kitchen-cloudstack 0.22.0 → 0.23.0
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.
- checksums.yaml +5 -5
- data/README.md +1 -0
- data/lib/kitchen/driver/cloudstack.rb +99 -1
- data/lib/kitchen/driver/cloudstack_version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 85e304a3e17949e1178d38b6a4bb8a79efee76cb9af48a0f9eeb6a942c416457
|
4
|
+
data.tar.gz: cf4363b3db44132a97cffbda84348cd553610206d3743434e34b6038033c9cc1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d3100a2b43079e25074c90e61a2bf206a53267be6816ac0c0ddf93014640396a56c178bfdc956584e90e2082703df852f31403ea19a21efaec5a56ad05cc5360
|
7
|
+
data.tar.gz: 0d285e444bb04b5878c4d42e97d5d4fa5e12822c8a13c94da2c9f468d0cb224d2a9c4e374470a67a5b8de5dc013566e89362fde13c447b2e355bf2425d2cb2eb
|
data/README.md
CHANGED
@@ -27,6 +27,7 @@ Provide, at a minimum, the required driver options in your `.kitchen.yml` file:
|
|
27
27
|
keypair_search_directory: [PATH TO DIRECTORY (other than ~, ., and ~/.ssh) WITH KEYPAIR PEM FILE]
|
28
28
|
cloudstack_project_id: [PROJECT_ID] # To deploy VMs into project.
|
29
29
|
cloudstack_vm_public_ip: [PUBLIC_IP] # In case you use advanced networking and do static NAT manually.
|
30
|
+
associate_public_ip: [TRUE/FALSE] # If you want kitchen to automatically associate a public IP, default false.
|
30
31
|
cloudstack_userdata: "#cloud-config\npackages:\n - htop\n" # double quote required.
|
31
32
|
|
32
33
|
Then to specify different OS templates,
|
@@ -146,7 +146,14 @@ module Kitchen
|
|
146
146
|
info("Keypair specified but not found. Using password if enabled.")
|
147
147
|
end
|
148
148
|
|
149
|
-
|
149
|
+
if config[:associate_public_ip]
|
150
|
+
info("Associating public ip...")
|
151
|
+
state[:hostname] = associate_public_ip(state, server_info)
|
152
|
+
info("Creating port forward...")
|
153
|
+
create_port_forward(state, server_info['id'])
|
154
|
+
else
|
155
|
+
state[:hostname] = default_public_ip(server_info) unless config[:associate_public_ip]
|
156
|
+
end
|
150
157
|
|
151
158
|
if keypair
|
152
159
|
debug("Using keypair: #{keypair}")
|
@@ -191,6 +198,10 @@ module Kitchen
|
|
191
198
|
|
192
199
|
def destroy(state)
|
193
200
|
return unless state[:server_id]
|
201
|
+
if config[:associate_public_ip]
|
202
|
+
delete_port_forward(state)
|
203
|
+
release_public_ip(state)
|
204
|
+
end
|
194
205
|
debug("Destroying #{state[:server_id]}")
|
195
206
|
server = compute.servers.get(state[:server_id])
|
196
207
|
expunge =
|
@@ -302,6 +313,93 @@ module Kitchen
|
|
302
313
|
Base64.encode64(user_data)
|
303
314
|
end
|
304
315
|
end
|
316
|
+
|
317
|
+
def associate_public_ip(state, server_info)
|
318
|
+
options = {
|
319
|
+
'zoneid' => config[:cloudstack_zone_id],
|
320
|
+
'vpcid' => get_vpc_id
|
321
|
+
}
|
322
|
+
res = compute.associate_ip_address(options)
|
323
|
+
job_status = compute.query_async_job_result(res['associateipaddressresponse']['jobid'])
|
324
|
+
if job_status['queryasyncjobresultresponse'].fetch('jobstatus').to_i == 1
|
325
|
+
save_ipaddress_id(state, job_status)
|
326
|
+
get_public_ip(res['associateipaddressresponse']['id'])
|
327
|
+
else
|
328
|
+
error(job_status['queryasyncjobresultresponse'].fetch('jobresult'))
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
def create_port_forward(state, virtualmachineid)
|
333
|
+
options = {
|
334
|
+
'ipaddressid' => state[:ipaddressid],
|
335
|
+
'privateport' => 22,
|
336
|
+
'protocol' => "TCP",
|
337
|
+
'publicport' => 22,
|
338
|
+
'virtualmachineid' => virtualmachineid,
|
339
|
+
'networkid' => config[:cloudstack_network_id],
|
340
|
+
'openfirewall' => false
|
341
|
+
}
|
342
|
+
res = compute.create_port_forwarding_rule(options)
|
343
|
+
job_status = compute.query_async_job_result(res['createportforwardingruleresponse']['jobid'])
|
344
|
+
unless job_status['queryasyncjobresultresponse'].fetch('jobstatus').to_i == 0
|
345
|
+
error("Error creating port forwarding rules")
|
346
|
+
end
|
347
|
+
save_forwarding_port_rule_id(state, res['createportforwardingruleresponse']['id'])
|
348
|
+
end
|
349
|
+
|
350
|
+
def release_public_ip(state)
|
351
|
+
info("Disassociating public ip...")
|
352
|
+
begin
|
353
|
+
res = compute.disassociate_ip_address(state[:ipaddressid])
|
354
|
+
rescue Fog::Compute::Cloudstack::BadRequest => e
|
355
|
+
error(e) unless e.to_s.match?(/does not exist/)
|
356
|
+
else
|
357
|
+
job_status = compute.query_async_job_result(res['disassociateipaddressresponse']['jobid'])
|
358
|
+
unless job_status['queryasyncjobresultresponse'].fetch('jobstatus').to_i == 0
|
359
|
+
error("Error disassociating public ip")
|
360
|
+
end
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
def delete_port_forward(state)
|
365
|
+
info("Deleting port forwarding rules...")
|
366
|
+
begin
|
367
|
+
res = compute.delete_port_forwarding_rule(state[:forwardingruleid])
|
368
|
+
rescue Fog::Compute::Cloudstack::BadRequest => e
|
369
|
+
error(e) unless e.to_s.match?(/does not exist/)
|
370
|
+
else
|
371
|
+
job_status = compute.query_async_job_result(res['deleteportforwardingruleresponse']['jobid'])
|
372
|
+
unless job_status['queryasyncjobresultresponse'].fetch('jobstatus').to_i == 0
|
373
|
+
error("Error deleting port forwarding rules")
|
374
|
+
end
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
378
|
+
def get_vpc_id
|
379
|
+
compute.list_networks['listnetworksresponse']['network']
|
380
|
+
.select{|e| e['id'] == config[:cloudstack_network_id]}.first['vpcid']
|
381
|
+
end
|
382
|
+
|
383
|
+
def get_public_ip(public_ip_uuid)
|
384
|
+
compute.list_public_ip_addresses['listpublicipaddressesresponse']['publicipaddress']
|
385
|
+
.select{|e| e['id'] == public_ip_uuid}
|
386
|
+
.first['ipaddress']
|
387
|
+
end
|
388
|
+
|
389
|
+
def save_ipaddress_id(state, job_status)
|
390
|
+
state[:ipaddressid] = job_status['queryasyncjobresultresponse']
|
391
|
+
.fetch('jobresult')
|
392
|
+
.fetch('ipaddress')
|
393
|
+
.fetch('id')
|
394
|
+
end
|
395
|
+
|
396
|
+
def save_forwarding_port_rule_id(state, uuid)
|
397
|
+
state[:forwardingruleid] = uuid
|
398
|
+
end
|
399
|
+
|
400
|
+
def default_public_ip(server_info)
|
401
|
+
config[:cloudstack_vm_public_ip] || server_info.fetch('nic').first.fetch('ipaddress')
|
402
|
+
end
|
305
403
|
end
|
306
404
|
end
|
307
405
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kitchen-cloudstack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.23.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:
|
11
|
+
date: 2018-08-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: test-kitchen
|
@@ -173,7 +173,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
173
173
|
version: '0'
|
174
174
|
requirements: []
|
175
175
|
rubyforge_project:
|
176
|
-
rubygems_version: 2.
|
176
|
+
rubygems_version: 2.7.6
|
177
177
|
signing_key:
|
178
178
|
specification_version: 4
|
179
179
|
summary: Provides an interface for Test Kitchen to be able to run jobs against an
|