dapp 0.34.7 → 0.35.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a5cb59dc0c1ac431b394689bb1a3e8ebdddbf39da9ff360ece1e8c352a1bdfe1
4
- data.tar.gz: 4f8a89d6268fd9bc4e27cc50131fda4b1704c6379d2d6456c3b74b1ee8c80074
3
+ metadata.gz: 59c94384729263dd6beae2c0cfcbd75f09010d43f334726ad53f561e70f43e93
4
+ data.tar.gz: ea069cf6302db1aaf1e90291299f9dbf1887f06f091afd4a7bdf9beaaba7be25
5
5
  SHA512:
6
- metadata.gz: 5cf0708e76a7e2b4af0a7d8dccf618c329eda05c65cf0573acef669b110eb7628d72a2b73f24485b5f54afaf1a3dd2e9403ba4719bbdd6823922abc378fb5ddc
7
- data.tar.gz: 234bf91076f193b3dd5d68797462e72aed728634f5114dafa8426ab2be1ce4e61de42f45d3682c07fdf09573c87feb79560a3f8e1d7bd6d99c6c5052ec5fd2ee
6
+ metadata.gz: 06f26d814a0f747fd4a40b7dc17d63896bfaf15dcd748a8bd1c7a467dde708bedc43726ab120cb8027e6f7ac1b832eae354c6ede5d9010bc402922981d5fe190
7
+ data.tar.gz: 89517f7d50bef08d1d62f9f6fdd73de52068a7097f770326344f4b1b956a42d1517f482c8cb6d0591c465e86c043ee97edcfeaac9dcfc9be6641564d56c78a09
data/bin/dapp CHANGED
@@ -74,29 +74,7 @@ set_gitlab_cancel_handler if ENV["GITLAB_CI"]
74
74
  begin
75
75
  begin
76
76
  begin
77
- begin
78
- Dapp::CLI.new.run
79
- ensure
80
- if Time.now.to_date < Date.parse("2019-11-01")
81
- STDERR.puts
82
- STDERR.puts ::Paint["###################################################################", :red, :bold]
83
- STDERR.puts ::Paint["### DEPRECATION WARNING! ###", :red, :bold]
84
- STDERR.puts ::Paint["### Dapp will be deprecated for use starting with 01.11.2019! ###", :red, :bold]
85
- STDERR.puts ::Paint["### Please port your project to werf: ###", :red, :bold]
86
- STDERR.puts ::Paint["### https://werf.io ###", :red, :bold]
87
- STDERR.puts ::Paint["###################################################################", :red, :bold]
88
- STDERR.puts
89
- else
90
- STDERR.puts
91
- STDERR.puts ::Paint["######################################################################", :red, :bold]
92
- STDERR.puts ::Paint["### DEPRECATION WARNING! ###", :red, :bold]
93
- STDERR.puts ::Paint["### Dapp is deprecated for use and will not receive any support! ###", :red, :bold]
94
- STDERR.puts ::Paint["### Please port your project to werf: ###", :red, :bold]
95
- STDERR.puts ::Paint["### https://werf.io ###", :red, :bold]
96
- STDERR.puts ::Paint["######################################################################", :red, :bold]
97
- STDERR.puts
98
- end
99
- end
77
+ Dapp::CLI.new.run
100
78
  rescue Dapp::Error::Base => e
101
79
  unless (message = Dapp::Helper::NetStatus.before_error_message(e)).empty?
102
80
  $stderr.puts(message)
@@ -122,11 +122,7 @@ en:
122
122
  builder_cookbook_not_found: "Dapp cookbook directory not found at %{path}"
123
123
  berksfile_absolute_path_forbidden: "Absolute paths in Berksfile are not allowed (cookbook `%{cookbook}`, path: `%{path}`)"
124
124
  registry:
125
- authenticate_type_not_supported: 'Registry `%{registry}`: authenticate type is not supported!'
126
- page_not_found: "Registry `%{registry}`: page `%{url}` not found!"
127
- method_not_allowed: "Registry `%{registry}`: method `%{method}` not allowed (`%{url}`)!"
128
- user_not_authorized: 'Registry `%{registry}`: user not authorized!'
129
- registry_not_available: 'Registry `%{registry}`: not available!'
125
+ ruby2go_docker_registry_command_failed_unexpected_error: 'ruby2go_docker_registry command `%{command}` failed: `%{message}`!'
130
126
  rugged:
131
127
  git_repository_reference_error: "Git repo `%{name}`: %{message}!"
132
128
  rugged_remote_error: "Remote git repo `%{url}`: `%{message}`!"
@@ -266,12 +266,8 @@ require 'dapp/dimg/dapp/dimg'
266
266
  require 'dapp/dimg/dapp/config_artifact_group'
267
267
  require 'dapp/dimg/dapp/dapp'
268
268
  require 'dapp/dimg/docker_registry'
269
- require 'dapp/dimg/docker_registry/error'
270
- require 'dapp/dimg/docker_registry/base/request'
271
- require 'dapp/dimg/docker_registry/base/authorization'
272
269
  require 'dapp/dimg/docker_registry/base'
