dapp 0.32.10 → 0.33.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/bin/dapp +1 -23
  3. data/config/en/net_status.yml +7 -0
  4. data/lib/dapp.rb +3 -3
  5. data/lib/dapp/dapp.rb +13 -0
  6. data/lib/dapp/dapp/dappfile.rb +2 -2
  7. data/lib/dapp/dapp/deps/base.rb +5 -37
  8. data/lib/dapp/dapp/deps/common.rb +25 -0
  9. data/lib/dapp/dapp/deps/gitartifact.rb +2 -25
  10. data/lib/dapp/dapp/deps/toolchain.rb +1 -23
  11. data/lib/dapp/dapp/logging/base.rb +3 -3
  12. data/lib/dapp/dapp/ruby2go.rb +96 -0
  13. data/lib/dapp/dapp/sentry.rb +0 -1
  14. data/lib/dapp/dapp/shellout/base.rb +4 -2
  15. data/lib/dapp/dimg/build/stage/artifact_base.rb +7 -6
  16. data/lib/dapp/dimg/build/stage/base.rb +37 -7
  17. data/lib/dapp/dimg/build/stage/from.rb +1 -1
  18. data/lib/dapp/dimg/builder/ansible.rb +1 -209
  19. data/lib/dapp/dimg/builder/base.rb +0 -5
  20. data/lib/dapp/dimg/builder/none.rb +1 -34
  21. data/lib/dapp/dimg/builder/ruby2go.rb +51 -0
  22. data/lib/dapp/dimg/builder/shell.rb +1 -25
  23. data/lib/dapp/dimg/cli/command/dimg/bp.rb +10 -15
  24. data/lib/dapp/dimg/cli/command/dimg/build.rb +0 -5
  25. data/lib/dapp/dimg/config/directive/docker/base.rb +1 -1
  26. data/lib/dapp/dimg/dapp/command/build_context/export.rb +1 -1
  27. data/lib/dapp/dimg/dapp/command/build_context/import.rb +1 -1
  28. data/lib/dapp/dimg/dapp/command/cleanup_repo.rb +59 -90
  29. data/lib/dapp/dimg/dapp/command/common.rb +60 -74
  30. data/lib/dapp/dimg/dapp/command/mrproper.rb +2 -17
  31. data/lib/dapp/dimg/dapp/command/stages/cleanup_local.rb +9 -6
  32. data/lib/dapp/dimg/dimg.rb +26 -43
  33. data/lib/dapp/dimg/docker_registry/base/authorization.rb +1 -16
  34. data/lib/dapp/dimg/git_artifact.rb +142 -21
  35. data/lib/dapp/dimg/git_repo/base.rb +11 -0
  36. data/lib/dapp/dimg/git_repo/local.rb +14 -0
  37. data/lib/dapp/dimg/git_repo/remote.rb +25 -34
  38. data/lib/dapp/dimg/image/argument.rb +12 -58
  39. data/lib/dapp/dimg/image/stage.rb +202 -43
  40. data/lib/dapp/kube/kubernetes/client.rb +0 -6
  41. data/lib/dapp/kube/kubernetes/manager/deployment.rb +18 -30
  42. data/lib/dapp/version.rb +1 -1
  43. metadata +8 -8
  44. data/lib/dapp/dimg/builder/ansible/assets.rb +0 -349
  45. data/lib/dapp/dimg/exception/introspect_image.rb +0 -7
  46. data/lib/dapp/dimg/image/docker.rb +0 -144
@@ -1,29 +1,5 @@
1
1
  module Dapp
2
2
  module Dimg
