awful 0.0.127 → 0.0.128
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/awful/ecr.rb +96 -14
- data/lib/awful/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a0da7e8c9d19b6ce0b6188f1e1c32c81c9c75eaa
|
4
|
+
data.tar.gz: 97a8e87f2f1e5e83e1e1d5ec3e1c8fae26a83727
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 135c8ae7944cdd637c553000d5997e282b682c8b65db6d45f940d12a9c1c7b582868f789126e1cd704113ea8f7ed5c9d890ef081ed0fb4a46935a4b209bd1ff6
|
7
|
+
data.tar.gz: 8360d46cd3a3ab4caac731d72a289b4811063727ed689bd474f7bef4e78b52fada39af9b80d0bac6efa675a5061231540f47d16cacb9249f918b24fb3eb49083
|
data/lib/awful/ecr.rb
CHANGED
@@ -12,12 +12,24 @@ module Awful
|
|
12
12
|
def ecr
|
13
13
|
@ecr ||= Aws::ECR::Client.new
|
14
14
|
end
|
15
|
+
|
16
|
+
## get array of image_tag hashes in form expected by get methods
|
17
|
+
def image_tags(*tags)
|
18
|
+
tags.map do |tag|
|
19
|
+
{image_tag: tag}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
## parse created date from manifest of Aws::ECR::Types::Image object
|
24
|
+
def parse_created(image)
|
25
|
+
JSON.parse(JSON.parse(image.image_manifest)['history'].first['v1Compatibility'])['created']
|
26
|
+
end
|
15
27
|
end
|
16
28
|
|
17
29
|
desc 'ls', 'list commands'
|
18
30
|
method_option :long, aliases: '-l', type: :boolean, default: false, desc: 'Long listing'
|
19
31
|
def ls
|
20
|
-
ecr.describe_repositories.repositories.
|
32
|
+
ecr.describe_repositories.repositories.output do |repos|
|
21
33
|
if options[:long]
|
22
34
|
print_table repos.map { |r| [r.repository_name, r.registry_id, r.repository_arn] }
|
23
35
|
else
|
@@ -29,7 +41,7 @@ module Awful
|
|
29
41
|
desc 'dump [REPOS]', 'describe given or all repositories as yaml'
|
30
42
|
def dump(*repos)
|
31
43
|
repos = nil if repos.empty? # omit this arg to show all repos
|
32
|
-
ecr.describe_repositories(repository_names: repos).repositories.
|
44
|
+
ecr.describe_repositories(repository_names: repos).repositories.output do |list|
|
33
45
|
list.each do |repo|
|
34
46
|
puts YAML.dump(stringify_keys(repo.to_h))
|
35
47
|
end
|
@@ -52,7 +64,7 @@ module Awful
|
|
52
64
|
desc 'auth [REGISTRIES]', 'dump authorization details for registries (or default)'
|
53
65
|
def auth(*registries)
|
54
66
|
registries = nil if registries.empty?
|
55
|
-
ecr.get_authorization_token(registry_ids: registries).authorization_data.
|
67
|
+
ecr.get_authorization_token(registry_ids: registries).authorization_data.output do |auths|
|
56
68
|
auths.each do |auth|
|
57
69
|
puts YAML.dump(stringify_keys(auth.to_h))
|
58
70
|
end
|
@@ -65,7 +77,7 @@ module Awful
|
|
65
77
|
def login(*registries)
|
66
78
|
cmd = options[:print] ? :puts : :system
|
67
79
|
registries = nil if registries.empty?
|
68
|
-
ecr.get_authorization_token(registry_ids: registries).authorization_data.
|
80
|
+
ecr.get_authorization_token(registry_ids: registries).authorization_data.output do |auths|
|
69
81
|
auths.each do |auth|
|
70
82
|
user, pass = Base64.decode64(auth.authorization_token).split(':')
|
71
83
|
send(cmd, "docker login -u #{user} -p #{pass} -e #{options[:email]} #{auth.proxy_endpoint}")
|
@@ -75,32 +87,102 @@ module Awful
|
|
75
87
|
|
76
88
|
desc 'images REPO', 'list images for repo'
|
77
89
|
method_option :long, aliases: '-l', type: :boolean, default: false, desc: 'Long listing'
|
78
|
-
def images(repository)
|
79
|
-
|
90
|
+
def images(repository, token: nil)
|
91
|
+
next_token = token
|
92
|
+
images = []
|
93
|
+
loop do
|
94
|
+
response = ecr.list_images(repository_name: repository, next_token: next_token)
|
95
|
+
images = images + response.image_ids
|
96
|
+
next_token = response.next_token
|
97
|
+
break unless next_token
|
98
|
+
end
|
99
|
+
|
100
|
+
images.output do |list|
|
80
101
|
if options[:long]
|
81
|
-
print_table
|
102
|
+
print_table list.map { |i|
|
103
|
+
[i.image_tag, i.image_digest]
|
104
|
+
}
|
82
105
|
else
|
83
|
-
puts
|
106
|
+
puts list.map(&:image_tag)
|
84
107
|
end
|
85
108
|
end
|
86
109
|
end
|
87
110
|
|
88
111
|
desc 'get REPO TAG[S]', 'get image details for all given TAGS'
|
89
112
|
def get(repository, *tags)
|
90
|
-
|
91
|
-
{image_tag: tag}
|
92
|
-
end
|
93
|
-
ecr.batch_get_image(repository_name: repository, image_ids: ids).images.tap do |imgs|
|
113
|
+
ecr.batch_get_image(repository_name: repository, image_ids: image_tags(*tags)).images.output do |imgs|
|
94
114
|
imgs.each do |img|
|
95
115
|
puts YAML.dump(stringify_keys(img.to_h))
|
96
116
|
end
|
97
117
|
end
|
98
118
|
end
|
99
119
|
|
120
|
+
desc 'inspect REPO TAGS', 'get first history element from manifest'
|
121
|
+
def inspect(repository, *tags)
|
122
|
+
ecr.batch_get_image(repository_name: repository, image_ids: image_tags(*tags)).images.output do |imgs|
|
123
|
+
imgs.map do |img|
|
124
|
+
JSON.parse(JSON.parse(img.image_manifest)['history'].first['v1Compatibility'])
|
125
|
+
end.output do |list|
|
126
|
+
puts YAML.dump(list)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
desc 'date REPO TAGS', 'get created date for given tags'
|
132
|
+
def date(repository, *tags)
|
133
|
+
ecr.batch_get_image(repository_name: repository, image_ids: image_tags(*tags)).images.output do |imgs|
|
134
|
+
imgs.map do |img|
|
135
|
+
parse_created(img)
|
136
|
+
end.output do |dates|
|
137
|
+
puts dates
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
100
142
|
desc 'exists REPO TAG', 'test if repo with given tag exists in registry'
|
101
143
|
def exists(repository, tag)
|
102
|
-
imgs = ecr.batch_get_image(repository_name: repository, image_ids:
|
103
|
-
(imgs.empty? ? false : true).
|
144
|
+
imgs = ecr.batch_get_image(repository_name: repository, image_ids: image_tags(tag)).images
|
145
|
+
(imgs.empty? ? false : true).output(&method(:puts))
|
146
|
+
end
|
147
|
+
|
148
|
+
desc 'reap REPO', 'reap old images for repo'
|
149
|
+
method_option :batch, aliases: '-b', type: :numeric, default: 10, desc: 'batch size to get and delete'
|
150
|
+
method_option :dry_run, aliases: '-d', type: :boolean, default: false, desc: 'dry run, do not delete, implies verbose'
|
151
|
+
method_option :verbose, aliases: '-v', type: :boolean, default: false, desc: 'print images to be deleted'
|
152
|
+
def reap(repository, days, token: nil)
|
153
|
+
verbose = options[:verbose] || options[:dry_run]
|
154
|
+
next_token = token
|
155
|
+
now = Time.now.utc
|
156
|
+
|
157
|
+
deleted = failures = 0
|
158
|
+
loop do
|
159
|
+
## get a batch of image ids
|
160
|
+
response = ecr.list_images(repository_name: repository, next_token: next_token, max_results: options[:batch])
|
161
|
+
|
162
|
+
## get details for the batch of images and calculate age
|
163
|
+
old_images = ecr.batch_get_image(repository_name: repository, image_ids: response.image_ids).images.select do |image|
|
164
|
+
date = Time.parse(parse_created(image)).utc
|
165
|
+
age = ((now - date)/(24*60*60)).to_i
|
166
|
+
if age > days.to_i
|
167
|
+
puts "#{date} #{age} #{image.image_id.image_tag}" if verbose
|
168
|
+
true
|
169
|
+
else
|
170
|
+
false
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
## delete old images
|
175
|
+
unless options[:dry_run] || old_images.empty?
|
176
|
+
r = ecr.batch_delete_image(repository_name: repository, image_ids: old_images.map(&:image_id))
|
177
|
+
deleted += r.image_ids.count
|
178
|
+
failures += r.failures.count
|
179
|
+
end
|
180
|
+
|
181
|
+
next_token = response.next_token
|
182
|
+
break unless next_token
|
183
|
+
end
|
184
|
+
|
185
|
+
puts "deleted: #{deleted}, failures: #{failures}"
|
104
186
|
end
|
105
187
|
end
|
106
188
|
end
|
data/lib/awful/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: awful
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.128
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ric Lister
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|