273
270
  require 'dapp/dimg/docker_registry/dimg'
274
- require 'dapp/dimg/docker_registry/default'
275
271
  require 'dapp/dimg/lock/base'
276
272
  require 'dapp/dimg/lock/file'
277
273
  require 'dapp/dimg/filelock'
@@ -237,9 +237,10 @@ module Dapp
237
237
  end
238
238
 
239
239
  def docker_credentials
240
- if options.key?(:registry_username) && options.key?(:registry_password)
240
+ if options[:registry_username] && options[:registry_password]
241
241
  [options[:registry_username], options[:registry_password]]
242
- elsif ENV.key?('CI_JOB_TOKEN')
242
+ elsif ENV.key?('DAPP_DOCKER_CONFIG')
243
+ elsif !ENV.key?('DAPP_IGNORE_CI_DOCKER_AUTOLOGIN') && ENV.key?('CI_JOB_TOKEN')
243
244
  ['gitlab-ci-token', ENV['CI_JOB_TOKEN']]
244
245
  end
245
246
  end
@@ -16,7 +16,7 @@ module Dapp
16
16
 
17
17
  def dimg_registry(repo = option_repo)
18
18
  validate_repo_name!(repo)
19
- ::Dapp::Dimg::DockerRegistry.new(repo)
19
+ ::Dapp::Dimg::DockerRegistry.new(self, repo)
20
20
  end
21
21
  end
22
22
  end
@@ -5,6 +5,10 @@ module Dapp
5
5
  _ruby2go("image", args_hash)
6
6
  end
7
7
 
8
+ def ruby2go_docker_registry(args_hash)
9
+ _ruby2go("docker_registry", args_hash)
10
+ end
11
+
8
12
  def ruby2go_builder(args_hash)
9
13
  _ruby2go("builder", args_hash)
10
14
  end
@@ -113,6 +113,7 @@ module Dapp
113
113
  image.add_service_change_label dapp: dimg.stage_dapp_label
114
114
  image.add_service_change_label 'dapp-version'.to_sym => ::Dapp::VERSION
115
115
  image.add_service_change_label 'dapp-cache-version'.to_sym => ::Dapp::BUILD_CACHE_VERSION
116
+ image.add_service_change_label 'dapp-dimg'.to_sym => false
116
117
  image.add_service_change_label 'dapp-dev-mode'.to_sym => true if dimg.dev_mode?
117
118
 
118
119
  if dimg.dapp.ssh_auth_sock
@@ -39,7 +39,7 @@ BANNER
39
39
  def run(argv = ARGV)
40
40
  self.class.parse_options(self, argv)
41
41
  repo = self.class.required_argument(self, 'repo')
42
- run_dapp_command(run_method, options: cli_options(dimgs_patterns: cli_arguments, repo: repo, verbose: true))
42
+ run_dapp_command(run_method, options: cli_options(dimgs_patterns: cli_arguments, repo: repo, verbose: true), try_host_docker_login: true)
43
43
  end
44
44
  end
45
45
  end
@@ -28,7 +28,7 @@ BANNER
28
28
  def run(argv = ARGV)
29
29
  self.class.parse_options(self, argv)
30
30
  repo = self.class.required_argument(self, 'repo')
31
- run_dapp_command(run_method, options: cli_options(dimgs_patterns: cli_arguments, repo: repo, verbose: true))
31
+ run_dapp_command(run_method, options: cli_options(dimgs_patterns: cli_arguments, repo: repo, verbose: true), try_host_docker_login: true)
32
32
  end
33
33
  end
34
34
  end
@@ -31,7 +31,7 @@ BANNER
31
31
  def run(argv = ARGV)
32
32
  self.class.parse_options(self, argv)
33
33
  repository = repo
34
- run_dapp_command(run_method, options: cli_options(repo: repository))
34
+ run_dapp_command(run_method, options: cli_options(repo: repository), try_host_docker_login: true)
35
35
  end
36
36
 
37
37
  def repo
@@ -19,7 +19,7 @@ BANNER
19
19
  def run(argv = ARGV)
20
20
  self.class.parse_options(self, argv)
21
21
  repo = self.class.required_argument(self, 'repo')
22
- run_dapp_command(:stages_flush_repo, options: cli_options(repo: repo))
22
+ run_dapp_command(:stages_flush_repo, options: cli_options(repo: repo), try_host_docker_login: true)
23
23
  end
24
24
  end
25
25
  end
@@ -225,65 +225,59 @@ module Dapp
225
225
  # pod items[] spec containers[] image
226
226
  def pod_images(client)
227
227
  client.pod_list['items'].map do |item|
228
- images_from_pod_spec(item)
228
+ item['spec']['containers'].map{ |cont| cont['image'] }
229
229
  end
230
230
  end
231
231
 
232
232
  # cronjob items[] spec jobTemplate spec template spec containers[] image
233
233
  def cronjob_images(client)
234
234
  client.cronjob_list['items'].map do |item|