3
- class Builder::Shell < Builder::Base
4
- [:before_install, :before_setup, :install, :setup, :build_artifact].each do |stage|
5
- define_method("#{stage}_checksum") do
6
- _checksum(
7
- dimg.config._shell.public_send("_#{stage}_command"),
8
- public_send("#{stage}_version_checksum")
9
- )
10
- end
11
- define_method("#{stage}_version_checksum") do
12
- _checksum(dimg.config._shell.public_send("_#{stage}_version"), dimg.config._shell._version)
13
- end
14
- define_method("#{stage}?") { !stage_empty?(stage) }
15
- define_method(stage.to_s) do |image|
16
- image.add_command(*stage_commands(stage)) unless stage_empty?(stage)
17
- end
18
- end
19
-
20
- def stage_empty?(stage)
21
- stage_commands(stage).empty? && public_send("#{stage}_version_checksum").nil?
22
- end
23
-
24
- def stage_commands(stage)
25
- dimg.config._shell.public_send("_#{stage}_command")
26
- end
27
- end # Builder::Shell
3
+ class Builder::Shell < Builder::Ruby2Go; end
28
4
  end # Dimg
29
5
  end # Dapp
@@ -19,27 +19,22 @@ BANNER
19
19
  extend ::Dapp::CLI::Options::Ssh
20
20
 
21
21
  option :tmp_dir_prefix,
22
- long: '--tmp-dir-prefix PREFIX',
23
- description: 'Tmp directory prefix (/tmp by default). Used for build process service directories.'
22
+ long: '--tmp-dir-prefix PREFIX',
23
+ description: 'Tmp directory prefix (/tmp by default). Used for build process service directories.'
24
24
 
25
25
  option :lock_timeout,
26
- long: '--lock-timeout TIMEOUT',
27
- description: 'Redefine resource locking timeout (in seconds)',
28
- proc: ->(v) { v.to_i }
26
+ long: '--lock-timeout TIMEOUT',
27
+ description: 'Redefine resource locking timeout (in seconds)',
28
+ proc: ->(v) { v.to_i }
29
29
 
30
30
  option :build_context_directory,
31
- long: '--build-context-directory DIR_PATH',
32
- default: nil
31
+ long: '--build-context-directory DIR_PATH',
32
+ default: nil
33
33
 
34
34
  option :use_system_tar,
35
- long: '--use-system-tar',
36
- boolean: true,
37
- default: false
38
-
39
- option :force_save_cache,
40
- long: '--force-save-cache',
41
- boolean: true,
42
- default: false
35
+ long: '--use-system-tar',
36
+ boolean: true,
37
+ default: false
43
38
 
44
39
  # push options
45
40
 
@@ -32,11 +32,6 @@ BANNER
32
32
  long: '--use-system-tar',
33
33
  boolean: true,
34
34
  default: false
35
-
36
- option :force_save_cache,
37
- long: '--force-save-cache',
38
- boolean: true,
39
- default: false
40
35
  end
41
36
  end
42
37
  end
@@ -9,7 +9,7 @@ module Dapp
9
9
  def from(image, cache_version: nil)
10
10
  sub_directive_eval do
11
11
  image = image.to_s
12
- raise(::Dapp::Error::Config, code: :docker_from_incorrect, data: { name: image }) unless ::Dapp::Dimg::Image::Docker.image_name?(image)
12
+ raise(::Dapp::Error::Config, code: :docker_from_incorrect, data: { name: image }) unless ::Dapp::Dimg::Image::Stage.image_name?(image)
13
13
  @_from = image.include?(':') ? image : [image, 'latest'].join(':')
14
14
  @_from_cache_version = cache_version
15
15
  end
@@ -18,7 +18,7 @@ module Dapp
18
18
  end.flatten
19
19
 
20
20
  log_secondary_process(:images, short: true) do
21
- Image::Docker.save!(context_images_names, build_context_images_tar, verbose: true, quiet: log_quiet?) unless dry_run?
21
+ Image::Stage.save!(self, context_images_names, build_context_images_tar, verbose: true, quiet: log_quiet?) unless dry_run?
22
22
  end unless context_images_names.empty?
23
23
  end
24
24
  end
@@ -18,7 +18,7 @@ module Dapp
18
18
  if build_context_images_tar.exist?
19
19
  log_secondary_process(:images) do
20
20
  lock("#{name}.images") do
21
- Image::Docker.load!(build_context_images_tar, verbose: true, quiet: log_quiet?)
21
+ Image::Stage.load!(self, build_context_images_tar, verbose: true, quiet: log_quiet?)
22
22
  end unless dry_run?
