kitchen-cloudstack 0.9.2 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +7 -5
- data/kitchen-cloudstack.gemspec +10 -11
- data/lib/kitchen/driver/cloudstack.rb +76 -65
- data/lib/kitchen/driver/cloudstack_version.rb +1 -1
- metadata +31 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c8040fde05ddb78c105dcde532e513609778f21c
|
4
|
+
data.tar.gz: 4026c35590d771c985f69282d31a0913af1e46f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb0259abafb6e674cec30e039d5b21c381f53ce04a1f19969791c9ee23becce992d4d0764faad15bf9e9b73e4abd110bc38d124b097ede7fcd21380b08220e4a
|
7
|
+
data.tar.gz: e0a1d0c94393570a6b8d487fc0f357297af5cc82a9140a6679d767081a20bc2e72c1ac4697d9aa1376e493ba4db7274acba37603a4fca8aa284e8ff7f08a00e7
|
data/README.md
CHANGED
@@ -24,6 +24,7 @@ Provide, at a minimum, the required driver options in your `.kitchen.yml` file:
|
|
24
24
|
OPTIONAL
|
25
25
|
cloudstack_sync_time: [NUMBER OF SECONDS TO WAIT FOR CLOUD-SET-GUEST-PASSWORD/SSHKEY]
|
26
26
|
keypair_search_directory: [PATH TO DIRECTORY (other than ~, ., and ~/.ssh) WITH KEYPAIR PEM FILE]
|
27
|
+
cloudstack_vm_public_ip: [PUBLIC_IP] # In case you use advanced networking and do static NAT manually.
|
27
28
|
|
28
29
|
Then to specify different OS templates,
|
29
30
|
|
@@ -40,7 +41,8 @@ To use the CloudStack public key provider, you need to have the .PEM file locate
|
|
40
41
|
your .kitchen.yml file, your home directory (~), your .ssh directory (~/.ssh/), or specify a directory (without any
|
41
42
|
trailing slahses) as your "keypair_search_directory" and the file be named the same as the Keypair on CloudStack
|
42
43
|
suffixed with .pem (e.g. the Keypair named "TestKey" should be located in one of the searched directories and named
|
43
|
-
"TestKey.pem").
|
44
|
+
"TestKey.pem").
|
45
|
+
This PEM file should be the PRIVATE key, not the PUBLIC key.
|
44
46
|
|
45
47
|
By default, a unique server name will be generated and the randomly generated password will be used, though that
|
46
48
|
behavior can be overridden with additional options (e.g., to specify a SSH private key):
|
@@ -96,8 +98,8 @@ Apache 2.0 (see [LICENSE][license])
|
|
96
98
|
|
97
99
|
|
98
100
|
[author]: https://github.com/fifthecho
|
99
|
-
[issues]: https://github.com/
|
100
|
-
[license]: https://github.com/
|
101
|
-
[repo]: https://github.com/
|
101
|
+
[issues]: https://github.com/test-kitchen/kitchen-cloudstack/issues
|
102
|
+
[license]: https://github.com/test-kitchen/kitchen-cloudstack/blob/master/LICENSE
|
103
|
+
[repo]: https://github.com/test-kitchen/kitchen-cloudstack
|
102
104
|
[driver_usage]: http://docs.kitchen-ci.org/drivers/usage
|
103
|
-
[chef_omnibus_dl]: http://
|
105
|
+
[chef_omnibus_dl]: http://getchef.com/chef/install/
|
data/kitchen-cloudstack.gemspec
CHANGED
@@ -8,9 +8,9 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Kitchen::Driver::CLOUDSTACK_VERSION
|
9
9
|
spec.authors = ['Jeff Moody']
|
10
10
|
spec.email = ['fifthecho@gmail.com']
|
11
|
-
spec.description = %q{A Test Kitchen Driver for
|
12
|
-
spec.summary =
|
13
|
-
spec.homepage = 'https://github.com/
|
11
|
+
spec.description = %q{A Test Kitchen Driver for Apache CloudStack}
|
12
|
+
spec.summary = %q{Provides an interface for Test Kitchen to be able to run jobs against an Apache CloudStack cloud.}
|
13
|
+
spec.homepage = 'https://github.com/test-kitchen/kitchen-cloudstack'
|
14
14
|
spec.license = 'Apache 2.0'
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
@@ -18,15 +18,14 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
|
-
spec.add_dependency 'test-kitchen', '>= 1.0.0'
|
22
|
-
spec.add_dependency 'fog',
|
23
|
-
spec.add_dependency 'net-ssh-multi'
|
21
|
+
spec.add_dependency 'test-kitchen', '~> 1.0', '>= 1.0.0'
|
22
|
+
spec.add_dependency 'fog', '~> 1.23', '>= 1.23.0'
|
24
23
|
|
25
24
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
26
|
-
spec.add_development_dependency 'rake'
|
25
|
+
spec.add_development_dependency 'rake', '~> 0'
|
27
26
|
|
28
|
-
spec.add_development_dependency 'cane'
|
29
|
-
spec.add_development_dependency 'tailor'
|
30
|
-
spec.add_development_dependency 'countloc'
|
31
|
-
spec.add_development_dependency 'pry'
|
27
|
+
spec.add_development_dependency 'cane', '~> 0'
|
28
|
+
spec.add_development_dependency 'tailor', '~> 0'
|
29
|
+
spec.add_development_dependency 'countloc', '~> 0'
|
30
|
+
spec.add_development_dependency 'pry', '~> 0'
|
32
31
|
end
|
@@ -20,7 +20,7 @@ require 'benchmark'
|
|
20
20
|
require 'kitchen'
|
21
21
|
require 'fog'
|
22
22
|
require 'socket'
|
23
|
-
require '
|
23
|
+
require 'openssl'
|
24
24
|
# require 'pry'
|
25
25
|
|
26
26
|
module Kitchen
|
@@ -51,10 +51,7 @@ module Kitchen
|
|
51
51
|
def create_server
|
52
52
|
options = {}
|
53
53
|
config[:server_name] ||= generate_name(instance.name)
|
54
|
-
options['zoneid'] = config[:cloudstack_zone_id]
|
55
|
-
options['templateid'] = config[:cloudstack_template_id]
|
56
54
|
options['displayname'] = config[:server_name]
|
57
|
-
options['serviceofferingid'] = config[:cloudstack_serviceoffering_id]
|
58
55
|
if (!config[:cloudstack_network_id].nil?)
|
59
56
|
options['networkids'] = config[:cloudstack_network_id]
|
60
57
|
end
|
@@ -69,7 +66,8 @@ module Kitchen
|
|
69
66
|
|
70
67
|
debug(options)
|
71
68
|
# binding.pry
|
72
|
-
compute.deploy_virtual_machine(
|
69
|
+
compute.deploy_virtual_machine(config[:cloudstack_serviceoffering_id],
|
70
|
+
config[:cloudstack_template_id], config[:cloudstack_zone_id], options)
|
73
71
|
end
|
74
72
|
|
75
73
|
def create(state)
|
@@ -83,6 +81,7 @@ module Kitchen
|
|
83
81
|
Excon.defaults[:ssl_verify_peer] = false
|
84
82
|
end
|
85
83
|
|
84
|
+
|
86
85
|
server = create_server
|
87
86
|
debug(server)
|
88
87
|
|
@@ -91,11 +90,11 @@ module Kitchen
|
|
91
90
|
info("CloudStack instance <#{state[:server_id]}> created.")
|
92
91
|
debug("Job ID #{jobid}")
|
93
92
|
|
94
|
-
server_start = compute.query_async_job_result(
|
93
|
+
server_start = compute.query_async_job_result(jobid)
|
95
94
|
while server_start['queryasyncjobresultresponse'].fetch('jobstatus') == 0
|
96
95
|
print ". "
|
97
96
|
sleep(10)
|
98
|
-
server_start = compute.query_async_job_result(
|
97
|
+
server_start = compute.query_async_job_result(jobid)
|
99
98
|
end
|
100
99
|
debug("Server_Start: #{server_start} \n")
|
101
100
|
|
@@ -114,41 +113,50 @@ module Kitchen
|
|
114
113
|
password = nil
|
115
114
|
if ((!config[:keypair_search_directory].nil?) and (File.exist?("#{config[:keypair_search_directory]}/#{config[:cloudstack_ssh_keypair_name]}.pem")))
|
116
115
|
keypair = "#{config[:keypair_search_directory]}/#{config[:cloudstack_ssh_keypair_name]}.pem"
|
116
|
+
debug("Keypair being used is #{keypair}")
|
117
117
|
elsif File.exist?("./#{config[:cloudstack_ssh_keypair_name]}.pem")
|
118
118
|
keypair = "./#{config[:cloudstack_ssh_keypair_name]}.pem"
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
119
|
+
debug("Keypair being used is #{keypair}")
|
120
|
+
elsif File.exist?("#{ENV["HOME"]}/#{config[:cloudstack_ssh_keypair_name]}.pem")
|
121
|
+
keypair = "#{ENV["HOME"]}/#{config[:cloudstack_ssh_keypair_name]}.pem"
|
122
|
+
debug("Keypair being used is #{keypair}")
|
123
|
+
elsif File.exist?("#{ENV["HOME"]}/.ssh/#{config[:cloudstack_ssh_keypair_name]}.pem")
|
124
|
+
keypair = "#{ENV["HOME"]}/.ssh/#{config[:cloudstack_ssh_keypair_name]}.pem"
|
125
|
+
debug("Keypair being used is #{keypair}")
|
123
126
|
elsif (!config[:cloudstack_ssh_keypair_name].nil?)
|
124
127
|
info("Keypair specified but not found. Using password if enabled.")
|
125
128
|
end
|
126
129
|
|
130
|
+
# binding.pry
|
127
131
|
# debug("Keypair is #{keypair}")
|
128
|
-
state[:hostname] = server_info.fetch('nic').first.fetch('ipaddress')
|
129
|
-
|
132
|
+
state[:hostname] = config[:cloudstack_vm_public_ip] || server_info.fetch('nic').first.fetch('ipaddress')
|
133
|
+
wait_for_sshd(state[:hostname])
|
134
|
+
|
130
135
|
debug("SSH Connectivity Validated.")
|
131
136
|
|
132
137
|
if (!keypair.nil?)
|
133
138
|
debug("Using keypair: #{keypair}")
|
134
139
|
info("SSH for #{state[:hostname]} with keypair #{config[:cloudstack_ssh_keypair_name]}.")
|
140
|
+
ssh_key = File.read(keypair)
|
141
|
+
if ssh_key.split[0] == "ssh-rsa" or ssh_key.split[0] == "ssh-dsa"
|
142
|
+
error("SSH key #{keypair} is not a Private Key. Please modify your .kitchen.yml")
|
143
|
+
end
|
135
144
|
ssh = Fog::SSH.new(state[:hostname], config[:username], {:keys => keypair})
|
136
|
-
debug(state[:hostname])
|
137
|
-
debug(config[:username])
|
138
|
-
debug(keypair)
|
139
|
-
deploy_private_key(state[:hostname], ssh)
|
145
|
+
debug("Connecting to : #{state[:hostname]} as #{config[:username]} using keypair #{keypair}.")
|
140
146
|
elsif (server_info.fetch('passwordenabled') == true)
|
141
147
|
password = server_info.fetch('password')
|
142
148
|
# Print out IP and password so you can record it if you want.
|
143
149
|
info("Password for #{config[:username]} at #{state[:hostname]} is #{password}")
|
144
150
|
ssh = Fog::SSH.new(state[:hostname], config[:username], {:password => password})
|
145
|
-
debug(state[:hostname])
|
146
|
-
debug(config[:username])
|
147
|
-
debug(password)
|
148
|
-
deploy_private_key(state[:hostname], ssh)
|
151
|
+
debug("Connecting to : #{state[:hostname]} as #{config[:username]} using password #{password}.")
|
149
152
|
else
|
150
153
|
info("No keypair specified (or file not found) nor is this a password enabled template. You will have to manually copy your SSH public key to #{state[:hostname]} to use this Kitchen.")
|
151
154
|
end
|
155
|
+
# binding.pry
|
156
|
+
|
157
|
+
validate_ssh_connectivity(ssh)
|
158
|
+
|
159
|
+
deploy_private_key(ssh)
|
152
160
|
end
|
153
161
|
end
|
154
162
|
|
@@ -156,62 +164,65 @@ module Kitchen
|
|
156
164
|
return if state[:server_id].nil?
|
157
165
|
|
158
166
|
server = compute.servers.get(state[:server_id])
|
159
|
-
|
167
|
+
compute.destroy_virtual_machine(state[:server_id]) unless server.nil?
|
160
168
|
info("CloudStack instance <#{state[:server_id]}> destroyed.")
|
161
169
|
state.delete(:server_id)
|
162
170
|
state.delete(:hostname)
|
163
171
|
end
|
164
172
|
|
165
|
-
def
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
readable = IO.select([tcp_socket], nil, nil, 5)
|
170
|
-
if readable
|
171
|
-
debug("\nsshd accepting connections on #{hostname}, banner is #{tcp_socket.gets}\n")
|
172
|
-
true
|
173
|
-
else
|
173
|
+
def validate_ssh_connectivity(ssh)
|
174
|
+
rescue Errno::ETIMEDOUT
|
175
|
+
debug("SSH connection timed out. Retrying.")
|
176
|
+
sleep 2
|
174
177
|
false
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
178
|
+
rescue Errno::EPERM
|
179
|
+
debug("SSH connection returned error. Retrying.")
|
180
|
+
false
|
181
|
+
rescue Errno::ECONNREFUSED
|
182
|
+
debug("SSH connection returned connection refused. Retrying.")
|
183
|
+
sleep 2
|
184
|
+
false
|
185
|
+
rescue Errno::EHOSTUNREACH
|
186
|
+
debug("SSH connection returned host unreachable. Retrying.")
|
187
|
+
sleep 2
|
188
|
+
false
|
189
|
+
rescue Errno::ENETUNREACH
|
190
|
+
debug("SSH connection returned network unreachable. Retrying.")
|
191
|
+
sleep 30
|
192
|
+
false
|
193
|
+
rescue Net::SSH::Disconnect
|
194
|
+
debug("SSH connection has been disconnected. Retrying.")
|
195
|
+
sleep 15
|
196
|
+
false
|
197
|
+
rescue Net::SSH::AuthenticationFailed
|
198
|
+
debug("SSH authentication has failed. Password or Keys may not be in place yet. Retrying.")
|
199
|
+
sleep 15
|
200
|
+
false
|
201
|
+
ensure
|
202
|
+
sync_time = 45
|
203
|
+
if (config[:cloudstack_sync_time])
|
204
|
+
sync_time = config[:cloudstack_sync_time]
|
205
|
+
end
|
206
|
+
sleep(sync_time)
|
207
|
+
debug("Connecting to host and running ls")
|
208
|
+
ssh.run('ls')
|
196
209
|
end
|
197
210
|
|
198
|
-
def deploy_private_key(
|
199
|
-
debug("Deploying private key to
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
211
|
+
def deploy_private_key(ssh)
|
212
|
+
debug("Deploying user private key to server using connection #{ssh} to guarantee connectivity.")
|
213
|
+
if File.exist?("#{ENV["HOME"]}/.ssh/id_rsa.pub")
|
214
|
+
user_public_key = File.read("#{ENV["HOME"]}/.ssh/id_rsa.pub")
|
215
|
+
elsif File.exist?("#{ENV["HOME"]}/.ssh/id_dsa.pub")
|
216
|
+
user_public_key = File.read("#{ENV["HOME"]}/.ssh/id_dsa.pub")
|
217
|
+
else
|
218
|
+
debug("No public SSH key for user. Skipping.")
|
204
219
|
end
|
205
|
-
|
206
|
-
if
|
207
|
-
pub_key = open(config[:public_key_path]).read
|
208
|
-
# Wait a few moments for the OS to run the cloud-setup-password scripts
|
209
|
-
sleep(sync_time)
|
220
|
+
|
221
|
+
if user_public_key
|
210
222
|
ssh.run([
|
211
223
|
%{mkdir .ssh},
|
212
|
-
%{echo "#{
|
224
|
+
%{echo "#{user_public_key}" >> ~/.ssh/authorized_keys}
|
213
225
|
])
|
214
|
-
|
215
226
|
end
|
216
227
|
end
|
217
228
|
|
metadata
CHANGED
@@ -1,19 +1,22 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kitchen-cloudstack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Moody
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: test-kitchen
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
17
20
|
- - ">="
|
18
21
|
- !ruby/object:Gem::Version
|
19
22
|
version: 1.0.0
|
@@ -21,6 +24,9 @@ dependencies:
|
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
23
26
|
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.0'
|
24
30
|
- - ">="
|
25
31
|
- !ruby/object:Gem::Version
|
26
32
|
version: 1.0.0
|
@@ -28,30 +34,22 @@ dependencies:
|
|
28
34
|
name: fog
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
30
36
|
requirements:
|
31
|
-
- - "
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 1.15.0
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
37
|
+
- - "~>"
|
39
38
|
- !ruby/object:Gem::Version
|
40
|
-
version: 1.
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: net-ssh-multi
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
39
|
+
version: '1.23'
|
45
40
|
- - ">="
|
46
41
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
42
|
+
version: 1.23.0
|
48
43
|
type: :runtime
|
49
44
|
prerelease: false
|
50
45
|
version_requirements: !ruby/object:Gem::Requirement
|
51
46
|
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1.23'
|
52
50
|
- - ">="
|
53
51
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
52
|
+
version: 1.23.0
|
55
53
|
- !ruby/object:Gem::Dependency
|
56
54
|
name: bundler
|
57
55
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,73 +68,73 @@ dependencies:
|
|
70
68
|
name: rake
|
71
69
|
requirement: !ruby/object:Gem::Requirement
|
72
70
|
requirements:
|
73
|
-
- - "
|
71
|
+
- - "~>"
|
74
72
|
- !ruby/object:Gem::Version
|
75
73
|
version: '0'
|
76
74
|
type: :development
|
77
75
|
prerelease: false
|
78
76
|
version_requirements: !ruby/object:Gem::Requirement
|
79
77
|
requirements:
|
80
|
-
- - "
|
78
|
+
- - "~>"
|
81
79
|
- !ruby/object:Gem::Version
|
82
80
|
version: '0'
|
83
81
|
- !ruby/object:Gem::Dependency
|
84
82
|
name: cane
|
85
83
|
requirement: !ruby/object:Gem::Requirement
|
86
84
|
requirements:
|
87
|
-
- - "
|
85
|
+
- - "~>"
|
88
86
|
- !ruby/object:Gem::Version
|
89
87
|
version: '0'
|
90
88
|
type: :development
|
91
89
|
prerelease: false
|
92
90
|
version_requirements: !ruby/object:Gem::Requirement
|
93
91
|
requirements:
|
94
|
-
- - "
|
92
|
+
- - "~>"
|
95
93
|
- !ruby/object:Gem::Version
|
96
94
|
version: '0'
|
97
95
|
- !ruby/object:Gem::Dependency
|
98
96
|
name: tailor
|
99
97
|
requirement: !ruby/object:Gem::Requirement
|
100
98
|
requirements:
|
101
|
-
- - "
|
99
|
+
- - "~>"
|
102
100
|
- !ruby/object:Gem::Version
|
103
101
|
version: '0'
|
104
102
|
type: :development
|
105
103
|
prerelease: false
|
106
104
|
version_requirements: !ruby/object:Gem::Requirement
|
107
105
|
requirements:
|
108
|
-
- - "
|
106
|
+
- - "~>"
|
109
107
|
- !ruby/object:Gem::Version
|
110
108
|
version: '0'
|
111
109
|
- !ruby/object:Gem::Dependency
|
112
110
|
name: countloc
|
113
111
|
requirement: !ruby/object:Gem::Requirement
|
114
112
|
requirements:
|
115
|
-
- - "
|
113
|
+
- - "~>"
|
116
114
|
- !ruby/object:Gem::Version
|
117
115
|
version: '0'
|
118
116
|
type: :development
|
119
117
|
prerelease: false
|
120
118
|
version_requirements: !ruby/object:Gem::Requirement
|
121
119
|
requirements:
|
122
|
-
- - "
|
120
|
+
- - "~>"
|
123
121
|
- !ruby/object:Gem::Version
|
124
122
|
version: '0'
|
125
123
|
- !ruby/object:Gem::Dependency
|
126
124
|
name: pry
|
127
125
|
requirement: !ruby/object:Gem::Requirement
|
128
126
|
requirements:
|
129
|
-
- - "
|
127
|
+
- - "~>"
|
130
128
|
- !ruby/object:Gem::Version
|
131
129
|
version: '0'
|
132
130
|
type: :development
|
133
131
|
prerelease: false
|
134
132
|
version_requirements: !ruby/object:Gem::Requirement
|
135
133
|
requirements:
|
136
|
-
- - "
|
134
|
+
- - "~>"
|
137
135
|
- !ruby/object:Gem::Version
|
138
136
|
version: '0'
|
139
|
-
description: A Test Kitchen Driver for
|
137
|
+
description: A Test Kitchen Driver for Apache CloudStack
|
140
138
|
email:
|
141
139
|
- fifthecho@gmail.com
|
142
140
|
executables: []
|
@@ -155,7 +153,7 @@ files:
|
|
155
153
|
- kitchen-cloudstack.gemspec
|
156
154
|
- lib/kitchen/driver/cloudstack.rb
|
157
155
|
- lib/kitchen/driver/cloudstack_version.rb
|
158
|
-
homepage: https://github.com/
|
156
|
+
homepage: https://github.com/test-kitchen/kitchen-cloudstack
|
159
157
|
licenses:
|
160
158
|
- Apache 2.0
|
161
159
|
metadata: {}
|
@@ -175,8 +173,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
175
173
|
version: '0'
|
176
174
|
requirements: []
|
177
175
|
rubyforge_project:
|
178
|
-
rubygems_version: 2.
|
176
|
+
rubygems_version: 2.2.2
|
179
177
|
signing_key:
|
180
178
|
specification_version: 4
|
181
|
-
summary:
|
179
|
+
summary: Provides an interface for Test Kitchen to be able to run jobs against an
|
180
|
+
Apache CloudStack cloud.
|
182
181
|
test_files: []
|
182
|
+
has_rdoc:
|