235
- images_from_pod_spec(item['spec']['jobTemplate']['spec']['template'])
235
+ item['spec']['jobTemplate']['spec']['template']['spec']['containers'].map{ |cont| cont['image'] }
236
236
  end
237
237
  end
238
238
 
239
239
  # daemonsets items[] spec template spec containers[] image
240
240
  def daemonset_images(client)
241
241
  client.daemonset_list['items'].map do |item|
242
- images_from_pod_spec(item['spec']['template'])
242
+ item['spec']['template']['spec']['containers'].map{ |cont| cont['image'] }
243
243
  end
244
244
  end
245
245
 
246
246
  # deployment items[] spec template spec containers[] image
247
247
  def deployment_images(client)
248
248
  client.deployment_list['items'].map do |item|
249
- images_from_pod_spec(item['spec']['template'])
249
+ item['spec']['template']['spec']['containers'].map{ |cont| cont['image'] }
250
250
  end
251
251
  end
252
252
 
253
253
  # job items[] spec template spec containers[] image
254
254
  def job_images(client)
255
255
  client.job_list['items'].map do |item|
256
- images_from_pod_spec(item['spec']['template'])
256
+ item['spec']['template']['spec']['containers'].map{ |cont| cont['image'] }
257
257
  end
258
258
  end
259
259
 
260
260
  # replicasets items[] spec template spec containers[] image
261
261
  def replicaset_images(client)
262
262
  client.replicaset_list['items'].map do |item|
263
- images_from_pod_spec(item['spec']['template'])
263
+ item['spec']['template']['spec']['containers'].map{ |cont| cont['image'] }
264
264
  end
265
265
  end
266
266
 
267
267
  # replicasets items[] spec template spec containers[] image
268
268
  def statefulset_images(client)
269
269
  client.statefulset_list['items'].map do |item|
270
- images_from_pod_spec(item['spec']['template'])
270
+ item['spec']['template']['spec']['containers'].map{ |cont| cont['image'] }
271
271
  end
272
272
  end
273
273
 
274
274
  # replicationcontroller items[] spec template spec containers[] image
275
275
  def replicationcontroller_images(client)
276
276
  client.replicationcontroller_list['items'].map do |item|
277
- images_from_pod_spec(item['spec']['template'])
277
+ item['spec']['template']['spec']['containers'].map{ |cont| cont['image'] }
278
278
  end
279
279
  end
280
280
 
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
281
  def without_kube?
288
282
  !!options[:without_kube]
289
283
  end
@@ -55,11 +55,11 @@ module Dapp
55
55
  end
56
56
 
57
57
  def repo_image_dapp_artifacts_labels(registry, repo_image)
58
- select_dapp_artifacts_ids(registry.image_labels(repo_image[:tag], repo_image[:dimg]))
58
+ select_dapp_artifacts_ids(registry.image_config(repo_image[:tag], repo_image[:dimg])["config"]["Labels"])
59
59
  end
60
60
 
61
61
  def repo_image_dapp_cache_version_label(registry, repo_image)
62
- registry.image_labels(repo_image[:tag], repo_image[:dimg])['dapp-cache-version']
62
+ registry.image_config(repo_image[:tag], repo_image[:dimg])["config"]["Labels"]['dapp-cache-version']
63
63
  end
64
64
 
65
65
  def repo_image_by_id(repo_image_id, repo_images)
@@ -82,9 +82,9 @@ module Dapp
82
82
  def repo_detailed_dimgstage_images(registry)
83
83
  @repo_dapp_dimgstage_images_detailed ||= begin
84
84
  repo_dimgstages_images(registry).each do |dimgstage|
85
- image_history = registry.image_history(dimgstage[:tag], nil)
86
- dimgstage[:parent] = image_history['container_config']['Image']
87
- dimgstage[:labels] = image_history['config']['Labels']
85
+ image_config = registry.image_config(dimgstage[:tag], nil)
86
+ dimgstage[:parent] = image_config["container_config"]["Image"]
87
+ dimgstage[:labels] = image_config["config"]["Labels"]
88
88
  end
89
89
  end
90
90
  end
@@ -9,13 +9,14 @@ module Dapp
9
9
  def repo_detailed_dimgs_images(registry)
10
10
  repo_dimgs_images(registry).select do |dimg|
11
11
  begin
12
- image_history = registry.image_history(dimg[:tag], dimg[:dimg])
13
- dimg[:created_at] = Time.parse(image_history['created']).to_i
14
- dimg[:parent] = image_history['container_config']['Image']
15
- dimg[:labels] = image_history['config']['Labels'] || {}
12
+ image_config = registry.image_config(dimg[:tag], dimg[:dimg])
13
+ dimg[:created_at] = Time.parse(image_config["created"]).to_i
14
+ dimg[:parent] = image_config["container_config"]["Image"]
15
+ dimg[:labels] = image_config["config"]["Labels"]
16
16
  dimg[:labels]['dapp'] == name
