kitchen-docker-api 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,19 @@
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
18
+ .kitchen/
19
+ .kitchen.local.yml
data/.kitchen.yml ADDED
@@ -0,0 +1,14 @@
1
+ ---
2
+ driver:
3
+ name: docker
4
+
5
+ provisioner:
6
+ name: dummy
7
+
8
+ platforms:
9
+ - name: ubuntu-12.04
10
+ - name: centos-6.4
11
+ - name: unknown
12
+
13
+ suites:
14
+ - name: default
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,4 @@
1
+ ## 0.8.0
2
+
3
+ * Initial fork from kitchen-docker
4
+ * Supports docker version < 0.9
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ Author:: Aaron Nichols <anichols@trumped.org>
2
+
3
+ Copyright (C) 2014, Aaron Nichols
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.
data/README.md ADDED
@@ -0,0 +1,291 @@
1
+ # Kitchen::Docker
2
+
3
+ A Test Kitchen Driver for Docker. This driver utilizes the
4
+ [docker-api](https://github.com/swipely/docker-api) gem as the docker
5
+ client making a CLI client unnecessary. If you would prefer a docker
6
+ driver which uses the docker CLI you should look at the original
7
+ [kitchen-docker](https://github.com/portertech/kitchen-docker) from
8
+ which this fork originated.
9
+
10
+ Substantial credit for this driver goes to Sean Porter for the CLI
11
+ implmentation & his support in developing the docker-api based version.
12
+ We ultimately decided it would be best to have two versions so folks
13
+ could choose to use the CLI or docker-api based client.
14
+
15
+ ## Requirements
16
+
17
+ * [Docker][docker_getting_started]
18
+
19
+ ## Known Issues
20
+
21
+ * Upstart is neutered due to [this issue][docker_upstart_issue].
22
+
23
+ ## Installation and Setup
24
+
25
+ Please read the Test Kitchen [docs][test_kitchen_docs] for more details.
26
+
27
+ Example `.kitchen.local.yml`:
28
+
29
+ ```
30
+ ---
31
+ driver_plugin: docker
32
+
33
+ platforms:
34
+ - name: ubuntu
35
+ run_list:
36
+ - recipe[apt]
37
+ - name: centos
38
+ driver_config:
39
+ image: centos
40
+ platform: rhel
41
+ run_list:
42
+ - recipe[yum]
43
+ ```
44
+
45
+ ## Default Configuration
46
+
47
+ This driver can determine an image and platform type for a select number of
48
+ platforms. Currently, the following platform names are supported:
49
+
50
+ ```
51
+ ---
52
+ platforms:
53
+ - name: ubuntu-12.04
54
+ - name: centos-6.4
55
+ ```
56
+
57
+ This will effectively generate a configuration similar to:
58
+
59
+ ```
60
+ ---
61
+ platforms:
62
+ - name: ubuntu-12.04
63
+ driver_config:
64
+ image: ubuntu:12.04
65
+ platform: ubuntu
66
+ - name: centos-6.4
67
+ driver_config:
68
+ image: centos:6.4
69
+ platform: centos
70
+ ```
71
+
72
+ ## Configuration
73
+
74
+ ### socket
75
+
76
+ The Docker daemon socket to use. By default, Docker will listen on
77
+ `unix:///var/run/docker.sock`, and no configuration here is required. If
78
+ Docker is binding to another host/port or Unix socket, you will need to set
79
+ this option. If a TCP socket is set, its host will be used for SSH access
80
+ to suite containers.
81
+
82
+ Examples:
83
+
84
+ ```
85
+ socket: unix:///tmp/docker.sock
86
+ ```
87
+
88
+ ```
89
+ socket: tcp://docker.example.com:4242
90
+ ```
91
+
92
+ ### image
93
+
94
+ The Docker image to use as the base for the suite containers. You can find
95
+ images using the [Docker Index][docker_index].
96
+
97
+ The default will be determined by the Platform name, if a default exists
98
+ (see the Default Configuration section for more details). If a default
99
+ cannot be computed, then the default value is `base`, an official Ubuntu
100
+ [image][docker_default_image].
101
+
102
+ ### platform
103
+
104
+ The platform of the chosen image. This is used to properly bootstrap the
105
+ suite container for Test Kitchen. Kitchen Docker currently supports:
106
+
107
+ * `debian` or `ubuntu`
108
+ * `rhel` or `centos`
109
+
110
+ The default will be determined by the Platform name, if a default exists
111
+ (see the Default Configuration section for more details). If a default
112
+ cannot be computed, then the default value is `ubuntu`.
113
+
114
+ ### require\_chef\_omnibus
115
+
116
+ Determines whether or not a Chef [Omnibus package][chef_omnibus_dl] will be
117
+ installed. There are several different behaviors available:
118
+
119
+ * `true` - the latest release will be installed. Subsequent converges
120
+ will skip re-installing if chef is present.
121
+ * `latest` - the latest release will be installed. Subsequent converges
122
+ will always re-install even if chef is present.
123
+ * `<VERSION_STRING>` (ex: `10.24.0`) - the desired version string will
124
+ be passed the the install.sh script. Subsequent converges will skip if
125
+ the installed version and the desired version match.
126
+ * `false` or `nil` - no chef is installed.
127
+
128
+ The default value is `true`.
129
+
130
+ ### provision\_command
131
+
132
+ Custom command(s) to be run when provisioning the base for the suite containers.
133
+
134
+ Examples:
135
+
136
+ ```
137
+ provision_command: curl -L https://www.opscode.com/chef/install.sh | bash
138
+ ```
139
+
140
+ ```
141
+ provision_command:
142
+ - apt-get install dnsutils
143
+ - apt-get install telnet
144
+ ```
145
+
146
+ ```
147
+ driver_config:
148
+ provision_command: curl -L https://www.opscode.com/chef/install.sh | bash
149
+ require_chef_omnibus: false
150
+ ```
151
+
152
+ ### remove\_images
153
+
154
+ This determines if images are automatically removed when the suite container is
155
+ destroyed.
156
+
157
+ The default value is `false`.
158
+
159
+ ### run_command
160
+
161
+ Sets the command used to run the suite container.
162
+
163
+ The default value is `/usr/sbin/sshd -D -o UseDNS=no -o UsePAM=no`.
164
+
165
+ Examples:
166
+
167
+ ```
168
+ run_command: /sbin/init
169
+ ```
170
+
171
+ ### memory
172
+
173
+ Sets the memory limit for the suite container in bytes. Otherwise use Dockers
174
+ default. You can read more about `memory.limit_in_bytes` [here][memory_limit].
175
+
176
+ ### cpu
177
+
178
+ Sets the CPU shares (relative weight) for the suite container. Otherwise use
179
+ Dockers defaults. You can read more about cpu.shares [here][cpu_shares].
180
+
181
+ ### volume
182
+
183
+ Adds a data volume(s) to the suite container.
184
+
185
+ Examples:
186
+
187
+ ```
188
+ volume: /ftp
189
+ ```
190
+
191
+ ```
192
+ volume:
193
+ - /ftp
194
+ - /srv
195
+ ```
196
+
197
+ ## dns
198
+
199
+ Adjusts `resolv.conf` to use the dns servers specified. Otherwise use
200
+ Dockers defaults.
201
+
202
+ Examples:
203
+
204
+ ```
205
+ dns: 8.8.8.8
206
+ ```
207
+
208
+ ```
209
+ dns:
210
+ - 8.8.8.8
211
+ - 8.8.4.4
212
+ ```
213
+
214
+ ### forward
215
+
216
+ Set suite container port(s) to forward to the host machine. You may specify
217
+ the host (public) port in the mappings, if not, Docker chooses for you.
218
+
219
+ Examples:
220
+
221
+ ```
222
+ forward: 80
223
+ ```
224
+
225
+ ```
226
+ forward:
227
+ - 22:2222
228
+ - 80:8080
229
+ ```
230
+
231
+ ### hostname
232
+
233
+ Set the suite container hostname. Otherwise use Dockers default.
234
+
235
+ Examples:
236
+
237
+ ```
238
+ hostname: foobar.local
239
+ ```
240
+
241
+ ### privileged
242
+
243
+ Run the suite container in privileged mode. This allows certain functionality
244
+ inside the Docker container which is not otherwise permitted.
245
+
246
+ The default value is `false`.
247
+
248
+ Examples:
249
+
250
+ ```
251
+ privileged: true
252
+ ```
253
+
254
+ ## Development
255
+
256
+ * Source hosted at [GitHub][repo]
257
+ * Report issues/questions/feature requests on [GitHub Issues][issues]
258
+
259
+ Pull requests are very welcome! Make sure your patches are well tested.
260
+ Ideally create a topic branch for every separate change you make. For
261
+ example:
262
+
263
+ 1. Fork the repo
264
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
265
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
266
+ 4. Push to the branch (`git push origin my-new-feature`)
267
+ 5. Create new Pull Request
268
+
269
+ ## Authors
270
+
271
+ Created and maintained by [Aaron Nichols][author] (<anichols@trumped.org>)
272
+
273
+ Original kitchen-docker by [Sean Porter](<portertech@gmail.com>)
274
+
275
+ ## License
276
+
277
+ Apache 2.0 (see [LICENSE][license])
278
+
279
+
280
+ [author]: https://github.com/adnichols
281
+ [issues]: https://github.com/adnichols/kitchen-docker-api/issues
282
+ [license]: https://github.com/adnichols/kitchen-docker-api/blob/master/LICENSE
283
+ [repo]: https://github.com/adnichols/kitchen-docker-api
284
+ [docker_getting_started]: http://www.docker.io/gettingstarted/
285
+ [docker_upstart_issue]: https://github.com/dotcloud/docker/issues/223
286
+ [docker_index]: https://index.docker.io/
287
+ [docker_default_image]: https://index.docker.io/_/base/
288
+ [test_kitchen_docs]: http://kitchen.ci/docs/getting-started/
289
+ [chef_omnibus_dl]: http://www.opscode.com/chef/install/
290
+ [cpu_shares]: https://docs.fedoraproject.org/en-US/Fedora/17/html/Resource_Management_Guide/sec-cpu.html
291
+ [memory_limit]: https://docs.fedoraproject.org/en-US/Fedora/17/html/Resource_Management_Guide/sec-memory.html
data/Rakefile ADDED
@@ -0,0 +1,28 @@
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]
22
+
23
+ begin
24
+ require 'kitchen/rake_tasks'
25
+ Kitchen::RakeTasks.new
26
+ rescue LoadError
27
+ puts ">>>>> Kitchen gem not loaded, omitting tasks" unless ENV['CI']
28
+ end
@@ -0,0 +1,30 @@
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_version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'kitchen-docker-api'
8
+ spec.version = Kitchen::Driver::DOCKER_VERSION
9
+ spec.authors = ['Sean Porter', 'Aaron Nichols']
10
+ spec.email = ['anichols@trumped.org']
11
+ spec.description = %q{A Test Kitchen Driver for Docker - docker-api based}
12
+ spec.summary = spec.description
13
+ spec.homepage = 'https://github.com/adnichols/kitchen-docker-api'
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.0.0'
22
+ spec.add_dependency 'docker-api', '~> 1.9.0'
23
+
24
+ spec.add_development_dependency 'bundler', '~> 1.3'
25
+ spec.add_development_dependency 'rake'
26
+
27
+ spec.add_development_dependency 'cane'
28
+ spec.add_development_dependency 'tailor'
29
+ spec.add_development_dependency 'countloc'
30
+ end
@@ -0,0 +1,211 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2014, Aaron Nichols
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 'docker'
20
+
21
+ module Kitchen
22
+
23
+ module Driver
24
+
25
+ # Docker driver
26
+ class Docker < Kitchen::Driver::SSHBase
27
+
28
+ default_config :socket, 'unix:///var/run/docker.sock'
29
+ default_config :privileged, false
30
+ default_config :remove_images, false
31
+ default_config :run_command, '/usr/sbin/sshd -D -o UseDNS=no -o UsePAM=no'
32
+ default_config :username, 'kitchen'
33
+ default_config :password, 'kitchen'
34
+ default_config :read_timeout, 300
35
+
36
+ default_config :image do |driver|
37
+ driver.default_image
38
+ end
39
+
40
+ default_config :platform do |driver|
41
+ driver.default_platform
42
+ end
43
+
44
+ def initialize(*args)
45
+ super(*args)
46
+ @docker_connection = ::Docker::Connection.new(config[:socket], :read_timeout => config[:read_timeout])
47
+ if Kitchen.logger.debug?
48
+ ::Docker.logger = Kitchen.logger
49
+ end
50
+ end
51
+
52
+ def default_image
53
+ platform, release = instance.platform.name.split('-')
54
+ release ? [platform, release].join(':') : 'base'
55
+ end
56
+
57
+ def default_platform
58
+ platform, release = instance.platform.name.split('-')
59
+ release ? platform : 'ubuntu'
60
+ end
61
+
62
+ def create(state)
63
+ state[:image_id] = create_image(state) unless state[:image_id]
64
+ state[:container_id] = create_container(state) unless state[:container_id]
65
+ state[:hostname] = container_ssh_host
66
+ state[:port] = container_ssh_port(state)
67
+ wait_for_sshd(state[:hostname], nil, :port => state[:port])
68
+ end
69
+
70
+ def destroy(state)
71
+ destroy_container(state) if state[:container_id]
72
+ if config[:remove_images] && state[:image_id]
73
+ destroy_image(state)
74
+ end
75
+ end
76
+
77
+ protected
78
+
79
+ def socket_uri
80
+ URI.parse(config[:socket])
81
+ end
82
+
83
+ def remote_socket?
84
+ config[:socket] ? socket_uri.scheme == 'tcp' : false
85
+ end
86
+
87
+ def dockerfile
88
+ from = "FROM #{config[:image]}"
89
+ platform = case config[:platform]
90
+ when 'debian', 'ubuntu'
91
+ <<-eos
92
+ ENV DEBIAN_FRONTEND noninteractive
93
+ RUN dpkg-divert --local --rename --add /sbin/initctl
94
+ RUN ln -sf /bin/true /sbin/initctl
95
+ RUN apt-get update
96
+ RUN apt-get install -y sudo openssh-server curl lsb-release
97
+ eos
98
+ when 'rhel', 'centos'
99
+ <<-eos
100
+ RUN yum clean all
101
+ RUN yum install -y sudo openssh-server openssh-clients curl
102
+ RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
103
+ RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
104
+ eos
105
+ else
106
+ raise ActionFailed,
107
+ "Unknown platform '#{config[:platform]}'"
108
+ end
109
+ username = config[:username]
110
+ password = config[:password]
111
+ base = <<-eos
112
+ RUN mkdir -p /var/run/sshd
113
+ RUN useradd -d /home/#{username} -m -s /bin/bash #{username}
114
+ RUN echo #{username}:#{password} | chpasswd
115
+ RUN echo '#{username} ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
116
+ eos
117
+ custom = ''
118
+ Array(config[:provision_command]).each do |cmd|
119
+ custom << "RUN #{cmd}\n"
120
+ end
121
+ [from, platform, base, custom].join("\n")
122
+ end
123
+
124
+ def container_config(state)
125
+ data = {
126
+ :Cmd => config[:run_command].split,
127
+ :Image => state[:image_id],
128
+ :AttachStdout => true,
129
+ :AttachStderr => true,
130
+ :Privileged => config[:privileged],
131
+ :PublishAllPorts => false
132
+ }
133
+ data[:CpuShares] = config[:cpu] if config[:cpu]
134
+ data[:Dns] = config[:dns] if config[:dns]
135
+ data[:Hostname] = config[:hostname] if config[:hostname]
136
+ data[:Memory] = config[:memory] if config[:memory]
137
+ forward = ['22'] + Array(config[:forward]).map { |mapping| mapping.to_s }
138
+ forward.compact!
139
+ data[:PortSpecs] = forward
140
+ data[:PortBindings] = forward.inject({}) do |bindings, mapping|
141
+ guest_port, host_port = mapping.split(':').reverse
142
+ bindings["#{guest_port}/tcp"] = [{
143
+ :HostIp => '',
144
+ :HostPort => host_port || ''
145
+ }]
146
+ bindings
147
+ end
148
+ data[:Volumes] = Hash[Array(config[:volume]).map { |volume| [volume, {}] }]
149
+ data
150
+ end
151
+
152
+ def parse_log_chunk(chunk)
153
+ if ::Kitchen.logger.debug?
154
+ logger.debug chunk
155
+ else
156
+ parsed_chunk = JSON.parse(chunk)
157
+ parsed_chunk.each do |k, v|
158
+ if [ "stream", "status" ].include? k
159
+ logger.info parsed_chunk[k].strip
160
+ end
161
+ end
162
+ end
163
+ end
164
+
165
+ def create_image(state, opts = {})
166
+ info("Fetching Docker base image '#{config[:image]}' and building...")
167
+ opts[:rm] = config[:remove_images]
168
+ image = ::Docker::Image.build(dockerfile, opts, @docker_connection) do |chunk|
169
+ parse_log_chunk(chunk)
170
+ end
171
+ image.id
172
+ end
173
+
174
+ def create_container(state)
175
+ config_data = container_config(state)
176
+ container = ::Docker::Container.create(config_data, @docker_connection)
177
+ container.start(config_data)
178
+ container.id
179
+ end
180
+
181
+ def docker_image(state)
182
+ ::Docker::Image.get(state[:image_id], nil, @docker_connection)
183
+ end
184
+
185
+ def docker_container(state)
186
+ ::Docker::Container.get(state[:container_id], nil, @docker_connection)
187
+ end
188
+
189
+ def container_ssh_host
190
+ remote_socket? ? socket_uri.host : 'localhost'
191
+ end
192
+
193
+ def container_ssh_port(state)
194
+ container = docker_container(state)
195
+ container.json['NetworkSettings']['Ports']['22/tcp'].first['HostPort']
196
+ end
197
+
198
+ def destroy_container(state)
199
+ container = docker_container(state)
200
+ container.stop
201
+ container.wait
202
+ container.delete
203
+ end
204
+
205
+ def destroy_image(state)
206
+ image = docker_image(state)
207
+ image.remove
208
+ end
209
+ end
210
+ end
211
+ end
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # Copyright (C) 2014, Aaron Nichols
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 Docker Kitchen driver
22
+ DOCKER_VERSION = "0.1.0"
23
+ end
24
+ end
metadata ADDED
@@ -0,0 +1,171 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kitchen-docker-api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Sean Porter
9
+ - Aaron Nichols
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2014-03-18 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: test-kitchen
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: 1.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: 1.0.0
31
+ - !ruby/object:Gem::Dependency
32
+ name: docker-api
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ~>
37
+ - !ruby/object:Gem::Version
38
+ version: 1.9.0
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: 1.9.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: '1.3'
63
+ - !ruby/object:Gem::Dependency
64
+ name: rake
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ - !ruby/object:Gem::Dependency
80
+ name: cane
81
+ requirement: !ruby/object:Gem::Requirement
82
+ none: false
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ none: false
91
+ requirements:
92
+ - - ! '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ - !ruby/object:Gem::Dependency
96
+ name: tailor
97
+ requirement: !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ! '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: countloc
113
+ requirement: !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ none: false
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ description: A Test Kitchen Driver for Docker - docker-api based
128
+ email:
129
+ - anichols@trumped.org
130
+ executables: []
131
+ extensions: []
132
+ extra_rdoc_files: []
133
+ files:
134
+ - .gitignore
135
+ - .kitchen.yml
136
+ - .tailor
137
+ - .travis.yml
138
+ - CHANGELOG.md
139
+ - Gemfile
140
+ - LICENSE
141
+ - README.md
142
+ - Rakefile
143
+ - kitchen-docker-api.gemspec
144
+ - lib/kitchen/driver/docker.rb
145
+ - lib/kitchen/driver/docker_version.rb
146
+ homepage: https://github.com/adnichols/kitchen-docker-api
147
+ licenses:
148
+ - Apache 2.0
149
+ post_install_message:
150
+ rdoc_options: []
151
+ require_paths:
152
+ - lib
153
+ required_ruby_version: !ruby/object:Gem::Requirement
154
+ none: false
155
+ requirements:
156
+ - - ! '>='
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ required_rubygems_version: !ruby/object:Gem::Requirement
160
+ none: false
161
+ requirements:
162
+ - - ! '>='
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ requirements: []
166
+ rubyforge_project:
167
+ rubygems_version: 1.8.23
168
+ signing_key:
169
+ specification_version: 3
170
+ summary: A Test Kitchen Driver for Docker - docker-api based
171
+ test_files: []