23
23
  end
24
24
  else
@@ -3,15 +3,13 @@ module Dapp
3
3
  module Dapp
4
4
  module Command
5
5
  module CleanupRepo
6
- GIT_TAGS_LIMIT_POLICY = 10
7
- EXPIRY_DATE_PERIOD_POLICY = 60 * 60 * 24 * 30
8
- GIT_COMMITS_LIMIT_POLICY = 50
9
- GIT_COMMITS_EXPIRY_DATE_PERIOD_POLICY = 60 * 60 * 24 * 30
6
+ GIT_TAGS_LIMIT_POLICY = 10
7
+ EXPIRY_DATE_PERIOD_POLICY = 60 * 60 * 24 * 30
10
8
 
11
9
  def cleanup_repo
12
10
  lock_repo(repo = option_repo) do
13
11
  log_step_with_indent(repo) do
14
- log_step_with_indent('Searching for images being used in kubernetes clusters in one of the kube-config contexts') do
12
+ log_step_with_indent("Searching for images being used in kubernetes clusters in one of the kube-config contexts") do
15
13
  deployed_docker_images.each do |deployed_img|
16
14
  log(deployed_img)
17
15
  end
@@ -54,13 +52,15 @@ module Dapp
54
52
 
55
53
  def cleanup_repo_by_nonexistent_git_primitive(registry, detailed_dimgs_images_by_scheme)
56
54
  %w(git_tag git_branch git_commit).each do |scheme|
57
- cleanup_repo_by_nonexistent_git_base(registry, detailed_dimgs_images_by_scheme, scheme) do |detailed_dimg_image|
58
- case scheme
59
- when 'git_tag' then consistent_git_tags.include?(detailed_dimg_image[:tag])
60
- when 'git_branch' then consistent_git_remote_branches.include?(detailed_dimg_image[:tag])
61
- when 'git_commit' then git_own_repo.commit_exists?(detailed_dimg_image[:tag])
62
- else
63
- raise
55
+ cleanup_repo_by_nonexistent_git_base(detailed_dimgs_images_by_scheme, scheme) do |detailed_dimg_image|
56
+ delete_repo_image(registry, detailed_dimg_image) unless begin
57
+ case scheme
58
+ when 'git_tag' then consistent_git_tags.include?(detailed_dimg_image[:tag])
59
+ when 'git_branch' then consistent_git_remote_branches.include?(detailed_dimg_image[:tag])
60
+ when 'git_commit' then git_own_repo.commit_exists?(detailed_dimg_image[:tag])
61
+ else
62
+ raise
63
+ end
64
64
  end
65
65
  end unless detailed_dimgs_images_by_scheme[scheme].empty?
66
66
  end
@@ -74,81 +74,56 @@ module Dapp
74
74
  @consistent_git_remote_branches ||= git_own_repo.remote_branches.map(&method(:consistent_uniq_slugify))
75
75
  end
76
76
 
77
- def cleanup_repo_by_nonexistent_git_base(registry, repo_dimgs_images_by_scheme, dapp_tag_scheme)
78
- nonexist_repo_images = repo_dimgs_images_by_scheme[dapp_tag_scheme]
79
- .select { |dimg_image| dimg_image[:labels]['dapp-tag-scheme'] == dapp_tag_scheme }
80
- .select { |dimg_image| !(yield dimg_image) }
81
-
82
- log_step_with_indent(:"#{dapp_tag_scheme.split('_').join(' ')} nonexistent") do
83
- nonexist_repo_images.each { |repo_image| delete_repo_image(registry, repo_image) }
84
- end unless nonexist_repo_images.empty?
77
+ def cleanup_repo_by_nonexistent_git_base(repo_dimgs_images_by_scheme, dapp_tag_scheme)
78
+ return if repo_dimgs_images_by_scheme[dapp_tag_scheme].empty?
79
+ log_step_with_indent(:"nonexistent #{dapp_tag_scheme.split('_').join(' ')}") do
80
+ repo_dimgs_images_by_scheme[dapp_tag_scheme]
81
+ .select { |dimg_image| dimg_image[:labels]['dapp-tag-scheme'] == dapp_tag_scheme }
82
+ .each { |dimg_image| yield dimg_image }
83
+ end
85
84
  end