17
- rescue ::Dapp::Dimg::DockerRegistry::Error::ManifestInvalid => err
18
- log_warning "WARNING: Ignore dimg `#{dimg[:dimg]}` tag `#{dimg[:tag]}`: got manifest-invalid-error from docker registry: #{err.message}"
17
+ rescue ::Dapp::Dimg::Error::Registry => e
18
+ raise unless e.net_status[:data][:message].include?("MANIFEST_UNKNOWN")
19
+ log_warning "WARNING: Ignore dimg `#{dimg[:dimg]}` tag `#{dimg[:tag]}`: got manifest-invalid-error from docker registry: #{e.net_status[:data][:message]}"
19
20
  false
20
21
  end
21
22
  end
@@ -52,8 +53,9 @@ module Dapp
52
53
  end
53
54
 
54
55
  return { dimg: dimg_name, tag: tag, id: id }
55
- rescue ::Dapp::Dimg::DockerRegistry::Error::ImageNotFound => err
56
- log_warning "WARNING: Ignore dimg `#{dimg_name}` tag `#{tag}`: got not-found-error from docker registry on get-image-manifest request: #{err.message}"
56
+ rescue ::Dapp::Dimg::Error::Registry => e
57
+ raise unless e.net_status[:data][:message].include?("MANIFEST_UNKNOWN")
58
+ log_warning "WARNING: Ignore dimg `#{dimg_name}` tag `#{tag}`: got not-found-error from docker registry on get-image-manifest request: #{e.net_status[:data][:message]}"
57
59
  return nil
58
60
  end
59
61
  end
@@ -63,8 +65,9 @@ module Dapp
63
65
  unless dry_run?
64
66
  begin
65
67
  registry.image_delete(repo_image[:tag], repo_image[:dimg])
66
- rescue ::Dapp::Dimg::DockerRegistry::Error::ImageNotFound => err
67
- log_warning "WARNING: Ignore dimg `#{repo_image[:dimg]}` tag `#{repo_image[:tag]}`: got not-found-error from docker registry on image-delete request: #{err.message}"
68
+ rescue ::Dapp::Dimg::Error::Registry => e
69
+ raise unless e.net_status[:data][:message].include?("MANIFEST_UNKNOWN")
70
+ log_warning "WARNING: Ignore dimg `#{repo_image[:dimg]}` tag `#{repo_image[:tag]}`: got not-found-error from docker registry on image-delete request: #{e.net_status[:data][:message]}"
68
71
  end
69
72
  end
70
73
  end
@@ -126,7 +126,7 @@ module Dapp
126
126
 
127
127
  def tag_should_not_be_pushed?(tag)
128
128
  registry_tags.include?(tag) && begin
129
- registry_tag_parent = registry.image_history(tag, name)['container_config']['Image']
129
+ registry_tag_parent = registry.image_parent_id(tag, name)
130
130
  registry_tag_parent == last_stage.image.built_id
131
131
  end
132
132
  end
@@ -1,20 +1,8 @@
1
1
  module Dapp
2
2
  module Dimg
3
3
  module DockerRegistry
4
- def self.new(repo)
5
- /^#{repo_name_format}$/ =~ repo
6
- expected_hostname = Regexp.last_match(:hostname)
7
- expected_repo_suffix = Regexp.last_match(:repo_suffix)
8
-
9
- if expected_hostname
10
- %w(https http).each do |protocol|
11
- expected_hostname_url = [protocol, expected_hostname].join('://')
12
- return Dimg.new(repo, expected_hostname_url, expected_repo_suffix) if hostname_exist?(expected_hostname_url)
13
- end
14
- raise ::Dapp::Dimg::Error::Registry, code: :registry_not_available, data: { registry: repo }
15
- else
16
- Default.new(repo, expected_repo_suffix)
17
- end
4
+ def self.new(dapp, repo)
5
+ Dimg.new(dapp, repo)
18
6
  end
19
7
 
20
8
  def self.repo_name_format
@@ -26,11 +14,6 @@ module Dapp
26
14
  def self.repo_name?(name)
