dapp 0.32.10 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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?