kitchen-dokken 2.19.1 → 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: be2c8c44ba41e769729ee777daf91a2d2392c923b350f8fc359305deb75c8ae6
4
- data.tar.gz: fe6adeaea1645fc26ab1117de9af06e2a212483f782d62da01a77634d03c18e3
3
+ metadata.gz: 7968068f2971454ab8aae38e6a448c513bb094b908fdbd98272b545ed4eb84ed
4
+ data.tar.gz: cff7edf63103c4337eddd245b1ee8a247516c1cb67c45d14747e143b652d1522
5
5
  SHA512:
6
- metadata.gz: c26fc34a7c0f00c29031300be0d2d4af57fe2b3987fe543d2630588c917c4b1adef8252d737c01adc031a3a2e4329e0d5ae1a0a2291d4714f5146faffe3eb9a9
7
- data.tar.gz: 4c7235960fda3df63e8111c6a0e02ee79a3c50de37582c442b525cf61dbb685637378b8804b27075c1989e7a7929131cc922786d5ba4800116ae8e7641d085f4
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.1".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
@@ -45,7 +45,13 @@ module Kitchen
45
45
  default_config :write_timeout, 3600
46
46
  default_config :login_command, "docker"
47
47
  default_config :host_ip_override do |transport|
48
- 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
49
55
  end
50
56
 
51
57
  # (see Base#connection)
@@ -212,7 +218,7 @@ module Kitchen
212
218
  #
213
219
  # @return [TrueClass,FalseClass]
214
220
  def docker_for_mac_or_win?
215
- ::Docker.info(::Docker::Connection.new(config[:docker_host_url], {}))["Name"] == "moby"
221
+ ::Docker.info(::Docker::Connection.new(config[:docker_host_url], {}))["Name"] == "docker-desktop"
216
222
  rescue
217
223
  false
218
224
  end
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.1
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: 2023-02-07 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.3.3
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