27
15
  !(/^#{repo_name_format}$/ =~ name).nil?
28
16
  end
29
-
30
- def self.hostname_exist?(url)
31
- return false unless url
32
- Base.url_available?(url)
33
- end
34
17
  end # DockerRegistry
35
18
  end # Dimg
36
19
  end # Dapp
@@ -2,109 +2,51 @@ module Dapp
2
2
  module Dimg
3
3
  module DockerRegistry
4
4
  class Base
5
- include Request
6
- include Authorization
5
+ attr_accessor :dapp
6
+ attr_accessor :repository
7
7
 
8
- API_VERSION = 'v2'.freeze
9
-
10
- attr_accessor :repo
11
- attr_accessor :hostname_url
12
- attr_accessor :repo_suffix
13
-
14
- def initialize(repo, hostname_url, repo_suffix)
15
- self.repo = repo
16
- self.hostname_url = hostname_url
17
- self.repo_suffix = repo_suffix
18
- end
19
-
20
- def tags
21
- api_request(repo_suffix, 'tags/list')['tags'] || []
8
+ def initialize(dapp, repository)
9
+ self.dapp = dapp
10
+ self.repository = repository
22
11
  end
23
12
 
24
13
  def image_id(tag)
25
- response = manifest_v2(tag)
26
- response['config']['digest'] if response['schemaVersion'] == 2
14
+ ruby2go_docker_registry_command(command: :image_id, options: { reference: tag_reference(tag) })
27
15
  end
28
16
 
29
17
  def image_parent_id(tag)
30
- image_history(tag)['container_config']['Image']
18
+ ruby2go_docker_registry_command(command: :image_parent_id, options: { reference: tag_reference(tag) })
31
19
  end
32
20
 
33
- def image_labels(tag)
34
- image_history(tag)['config']['Labels']
21
+ def image_config(tag)
22
+ ruby2go_docker_registry_command(command: :image_config, options: { reference: tag_reference(tag) })
35
23
  end
36
24
 
37
25
  def image_delete(tag)
38
- api_request(repo_suffix, "/manifests/#{image_digest(tag)}",
39
- method: :delete,
40
- expects: [202, 404],
41
- headers: { Accept: 'application/vnd.docker.distribution.manifest.v2+json' })
26
+ digest = image_digest(tag)
27
+ ruby2go_docker_registry_command(command: :image_delete, options: { reference: digest_reference(digest) })
42
28
  end
43
29
 
44
- def image_history(tag)
45
- response = manifest_v1(tag)
46
- JSON.load(response['history'].first['v1Compatibility'])
47
- end
48
-
49
- protected
50
-
51
30
  def image_digest(tag)
52
- raw_api_request(repo_suffix, "/manifests/#{tag}",
53
- headers: { Accept: 'application/vnd.docker.distribution.manifest.v2+json' }).headers['Docker-Content-Digest']
31
+ ruby2go_docker_registry_command(command: :image_digest, options: { reference: tag_reference(tag) })
54
32
  end
55
33
 
56
- def manifest_v1(tag)
57
- api_request(repo_suffix, "/manifests/#{tag}")
58
- end
34
+ protected
59
35
 
60
- def manifest_v2(tag)
61
- api_request(repo_suffix, "/manifests/#{tag}",
62
- headers: { Accept: 'application/vnd.docker.distribution.manifest.v2+json' })
36
+ def tag_reference(tag = nil)
37
+ [self.repository.chomp("/"), tag].compact.join(":")
63
38
  end
64
39
 
65
- def api_request(*uri, **options)
66
- JSON.load(raw_api_request(*uri, **options).body)
40
+ def digest_reference(digest = nil)
41
+ [self.repository.chomp("/"), digest].compact.join("@")
67
42
  end
68
43
 
69
- def raw_api_request(*uri, **options)
70
- url = api_url(*uri)
71
- request(url, **default_api_options.merge(options))
72
- rescue Excon::Error::MethodNotAllowed
73
- raise ::Dapp::Dimg::DockerRegistry::Error::Base, code: :method_not_allowed, data: { url: url, registry: api_url, method: options[:method] }
74
- rescue Excon::Error::NotFound
75
- raise ::Dapp::Dimg::DockerRegistry::Error::ImageNotFound.new(url, api_url)
76
- rescue Excon::Error::Unauthorized
77
- user_not_authorized!
78
- rescue Excon::Error => err
79
- if err.is_a? Excon::Error::BadRequest
80
- response_data = (JSON.load(err.response.body) rescue nil)
81
- if response_data
82
- (response_data["errors"] || []).each do |err_data|
83
- if err_data["code"] == "MANIFEST_INVALID"
84
- raise ::Dapp::Dimg::DockerRegistry::Error::ManifestInvalid.new(url, api_url, "#{err.response.status_line.strip}: #{err.response.reason_phrase.strip}: #{err.response.body.strip}")
85
- end
86
- end
87
- end
44
+ def ruby2go_docker_registry_command(command:, **options)
45
+ (options[:options] ||= {}).merge!(host_docker_config_dir: dapp.class.host_docker_config_dir)
46
+ dapp.ruby2go_docker_registry(command: command, **options).tap do |res|
47
+ raise Error::Registry, code: :ruby2go_docker_registry_command_failed_unexpected_error, data: { command: command, message: res["error"] } unless res["error"].nil?
48
+ break res['data']
88
49
  end
89
-
90
- raise(::Dapp::Dimg::DockerRegistry::Error::Base,
91
- code: :unknown_error,
92
- data: { url: url,
93
- registry: api_url,
94
- message: "#{err.response.status_line.strip}: #{err.response.reason_phrase.strip}: #{err.response.body.strip}" }
95
- )
96
- end
97
-
98
- def api_url(*uri)
99
- File.join(hostname_url, API_VERSION, '/', *uri)
100
- end
101
-
102
- def default_api_options
103
- { expects: [200] }
104
- end
105
-
106
- def user_not_authorized!
107
- raise ::Dapp::Dimg::DockerRegistry::Error::Base, code: :user_not_authorized, data: { registry: api_url }
108
50
  end
109
51
  end
110
52
  end # DockerRegistry
@@ -3,54 +3,60 @@ module Dapp
3
3
  module DockerRegistry
4
4
  class Dimg < Base
5
5
  def dimgstages_tags
6
- tags.select { |tag| tag.start_with?('dimgstage') }
6
+ tags_wrapper do
7
+ ruby2go_docker_registry_command(command: :dimgstage_tags, options: { reference: tag_reference })
8
+ end
7
9
  end
8
10
 
9
11
  def dimg_tags(dimg_name)
10
- with_repo_suffix(dimg_name.to_s) { tags }
12
+ tags_wrapper do
13
+ with_dimg_repository(dimg_name.to_s) do
14
+ ruby2go_docker_registry_command(command: :dimg_tags, options: { reference: tag_reference })
15
+ end
16
+ end
11
17
  end
12
18
 
13
19
  def nameless_dimg_tags
14
- tags.select { |tag| !tag.start_with?('dimgstage') }
20
+ tags_wrapper do
21
+ ruby2go_docker_registry_command(command: :dimg_tags, options: { reference: tag_reference })
22
+ end
15
23
  end
16
24
 
17
- def tags
18
- super
19
- rescue ::Dapp::Dimg::DockerRegistry::Error::Base => e
20
- raise unless e.net_status[:code] == :page_not_found
25
+ def tags_wrapper
26
+ yield || []
27
+ rescue Error::Registry => e
28
+ raise unless e.net_status[:data][:message].include?("NAME_UNKNOWN")
21
29
  []
22
30
  end
23
31
 
24
- def image_id(tag, extra_repo_suffix = nil)
25
- with_repo_suffix(extra_repo_suffix.to_s) { super(tag) }
32
+ def image_id(tag, dimg_repository = nil)
33
+ with_dimg_repository(dimg_repository.to_s) { super(tag) }
26
34
  end
27
35
 
28
- def image_parent_id(tag, extra_repo_suffix = nil)
29
- with_repo_suffix(extra_repo_suffix.to_s) { super(tag) }
36
+ def image_parent_id(tag, dimg_repository = nil)
37
+ with_dimg_repository(dimg_repository.to_s) { super(tag) }
30
38
  end
31
39
 
32
- def image_labels(tag, extra_repo_suffix = nil)
33
- with_repo_suffix(extra_repo_suffix.to_s) { super(tag) }
40
+ def image_config(tag, dimg_repository = nil)
41
+ with_dimg_repository(dimg_repository.to_s) { super(tag) }
34
42
  end
35
43
 
36
- def image_delete(tag, extra_repo_suffix = nil)
37
- with_repo_suffix(extra_repo_suffix.to_s) { super(tag) }
44
+ def image_delete(tag, dimg_repository = nil)
45
+ with_dimg_repository(dimg_repository.to_s) { super(tag) }
38
46
  end
39
47
 
40
- def image_history(tag, extra_repo_suffix = nil)
41
- with_repo_suffix(extra_repo_suffix.to_s) do
42
- (@image_history ||= {})[[repo_suffix, tag]] ||= super(tag)
43
- end
48
+ def image_digest(tag, dimg_repository = nil)
49
+ with_dimg_repository(dimg_repository.to_s) { super(tag) }
44
50
  end
45
51
 
46
52
  protected
47
53
 
48
- def with_repo_suffix(extra_repo_suffix)
49
- old_repo_suffix = repo_suffix
50
- @repo_suffix = File.join(repo_suffix, extra_repo_suffix)
54
+ def with_dimg_repository(dimg_repository)
55
+ old_repository = repository
56
+ @repository = File.join(old_repository, dimg_repository)
51
57
  yield
52
58
  ensure
53
- @repo_suffix = old_repo_suffix
59
+ @repository = old_repository
54
60
  end
55
61
  end
56
62
  end # DockerRegistry
@@ -85,7 +85,7 @@ module Dapp
85
85
  docker_image_id = TEMPLATE_EMPTY_VALUE
86
86
  unless fake || without_registry
87
87
  begin
88
- dimg_labels = dapp.dimg_registry(repo).image_labels(docker_tag, dimg.name)
88
+ dimg_labels = dapp.dimg_registry(repo).image_config(docker_tag, dimg.name)["config"]["Labels"]
89
89
  docker_image_id = dapp.dimg_registry(repo).image_id(docker_tag, dimg.name)
90
90
  rescue ::Dapp::Dimg::Error::Registry => err
91
91
  unless disable_warnings
@@ -50,11 +50,12 @@ module Dapp
50
50
 
51
51
  dapp.log_step("[#{Time.now}] Poll deployment '#{d.name}' status")
52
52
  dapp.with_log_indent do
53
- dapp.log_info("Replicas: #{_field_value_for_log(d.status['replicas'])}")
54
- dapp.log_info("Updated replicas: #{_field_value_for_log(d.status['updatedReplicas'])}")
55
- dapp.log_info("Available replicas: #{_field_value_for_log(d.status['availableReplicas'])}")
56
- dapp.log_info("Unavailable replicas: #{_field_value_for_log(d.status['unavailableReplicas'])}")
53
+ dapp.log_info("Target replicas: #{_field_value_for_log(d.replicas)}")
54
+ dapp.log_info("Updated replicas: #{_field_value_for_log(d.status['updatedReplicas'])} / #{_field_value_for_log(d.replicas)}")
55
+ dapp.log_info("Available replicas: #{_field_value_for_log(d.status['availableReplicas'])} / #{_field_value_for_log(d.replicas)}")
57
56
  dapp.log_info("Ready replicas: #{_field_value_for_log(d.status['readyReplicas'])} / #{_field_value_for_log(d.replicas)}")
57
+ dapp.log_info("Old deployment.kubernetes.io/revision: #{_field_value_for_log(@revision_before_deploy)}")
58
+ dapp.log_info("Current deployment.kubernetes.io/revision: #{_field_value_for_log(d_revision)}")
58
59
  end
59
60
 
60
61
  rs = nil
@@ -83,16 +84,6 @@ module Dapp
83
84
  end
84
85
 
85
86
  if rs
86
- dapp.with_log_indent do
87
- dapp.log_step("Current ReplicaSet '#{rs.name}' status")
88
- dapp.with_log_indent do
89
- dapp.log_info("Replicas: #{_field_value_for_log(rs.status['replicas'])}")
90
- dapp.log_info("Fully labeled replicas: #{_field_value_for_log(rs.status['fullyLabeledReplicas'])}")
91
- dapp.log_info("Available replicas: #{_field_value_for_log(rs.status['availableReplicas'])}")
92
- dapp.log_info("Ready replicas: #{_field_value_for_log(rs.status['readyReplicas'])} / #{_field_value_for_log(d.replicas)}")
93
- end
94
- end
95
-
96
87
  # Pod'ы связанные с активным ReplicaSet
97
88
  rs_pods = dapp.kubernetes.pod_list['items']
98
89
  .map {|spec| Kubernetes::Client::Resource::Pod.new(spec)}
@@ -177,14 +168,19 @@ module Dapp
177
168
  end # with_log_indent
178
169
  end
179
170
 
180
- # break only when rs is not nil
181
-
182
- if d_revision && d.replicas && d.replicas == 0
183
- break
184
- end
185
-
186
- if d_revision && d.replicas && rs
187
- break if is_deployment_ready(d) && is_replicaset_ready(d, rs)
171
+ if d_revision && d.replicas
172
+ if d.replicas == 0
173
+ break
174
+ else
175
+ break if begin
176
+ d.status['updatedReplicas'] &&
177
+ d.status['availableReplicas'] &&
178
+ d.status['readyReplicas'] &&
179
+ (d.status['updatedReplicas'] >= d.replicas) &&
180
+ (d.status['availableReplicas'] >= d.replicas) &&
181
+ (d.status['readyReplicas'] >= d.replicas)
182
+ end
183
+ end
188
184
  end
189
185
 
190
186
  sleep 5
@@ -193,14 +189,6 @@ module Dapp
193
189
  end
194
190
  end
195
191
 
196
- def is_deployment_ready(d)
197
- d.status.key?("readyReplicas") && d.status["readyReplicas"] >= d.replicas
198
- end
199
-
200
- def is_replicaset_ready(d, rs)
201
- rs.status.key?("readyReplicas") && rs.status["readyReplicas"] >= d.replicas
202
- end
203
-
204
192
  private
205
193
 
206
194
  def _field_value_for_log(value)
@@ -1,4 +1,4 @@
1
1
  module Dapp
2
- VERSION = "0.34.7"
2
+ VERSION = "0.35.0"
3
3
  BUILD_CACHE_VERSION = 31
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dapp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.34.7
4
+ version: 0.35.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitry Stolyarov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-08 00:00:00.000000000 Z
11
+ date: 2018-09-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mixlib-shellout
@@ -627,11 +627,7 @@ files:
627
627
  - lib/dapp/dimg/dimg/stages.rb
628
628
  - lib/dapp/dimg/docker_registry.rb
629
629
  - lib/dapp/dimg/docker_registry/base.rb
630
- - lib/dapp/dimg/docker_registry/base/authorization.rb
631
- - lib/dapp/dimg/docker_registry/base/request.rb
632
- - lib/dapp/dimg/docker_registry/default.rb
633
630
  - lib/dapp/dimg/docker_registry/dimg.rb
634
- - lib/dapp/dimg/docker_registry/error.rb
635
631
  - lib/dapp/dimg/error/build.rb
636
632
  - lib/dapp/dimg/error/chef.rb
637
633
  - lib/dapp/dimg/error/default.rb
@@ -744,7 +740,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
744
740
  version: 2.5.0
745
741
  requirements: []
746
742
  rubyforge_project:
747
- rubygems_version: 2.7.6
743
+ rubygems_version: 2.7.7
748
744
  signing_key:
749
745
  specification_version: 4
750
746
  summary: Build docker packaged apps using chef or shell
@@ -1,69 +0,0 @@
1
- module Dapp
2
- module Dimg
3
- module DockerRegistry
4
- class Base
5
- module Authorization
6
- def authorization_options(url, method:)
7
- (@authorization_options ||= {})[[@repo_suffix, method]] ||= begin
8
- case authenticate_header = raw_request(url, method: method).headers['Www-Authenticate']
9
- when /Bearer/ then { headers: { Authorization: "Bearer #{authorization_token(authenticate_header)}" } }
10
- when /Basic/ then { headers: { Authorization: "Basic #{authorization_auth}" } }
11
- when nil then {}
12
- else raise ::Dapp::Dimg::DockerRegistry::Error::Base, code: :authenticate_type_not_supported, data: { registry: api_url }
13
- end
14
- end
15
- end
16
-
17
- def authorization_token(authenticate_header)
18
- options = parse_authenticate_header(authenticate_header)
19
- realm = options.delete(:realm)
20
- begin
21
- response = raw_request(realm, headers: { Authorization: "Basic #{authorization_auth}" }, query: options, expects: [200])
22
- rescue ::Dapp::Dimg::DockerRegistry::Error::Base
23
- raise unless (response = raw_request(realm, query: options)).status == 200
24
- end
25
- JSON.load(response.body)['token']
26
- end
27
-
28
- def parse_authenticate_header(header)
29
- [:realm, :service, :scope].map do |option|
30
- /#{option}="([[^"].]*)/ =~ header
31
- next unless Regexp.last_match(1)
32
- [option, Regexp.last_match(1)]
33
- end.compact.to_h
34
- end
35
-
36
- def authorization_auth
37
- @authorization_auth ||= begin
38
- if ::Dapp::Dapp.options_with_docker_credentials?
39
- Base64.strict_encode64(::Dapp::Dapp.docker_credentials.join(':'))
40
- else
41
- auths = auths_section_from_docker_config
42
- r = repo
43
- loop do
44
- break unless r.include?('/') && !auths.keys.any? { |auth| auth.start_with?(r) }
45
- r = chomp_name(r)
46
- end
47
- credential = (auths[r] || auths.find { |repo, _| repo == r })
48
- user_not_authorized! if credential.nil?
49
- credential['auth']
50
- end
51
- end
52
- end
53
-
54
- def auths_section_from_docker_config
55
- file = Pathname(File.join(::Dapp::Dapp.host_docker_config_dir, 'config.json'))
56
- user_not_authorized! unless file.exist?
57
- JSON.load(file.read)['auths'].tap { |auths| user_not_authorized! if auths.nil? }
58
- end
59
-
60
- private
61
-
62
- def chomp_name(r)
63
- r.split('/')[0..-2].join('/')
64
- end
65
- end
66
- end # Base
67
- end # DockerRegistry
68
- end # Dimg
69
- end # Dapp
@@ -1,34 +0,0 @@
1
- module Dapp
2
- module Dimg
3
- module DockerRegistry
4
- class Base
5
- module Request
6
- def self.included(base)
7
- base.extend(self)
8
- end
9
-
10
- def request(url, **options)
11
- raw_request(url, options.in_depth_merge(authorization_options(url, method: options[:method] || :get)))
12
- end
13
-
14
- def raw_request(url, **options)
15
- Excon.new(url).request(default_request_options.in_depth_merge(options))
16
- end
17
-
18
- def url_available?(url)
19
- raw_request(url, expects: [200])
20
- true
21
- rescue Excon::Error
22
- false
23
- end
24
-
25
- protected
26
-
27
- def default_request_options
28
- { method: :get, omit_default_port: true }
29
- end
30
- end
31
- end # Base
32
- end # DockerRegistry
33
- end # Dimg
34
- end # Dapp
@@ -1,18 +0,0 @@
1
- module Dapp
2
- module Dimg
3
- module DockerRegistry
4
- class Default < Dimg
5
- DEFAULT_HOSTNAME_URL = 'https://registry.hub.docker.com'.freeze
6
-
7
- def initialize(repo, repo_suffix)
8
- super(repo, DEFAULT_HOSTNAME_URL, repo_suffix)
9
- end
10
-
11
- def repo_suffix=(val)
12
- val = "library/#{val}" if val.split('/').one?
13
- super(val)
14
- end
15
- end
16
- end
17
- end # Dimg
18
- end # Dapp
@@ -1,25 +0,0 @@
1
- module Dapp
2
- module Dimg
3
- module DockerRegistry
4
- module Error
5
- class Base < ::Dapp::Dimg::Error::Registry
6
- def initialize(**net_status)
7
- super(**net_status, context: :registry)
8
- end
9
- end
10
-
11
- class ManifestInvalid < Base
12
- def initialize(url, registry, response_body)
13
- super(code: :manifest_invalid, data: {url: url, registry: registry, response_body: response_body})
14
- end
15
- end
16
-
17
- class ImageNotFound < Base
18
- def initialize(url, registry)
19
- super(code: :page_not_found, data: { url: url, registry: registry })
20
- end
21
- end
22
- end # Error
23
- end # DockerRegistry
24
- end # Dimg
25
- end # Dapp