kitchen-openstack 1.9.0.dev → 2.0.0.dev
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -12
- data/CHANGELOG.md +7 -1
- data/README.md +40 -10
- data/Rakefile +0 -3
- data/kitchen-openstack.gemspec +5 -6
- data/lib/kitchen/driver/openstack.rb +60 -49
- data/lib/kitchen/driver/openstack/volume.rb +1 -1
- data/lib/kitchen/driver/openstack_version.rb +1 -1
- data/spec/kitchen/driver/openstack_spec.rb +37 -11
- metadata +15 -8
- data/Gemfile.ohai-7 +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0fcef6ed3a8627a5040fdd71bce12e068ea0fe2
|
4
|
+
data.tar.gz: b1325ba7444d75a0e88db8a2e3429e9f4d3514f6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d89d7bc5d23ddb2617be2e43671d405282531891b2c6a63e70d3993681e301e3f0f46bac27f61cb5feffbd29ab095267240fb7f9c1a01e3b700583c4bb56bca
|
7
|
+
data.tar.gz: d5592746386dde26f22029973d9594407e764894331d3d66f9ec3b00060c2e4eefbbc633cc39094978ce4b5df41446062fd82326a06f14c41d02e68f9063612d
|
data/.travis.yml
CHANGED
@@ -5,18 +5,7 @@ sudo: false
|
|
5
5
|
|
6
6
|
gemfile:
|
7
7
|
- Gemfile
|
8
|
-
- Gemfile.ohai-7
|
9
8
|
|
10
9
|
rvm:
|
11
|
-
- 1.9.3
|
12
10
|
- 2.0.0
|
13
|
-
- ruby-head
|
14
|
-
|
15
|
-
matrix:
|
16
|
-
exclude:
|
17
|
-
- rvm: 1.9.3
|
18
|
-
gemfile: Gemfile
|
19
|
-
- rvm: 2.0.0
|
20
|
-
gemfile: Gemfile.ohai-7
|
21
|
-
- rvm: ruby-head
|
22
|
-
gemfile: Gemfile.ohai-7
|
11
|
+
- ruby-head
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -15,7 +15,9 @@
|
|
15
15
|
An OpenStack Nova driver for Test Kitchen 1.0!
|
16
16
|
|
17
17
|
Shamelessly copied from [Fletcher Nichol](https://github.com/fnichol)'s
|
18
|
-
awesome work on an [EC2 driver](https://github.com/
|
18
|
+
awesome work on an [EC2 driver](https://github.com/test-kitchen/kitchen-ec2),
|
19
|
+
and [Adam Leff](https://github.com/adamleff)'s
|
20
|
+
amazing work on an [VRO driver](https://github.com/chef-partners/kitchen-vro).
|
19
21
|
|
20
22
|
## Installation
|
21
23
|
|
@@ -39,18 +41,39 @@ Or if using [chefdk](https://downloads.chef.io/chef-dk) install with:
|
|
39
41
|
|
40
42
|
Provide, at a minimum, the required driver options in your `.kitchen.yml` file:
|
41
43
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
44
|
+
```yaml
|
45
|
+
driver:
|
46
|
+
name: openstack
|
47
|
+
openstack_username: [YOUR OPENSTACK USERNAME]
|
48
|
+
openstack_api_key: [YOUR OPENSTACK API KEY] # AKA your OPENSTACK PASSWORD
|
49
|
+
openstack_auth_url: [YOUR OPENSTACK AUTH URL]
|
50
|
+
require_chef_omnibus: [e.g. 'true' or a version number if you need Chef]
|
51
|
+
image_ref: [SERVER IMAGE ID]
|
52
|
+
flavor_ref: [SERVER FLAVOR ID]
|
53
|
+
```
|
50
54
|
|
51
55
|
The `image_ref` and `flavor_ref` options can be specified as an exact id,
|
52
56
|
an exact name, or as a regular expression matching the name of the image or flavor.
|
53
57
|
|
58
|
+
Test Kitchen 1.4 supports multiple transports, and transports can be configure globally:
|
59
|
+
|
60
|
+
```yaml
|
61
|
+
transport:
|
62
|
+
username: ubuntu
|
63
|
+
password: mysecretpassword
|
64
|
+
```
|
65
|
+
|
66
|
+
... or per-platform:
|
67
|
+
|
68
|
+
```yaml
|
69
|
+
platforms:
|
70
|
+
name: ubuntu-14.04
|
71
|
+
transport:
|
72
|
+
password: myrootpassword
|
73
|
+
name: windows-2012r2
|
74
|
+
password: myadministratorpassword
|
75
|
+
```
|
76
|
+
|
54
77
|
By default, a unique server name will be generated and the current user's SSH
|
55
78
|
key will be used (with an RSA key taking precedence over a DSA), though that
|
56
79
|
behavior can be overridden with additional options:
|
@@ -85,18 +108,25 @@ behavior can be overridden with additional options:
|
|
85
108
|
availability_zone: [THE BLOCK STORAGE AVAILABILITY ZONE, DEFAULTS TO nova]
|
86
109
|
volume_type: [THE VOLUME TYPE, THIS IS OPTIONAL]
|
87
110
|
delete_on_termination: [WILL DELETE VOLUME ON INSTANCE DESTROY WHEN true, OTHERWISE SET TO false]
|
111
|
+
winrm_wait: [DEFAULTS TO 0, BUT THIS HELPS CONFIRM WINRM IS IN A GOOD STATE BEFORE TRYING TO CONNECT]
|
88
112
|
|
89
113
|
If a `server_name_prefix` is specified then this prefix will be used when
|
90
114
|
generating random names of the form `<NAME PREFIX>-<RANDOM STRING>` e.g.
|
91
115
|
`myproject-asdfghjk`. If both `server_name_prefix` and `server_name` are
|
92
116
|
specified then the `server_name` takes precedence.
|
93
117
|
|
118
|
+
`winrm_wait` is a workaround to deal with how WinRM comes up during machine
|
119
|
+
creation. With `cloud-init` running on most OpenStack instances having this
|
120
|
+
wait makes sure that the machine is in a good state to work with.
|
121
|
+
|
94
122
|
If a `key_name` is provided it will be used instead of any
|
95
123
|
`public_key_path` that is specified.
|
96
124
|
|
97
125
|
If a `key_name` is provided without any `private_key_path`, unexpected
|
98
126
|
behavior may result if your local RSA/DSA private key doesn't match that
|
99
|
-
OpenStack key.
|
127
|
+
OpenStack key. If you do key injection via `cloud-init` like this issue:
|
128
|
+
[#77](https://github.com/test-kitchen/kitchen-openstack/issues/77) the best
|
129
|
+
way is to make a "dummy-key."
|
100
130
|
|
101
131
|
A specific `floating_ip` or the ID of a `floating_ip_pool` can be provided to
|
102
132
|
bind a floating IP to the node. Any floating IP will be the IP used for
|
data/Rakefile
CHANGED
data/kitchen-openstack.gemspec
CHANGED
@@ -7,8 +7,8 @@ require 'kitchen/driver/openstack_version'
|
|
7
7
|
Gem::Specification.new do |spec|
|
8
8
|
spec.name = 'kitchen-openstack'
|
9
9
|
spec.version = Kitchen::Driver::OPENSTACK_VERSION
|
10
|
-
spec.authors = ['Jonathan Hartman']
|
11
|
-
spec.email = ['j@p4nt5.com']
|
10
|
+
spec.authors = ['Jonathan Hartman', 'JJ Asghar']
|
11
|
+
spec.email = ['j@p4nt5.com', 'jj@chef.io']
|
12
12
|
spec.description = 'A Test Kitchen OpenStack Nova driver'
|
13
13
|
spec.summary = spec.description
|
14
14
|
spec.homepage = 'https://github.com/test-kitchen/kitchen-openstack'
|
@@ -19,11 +19,10 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
20
|
spec.require_paths = ['lib']
|
21
21
|
|
22
|
-
spec.required_ruby_version = '>=
|
22
|
+
spec.required_ruby_version = '>= 2.0.0'
|
23
23
|
|
24
|
-
spec.add_dependency 'test-kitchen', '~> 1.
|
25
|
-
spec.add_dependency 'fog', '~> 1.
|
26
|
-
# Newer Fogs throw a warning if unf isn't there :(
|
24
|
+
spec.add_dependency 'test-kitchen', '~> 1.4', '>= 1.4.1'
|
25
|
+
spec.add_dependency 'fog', '~> 1.33'
|
27
26
|
spec.add_dependency 'unf'
|
28
27
|
spec.add_dependency 'ohai'
|
29
28
|
|
@@ -1,8 +1,10 @@
|
|
1
|
-
# Encoding:
|
1
|
+
# Encoding: UTF-8
|
2
2
|
#
|
3
3
|
# Author:: Jonathan Hartman (<j@p4nt5.com>)
|
4
|
+
# Author:: JJ Asghar (<jj@chef.io>)
|
4
5
|
#
|
5
6
|
# Copyright (C) 2013-2015, Jonathan Hartman
|
7
|
+
# Copyright (C) 2015, Chef Inc
|
6
8
|
#
|
7
9
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
8
10
|
# you may not use this file except in compliance with the License.
|
@@ -16,23 +18,20 @@
|
|
16
18
|
# See the License for the specific language governing permissions and
|
17
19
|
# limitations under the License.
|
18
20
|
|
19
|
-
require 'benchmark'
|
20
|
-
require 'fog'
|
21
21
|
require 'kitchen'
|
22
|
-
require '
|
23
|
-
require 'ipaddr'
|
24
|
-
require 'socket'
|
22
|
+
require 'fog'
|
25
23
|
require 'ohai'
|
26
24
|
require_relative 'openstack/volume'
|
27
25
|
|
28
26
|
module Kitchen
|
29
27
|
module Driver
|
30
|
-
#
|
31
|
-
#
|
32
|
-
# @author Jonathan Hartman <j@p4nt5.com>
|
33
|
-
class Openstack < Kitchen::Driver::SSHBase # rubocop:disable Metrics/ClassLength, Metrics/LineLength
|
28
|
+
# This takes from the Base Class and creates the OpenStack driver.
|
29
|
+
class Openstack < Kitchen::Driver::Base # rubocop:disable Metrics/ClassLength, Metrics/LineLength
|
34
30
|
@@ip_pool_lock = Mutex.new
|
35
31
|
|
32
|
+
kitchen_driver_api_version 2
|
33
|
+
plugin_version Kitchen::Driver::OPENSTACK_VERSION
|
34
|
+
|
36
35
|
default_config :server_name, nil
|
37
36
|
default_config :server_name_prefix, nil
|
38
37
|
default_config :key_name, nil
|
@@ -62,6 +61,7 @@ module Kitchen
|
|
62
61
|
default_config :network_ref, nil
|
63
62
|
default_config :no_ssh_tcp_check, false
|
64
63
|
default_config :no_ssh_tcp_check_sleep, 120
|
64
|
+
default_config :winrm_wait, 0
|
65
65
|
default_config :block_device_mapping, nil
|
66
66
|
|
67
67
|
required_config :private_key_path
|
@@ -82,23 +82,18 @@ module Kitchen
|
|
82
82
|
config[:server_name] = default_name
|
83
83
|
end
|
84
84
|
end
|
85
|
-
config[:disable_ssl_validation]
|
85
|
+
disable_ssl_validation if config[:disable_ssl_validation]
|
86
86
|
server = create_server
|
87
87
|
state[:server_id] = server.id
|
88
|
-
info "OpenStack instance <#{state[:server_id]}>
|
89
|
-
|
90
|
-
print '.'
|
91
|
-
ready?
|
92
|
-
end
|
93
|
-
info "\n(server ready)"
|
88
|
+
info "OpenStack instance with ID of <#{state[:server_id]}> is ready." # rubocop:disable Metrics/LineLength
|
89
|
+
sleep 30
|
94
90
|
if config[:floating_ip]
|
95
91
|
attach_ip(server, config[:floating_ip])
|
96
92
|
elsif config[:floating_ip_pool]
|
97
93
|
attach_ip_from_pool(server, config[:floating_ip_pool])
|
98
94
|
end
|
99
|
-
state
|
100
|
-
setup_ssh(server, state)
|
101
|
-
wait_for_ssh_key_access(state)
|
95
|
+
wait_for_server(state)
|
96
|
+
setup_ssh(server, state) if bourne_shell?
|
102
97
|
add_ohai_hint(state)
|
103
98
|
rescue Fog::Errors::Error, Excon::Errors::Error => ex
|
104
99
|
raise ActionFailed, ex.message
|
@@ -107,7 +102,7 @@ module Kitchen
|
|
107
102
|
def destroy(state)
|
108
103
|
return if state[:server_id].nil?
|
109
104
|
|
110
|
-
config[:disable_ssl_validation]
|
105
|
+
disable_ssl_validation if config[:disable_ssl_validation]
|
111
106
|
server = compute.servers.get(state[:server_id])
|
112
107
|
server.destroy unless server.nil?
|
113
108
|
info "OpenStack instance <#{state[:server_id]}> destroyed."
|
@@ -117,25 +112,6 @@ module Kitchen
|
|
117
112
|
|
118
113
|
private
|
119
114
|
|
120
|
-
def wait_for_ssh_key_access(state)
|
121
|
-
new_state = build_ssh_args(state)
|
122
|
-
new_state[2][:number_of_password_prompts] = 0
|
123
|
-
info 'Checking ssh key authentication'
|
124
|
-
30.times do
|
125
|
-
ssh = Fog::SSH.new(*new_state)
|
126
|
-
begin
|
127
|
-
ssh.run([%(uname -a)])
|
128
|
-
rescue => e
|
129
|
-
info "Server not yet accepting SSH key: #{e.message}"
|
130
|
-
sleep 1
|
131
|
-
else
|
132
|
-
info 'SSH key authetication successful'
|
133
|
-
return
|
134
|
-
end
|
135
|
-
end
|
136
|
-
fail "30 seconds went by and we couldn't connect, somethings broken"
|
137
|
-
end
|
138
|
-
|
139
115
|
def openstack_server
|
140
116
|
server_def = {
|
141
117
|
provider: 'OpenStack'
|
@@ -212,7 +188,7 @@ module Kitchen
|
|
212
188
|
when :security_groups
|
213
189
|
config[c] if config[c].is_a?(Array)
|
214
190
|
when :user_data
|
215
|
-
File.open(config[c]
|
191
|
+
File.open(config[c], &:read) if File.exist?(config[c])
|
216
192
|
else
|
217
193
|
config[c]
|
218
194
|
end
|
@@ -299,7 +275,6 @@ module Kitchen
|
|
299
275
|
def attach_ip(server, ip)
|
300
276
|
info "Attaching floating IP <#{ip}>"
|
301
277
|
server.associate_address ip
|
302
|
-
(server.addresses['public'] ||= []) << { 'version' => 4, 'addr' => ip }
|
303
278
|
end
|
304
279
|
|
305
280
|
def get_public_private_ips(server)
|
@@ -344,12 +319,25 @@ module Kitchen
|
|
344
319
|
end
|
345
320
|
|
346
321
|
def add_ohai_hint(state)
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
322
|
+
if bourne_shell?
|
323
|
+
info 'Adding OpenStack hint for ohai'
|
324
|
+
mkdir_cmd = "sudo mkdir -p #{hints_path}"
|
325
|
+
touch_cmd = "sudo touch #{hints_path}/openstack.json"
|
326
|
+
instance.transport.connection(state).execute(
|
327
|
+
"#{mkdir_cmd} && #{touch_cmd}"
|
328
|
+
)
|
329
|
+
elsif windows_os?
|
330
|
+
info 'Adding OpenStack hint for ohai'
|
331
|
+
mkdir_cmd = "mkdir #{hints_path}"
|
332
|
+
touch_cmd = "'' > #{hints_path}\\openstack.json"
|
333
|
+
instance.transport.connection(state).execute(
|
334
|
+
"#{mkdir_cmd} && #{touch_cmd}"
|
335
|
+
)
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
339
|
+
def hints_path
|
340
|
+
Ohai::Config[:hints_path][0]
|
353
341
|
end
|
354
342
|
|
355
343
|
def setup_ssh(server, state)
|
@@ -386,7 +374,7 @@ module Kitchen
|
|
386
374
|
config[:username],
|
387
375
|
port: config[:port])
|
388
376
|
end
|
389
|
-
info
|
377
|
+
info "Server #{state[:hostname]} has ssh ready..."
|
390
378
|
end
|
391
379
|
|
392
380
|
def disable_ssl_validation
|
@@ -394,6 +382,29 @@ module Kitchen
|
|
394
382
|
Excon.defaults[:ssl_verify_peer] = false
|
395
383
|
end
|
396
384
|
|
385
|
+
def wait_for_server(state)
|
386
|
+
state[:hostname] = get_ip(state)
|
387
|
+
if config[:winrm_wait]
|
388
|
+
info "Sleeping for #{config[:winrm_wait]} seconds to let WinRM start up..." # rubocop:disable Metrics/LineLength
|
389
|
+
countdown(config[:winrm_wait])
|
390
|
+
end
|
391
|
+
info 'Waiting for server to be ready...'
|
392
|
+
instance.transport.connection(state).wait_until_ready
|
393
|
+
rescue
|
394
|
+
error "Server #{state[:hostname]} (#{state[:server_id]}) not reachable. Destroying server..." # rubocop:disable Metrics/LineLength
|
395
|
+
destroy(state)
|
396
|
+
raise
|
397
|
+
end
|
398
|
+
|
399
|
+
def countdown(seconds)
|
400
|
+
date1 = Time.now + seconds
|
401
|
+
while Time.now < date1
|
402
|
+
t = Time.at(date1.to_i - Time.now.to_i)
|
403
|
+
puts t.strftime('%M:%S')
|
404
|
+
sleep 1
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
397
408
|
def find_matching(collection, name)
|
398
409
|
name = name.to_s
|
399
410
|
if name.start_with?('/') && name.end_with?('/')
|
@@ -7,6 +7,10 @@ require 'logger'
|
|
7
7
|
require 'stringio'
|
8
8
|
require 'rspec'
|
9
9
|
require 'kitchen'
|
10
|
+
require 'kitchen/driver/openstack'
|
11
|
+
require 'kitchen/provisioner/dummy'
|
12
|
+
require 'kitchen/transport/dummy'
|
13
|
+
require 'kitchen/verifier/dummy'
|
10
14
|
require 'ohai'
|
11
15
|
|
12
16
|
describe Kitchen::Driver::Openstack do
|
@@ -17,10 +21,17 @@ describe Kitchen::Driver::Openstack do
|
|
17
21
|
let(:dsa) { File.expand_path('~/.ssh/id_dsa') }
|
18
22
|
let(:rsa) { File.expand_path('~/.ssh/id_rsa') }
|
19
23
|
let(:instance_name) { 'potatoes' }
|
24
|
+
let(:transport) { Kitchen::Transport::Dummy.new }
|
25
|
+
let(:platform) { Kitchen::Platform.new(name: 'fake_platform') }
|
26
|
+
let(:driver) { Kitchen::Driver::Openstack.new(config) }
|
20
27
|
|
21
28
|
let(:instance) do
|
22
29
|
double(
|
23
|
-
name: instance_name,
|
30
|
+
name: instance_name,
|
31
|
+
transport: transport,
|
32
|
+
logger: logger,
|
33
|
+
platform: platform,
|
34
|
+
to_str: 'instance'
|
24
35
|
)
|
25
36
|
end
|
26
37
|
|
@@ -184,6 +195,7 @@ describe Kitchen::Driver::Openstack do
|
|
184
195
|
allow(d).to receive(:get_ip).and_return('1.2.3.4')
|
185
196
|
allow(d).to receive(:add_ohai_hint).and_return(true)
|
186
197
|
allow(d).to receive(:do_ssh_setup).and_return(true)
|
198
|
+
allow(d).to receive(:sleep)
|
187
199
|
d
|
188
200
|
end
|
189
201
|
|
@@ -197,6 +209,28 @@ describe Kitchen::Driver::Openstack do
|
|
197
209
|
}
|
198
210
|
end
|
199
211
|
end
|
212
|
+
|
213
|
+
context 'when executed with a bourne shell' do
|
214
|
+
before do
|
215
|
+
allow(driver).to receive(:bourne_shell?).and_return(true)
|
216
|
+
end
|
217
|
+
|
218
|
+
it 'executes the ssh setup' do
|
219
|
+
expect(driver).to receive(:setup_ssh)
|
220
|
+
driver.create(state)
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
context 'when executed in a non-bourne shell' do
|
225
|
+
before do
|
226
|
+
allow(driver).to receive(:bourne_shell?).and_return(false)
|
227
|
+
end
|
228
|
+
|
229
|
+
it 'does not execute the ssh setup' do
|
230
|
+
expect(driver).not_to receive(:setup_ssh)
|
231
|
+
driver.create(state)
|
232
|
+
end
|
233
|
+
end
|
200
234
|
end
|
201
235
|
|
202
236
|
describe '#destroy' do
|
@@ -812,8 +846,7 @@ describe Kitchen::Driver::Openstack do
|
|
812
846
|
end
|
813
847
|
|
814
848
|
it 'associates the IP address with the server' do
|
815
|
-
expect(driver.send(:attach_ip, server, ip)).to eq(
|
816
|
-
[{ 'version' => 4, 'addr' => ip }])
|
849
|
+
expect(driver.send(:attach_ip, server, ip)).to eq(true)
|
817
850
|
end
|
818
851
|
end
|
819
852
|
|
@@ -1067,14 +1100,7 @@ describe Kitchen::Driver::Openstack do
|
|
1067
1100
|
s
|
1068
1101
|
end
|
1069
1102
|
it 'opens an SSH session to the server' do
|
1070
|
-
|
1071
|
-
.and_return(ssh)
|
1072
|
-
res = driver.send(:add_ohai_hint, state)
|
1073
|
-
expected = [
|
1074
|
-
"sudo mkdir -p #{Ohai::Config[:hints_path][0]}",
|
1075
|
-
"sudo touch #{Ohai::Config[:hints_path][0]}/openstack.json"
|
1076
|
-
]
|
1077
|
-
expect(res).to eq(expected)
|
1103
|
+
driver.send(:add_ohai_hint, state)
|
1078
1104
|
end
|
1079
1105
|
end
|
1080
1106
|
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kitchen-openstack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0.dev
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jonathan Hartman
|
8
|
+
- JJ Asghar
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
12
|
+
date: 2015-09-09 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: test-kitchen
|
@@ -16,28 +17,34 @@ dependencies:
|
|
16
17
|
requirements:
|
17
18
|
- - "~>"
|
18
19
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
20
|
+
version: '1.4'
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.4.1
|
20
24
|
type: :runtime
|
21
25
|
prerelease: false
|
22
26
|
version_requirements: !ruby/object:Gem::Requirement
|
23
27
|
requirements:
|
24
28
|
- - "~>"
|
25
29
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
30
|
+
version: '1.4'
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.4.1
|
27
34
|
- !ruby/object:Gem::Dependency
|
28
35
|
name: fog
|
29
36
|
requirement: !ruby/object:Gem::Requirement
|
30
37
|
requirements:
|
31
38
|
- - "~>"
|
32
39
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
40
|
+
version: '1.33'
|
34
41
|
type: :runtime
|
35
42
|
prerelease: false
|
36
43
|
version_requirements: !ruby/object:Gem::Requirement
|
37
44
|
requirements:
|
38
45
|
- - "~>"
|
39
46
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1.
|
47
|
+
version: '1.33'
|
41
48
|
- !ruby/object:Gem::Dependency
|
42
49
|
name: unf
|
43
50
|
requirement: !ruby/object:Gem::Requirement
|
@@ -195,6 +202,7 @@ dependencies:
|
|
195
202
|
description: A Test Kitchen OpenStack Nova driver
|
196
203
|
email:
|
197
204
|
- j@p4nt5.com
|
205
|
+
- jj@chef.io
|
198
206
|
executables: []
|
199
207
|
extensions: []
|
200
208
|
extra_rdoc_files: []
|
@@ -204,7 +212,6 @@ files:
|
|
204
212
|
- ".travis.yml"
|
205
213
|
- CHANGELOG.md
|
206
214
|
- Gemfile
|
207
|
-
- Gemfile.ohai-7
|
208
215
|
- LICENSE.txt
|
209
216
|
- README.md
|
210
217
|
- Rakefile
|
@@ -227,7 +234,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
227
234
|
requirements:
|
228
235
|
- - ">="
|
229
236
|
- !ruby/object:Gem::Version
|
230
|
-
version:
|
237
|
+
version: 2.0.0
|
231
238
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
232
239
|
requirements:
|
233
240
|
- - ">"
|