kitchen-dokken 2.19.0 → 2.20.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: becf7bcb14b565a4e38ef71339232b99d6cb2196918462f66007d77efcc49e62
4
- data.tar.gz: e68938ec9d01a83c72456b3fd51c0af5ec0d81e9092695b11df9e487bfde8fc0
3
+ metadata.gz: 7968068f2971454ab8aae38e6a448c513bb094b908fdbd98272b545ed4eb84ed
4
+ data.tar.gz: cff7edf63103c4337eddd245b1ee8a247516c1cb67c45d14747e143b652d1522
5
5
  SHA512:
6
- metadata.gz: fbac5749ab791a90968ccfd9ff5d11667ea8d5ad9801146a451cd8fe979db215460506e4a8810bc7b2a8129213a321665f9c5fc26bc461c0135427eff6648da7
7
- data.tar.gz: d26c39d6be05058de8e86ff9c10cf8576fc44ea1999f55c8bc0c1b9b6c013abcda5103233f48a788e2164ed9c5cb49928b3947674adccc26ce500998c6f96e6a
6
+ metadata.gz: 3b82a6d24f3ceb8619c8ee4ac3b0f72156efa678dead489fbe812ae3bb8114a864a89ed794aa70dd0a5e7d0f94daf7cd7cdabbca69302c8df0f1ef9f9e4af2a3
7
+ data.tar.gz: be4ebb93a209623830ec4333d82dd82d845ae1e5077c65a60a5bb771665eef897d97d8c84536e21c498a2ef6722357cacd40d0e7691ce9ba852a624a8edd774b
data/Gemfile ADDED
@@ -0,0 +1,19 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in kitchen-dokken.gemspec
4
+ gemspec
5
+
6
+ group :test do
7
+ gem "berkshelf"
8
+ gem "kitchen-inspec"
9
+ gem "rake", ">= 11.0"
10
+ end
11
+
12
+ group :development do
13
+ gem "pry"
14
+ gem "pry-byebug"
15
+ end
16
+
17
+ group :chefstyle do
18
+ gem "chefstyle", "2.2.3"
19
+ end
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+ require "chefstyle"
3
+ require "rubocop/rake_task"
4
+
5
+ RuboCop::RakeTask.new(:style) do |task|
6
+ task.options += ["--display-cop-names", "--no-color"]
7
+ end
8
+
9
+ task default: %i{style}
@@ -0,0 +1,23 @@
1
+ lib = File.expand_path("lib", __dir__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require "kitchen/driver/dokken_version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "kitchen-dokken"
7
+ spec.version = Kitchen::Driver::DOKKEN_VERSION
8
+ spec.authors = ["Sean OMeara"]
9
+ spec.email = ["sean@sean.io"]
10
+ spec.description = "A Test Kitchen Driver for Docker & Chef Infra optimized for rapid testing using Chef Infra docker images"
11
+ spec.summary = "A Test Kitchen Driver for Docker & Chef Infra optimized for rapid testing using Chef Infra docker images"
12
+ spec.homepage = "https://github.com/test-kitchen/kitchen-dokken"
13
+ spec.license = "Apache-2.0"
14
+
15
+ spec.files = %w{LICENSE kitchen-dokken.gemspec Gemfile Rakefile} + Dir.glob("lib/**/*")
16
+ spec.require_paths = ["lib"]
17
+
18
+ spec.required_ruby_version = ">= 2.7"
19
+
20
+ spec.add_dependency "docker-api", ">= 1.33", "< 3"
21
+ spec.add_dependency "lockfile", "~> 2.1"
22
+ spec.add_dependency "test-kitchen", ">= 1.15", "< 4"
23
+ end
@@ -69,6 +69,7 @@ module Kitchen
69
69
  default_config :userns_host, false
70
70
  default_config :volumes, nil
71
71
  default_config :write_timeout, 3600
72
+ default_config :user_ns_mode, nil
72
73
  default_config :creds_file, nil
73
74
  default_config :docker_config_creds, false
74
75
 
@@ -90,7 +91,7 @@ module Kitchen
90
91
  # data
91
92
  dokken_create_sandbox
92
93
 
93
- if remote_docker_host?
94
+ if remote_docker_host? || running_inside_docker?
94
95
  make_data_image
95
96
  start_data_container state
96
97
  end
@@ -106,7 +107,7 @@ module Kitchen
106
107
  end
107
108
 
108
109
  def destroy(_state)
109
- if remote_docker_host?
110
+ if remote_docker_host? || running_inside_docker?
110
111
  stop_data_container
111
112
  delete_data_container
112
113
  end
@@ -232,15 +233,13 @@ module Kitchen
232
233
  end
233
234
 
234
235
  def work_image
235
- return "#{image_prefix}/#{instance_name}" unless image_prefix.nil?
236
-
237
- instance_name
236
+ [image_prefix, instance_name].compact.join("/").downcase
238
237
  end
239
238
 
240
239
  def dokken_binds
241
240
  ret = []
242
- ret << "#{dokken_kitchen_sandbox}:/opt/kitchen" unless dokken_kitchen_sandbox.nil? || remote_docker_host?
243
- ret << "#{dokken_verifier_sandbox}:/opt/verifier" unless dokken_verifier_sandbox.nil? || remote_docker_host?
241
+ ret << "#{dokken_kitchen_sandbox}:/opt/kitchen" unless dokken_kitchen_sandbox.nil? || remote_docker_host? || running_inside_docker?
242
+ ret << "#{dokken_verifier_sandbox}:/opt/verifier" unless dokken_verifier_sandbox.nil? || remote_docker_host? || running_inside_docker?
244
243
  ret << Array(config[:binds]) unless config[:binds].nil?
245
244
  ret.flatten
246
245
  end
@@ -289,7 +288,7 @@ module Kitchen
289
288
  def dokken_volumes_from
290
289
  ret = []
291
290
  ret << chef_container_name
292
- ret << data_container_name if remote_docker_host?
291
+ ret << data_container_name if remote_docker_host? || running_inside_docker?
293
292
  ret
294
293
  end
295
294
 
@@ -337,6 +336,15 @@ module Kitchen
337
336
  if self[:userns_host]
338
337
  config["HostConfig"]["UsernsMode"] = "host"
339
338
  end
339
+
340
+ if self[:privileged]
341
+ if self[:user_ns_mode] != "host"
342
+ debug "driver - privileged mode is not supported with user namespaces enabled"
343
+ debug "driver - changing UsernsMode from '#{self[:user_ns_mode]}' to 'host'"
344
+ end
345
+ config["HostConfig"]["UsernsMode"] = "host"
346
+ end
347
+
340
348
  runner_container = run_container(config)
341
349
  state[:runner_container] = runner_container.json
342
350
  end
@@ -441,11 +449,23 @@ module Kitchen
441
449
  @docker_config_creds = {}
442
450
  config_file = ::File.join(::Dir.home, ".docker", "config.json")
443
451
  if ::File.exist?(config_file)
444
- JSON.load_file!(config_file)["auths"].each do |k, v|
445
- next if v["auth"].nil?
452
+ config = JSON.load_file!(config_file)
453
+ if config["auths"]
454
+ config["auths"].each do |k, v|
455
+ next if v["auth"].nil?
456
+
457
+ username, password = Base64.decode64(v["auth"]).split(":")
458
+ @docker_config_creds[k] = { serveraddress: k, username: username, password: password }
459
+ end
460
+ end
446
461
 
447
- username, password = Base64.decode64(v["auth"]).split(":")
448
- @docker_config_creds[k] = { serveraddress: k, username: username, password: password }
462
+ if config["credHelpers"]
463
+ config["credHelpers"].each do |k, v|
464
+ @docker_config_creds[k] = Proc.new do
465
+ c = JSON.parse(`echo #{k} | docker-credential-#{v} get`)
466
+ { serveraddress: c["ServerURL"], username: c["Username"], password: c["Secret"] }
467
+ end
468
+ end
449
469
  end
450
470
  else
451
471
  debug("~/.docker/config.json does not exist")
@@ -462,7 +482,8 @@ module Kitchen
462
482
  # NOTE: Try to use DockerHub auth if exact registry match isn't found
463
483
  default_registry = "https://index.docker.io/v1/"
464
484
  if docker_config_creds.key?(image_registry)
465
- docker_config_creds[image_registry]
485
+ c = docker_config_creds[image_registry]
486
+ c.respond_to?(:call) ? c.call : c
466
487
  elsif docker_config_creds.key?(default_registry)
467
488
  docker_config_creds[default_registry]
468
489
  end
@@ -18,6 +18,6 @@
18
18
  module Kitchen
19
19
  module Driver
20
20
  # Version string for Dokken Kitchen driver
21
- DOKKEN_VERSION = "2.19.0".freeze
21
+ DOKKEN_VERSION = "2.20.0".freeze
22
22
  end
23
23
  end
@@ -3,6 +3,7 @@ module Dokken
3
3
  # https://stackoverflow.com/questions/517219/ruby-see-if-a-port-is-open
4
4
  require "socket" unless defined?(Socket)
5
5
  require "timeout" unless defined?(Timeout)
6
+ require "resolv" unless defined?(Resolv)
6
7
 
7
8
  def port_open?(ip, port)
8
9
  begin
@@ -170,7 +171,7 @@ module Dokken
170
171
 
171
172
  def instance_name
172
173
  prefix = (Digest::SHA2.hexdigest FileUtils.pwd)[0, 10]
173
- "#{prefix}-#{instance.name}"
174
+ "#{prefix}-#{instance.name}".downcase
174
175
  end
175
176
 
176
177
  def exposed_ports
@@ -268,6 +269,17 @@ module Dokken
268
269
  false
269
270
  end
270
271
 
272
+ def running_inside_docker?
273
+ File.file?("/.dockerenv")
274
+ end
275
+
276
+ def running_inside_docker_desktop?
277
+ Resolv.getaddress "host.docker.internal."
278
+ true
279
+ rescue
280
+ false
281
+ end
282
+
271
283
  def sandbox_path
272
284
  "#{Dir.home}/.dokken/verifier_sandbox/#{instance_name}"
273
285
  end
@@ -300,7 +312,7 @@ module Kitchen
300
312
 
301
313
  def instance_name
302
314
  prefix = (Digest::SHA2.hexdigest FileUtils.pwd)[0, 10]
303
- "#{prefix}-#{instance.name}"
315
+ "#{prefix}-#{instance.name}".downcase
304
316
  end
305
317
  end
306
318
  end
@@ -322,7 +334,7 @@ module Kitchen
322
334
 
323
335
  def instance_name
324
336
  prefix = (Digest::SHA2.hexdigest FileUtils.pwd)[0, 10]
325
- "#{prefix}-#{instance.name}"
337
+ "#{prefix}-#{instance.name}".downcase
326
338
  end
327
339
 
328
340
  def call(state)
@@ -58,7 +58,7 @@ module Kitchen
58
58
  create_sandbox
59
59
  write_run_command(run_command)
60
60
  instance.transport.connection(state) do |conn|
61
- if remote_docker_host?
61
+ if remote_docker_host? || running_inside_docker?
62
62
  info("Transferring files to #{instance.to_str}")
63
63
  conn.upload(sandbox_dirs, config[:root_path])
64
64
  end
@@ -43,8 +43,15 @@ module Kitchen
43
43
  default_config :docker_host_url, default_docker_host
44
44
  default_config :read_timeout, 3600
45
45
  default_config :write_timeout, 3600
46
+ default_config :login_command, "docker"
46
47
  default_config :host_ip_override do |transport|
47
- transport.docker_for_mac_or_win? ? "localhost" : false
48
+ if running_inside_docker_desktop?
49
+ "host.docker.internal"
50
+ elsif transport.docker_for_mac_or_win?
51
+ "localhost"
52
+ else
53
+ false
54
+ end
48
55
  end
49
56
 
50
57
  # (see Base#connection)
@@ -172,7 +179,7 @@ module Kitchen
172
179
  cols = `tput cols`
173
180
  lines = `tput lines`
174
181
  args = ["exec", "-e", "COLUMNS=#{cols}", "-e", "LINES=#{lines}", "-it", @runner, "/bin/bash", "-login", "-i"]
175
- LoginCommand.new("docker", args)
182
+ LoginCommand.new(options[:login_command], args)
176
183
  end
177
184
 
178
185
  private
@@ -211,7 +218,7 @@ module Kitchen
211
218
  #
212
219
  # @return [TrueClass,FalseClass]
213
220
  def docker_for_mac_or_win?
214
- ::Docker.info(::Docker::Connection.new(config[:docker_host_url], {}))["Name"] == "moby"
221
+ ::Docker.info(::Docker::Connection.new(config[:docker_host_url], {}))["Name"] == "docker-desktop"
215
222
  rescue
216
223
  false
217
224
  end
@@ -233,6 +240,7 @@ module Kitchen
233
240
  opts[:data_container] = data[:data_container]
234
241
  opts[:instance_name] = data[:instance_name]
235
242
  opts[:timeout] = data[:write_timeout]
243
+ opts[:login_command] = data[:login_command]
236
244
  opts
237
245
  end
238
246
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kitchen-dokken
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.19.0
4
+ version: 2.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean OMeara
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-27 00:00:00.000000000 Z
11
+ date: 2023-11-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: docker-api
@@ -72,7 +72,10 @@ executables: []
72
72
  extensions: []
73
73
  extra_rdoc_files: []
74
74
  files:
75
+ - Gemfile
75
76
  - LICENSE
77
+ - Rakefile
78
+ - kitchen-dokken.gemspec
76
79
  - lib/kitchen/driver/dokken.rb
77
80
  - lib/kitchen/driver/dokken_version.rb
78
81
  - lib/kitchen/helpers.rb
@@ -97,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
97
100
  - !ruby/object:Gem::Version
98
101
  version: '0'
99
102
  requirements: []
100
- rubygems_version: 3.2.33
103
+ rubygems_version: 3.4.10
101
104
  signing_key:
102
105
  specification_version: 4
103
106
  summary: A Test Kitchen Driver for Docker & Chef Infra optimized for rapid testing