kitchen-docker_adv 0.0.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.
data/.cane ADDED
File without changes
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.tailor ADDED
@@ -0,0 +1,4 @@
1
+ Tailor.config do |config|
2
+ config.formatters "text"
3
+ config.file_set 'lib/**/*.rb'
4
+ end
data/.travis.yml ADDED
@@ -0,0 +1,11 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.0.0
5
+ - 1.9.3
6
+ - 1.9.2
7
+ - ruby-head
8
+
9
+ matrix:
10
+ allow_failures:
11
+ - rvm: ruby-head
data/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ ## 0.1.0 / Unreleased
2
+
3
+ * Initial release
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,16 @@
1
+ Author:: Sean Porter (<portertech@gmail.com>)
2
+
3
+ Copyright (C) 2014, Sean Porter
4
+
5
+ Licensed under the Apache License, Version 2.0 (the "License");
6
+ you may not use this file except in compliance with the License.
7
+ You may obtain a copy of the License at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing, software
12
+ distributed under the License is distributed on an "AS IS" BASIS,
13
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ See the License for the specific language governing permissions and
15
+ limitations under the License.
16
+
data/README.md ADDED
@@ -0,0 +1,66 @@
1
+ # <a name="title"></a> Kitchen::DockerAdv
2
+
3
+ A Test Kitchen Driver for Docker.
4
+
5
+ ## <a name="requirements"></a> Requirements
6
+
7
+ **TODO:** document any software or library prerequisites that are required to
8
+ use this driver. Implement the `#verify_dependencies` method in your Driver
9
+ class to enforce these requirements in code, if possible.
10
+
11
+ ## <a name="installation"></a> Installation and Setup
12
+
13
+ Please read the [Driver usage][driver_usage] page for more details.
14
+
15
+ ## <a name="config"></a> Configuration
16
+
17
+ **TODO:** Write descriptions of all configuration options
18
+
19
+ ### <a name="config-require-chef-omnibus"></a> require\_chef\_omnibus
20
+
21
+ Determines whether or not a Chef [Omnibus package][chef_omnibus_dl] will be
22
+ installed. There are several different behaviors available:
23
+
24
+ * `true` - the latest release will be installed. Subsequent converges
25
+ will skip re-installing if chef is present.
26
+ * `latest` - the latest release will be installed. Subsequent converges
27
+ will always re-install even if chef is present.
28
+ * `<VERSION_STRING>` (ex: `10.24.0`) - the desired version string will
29
+ be passed the the install.sh script. Subsequent converges will skip if
30
+ the installed version and the desired version match.
31
+ * `false` or `nil` - no chef is installed.
32
+
33
+ The default value is unset, or `nil`.
34
+
35
+ ## <a name="development"></a> Development
36
+
37
+ * Source hosted at [GitHub][repo]
38
+ * Report issues/questions/feature requests on [GitHub Issues][issues]
39
+
40
+ Pull requests are very welcome! Make sure your patches are well tested.
41
+ Ideally create a topic branch for every separate change you make. For
42
+ example:
43
+
44
+ 1. Fork the repo
45
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
46
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
47
+ 4. Push to the branch (`git push origin my-new-feature`)
48
+ 5. Create new Pull Request
49
+
50
+ ## <a name="authors"></a> Authors
51
+
52
+ Created by [Sean Porter][original-author]
53
+
54
+ Maintained by [Gattsu][author]
55
+
56
+ ## <a name="license"></a> License
57
+
58
+ Apache 2.0 (see [LICENSE][license])
59
+
60
+ [original-author]: https://github.com/Sean-Porter
61
+ [author]: https://github.com/gattsublackswordsman
62
+ [issues]: https://github.com/gattsublackswordsman/kitchen-docker_adv/issues
63
+ [license]: https://github.com/gattsublackswordsman/kitchen-docker_adv/blob/master/LICENSE
64
+ [repo]: https://github.com/gattsublackswordsman/kitchen-docker_adv
65
+ [driver_usage]: http://docs.kitchen-ci.org/drivers/usage
66
+ [chef_omnibus_dl]: http://www.getchef.com/chef/install/
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ require "bundler/gem_tasks"
2
+ require 'cane/rake_task'
3
+ require 'tailor/rake_task'
4
+
5
+ desc "Run cane to check quality metrics"
6
+ Cane::RakeTask.new do |cane|
7
+ cane.canefile = './.cane'
8
+ end
9
+
10
+ Tailor::RakeTask.new
11
+
12
+ desc "Display LOC stats"
13
+ task :stats do
14
+ puts "\n## Production Code Stats"
15
+ sh "countloc -r lib"
16
+ end
17
+
18
+ desc "Run all quality tasks"
19
+ task :quality => [:cane, :tailor, :stats]
20
+
21
+ task :default => [:quality]
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'kitchen/driver/docker_adv_version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'kitchen-docker_adv'
8
+ spec.version = Kitchen::Driver::DOCKER_ADV_VERSION
9
+ spec.authors = ['Gattsu']
10
+ spec.email = ['gattsu.blackswordsman@gmail.com']
11
+ spec.description = %q{A Test Kitchen Driver for Docker}
12
+ spec.summary = spec.description
13
+ spec.homepage = ''
14
+ spec.license = 'Apache 2.0'
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = []
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_dependency 'test-kitchen', '~> 1.2.0.0'
22
+
23
+ spec.add_development_dependency 'bundler', '~> 1.3'
24
+ spec.add_development_dependency 'rake'
25
+
26
+ spec.add_development_dependency 'cane'
27
+ spec.add_development_dependency 'tailor'
28
+ spec.add_development_dependency 'countloc'
29
+ end
@@ -0,0 +1,35 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2014, Sean Porter
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require 'erb'
18
+
19
+ module Kitchen
20
+
21
+ module Driver
22
+
23
+ class DockerERBContext
24
+ def initialize(config={})
25
+ config.each do |key, value|
26
+ instance_variable_set('@' + key.to_s, value)
27
+ end
28
+ end
29
+
30
+ def get_binding
31
+ binding
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,286 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2014, Sean Porter
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require 'kitchen'
18
+ require 'json'
19
+ require 'uri'
20
+ require File.join(File.dirname(__FILE__), 'docker', 'erb')
21
+
22
+ module Kitchen
23
+
24
+ module Driver
25
+
26
+ # DockerAdv driver for Kitchen.
27
+ #
28
+ # @author Gattsu <Gattsu@gmail.com>
29
+ class DockerAdv < Kitchen::Driver::SSHBase
30
+
31
+ default_config :binary, 'docker'
32
+ default_config :socket, 'unix:///var/run/docker.sock'
33
+ default_config :privileged, true
34
+ default_config :capadd, true
35
+ default_config :module, '1'
36
+ default_config :branch, 'trunk'
37
+ default_config :regression, 'V0.0.0'
38
+ default_config :environment, 'integration'
39
+ default_config :use_cache, true
40
+ default_config :remove_images, false
41
+ default_config :run_command, '/usr/sbin/sshd -D -o UseDNS=no -o UsePAM=no -o UsePrivilegeSeparation=no -o PidFile=/tmp/sshd.pid'
42
+ default_config :username, 'kitchen'
43
+ default_config :password, 'kitchen'
44
+ default_config :tls, false
45
+ default_config :tls_verify, false
46
+ default_config :tls_cacert, nil
47
+ default_config :tls_cert, nil
48
+ default_config :tls_key, nil
49
+ default_config :svn_base, 'https://svn.domain.com/svn/proj1/'
50
+ default_config :svn_user, 'svnuser'
51
+ default_config :svn_pwd, 'svnpwd'
52
+
53
+ default_config :use_sudo do |driver|
54
+ !driver.remote_socket?
55
+ end
56
+
57
+ default_config :image do |driver|
58
+ driver.default_image
59
+ end
60
+
61
+ default_config :platform do |driver|
62
+ driver.default_platform
63
+ end
64
+
65
+ default_config :disable_upstart, true
66
+
67
+ def verify_dependencies
68
+ run_command("#{config[:binary]} > /dev/null", :quiet => true)
69
+ rescue
70
+ raise UserError,
71
+ 'You must first install the Docker CLI tool http://www.docker.io/gettingstarted/'
72
+ end
73
+
74
+ def default_image
75
+ platform, release = instance.platform.name.split('-')
76
+ if platform == "centos" && release
77
+ release = "centos" + release.split('.').first
78
+ end
79
+ release ? [platform, release].join(':') : platform
80
+ end
81
+
82
+ def default_platform
83
+ instance.platform.name.split('-').first
84
+ end
85
+
86
+ def create(state)
87
+ state[:image_id] = build_image(state) unless state[:image_id]
88
+ state[:container_id] = run_container(state) unless state[:container_id]
89
+ state[:hostname] = remote_socket? ? socket_uri.host : 'localhost'
90
+ state[:port] = container_ssh_port(state)
91
+ wait_for_sshd(state[:hostname], nil, :port => state[:port])
92
+ end
93
+
94
+ def destroy(state)
95
+ rm_container(state) if container_exists?(state)
96
+ if config[:remove_images] && state[:image_id]
97
+ rm_image(state)
98
+ end
99
+ end
100
+
101
+ def remote_socket?
102
+ config[:socket] ? socket_uri.scheme == 'tcp' : false
103
+ end
104
+
105
+ protected
106
+
107
+ def socket_uri
108
+ URI.parse(config[:socket])
109
+ end
110
+
111
+ def docker_command(cmd, options={})
112
+ docker = config[:binary].dup
113
+ docker << " -H #{config[:socket]}" if config[:socket]
114
+ docker << " --tls" if config[:tls]
115
+ docker << " --tlsverify" if config[:tls_verify]
116
+ docker << " --tlscacert=#{config[:tls_cacert]}" if config[:tls_cacert]
117
+ docker << " --tlscert=#{config[:tls_cert]}" if config[:tls_cert]
118
+ docker << " --tlskey=#{config[:tls_key]}" if config[:tls_key]
119
+ run_command("#{docker} #{cmd}", options.merge(:quiet => !logger.debug?))
120
+ end
121
+
122
+ def build_dockerfile
123
+ from = "FROM #{config[:image]}"
124
+ platform = case config[:platform]
125
+ when 'debian', 'ubuntu'
126
+ disable_upstart = <<-eos
127
+ RUN dpkg-divert --local --rename --add /sbin/initctl
128
+ RUN ln -sf /bin/true /sbin/initctl
129
+ eos
130
+ packages = <<-eos
131
+ ENV DEBIAN_FRONTEND noninteractive
132
+ RUN apt-get update
133
+ RUN apt-get install -y sudo openssh-server curl lsb-release
134
+ eos
135
+ config[:disable_upstart] ? disable_upstart + packages : packages
136
+ when 'rhel', 'centos'
137
+ <<-eos
138
+ RUN yum clean all
139
+ RUN yum install -y sudo openssh-server openssh-clients which curl
140
+ RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''
141
+ RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''
142
+ eos
143
+ when 'arch'
144
+ <<-eos
145
+ RUN pacman -Syu --noconfirm
146
+ RUN pacman -S --noconfirm openssh sudo curl
147
+ RUN ssh-keygen -A -t rsa -f /etc/ssh/ssh_host_rsa_key
148
+ RUN ssh-keygen -A -t dsa -f /etc/ssh/ssh_host_dsa_key
149
+ eos
150
+ else
151
+ raise ActionFailed,
152
+ "Unknown platform '#{config[:platform]}'"
153
+ end
154
+ username = config[:username]
155
+ password = config[:password]
156
+ base = <<-eos
157
+ RUN useradd -d /home/#{username} -m -s /bin/bash #{username}
158
+ RUN echo #{username}:#{password} | chpasswd
159
+ RUN echo '#{username} ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
160
+ eos
161
+ custom = ''
162
+ Array(config[:provision_command]).each do |cmd|
163
+ custom << "RUN #{cmd}\n"
164
+ end
165
+ [from, platform, base, custom].join("\n")
166
+ end
167
+
168
+ def dockerfile
169
+ if config[:dockerfile]
170
+ template = IO.read(File.expand_path(config[:dockerfile]))
171
+ context = DockerERBContext.new(config.to_hash)
172
+ ERB.new(template).result(context.get_binding)
173
+ else
174
+ build_dockerfile
175
+ end
176
+ end
177
+
178
+ def parse_image_id(output)
179
+ output.each_line do |line|
180
+ if line =~ /image id|build successful|successfully built/i
181
+ return line.split(/\s+/).last
182
+ end
183
+ end
184
+ raise ActionFailed,
185
+ 'Could not parse Docker build output for image ID'
186
+ end
187
+
188
+ def build_image(state)
189
+ cmd = "build"
190
+ cmd << " --no-cache" unless config[:use_cache]
191
+ cmd << " --build-arg module=#{config[:module]}" if config[:module]
192
+ cmd << " --build-arg branch=#{config[:branch]}" if config[:branch]
193
+ cmd << " --build-arg regression=#{config[:regression]}" if config[:regression]
194
+ cmd << " --build-arg environment=#{config[:environment]}" if config[:environment]
195
+ cmd << " --build-arg svn_base=#{config[:svn_base]}" if config[:svn_base]
196
+ cmd << " --build-arg svn_user=#{config[:svn_user]}" if config[:svn_user]
197
+ cmd << " --build-arg svn_pwd=#{config[:svn_pwd]}" if config[:svn_pwd]
198
+ cmd << " --build-arg proxy_user=#{config[:proxy_user]}" if config[:proxy_user]
199
+ cmd << " --build-arg proxy_pwd=#{config[:proxy_pwd]}" if config[:proxy_pwd]
200
+ output = docker_command("#{cmd} -", :input => dockerfile)
201
+ parse_image_id(output)
202
+ end
203
+
204
+ def parse_container_id(output)
205
+ container_id = output.chomp
206
+ unless [12, 64].include?(container_id.size)
207
+ raise ActionFailed,
208
+ 'Could not parse Docker run output for container ID'
209
+ end
210
+ container_id
211
+ end
212
+
213
+ def build_run_command(image_id)
214
+ cmd = "run -d -p 22"
215
+ Array(config[:forward]).each {|port| cmd << " -p #{port}"}
216
+ Array(config[:dns]).each {|dns| cmd << " -dns #{dns}"}
217
+ Array(config[:volume]).each {|volume| cmd << " -v #{volume}"}
218
+ Array(config[:volumes_from]).each {|container| cmd << " --volumes-from #{container}"}
219
+ cmd << " -h #{config[:hostname]}" if config[:hostname]
220
+ cmd << " -m #{config[:memory]}" if config[:memory]
221
+ cmd << " -c #{config[:cpu]}" if config[:cpu]
222
+ cmd << " --privileged"
223
+ cmd << " --cap-add ALL"
224
+ cmd << " -e http_proxy='#{config[:http_proxy]}'" if config[:http_proxy]
225
+ cmd << " -p 3000:3000" if config[:rails]
226
+ cmd << " -e https_proxy='#{config[:https_proxy]}'" if config[:https_proxy]
227
+ cmd << " -e module=#{config[:module]}"
228
+ cmd << " -e branch=#{config[:branch]}"
229
+ cmd << " -e regression=#{config[:regression]}"
230
+ cmd << " -e environment=#{config[:environment]}"
231
+ cmd << " -e svn_base=#{config[:svn_base]}"
232
+ cmd << " -e svn_user=#{config[:svn_user]}"
233
+ cmd << " -e svn_pwd=#{config[:svn_pwd]}"
234
+ cmd << " -e proxy_user=#{config[:proxy_user]}"
235
+ cmd << " -e proxy_pwd=#{config[:proxy_pwd]}"
236
+ cmd << " #{image_id} #{config[:run_command]}"
237
+ cmd
238
+ end
239
+
240
+ def run_container(state)
241
+ cmd = build_run_command(state[:image_id])
242
+ output = docker_command(cmd)
243
+ parse_container_id(output)
244
+ end
245
+
246
+ def inspect_container(state)
247
+ container_id = state[:container_id]
248
+ if container_id
249
+ docker_command("inspect #{container_id} " + %q[| awk -F"=" '$1 !~ /svn_user|svn_pwd|proxy_user|proxy_pwd|http_proxy|https_proxy/ {print $0}; $1 ~ /svn_user|svn_pwd|proxy_user|proxy_pwd|http_proxy|https_proxy/ {print $1 "=*****\","}'])
250
+ end
251
+ end
252
+
253
+ def container_exists?(state)
254
+ !!inspect_container(state) rescue false
255
+ end
256
+
257
+ def parse_container_ssh_port(output)
258
+ begin
259
+ info = Array(::JSON.parse(output)).first
260
+ ports = info['NetworkSettings']['Ports'] || info['HostConfig']['PortBindings']
261
+ ssh_port = ports['22/tcp'].detect {|port| port['HostIp'] == '0.0.0.0'}
262
+ ssh_port['HostPort'].to_i
263
+ rescue
264
+ raise ActionFailed,
265
+ 'Could not parse Docker inspect output for container SSH port'
266
+ end
267
+ end
268
+
269
+ def container_ssh_port(state)
270
+ output = inspect_container(state)
271
+ parse_container_ssh_port(output)
272
+ end
273
+
274
+ def rm_container(state)
275
+ container_id = state[:container_id]
276
+ docker_command("stop #{container_id}")
277
+ docker_command("rm -f #{container_id}")
278
+ end
279
+
280
+ def rm_image(state)
281
+ image_id = state[:image_id]
282
+ docker_command("rmi #{image_id}")
283
+ end
284
+ end
285
+ end
286
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2014, Sean Porter
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ module Kitchen
18
+
19
+ module Driver
20
+
21
+ # Version string for DockerAdv Kitchen driver
22
+ DOCKER_ADV_VERSION = "0.0.1"
23
+ end
24
+ end
metadata ADDED
@@ -0,0 +1,156 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kitchen-docker_adv
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Gattsu
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2016-05-17 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: test-kitchen
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.2.0.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 1.2.0.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: bundler
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '1.3'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '1.3'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: cane
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: tailor
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: countloc
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: A Test Kitchen Driver for Docker
111
+ email:
112
+ - gattsu.blackswordsman@gmail.com
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - .cane
118
+ - .gitignore
119
+ - .tailor
120
+ - .travis.yml
121
+ - CHANGELOG.md
122
+ - Gemfile
123
+ - LICENSE
124
+ - README.md
125
+ - Rakefile
126
+ - kitchen-docker_adv.gemspec
127
+ - lib/kitchen/driver/docker/erb.rb
128
+ - lib/kitchen/driver/docker_adv.rb
129
+ - lib/kitchen/driver/docker_adv_version.rb
130
+ homepage: ''
131
+ licenses:
132
+ - Apache 2.0
133
+ post_install_message:
134
+ rdoc_options: []
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ none: false
145
+ requirements:
146
+ - - ! '>='
147
+ - !ruby/object:Gem::Version
148
+ version: '0'
149
+ requirements: []
150
+ rubyforge_project:
151
+ rubygems_version: 1.8.23
152
+ signing_key:
153
+ specification_version: 3
154
+ summary: A Test Kitchen Driver for Docker
155
+ test_files: []
156
+ has_rdoc: