kitchen-docker_adv 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: