kitchen-dokken 2.12.0 → 2.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/kitchen/driver/dokken.rb +58 -27
- data/lib/kitchen/driver/dokken_version.rb +1 -1
- data/lib/kitchen/helpers.rb +18 -0
- data/lib/kitchen/provisioner/dokken.rb +2 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d549607487cae2cf1d58c9fadfed6e5c0649d085b27dc0841abf32d4a23670df
|
4
|
+
data.tar.gz: 4be3556b19ae6795d6c70d196913ed79f7d14971dc386f539a0321683ecdf49b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee6f97ad4f722b828f9d0508a69224ef7ae4514b39280a3c84ae14351626939e04d7fdae779c4280efcc4d88210a37fad02dab74ad638432d8aa1e929e40e1e7
|
7
|
+
data.tar.gz: 5035e7f732b10ed7f9407555d612441c509985acd6d33d577d23c02c0529cd80be0f93c2c668fc0355135ed765e9844d075adfaf417de441a501858588042e2a
|
@@ -48,7 +48,10 @@ module Kitchen
|
|
48
48
|
default_config :entrypoint, nil
|
49
49
|
default_config :env, nil
|
50
50
|
default_config :hostname, "dokken"
|
51
|
+
default_config :hostname_aliases, nil
|
51
52
|
default_config :image_prefix, nil
|
53
|
+
default_config :ipv6, false
|
54
|
+
default_config :ipv6_subnet, "2001:db8:1::/64" # "2001:db8::/32 Range reserved for documentation"
|
52
55
|
default_config :links, nil
|
53
56
|
default_config :memory_limit, 0
|
54
57
|
default_config :network_mode, "dokken"
|
@@ -169,8 +172,10 @@ module Kitchen
|
|
169
172
|
end
|
170
173
|
|
171
174
|
def work_image_dockerfile
|
175
|
+
from = registry_image_path(platform_image)
|
176
|
+
debug("driver - Building work image from #{from}")
|
172
177
|
dockerfile_contents = [
|
173
|
-
"FROM #{
|
178
|
+
"FROM #{from}",
|
174
179
|
"LABEL X-Built-By=kitchen-dokken X-Built-From=#{platform_image}",
|
175
180
|
]
|
176
181
|
Array(config[:intermediate_instructions]).each do |c|
|
@@ -287,7 +292,8 @@ module Kitchen
|
|
287
292
|
config = {
|
288
293
|
"name" => runner_container_name,
|
289
294
|
"Cmd" => Shellwords.shellwords(self[:pid_one_command]),
|
290
|
-
|
295
|
+
# locally built image, must use short-name
|
296
|
+
"Image" => short_image_path(work_image),
|
291
297
|
"Hostname" => self[:hostname],
|
292
298
|
"Env" => self[:env],
|
293
299
|
"ExposedPorts" => exposed_ports,
|
@@ -310,7 +316,7 @@ module Kitchen
|
|
310
316
|
"NetworkingConfig" => {
|
311
317
|
"EndpointsConfig" => {
|
312
318
|
self[:network_mode] => {
|
313
|
-
"Aliases" => Array(self[:hostname]),
|
319
|
+
"Aliases" => Array(self[:hostname]).concat(Array(self[:hostname_aliases])),
|
314
320
|
},
|
315
321
|
},
|
316
322
|
},
|
@@ -329,7 +335,8 @@ module Kitchen
|
|
329
335
|
debug "driver - creating #{data_container_name}"
|
330
336
|
config = {
|
331
337
|
"name" => data_container_name,
|
332
|
-
|
338
|
+
# locally built image, must use short-name
|
339
|
+
"Image" => short_image_path(data_image),
|
333
340
|
"HostConfig" => {
|
334
341
|
"PortBindings" => port_bindings,
|
335
342
|
"PublishAllPorts" => true,
|
@@ -352,9 +359,9 @@ module Kitchen
|
|
352
359
|
begin
|
353
360
|
lockfile.lock
|
354
361
|
with_retries { ::Docker::Network.get("dokken", {}, docker_connection) }
|
355
|
-
rescue
|
362
|
+
rescue ::Docker::Error::NotFoundError
|
356
363
|
begin
|
357
|
-
with_retries { ::Docker::Network.create("dokken",
|
364
|
+
with_retries { ::Docker::Network.create("dokken", network_settings) }
|
358
365
|
rescue ::Docker::Error => e
|
359
366
|
debug "driver - error :#{e}:"
|
360
367
|
end
|
@@ -388,14 +395,14 @@ module Kitchen
|
|
388
395
|
config = {
|
389
396
|
"name" => chef_container_name,
|
390
397
|
"Cmd" => "true",
|
391
|
-
"Image" =>
|
398
|
+
"Image" => registry_image_path(chef_image),
|
392
399
|
"HostConfig" => {
|
393
400
|
"NetworkMode" => self[:network_mode],
|
394
401
|
},
|
395
402
|
}
|
396
403
|
chef_container = create_container(config)
|
397
404
|
state[:chef_container] = chef_container.json
|
398
|
-
rescue ::Docker::Error => e
|
405
|
+
rescue ::Docker::Error, StandardError => e
|
399
406
|
raise "driver - #{chef_container_name} failed to create #{e}"
|
400
407
|
end
|
401
408
|
ensure
|
@@ -404,12 +411,12 @@ module Kitchen
|
|
404
411
|
end
|
405
412
|
|
406
413
|
def pull_platform_image
|
407
|
-
debug "driver - pulling #{
|
414
|
+
debug "driver - pulling #{short_image_path(platform_image)}"
|
408
415
|
config[:pull_platform_image] ? pull_image(platform_image) : pull_if_missing(platform_image)
|
409
416
|
end
|
410
417
|
|
411
418
|
def pull_chef_image
|
412
|
-
debug "driver - pulling #{
|
419
|
+
debug "driver - pulling #{short_image_path(chef_image)}"
|
413
420
|
config[:pull_chef_image] ? pull_image(chef_image) : pull_if_missing(chef_image)
|
414
421
|
end
|
415
422
|
|
@@ -422,7 +429,7 @@ module Kitchen
|
|
422
429
|
|
423
430
|
def container_exist?(name)
|
424
431
|
return true if ::Docker::Container.get(name, {}, docker_connection)
|
425
|
-
rescue
|
432
|
+
rescue StandardError, ::Docker::Error::NotFoundError
|
426
433
|
false
|
427
434
|
end
|
428
435
|
|
@@ -440,10 +447,45 @@ module Kitchen
|
|
440
447
|
[repo, tag]
|
441
448
|
end
|
442
449
|
|
450
|
+
# Return the 'repo' half of a docker image path. Agnostic about if a
|
451
|
+
# registry is included, this effectively is just "before the colon"
|
452
|
+
#
|
453
|
+
# @param image [String] the docker image path to parse
|
454
|
+
# @return [String] the repo portion of `image`
|
443
455
|
def repo(image)
|
444
456
|
parse_image_name(image)[0]
|
445
457
|
end
|
446
458
|
|
459
|
+
# Return the 'tag' of a docker image path. Will be `latest` if there
|
460
|
+
# is no explicit tag in the image path.
|
461
|
+
#
|
462
|
+
# @param image [String] the docker image path to parse
|
463
|
+
# @return [String] the tag of `image`
|
464
|
+
def tag(image)
|
465
|
+
parse_image_name(image)[1]
|
466
|
+
end
|
467
|
+
|
468
|
+
# Ensures an explicit tag on an image path.
|
469
|
+
#
|
470
|
+
# @param image [String] the docker image path to parse
|
471
|
+
# @return [String] `repo`:`tag`
|
472
|
+
def short_image_path(image)
|
473
|
+
"#{repo(image)}:#{tag(image)}"
|
474
|
+
end
|
475
|
+
|
476
|
+
# Qualifies the results of `short_image_path` with any registry the
|
477
|
+
# user has requested
|
478
|
+
#
|
479
|
+
# @param image [String] the docker image path to parse
|
480
|
+
# @return [String] The most fully-qualified registry path we cn make
|
481
|
+
def registry_image_path(image)
|
482
|
+
if config[:docker_registry]
|
483
|
+
"#{config[:docker_registry]}/#{short_image_path(image)}"
|
484
|
+
else
|
485
|
+
short_image_path(image)
|
486
|
+
end
|
487
|
+
end
|
488
|
+
|
447
489
|
def create_container(args)
|
448
490
|
with_retries { @container = ::Docker::Container.get(args["name"], {}, docker_connection) }
|
449
491
|
rescue
|
@@ -511,10 +553,6 @@ module Kitchen
|
|
511
553
|
end
|
512
554
|
end
|
513
555
|
|
514
|
-
def tag(image)
|
515
|
-
parse_image_name(image)[1]
|
516
|
-
end
|
517
|
-
|
518
556
|
def chef_container_name
|
519
557
|
"chef-#{chef_version}"
|
520
558
|
end
|
@@ -547,7 +585,7 @@ module Kitchen
|
|
547
585
|
end
|
548
586
|
|
549
587
|
def pull_if_missing(image)
|
550
|
-
return if ::Docker::Image.exist?(
|
588
|
+
return if ::Docker::Image.exist?(registry_image_path(image), {}, docker_connection)
|
551
589
|
|
552
590
|
pull_image image
|
553
591
|
end
|
@@ -557,21 +595,14 @@ module Kitchen
|
|
557
595
|
val.sub(%r{https?://}, "").split("/").first
|
558
596
|
end
|
559
597
|
|
560
|
-
def image_path(image)
|
561
|
-
fqimage = "#{repo(image)}:#{tag(image)}"
|
562
|
-
if config[:docker_registry]
|
563
|
-
fqimage = "#{config[:docker_registry]}/#{fqimage}"
|
564
|
-
end
|
565
|
-
fqimage
|
566
|
-
end
|
567
|
-
|
568
598
|
def pull_image(image)
|
599
|
+
path = registry_image_path(image)
|
569
600
|
with_retries do
|
570
|
-
if Docker::Image.exist?(
|
571
|
-
original_image = Docker::Image.get(
|
601
|
+
if Docker::Image.exist?(path, {}, docker_connection)
|
602
|
+
original_image = Docker::Image.get(path, {}, docker_connection)
|
572
603
|
end
|
573
604
|
|
574
|
-
new_image = Docker::Image.create({ "fromImage" =>
|
605
|
+
new_image = Docker::Image.create({ "fromImage" => path }, {}, docker_connection)
|
575
606
|
|
576
607
|
!(original_image && original_image.id.start_with?(new_image.id))
|
577
608
|
end
|
data/lib/kitchen/helpers.rb
CHANGED
@@ -117,6 +117,8 @@ VOLUME /opt/verifier
|
|
117
117
|
end
|
118
118
|
|
119
119
|
def docker_info
|
120
|
+
::Docker.url = default_docker_host
|
121
|
+
|
120
122
|
@docker_info ||= ::Docker.info
|
121
123
|
rescue Excon::Error::Socket
|
122
124
|
puts "kitchen-dokken could not connect to the docker host at #{default_docker_host}. Is docker running?"
|
@@ -175,6 +177,21 @@ VOLUME /opt/verifier
|
|
175
177
|
coerce_exposed_ports(config[:ports])
|
176
178
|
end
|
177
179
|
|
180
|
+
def network_settings
|
181
|
+
if self[:ipv6]
|
182
|
+
{
|
183
|
+
"EnableIPv6" => true,
|
184
|
+
"IPAM" => {
|
185
|
+
"Config" => [{
|
186
|
+
"Subnet" => self[:ipv6_subnet],
|
187
|
+
}],
|
188
|
+
},
|
189
|
+
}
|
190
|
+
else
|
191
|
+
{}
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
178
195
|
def port_bindings
|
179
196
|
coerce_port_bindings(config[:ports])
|
180
197
|
end
|
@@ -244,6 +261,7 @@ VOLUME /opt/verifier
|
|
244
261
|
end
|
245
262
|
|
246
263
|
def remote_docker_host?
|
264
|
+
return false if config[:docker_info]["OperatingSystem"].include?("Docker Desktop")
|
247
265
|
return false if config[:docker_info]["OperatingSystem"].include?("Boot2Docker")
|
248
266
|
return true if /^tcp:/.match?(config[:docker_host_url])
|
249
267
|
|
@@ -109,12 +109,13 @@ module Kitchen
|
|
109
109
|
cmd << " -c /opt/kitchen/client.rb"
|
110
110
|
cmd << " -j /opt/kitchen/dna.json"
|
111
111
|
cmd << "--profile-ruby" if config[:profile_ruby]
|
112
|
+
cmd << "--slow-report" if config[:slow_resource_report]
|
112
113
|
|
113
114
|
chef_cmd(cmd)
|
114
115
|
end
|
115
116
|
|
116
117
|
def write_run_command(command)
|
117
|
-
File.write("#{dokken_kitchen_sandbox}/run_command", command)
|
118
|
+
File.write("#{dokken_kitchen_sandbox}/run_command", command, mode: "wb")
|
118
119
|
end
|
119
120
|
|
120
121
|
def runner_container_name
|
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.
|
4
|
+
version: 2.15.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: 2021-
|
11
|
+
date: 2021-10-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: docker-api
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
version: '1.15'
|
54
54
|
- - "<"
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version: '
|
56
|
+
version: '4'
|
57
57
|
type: :runtime
|
58
58
|
prerelease: false
|
59
59
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -63,7 +63,7 @@ dependencies:
|
|
63
63
|
version: '1.15'
|
64
64
|
- - "<"
|
65
65
|
- !ruby/object:Gem::Version
|
66
|
-
version: '
|
66
|
+
version: '4'
|
67
67
|
description: A Test Kitchen Driver for Docker & Chef Infra optimized for rapid testing
|
68
68
|
using Chef Infra docker images
|
69
69
|
email:
|
@@ -97,7 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
97
97
|
- !ruby/object:Gem::Version
|
98
98
|
version: '0'
|
99
99
|
requirements: []
|
100
|
-
rubygems_version: 3.
|
100
|
+
rubygems_version: 3.2.22
|
101
101
|
signing_key:
|
102
102
|
specification_version: 4
|
103
103
|
summary: A Test Kitchen Driver for Docker & Chef Infra optimized for rapid testing
|