86
85
 
87
86
  def cleanup_repo_by_policies(registry, detailed_dimgs_images_by_scheme)
88
- cleanup_repo_tags_by_policies(registry, detailed_dimgs_images_by_scheme)
89
- cleanup_repo_commits_by_policies(registry, detailed_dimgs_images_by_scheme)
90
- end
91
-
92
- def cleanup_repo_tags_by_policies(registry, detailed_dimgs_images_by_scheme)
93
- cleanup_repo_by_policies_base(
94
- registry,
95
- detailed_dimgs_images_by_scheme['git_tag'].select { |dimg| consistent_git_tags.include?(dimg[:tag]) },
96
- expiry_date_policy: git_tags_expiry_date_policy,
97
- limit_policy: git_tags_limit_policy,
98
- log_primitive: 'tag'
99
- )
100
- end
101
-
102
- def cleanup_repo_commits_by_policies(registry, detailed_dimgs_images_by_scheme)
103
- cleanup_repo_by_policies_base(
104
- registry,
105
- detailed_dimgs_images_by_scheme['git_commit'].select { |dimg| git_own_repo.commit_exists?(dimg[:tag]) },
106
- expiry_date_policy: git_commits_expiry_date_policy,
107
- limit_policy: git_commits_limit_policy,
108
- log_primitive: 'commit'
109
- )
110
- end
111
-
112
- def cleanup_repo_by_policies_base(registry, detailed_dimgs_images, expiry_date_policy:, limit_policy:, log_primitive:)
113
- sorted_detailed_dimgs_images = detailed_dimgs_images.sort_by { |dimg| dimg[:created_at] }.reverse
114
-
115
- expired_dimgs_images, not_expired_dimgs_images = sorted_detailed_dimgs_images.partition do |dimg_image|
116
- dimg_image[:created_at] < expiry_date_policy
117
- end
87
+ %w(git_tag git_commit).each_with_object([]) do |scheme, dimgs_images|
88
+ dimgs_images.concat begin
89
+ detailed_dimgs_images_by_scheme[scheme].select do |dimg|
90
+ if scheme == 'git_tag'
91
+ consistent_git_tags.include?(dimg[:tag])
92
+ elsif scheme == 'git_commit'
93
+ git_own_repo.commit_exists?(dimg[:tag])
94
+ end
95
+ end
96
+ end
97
+ end.tap do |detailed_dimgs_images|
98
+ sorted_detailed_dimgs_images = detailed_dimgs_images.sort_by { |dimg| dimg[:created_at] }.reverse
99
+ expired_dimgs_images, not_expired_dimgs_images = sorted_detailed_dimgs_images.partition do |dimg_image|
100
+ dimg_image[:created_at] < expiry_date_policy
101
+ end
118
102
 
119
- log_step_with_indent(:"git #{log_primitive} date policy (before #{DateTime.strptime(expiry_date_policy.to_s, '%s')})") do
120
- expired_dimgs_images.each { |dimg| delete_repo_image(registry, dimg) }
121
- end unless expired_dimgs_images.empty?
103
+ log_step_with_indent(:"date policy (before #{DateTime.strptime(expiry_date_policy.to_s, '%s')})") do
104
+ expired_dimgs_images.each { |dimg| delete_repo_image(registry, dimg) }
105
+ end
122
106
 
