kitchen-dokken 2.3.0 → 2.4.1
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 +4 -4
- data/CHANGELOG.md +18 -0
- data/lib/kitchen/driver/dokken.rb +63 -33
- data/lib/kitchen/driver/dokken_version.rb +1 -1
- data/lib/kitchen/helpers.rb +29 -2
- data/lib/kitchen/transport/dokken.rb +28 -12
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b36486a74d03c58b8ed8fdad948f06028f1fb1ae
|
|
4
|
+
data.tar.gz: c8a95b0ab5526d783a60a23c0a693392645f51d2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7ca1a539cecff671e82091faf2cb41e696bf52c8b330398748dd89989d18e8842011ef2ead744537cd569f3771582f98f00641ef9a5647ecc7450c9f373c5796
|
|
7
|
+
data.tar.gz: 59ffd591e931ae9698c3aafc8240baaa1c13101838b6e1d729294b8270563671769097fe29ffa1a6f1dc216e07262ff5a980003154ab032de4741b9509ebbc9a
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Dokken Changelog
|
|
2
2
|
|
|
3
|
+
# 2.4.1
|
|
4
|
+
- Adding NotFoundError to with_retries and beefing up rescues
|
|
5
|
+
|
|
6
|
+
# 2.4.0
|
|
7
|
+
- Features meant for 2.2.0, but tested properly this time.
|
|
8
|
+
- Initial support for clusters / inter-suite name resolution
|
|
9
|
+
- Dokken now creates a user-defined network named "dokken" and
|
|
10
|
+
connects containers to it. This allows us to take advantage of the
|
|
11
|
+
built in DNS server that in Docker 1.10 and later.
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
driver:
|
|
15
|
+
hostname: www.computers.biz
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
# 2.3.1
|
|
19
|
+
- Actually doing the things in 2.3.0
|
|
20
|
+
|
|
3
21
|
# 2.3.0
|
|
4
22
|
- Reverting 2.2.x bits to 2.1.x. to restore stability to users.
|
|
5
23
|
- That'll teach me to push gems at odd hours.
|
|
@@ -41,7 +41,7 @@ module Kitchen
|
|
|
41
41
|
default_config :data_image, 'dokken/kitchen-cache:latest'
|
|
42
42
|
default_config :dns, nil
|
|
43
43
|
default_config :dns_search, nil
|
|
44
|
-
default_config :docker_info, docker_info
|
|
44
|
+
# default_config :docker_info, docker_info
|
|
45
45
|
default_config :docker_host_url, default_docker_host
|
|
46
46
|
default_config :forward, nil
|
|
47
47
|
default_config :hostname, 'dokken'
|
|
@@ -114,10 +114,12 @@ module Kitchen
|
|
|
114
114
|
return unless ::Docker::Image.exist?(work_image, {}, docker_connection)
|
|
115
115
|
with_retries { @work_image = ::Docker::Image.get(work_image, {}, docker_connection) }
|
|
116
116
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
117
|
+
with_retries do
|
|
118
|
+
begin
|
|
119
|
+
with_retries { @work_image.remove(force: true) }
|
|
120
|
+
rescue ::Docker::Error::ConflictError
|
|
121
|
+
debug "driver - #{work_image} cannot be removed"
|
|
122
|
+
end
|
|
121
123
|
end
|
|
122
124
|
end
|
|
123
125
|
|
|
@@ -280,7 +282,14 @@ module Kitchen
|
|
|
280
282
|
'HostConfig' => {
|
|
281
283
|
'PortBindings' => port_forwards({}, '22'),
|
|
282
284
|
'PublishAllPorts' => true,
|
|
283
|
-
'NetworkMode' =>
|
|
285
|
+
'NetworkMode' => 'bridge',
|
|
286
|
+
},
|
|
287
|
+
'NetworkingConfig' => {
|
|
288
|
+
'EndpointsConfig' => {
|
|
289
|
+
self[:network_mode] => {
|
|
290
|
+
'Aliases' => Array(self[:hostname]),
|
|
291
|
+
},
|
|
292
|
+
},
|
|
284
293
|
},
|
|
285
294
|
}
|
|
286
295
|
data_container = run_container(config)
|
|
@@ -288,14 +297,17 @@ module Kitchen
|
|
|
288
297
|
end
|
|
289
298
|
|
|
290
299
|
def make_dokken_network
|
|
291
|
-
|
|
292
|
-
::Docker::Network.get('dokken', {}, docker_connection)
|
|
300
|
+
debug 'driver - checking for dokken network'
|
|
301
|
+
with_retries { ::Docker::Network.get('dokken', {}, docker_connection) }
|
|
293
302
|
rescue
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
303
|
+
with_retries do
|
|
304
|
+
begin
|
|
305
|
+
info 'Creating dokken network'
|
|
306
|
+
n = ::Docker::Network.create('dokken', {})
|
|
307
|
+
debug "n - #{n}"
|
|
308
|
+
rescue ::Docker::Error => e
|
|
309
|
+
debug "driver - :#{e}:"
|
|
310
|
+
end
|
|
299
311
|
end
|
|
300
312
|
end
|
|
301
313
|
|
|
@@ -305,22 +317,24 @@ module Kitchen
|
|
|
305
317
|
end
|
|
306
318
|
|
|
307
319
|
def create_chef_container(state)
|
|
308
|
-
::Docker::Container.get(chef_container_name, {}, docker_connection)
|
|
320
|
+
with_retries { ::Docker::Container.get(chef_container_name, {}, docker_connection) }
|
|
309
321
|
rescue ::Docker::Error::NotFoundError
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
'
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
322
|
+
with_retries do
|
|
323
|
+
begin
|
|
324
|
+
debug "driver - creating volume container #{chef_container_name} from #{chef_image}"
|
|
325
|
+
config = {
|
|
326
|
+
'name' => chef_container_name,
|
|
327
|
+
'Cmd' => 'true',
|
|
328
|
+
'Image' => "#{repo(chef_image)}:#{tag(chef_image)}",
|
|
329
|
+
'HostConfig' => {
|
|
330
|
+
'NetworkMode' => self[:network_mode],
|
|
331
|
+
},
|
|
332
|
+
}
|
|
333
|
+
chef_container = create_container(config)
|
|
334
|
+
state[:chef_container] = chef_container.json
|
|
335
|
+
rescue ::Docker::Error => e
|
|
336
|
+
raise "driver - #{chef_container_name} failed to create #{e}"
|
|
337
|
+
end
|
|
324
338
|
end
|
|
325
339
|
end
|
|
326
340
|
|
|
@@ -366,12 +380,25 @@ module Kitchen
|
|
|
366
380
|
end
|
|
367
381
|
|
|
368
382
|
def create_container(args)
|
|
383
|
+
with_retries { @container = ::Docker::Container.get(args['name'], {}, docker_connection) }
|
|
384
|
+
rescue
|
|
369
385
|
with_retries do
|
|
370
|
-
|
|
371
|
-
|
|
386
|
+
begin
|
|
387
|
+
info "Creating container #{args['name']}"
|
|
388
|
+
debug "driver - create_container args #{args}"
|
|
389
|
+
with_retries do
|
|
390
|
+
begin
|
|
391
|
+
@container = ::Docker::Container.create(args.clone, docker_connection)
|
|
392
|
+
rescue ::Docker::Error::ConflictError
|
|
393
|
+
debug "driver - rescue ConflictError: #{args['name']}"
|
|
394
|
+
with_retries { @container = ::Docker::Container.get(args['name'], {}, docker_connection) }
|
|
395
|
+
|
|
396
|
+
end
|
|
397
|
+
end
|
|
398
|
+
rescue ::Docker::Error => e
|
|
399
|
+
raise "driver - failed to create_container #{args['name']}"
|
|
400
|
+
end
|
|
372
401
|
end
|
|
373
|
-
rescue ::Docker::Error::ConflictError
|
|
374
|
-
with_retries { @container = ::Docker::Container.get(args['name'], {}, docker_connection) }
|
|
375
402
|
end
|
|
376
403
|
|
|
377
404
|
def run_container(args)
|
|
@@ -492,9 +519,12 @@ module Kitchen
|
|
|
492
519
|
rescue ::Docker::Error::ServerError, # 404
|
|
493
520
|
::Docker::Error::UnexpectedResponseError, # 400
|
|
494
521
|
::Docker::Error::TimeoutError,
|
|
495
|
-
::Docker::Error::IOError
|
|
522
|
+
::Docker::Error::IOError,
|
|
523
|
+
::Docker::Error::NotFoundError => e
|
|
496
524
|
tries -= 1
|
|
525
|
+
sleep 0.1
|
|
497
526
|
retry if tries > 0
|
|
527
|
+
debug "tries: #{tries} e: #{e}"
|
|
498
528
|
raise e
|
|
499
529
|
end
|
|
500
530
|
end
|
data/lib/kitchen/helpers.rb
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
module Dokken
|
|
2
2
|
module Helpers
|
|
3
|
+
# https://stackoverflow.com/questions/517219/ruby-see-if-a-port-is-open
|
|
4
|
+
require 'socket'
|
|
5
|
+
require 'timeout'
|
|
6
|
+
|
|
7
|
+
def port_open?(ip, port)
|
|
8
|
+
begin
|
|
9
|
+
Timeout.timeout(1) do
|
|
10
|
+
begin
|
|
11
|
+
s = TCPSocket.new(ip, port)
|
|
12
|
+
s.close
|
|
13
|
+
return true
|
|
14
|
+
rescue Errno::ECONNREFUSED, Errno::EHOSTUNREACH
|
|
15
|
+
return false
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
rescue Timeout::Error
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
false
|
|
22
|
+
end
|
|
23
|
+
|
|
3
24
|
def insecure_ssh_public_key
|
|
4
25
|
<<-EOF
|
|
5
26
|
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCoJwyW7qNhw+NTuOjC4+RVpESl+JBXebXzB7JqxRgKAbymq6B39azEAiNx5NzHkWcQmOyQNhFpKFSAufegcXRS4ctS1LcElEoXe9brDAqKEBSkmnXYfZXMNIG0Enw4+5W/rZxHFCAlsUSAHYtYZEs+3CgbIWuHhZ95C8UC6nGLWHNZOjcbsYZFrnFfO0qg0ene2w8LKhxqj5X0MRSdCIn1IwyxIbl5NND5Yk1Hx8JKsJtTiNTdxssiMgmM5bvTbYQUSf8pbGrRI30VQKBgQ8/UkidZbaTfvzWXYpwcDUERSbzEYCvkUytTemZIv6uhpPxqkfjl6KEOOml/iGqquPEr test-kitchen-rsa
|
|
@@ -42,14 +63,20 @@ EOF
|
|
|
42
63
|
<<-EOF
|
|
43
64
|
FROM centos:7
|
|
44
65
|
MAINTAINER Sean OMeara \"sean@sean.io\"
|
|
45
|
-
|
|
46
66
|
ENV LANG en_US.UTF-8
|
|
47
67
|
|
|
48
68
|
RUN yum -y install tar rsync openssh-server passwd git
|
|
49
69
|
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
|
|
50
70
|
|
|
71
|
+
# uncomment to debug cert issues
|
|
72
|
+
# RUN echo 'root:dokkendokkendokken' | chpasswd
|
|
73
|
+
# RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
|
|
74
|
+
# RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
|
|
75
|
+
|
|
51
76
|
RUN mkdir -p /root/.ssh/
|
|
52
77
|
COPY authorized_keys /root/.ssh/authorized_keys
|
|
78
|
+
RUN chmod 700 /root/.ssh/
|
|
79
|
+
RUN chmod 600 /root/.ssh/authorized_keys
|
|
53
80
|
|
|
54
81
|
EXPOSE 22
|
|
55
82
|
CMD [ "/usr/sbin/sshd", "-D", "-p", "22", "-o", "UseDNS=no", "-o", "UsePrivilegeSeparation=no", "-o", "MaxAuthTries=60" ]
|
|
@@ -142,7 +169,7 @@ EOF
|
|
|
142
169
|
end
|
|
143
170
|
|
|
144
171
|
def remote_docker_host?
|
|
145
|
-
return false if config[:docker_info]['OperatingSystem'].include?('Boot2Docker')
|
|
172
|
+
# return false if config[:docker_info]['OperatingSystem'].include?('Boot2Docker')
|
|
146
173
|
return true if config[:docker_host_url] =~ /^tcp:/
|
|
147
174
|
false
|
|
148
175
|
end
|
|
@@ -77,26 +77,42 @@ module Kitchen
|
|
|
77
77
|
end
|
|
78
78
|
|
|
79
79
|
def upload(locals, remote)
|
|
80
|
-
port = options[:data_container][:NetworkSettings][:Ports][:"22/tcp"][0][:HostPort]
|
|
81
|
-
|
|
82
80
|
if options[:host_ip_override]
|
|
83
81
|
# Allow connecting to any ip/hostname to support sibling containers
|
|
84
|
-
|
|
82
|
+
ssh_ip = options[:host_ip_override]
|
|
83
|
+
ssh_port = options[:data_container][:NetworkSettings][:Ports][:"22/tcp"][0][:HostPort]
|
|
84
|
+
|
|
85
85
|
elsif options[:docker_host_url] =~ /unix:/
|
|
86
86
|
if options[:data_container][:NetworkSettings][:Ports][:"22/tcp"][0][:HostIp] == '0.0.0.0'
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
ssh_ip = options[:data_container][:NetworkSettings][:IPAddress]
|
|
88
|
+
ssh_port = '22'
|
|
89
89
|
else
|
|
90
90
|
# we should read the proper mapped ip, since this allows us to upload the files
|
|
91
|
-
|
|
91
|
+
ssh_ip = options[:data_container][:NetworkSettings][:Ports][:"22/tcp"][0][:HostIp]
|
|
92
|
+
ssh_port = options[:data_container][:NetworkSettings][:Ports][:"22/tcp"][0][:HostPort]
|
|
92
93
|
end
|
|
94
|
+
|
|
93
95
|
elsif options[:docker_host_url] =~ /tcp:/
|
|
94
|
-
|
|
96
|
+
name = options[:data_container][:Name]
|
|
97
|
+
candidate_ip = ::Docker::Container.all.select do |x|
|
|
98
|
+
x.info['Names'][0].eql?(name)
|
|
99
|
+
end.first.info['NetworkSettings']['Networks']['dokken']['IPAddress']
|
|
100
|
+
|
|
101
|
+
if port_open?(candidate_ip, '22')
|
|
102
|
+
ssh_ip = candidate_ip
|
|
103
|
+
ssh_port = '22'
|
|
104
|
+
else
|
|
105
|
+
ssh_ip = options[:docker_host_url].split('tcp://')[1].split(':')[0]
|
|
106
|
+
ssh_port = options[:data_container][:NetworkSettings][:Ports][:"22/tcp"][0][:HostPort]
|
|
107
|
+
end
|
|
95
108
|
else
|
|
96
109
|
raise Kitchen::UserError, 'docker_host_url must be tcp:// or unix://'
|
|
97
110
|
end
|
|
98
111
|
|
|
99
|
-
|
|
112
|
+
debug "ssh_ip : #{ssh_ip}"
|
|
113
|
+
debug "ssh_port : #{ssh_port}"
|
|
114
|
+
|
|
115
|
+
tmpdir = Dir.tmpdir + '/dokken/'
|
|
100
116
|
FileUtils.mkdir_p tmpdir.to_s, mode: 0o777
|
|
101
117
|
tmpdir += Process.uid.to_s
|
|
102
118
|
FileUtils.mkdir_p tmpdir.to_s
|
|
@@ -114,20 +130,20 @@ module Kitchen
|
|
|
114
130
|
rsync_cmd << ' -o StrictHostKeyChecking=no'
|
|
115
131
|
rsync_cmd << ' -o UserKnownHostsFile=/dev/null'
|
|
116
132
|
rsync_cmd << ' -o LogLevel=ERROR'
|
|
117
|
-
rsync_cmd << " -p #{
|
|
133
|
+
rsync_cmd << " -p #{ssh_port}"
|
|
118
134
|
rsync_cmd << '\''
|
|
119
|
-
rsync_cmd << " #{locals.join(' ')} root@#{
|
|
135
|
+
rsync_cmd << " #{locals.join(' ')} root@#{ssh_ip}:#{remote}"
|
|
120
136
|
debug "rsync_cmd :#{rsync_cmd}:"
|
|
121
137
|
`#{rsync_cmd}`
|
|
122
138
|
rescue Errno::ENOENT
|
|
123
139
|
debug 'Rsync is not installed. Falling back to SCP.'
|
|
124
140
|
locals.each do |local|
|
|
125
|
-
Net::SCP.upload!(
|
|
141
|
+
Net::SCP.upload!(ssh_ip,
|
|
126
142
|
'root',
|
|
127
143
|
local,
|
|
128
144
|
remote,
|
|
129
145
|
recursive: true,
|
|
130
|
-
ssh: { port:
|
|
146
|
+
ssh: { port: ssh_port, keys: ["#{tmpdir}/id_rsa"] })
|
|
131
147
|
end
|
|
132
148
|
end
|
|
133
149
|
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.
|
|
4
|
+
version: 2.4.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Sean OMeara
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2017-06-
|
|
11
|
+
date: 2017-06-21 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: test-kitchen
|