dapp 0.34.7 → 0.35.0

Sign up to get free protection for your applications and to get access to all the features.
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