123
- not_expired_dimgs_images
124
- .each_with_object({}) { |dimg, images_by_dimg| (images_by_dimg[dimg[:dimg]] ||= []) << dimg }
125
- .each do |dimg_name, images|
126
- next if images[limit_policy..-1].nil?
127
- log_step_with_indent(:"git #{log_primitive} limit policy (> #{limit_policy}) (`#{dimg_name || 'nameless'}` dimg)") do
128
- images[limit_policy..-1].each { |dimg| delete_repo_image(registry, dimg) }
107
+ {}.tap do |images_by_dimg|
108
+ not_expired_dimgs_images.each { |dimg| (images_by_dimg[dimg[:dimg]] ||= []) << dimg }
109
+ images_by_dimg.each do |dimg, images|
110
+ log_step_with_indent(:"limit policy (> #{git_tag_limit_policy}) (`#{dimg || "nameless"}` dimg)") do
111
+ images[git_tag_limit_policy..-1].each { |dimg| delete_repo_image(registry, dimg) }
112
+ end unless images[git_tag_limit_policy..-1].nil?
113
+ end
129
114
  end
130
115
  end
131
116
  end
132
117
 
133
- def git_tags_expiry_date_policy
134
- @git_tags_expiry_date_policy ||= expiry_date_policy_value('EXPIRY_DATE_PERIOD_POLICY', default: EXPIRY_DATE_PERIOD_POLICY)
135
- end
136
-
137
- def git_tags_limit_policy
138
- @git_tags_limit_policy ||= policy_value('GIT_TAGS_LIMIT_POLICY', default: GIT_TAGS_LIMIT_POLICY)
139
- end
140
-
141
- def git_commits_expiry_date_policy
142
- @git_commits_expiry_date_policy ||= expiry_date_policy_value('GIT_COMMITS_EXPIRY_DATE_PERIOD_POLICY', default: GIT_COMMITS_EXPIRY_DATE_PERIOD_POLICY)
143
- end
144
-
145
- def git_commits_limit_policy
146
- @git_commits_limit_policy ||= policy_value('GIT_COMMITS_LIMIT_POLICY', default: GIT_COMMITS_LIMIT_POLICY)
118
+ def expiry_date_policy
119
+ @expiry_date_policy = begin
120
+ expiry_date_period_policy = policy_value('EXPIRY_DATE_PERIOD_POLICY', default: EXPIRY_DATE_PERIOD_POLICY)
121
+ Time.now.to_i - expiry_date_period_policy
122
+ end
147
123
  end
148
124
 
149
- def expiry_date_policy_value(env_key, default:)
150
- expiry_date_period_policy = policy_value(env_key, default: default)
151
- Time.now.to_i - expiry_date_period_policy
125
+ def git_tag_limit_policy
126
+ @git_tag_limit_policy ||= policy_value('GIT_TAGS_LIMIT_POLICY', default: GIT_TAGS_LIMIT_POLICY)
152
127
  end
153
128
 
154
129
  def policy_value(env_key, default:)
@@ -225,65 +200,59 @@ module Dapp
225
200
  # pod items[] spec containers[] image
226
201
  def pod_images(client)
227
202
  client.pod_list['items'].map do |item|
228
- images_from_pod_spec(item)
203
+ item['spec']['containers'].map{ |cont| cont['image'] }
229
204
  end
230
205
  end
231
206
 
232
207
  # cronjob items[] spec jobTemplate spec template spec containers[] image
233
208
  def cronjob_images(client)
234
209
  client.cronjob_list['items'].map do |item|
235
- images_from_pod_spec(item['spec']['jobTemplate']['spec']['template'])
210
+ item['spec']['jobTemplate']['spec']['template']['spec']['containers'].map{ |cont| cont['image'] }
236
211
  end
237
212
  end
238
213
 
239
214
  # daemonsets items[] spec template spec containers[] image
240
215
  def daemonset_images(client)
241
216
  client.daemonset_list['items'].map do |item|
242
- images_from_pod_spec(item['spec']['template'])
217
+ item['spec']['template']['spec']['containers'].map{ |cont| cont['image'] }
243
218
  end
244
219
  end
245
220
 
246
221
  # deployment items[] spec template spec containers[] image
247
222
  def deployment_images(client)
248
223
  client.deployment_list['items'].map do |item|
249
- images_from_pod_spec(item['spec']['template'])
224
+ item['spec']['template']['spec']['containers'].map{ |cont| cont['image'] }
250
225
  end
251
226
  end
252
227
 
253
228
  # job items[] spec template spec containers[] image
254
229
  def job_images(client)
255
230
  client.job_list['items'].map do |item|
256
- images_from_pod_spec(item['spec']['template'])
231
+ item['spec']['template']['spec']['containers'].map{ |cont| cont['image'] }
257
232
  end
258
233
  end
259
234
 
260
235
  # replicasets items[] spec template spec containers[] image
261
236
  def replicaset_images(client)
262
237
  client.replicaset_list['items'].map do |item|
263
- images_from_pod_spec(item['spec']['template'])
238
+ item['spec']['template']['spec']['containers'].map{ |cont| cont['image'] }
264
239
  end
265
240
  end
266
241
 
267
242
  # replicasets items[] spec template spec containers[] image
268
243
  def statefulset_images(client)
269
244
  client.statefulset_list['items'].map do |item|
270
- images_from_pod_spec(item['spec']['template'])
245
+ item['spec']['template']['spec']['containers'].map{ |cont| cont['image'] }
271
246
  end
272
247
  end
273
248
 
274
249
  # replicationcontroller items[] spec template spec containers[] image
275
250
  def replicationcontroller_images(client)
276
251
  client.replicationcontroller_list['items'].map do |item|
277
- images_from_pod_spec(item['spec']['template'])
252
+ item['spec']['template']['spec']['containers'].map{ |cont| cont['image'] }
278
253
  end
279
254
  end
280
255
 
281
- def images_from_pod_spec(pod_spec)
282
- containers = Array(pod_spec['spec']['containers'])
283
- initContainers = Array(pod_spec['spec']['initContainers'])
284
- (containers + initContainers).map { |cont| cont['image'] }
285
- end
286
-
287
256
  def without_kube?
288
257
  !!options[:without_kube]
289
258
  end
@@ -18,41 +18,48 @@ module Dapp
18
18
  end
19
19
 
20
20
  def dapp_project_image_by_id(image_id)
21
- dapp_project_images.find { |image| image[:id] == image_id }
22
- end
23
-
24
- def dapp_project_image_labels(image)
25
- dapp_project_image_inspect(image)['Config']['Labels']
26
- end
27
-
28
- def dapp_project_image_inspect(image)
29
- image[:inspect] ||= begin
30
- cmd = shellout!("#{::Dapp::Dapp.host_docker} inspect --type=image #{image[:id]}")
31
- Array(JSON.parse(cmd.stdout.strip)).first || {}
32
- end
21
+ dapp_project_images.find { |image| image["Id"] == image_id }
33
22
  end
34
23
 
35
24
  def dapp_project_images
36
25
  @dapp_project_images ||= [].tap do |images|
37
- images.concat prepare_docker_images(stage_cache, dimgstage: true)
38
- images.concat prepare_docker_images('-f label=dapp-dimg=true', dimg: true)
26
+ images.concat prepare_docker_images(extra_filters: [{ reference: stage_cache }], extra_image_fields: { dimgstage: true })
27
+ images.concat prepare_docker_images(extra_filters: [{ label: "dapp-dimg=true" }], extra_image_fields: { dimg: true })
39
28
  end
40
29
  end
41
30
 
42
- def prepare_docker_images(extra_args, **extra_fields)
43
- [].tap do |images|
44
- shellout!(%(#{host_docker} images --format='{{if ne "<none>" .Tag }}{{.ID}};{{.Repository}}:{{.Tag}};{{.CreatedAt}}{{ end }}' -f "dangling=false" -f "label=dapp=#{name}" --no-trunc #{extra_args}))
45
- .stdout
46
- .lines
47
- .map(&:strip)
48
- .reject(&:empty?)
49
- .each do |l|
50
- id, name, created_at = l.split(';')
51
- images << { id: id, name: name, created_at: Time.parse(created_at).to_i, **extra_fields }
31
+ def prepare_docker_images(extra_filters: [], extra_image_fields: {})
32
+ filters = []
33
+ filters << { dangling: "false" }
34
+ filters << { label: "dapp=#{name}" }
35
+ filters.concat(extra_filters)
36
+
37
+ ruby2go_image_images(filters, ignore_tagless: true).map { |image| image.merge(**extra_image_fields) }
38
+ end
39
+
40
+ def ruby2go_image_images(filters, ignore_tagless:)
41
+ Image::Stage.ruby2go_command(self, command: :images, options: { filters: filters }).tap do |images|
42
+ if ignore_tagless
43
+ break images.select do |image|
44
+ image["RepoTags"].reject! { |tag| tag.split(":").last == '<none>' }
45
+ !image["RepoTags"].empty?
46
+ end
52
47
  end
53
48
  end
54
49
  end
55
50
 
51
+ def ruby2go_image_containers(filters)
52
+ Image::Stage.ruby2go_command(self, command: :containers, options: { filters: filters })
53
+ end
54
+
55
+ def ruby2go_image_rm(ids, force: false)
56
+ Image::Stage.ruby2go_command(self, command: :rm, options: { ids: ids, force: force })
57
+ end
58
+
59
+ def ruby2go_image_rmi(ids, force: false)
60
+ Image::Stage.ruby2go_command(self, command: :rmi, options: { ids: ids, force: force })
61
+ end
62
+
56
63
  def remove_project_images(project_images, force: false)
57
64
  update_project_images_cache(project_images)
58
65
  remove_images(project_images_to_delete(project_images), force: force)
@@ -63,49 +70,51 @@ module Dapp
63
70
  end
64
71
 
65
72
  def array_hash_delete_if_by_id(project_images, *images)
66
- project_images.delete_if { |image| images.flatten.any? { |i| image[:id] == i[:id] } }
73
+ project_images.delete_if { |image| images.flatten.any? { |i| image["Id"] == i["Id"] } }
67
74
  end
68
75
 
69
76
  def project_images_to_delete(project_images)
70
- project_images.map { |image| image[:dangling] ? image[:id] : image[:name] }
77
+ project_images.map { |i| i["RepoTags"] }.flatten.uniq
71
78
  end
72
79
 
73
80
  def dapp_containers_flush_by_label(label)
74
81
  log_proper_containers do
75
- remove_containers_by_query(%(#{host_docker} ps -a -f "label=#{label}" -f "name=dapp.build." -q --no-trunc))
82
+ containers = ruby2go_image_containers([{ name: "dapp.build.", label: label }])
83
+ remove_containers(containers.map { |c| c["Id"] })
76
84
  end
77
85
  end
78
86
 
79
87
  def dapp_dangling_images_flush_by_label(label)
80
88
  log_proper_flush_dangling_images do
81
- remove_images_by_query(%(#{host_docker} images -f "dangling=true" -f "label=#{label}" -q --no-trunc))
89
+ images = ruby2go_image_images([{ dangling: "true", label: label }], ignore_tagless: false)
90
+ remove_images(images.map { |i| i["Id"] })
82
91
  end
83
92
  end
84
93
 
85
94
  def dapp_tagless_images_flush
86
- remove_images_by_query(%(#{host_docker} images --format='{{if eq "<none>" .Tag }}{{.ID}}{{ end }}' -f "dangling=false" -f "label=dapp" -q --no-trunc))
87
- end
88
-
89
- def remove_images_by_query(images_query)
90
- with_subquery(images_query) { |ids| remove_images(ids) }
95
+ remove_images begin
96
+ ruby2go_image_images([{ dangling: "false", label: "dapp" }], ignore_tagless: false)
97
+ .map { |image| image["RepoTags"].select { |tag| tag.split(":").last == "<none>" } }
98
+ .flatten
99
+ end
91
100
  end
92
101
 
93
102
  def remove_images(images_ids_or_names, force: false)
94
- ids_chunks(images_ids_or_names) do |chunk|
95
- chunk = ignore_used_images(chunk) unless force
96
- remove_base("#{host_docker} rmi%{force_option} %{ids}", chunk, force: force)
97
- end
103
+ proc = proc { |refs| ruby2go_image_rmi(refs, force: force) }
104
+ images_ids_or_names = ignore_used_images(images_ids_or_names) unless force
105
+ remove_base(images_ids_or_names, proc: proc)
98
106
  end
99
107
 
100
108
  def ignore_used_images(images_ids_or_names)
101
109
  not_used_images = proc do |*image_id_or_name, log: true|
102
- images = image_id_or_name.flatten
103
- filters = images.map { |iion| "--filter=ancestor=#{iion}" }.join(' ')
104
- res = shellout!(%(#{host_docker} ps -a -q #{filters})).stdout.strip
105
- if res.empty?
110
+ images = image_id_or_name.flatten
111
+ filters = images.map { |ref| { ancestor: ref } }
112
+
113
+ containers = ruby2go_image_containers(filters).select { |c| images.include?(c["Image"]) || images.include?(c["ImageID"]) } # ancestor filter matches containers based on its image or a descendant of it
114
+ if containers.empty?
106
115
  true
107
116
  else
108
- log_info("Skip `#{images.join('`, `')}` (used by containers: #{res.split.join(' ')})") if log
117
+ log_info("Skip `#{images.join('`, `')}` (used by containers: #{ containers.map { |c| c["Id"] }.join(' ')})") if log
109
118
  false
110
119
  end
111
120
  end
@@ -117,35 +126,16 @@ module Dapp
117
126
  end
118
127
  end
119
128
 
120
- def remove_containers_by_query(containers_query)
121
- with_subquery(containers_query) { |ids| remove_containers(ids) }
122
- end
123
-
124
129
  def remove_containers(ids)
125
- ids_chunks(ids) do |chunk|
126
- remove_base("#{host_docker} rm%{force_option} %{ids}", chunk, force: true)
127
- end
130
+ proc = proc { |refs| ruby2go_image_rm(refs, force: true) }
131
+ remove_base(ids, proc: proc)
128
132
  end
129
133
 
130
- def ids_chunks(ids, &blk)
131
- return if ids.empty?
132
- ids.uniq.each_slice(50, &blk)
133
- end
134
-
135
- def remove_base(query_format, ids, force: false)
136
- return if ids.empty?
137
- force_option = force ? ' -f' : ''
138
- log(ids.join("\n")) if log_verbose? || dry_run?
139
- run_command(format(query_format, force_option: force_option, ids: ids.join(' ')))
140
- end
141
-
142
- def with_subquery(query)
143
- return if (res = shellout!(query).stdout.strip.lines.map(&:strip)).empty?
144
- yield(res)
145
- end
146
-
147
- def run_command(cmd)
148
- shellout!(cmd) unless dry_run?
134
+ def remove_base(ids, proc:)
135
+ return if ids.empty?
136
+ ids.uniq!
137
+ log(ids.join("\n")) if dry_run?
138
+ proc.call(ids) unless dry_run?
149
139
  end
150
140
 
151
141
  def dimg_import_export_base(should_be_built: true)
@@ -158,20 +148,16 @@ module Dapp
158
148
  end
159
149
  end
160
150
 
161
- def container_name_prefix
162
- name
163
- end
164
-
165
151
  def validate_repo_name!(repo)
166
152
  raise ::Dapp::Error::Command, code: :repo_name_incorrect, data: { name: repo } unless ::Dapp::Dimg::DockerRegistry.repo_name?(repo)
167
153
  end
168
154
 
169
155
  def validate_image_name!(image)
170
- raise ::Dapp::Error::Command, code: :image_name_incorrect, data: { name: image } unless ::Dapp::Dimg::Image::Docker.image_name?(image)
156
+ raise ::Dapp::Error::Command, code: :image_name_incorrect, data: { name: image } unless ::Dapp::Dimg::Image::Stage.image_name?(image)
171
157
  end
172
158
 
173
159
  def validate_tag_name!(tag)
174
- raise ::Dapp::Error::Command, code: :tag_name_incorrect, data: { name: tag } unless ::Dapp::Dimg::Image::Docker.tag?(tag)
160
+ raise ::Dapp::Error::Command, code: :tag_name_incorrect, data: { name: tag } unless ::Dapp::Dimg::Image::Stage.tag?(tag)
175
161
  end
176
162
 
177
163
  def proper_cache_version?