From fd73c1894e60ced62abcf507ff13030721b3460b Mon Sep 17 00:00:00 2001 From: Sebastien Goasguen Date: Fri, 6 Sep 2013 10:38:28 +0200 Subject: [PATCH] LIBCLOUD-391: Increases test coverage for CloudStack driver --- libcloud/compute/drivers/cloudstack.py | 33 ++--- libcloud/test/common/test_cloudstack.py | 2 +- .../cloudstack/associateIpAddress_default.json | 1 + .../createPortForwardingRule_default.json | 1 + .../deletePortForwardingRule_default.json | 1 + .../deployVirtualMachine_deploykeyname.json | 1 + .../deployVirtualMachine_deploysecuritygroup.json | 1 + .../cloudstack/disassociateIpAddress_default.json | 1 + .../listPortForwardingRules_default.json | 2 +- .../cloudstack/listPublicIpAddresses_default.json | 2 +- .../cloudstack/listSecurityGroups_default.json | 2 +- .../cloudstack/queryAsyncJobResult_11111.json | 1 + .../cloudstack/queryAsyncJobResult_11112.json | 1 + .../cloudstack/queryAsyncJobResult_11113.json | 1 + .../cloudstack/queryAsyncJobResult_11114.json | 1 + .../cloudstack/queryAsyncJobResult_11115.json | 1 + .../cloudstack/queryAsyncJobResult_11116.json | 1 + libcloud/test/compute/test_cloudstack.py | 137 ++++++++++++++++----- 18 files changed, 142 insertions(+), 48 deletions(-) create mode 100644 libcloud/test/compute/fixtures/cloudstack/associateIpAddress_default.json create mode 100644 libcloud/test/compute/fixtures/cloudstack/createPortForwardingRule_default.json create mode 100644 libcloud/test/compute/fixtures/cloudstack/deletePortForwardingRule_default.json create mode 100644 libcloud/test/compute/fixtures/cloudstack/deployVirtualMachine_deploykeyname.json create mode 100644 libcloud/test/compute/fixtures/cloudstack/deployVirtualMachine_deploysecuritygroup.json create mode 100644 libcloud/test/compute/fixtures/cloudstack/disassociateIpAddress_default.json create mode 100644 libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11111.json create mode 100644 libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11112.json create mode 100644 libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11113.json create mode 100644 libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11114.json create mode 100644 libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11115.json create mode 100644 libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11116.json diff --git a/libcloud/compute/drivers/cloudstack.py b/libcloud/compute/drivers/cloudstack.py index 7abe4b3..8d0306e 100644 --- a/libcloud/compute/drivers/cloudstack.py +++ b/libcloud/compute/drivers/cloudstack.py @@ -260,11 +260,13 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): public_ips.extend([ip for ip in private_ips if not is_private_subnet(ip)]) - keypair, password = None, None + keypair, password, securitygroup = None, None, None if 'keypair' in vm.keys(): keypair = vm['keypair'] if 'password' in vm.keys(): password = vm['password'] + if 'securitygroup' in vm.keys(): + securitygroup = [sg['name'] for sg in vm['securitygroup']] node = CloudStackNode( id=vm['id'], @@ -276,6 +278,7 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): extra={'zoneid': vm['zoneid'], 'password': password, 'key_name': keypair, + 'securitygroup': securitygroup, 'created': vm['created'] } ) @@ -346,14 +349,13 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): the node @type ex_security_groups: C{list} of C{str} - @rtype: L{CloudStackNode} + @rtype: L{CloudStackNode} """ server_params = self._create_args_to_params(None, **kwargs) node = self._async_request('deployVirtualMachine', **server_params)['virtualmachine'] - public_ips = [] private_ips = [] for nic in node['nic']: @@ -362,11 +364,13 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): else: public_ips.append(nic['ipaddress']) - keypair, password = None, None - if keypair in node.keys(): + keypair, password, securitygroup = None, None, None + if 'keypair' in node.keys(): keypair = node['keypair'] - if password in node.keys(): + if 'password' in node.keys(): password = node['password'] + if 'securitygroup' in node.keys(): + securitygroup = [sg['name'] for sg in node['securitygroup']] return CloudStackNode( id=node['id'], @@ -381,6 +385,7 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): 'port_forwarding_rules': [], 'password': password, 'key_name': keypair, + 'securitygroup': securitygroup, 'created': node['created'] } @@ -635,8 +640,8 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): @rtype: C{bool} """ - self._async_request('disassociateIpAddress', id=address.id) - return True + res = self._async_request('disassociateIpAddress', id=address.id) + return res['success'] def ex_list_port_forwarding_rules(self): """ @@ -657,11 +662,11 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): if a.address == rule['ipaddress']] rules.append(CloudStackPortForwardingRule (node[0], - rule['id'], - addr[0], - rule['protocol'], - rule['publicport'], - rule['privateport'])) + rule['id'], + addr[0], + rule['protocol'], + rule['publicport'], + rule['privateport'])) return rules @@ -722,7 +727,7 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): """ node.extra['port_forwarding_rules'].remove(rule) - node.public_ips.remove(rule.address) + node.public_ips.remove(rule.address.address) res = self._async_request('deletePortForwardingRule', id=rule.id) return res['success'] diff --git a/libcloud/test/common/test_cloudstack.py b/libcloud/test/common/test_cloudstack.py index 1c7c624..38abbb4 100644 --- a/libcloud/test/common/test_cloudstack.py +++ b/libcloud/test/common/test_cloudstack.py @@ -76,7 +76,7 @@ class CloudStackCommonTest(unittest.TestCase): self.connection._async_request('fake') except Exception: e = sys.exc_info()[1] - self.assertEquals(CloudStackMockHttp.ERROR_TEXT, str(e)) + self.assertEqual(CloudStackMockHttp.ERROR_TEXT, str(e)) return self.assertFalse(True) diff --git a/libcloud/test/compute/fixtures/cloudstack/associateIpAddress_default.json b/libcloud/test/compute/fixtures/cloudstack/associateIpAddress_default.json new file mode 100644 index 0000000..54aebb2 --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/associateIpAddress_default.json @@ -0,0 +1 @@ +{ "associateipaddressresponse" : {"id":"10987171-8cc9-4d0a-b98f-1698c09ddd2d","jobid":11111} } diff --git a/libcloud/test/compute/fixtures/cloudstack/createPortForwardingRule_default.json b/libcloud/test/compute/fixtures/cloudstack/createPortForwardingRule_default.json new file mode 100644 index 0000000..9e4a45a --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/createPortForwardingRule_default.json @@ -0,0 +1 @@ +{ "createportforwardingruleresponse" : {"id":"bc7ea3ee-a2c3-4b86-a53f-01bdaa1b2e32","jobid":"11113"} } diff --git a/libcloud/test/compute/fixtures/cloudstack/deletePortForwardingRule_default.json b/libcloud/test/compute/fixtures/cloudstack/deletePortForwardingRule_default.json new file mode 100644 index 0000000..f45af81 --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/deletePortForwardingRule_default.json @@ -0,0 +1 @@ +{ "deleteportforwardingruleresponse" : {"jobid":"11114"} } diff --git a/libcloud/test/compute/fixtures/cloudstack/deployVirtualMachine_deploykeyname.json b/libcloud/test/compute/fixtures/cloudstack/deployVirtualMachine_deploykeyname.json new file mode 100644 index 0000000..979df70 --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/deployVirtualMachine_deploykeyname.json @@ -0,0 +1 @@ +{ "deployvirtualmachineresponse" : {"id":"fc4fd31a","jobid":"11116"} } diff --git a/libcloud/test/compute/fixtures/cloudstack/deployVirtualMachine_deploysecuritygroup.json b/libcloud/test/compute/fixtures/cloudstack/deployVirtualMachine_deploysecuritygroup.json new file mode 100644 index 0000000..524cdb3 --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/deployVirtualMachine_deploysecuritygroup.json @@ -0,0 +1 @@ +{ "deployvirtualmachineresponse" : {"id":"fc4fd31a-16d3-49db-814a-56b39b9ef986","jobid":"11115"} } diff --git a/libcloud/test/compute/fixtures/cloudstack/disassociateIpAddress_default.json b/libcloud/test/compute/fixtures/cloudstack/disassociateIpAddress_default.json new file mode 100644 index 0000000..334d479 --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/disassociateIpAddress_default.json @@ -0,0 +1 @@ +{ "disassociateipaddressresponse" : {"jobid":"11112"} } diff --git a/libcloud/test/compute/fixtures/cloudstack/listPortForwardingRules_default.json b/libcloud/test/compute/fixtures/cloudstack/listPortForwardingRules_default.json index 460645c..a65d08d 100644 --- a/libcloud/test/compute/fixtures/cloudstack/listPortForwardingRules_default.json +++ b/libcloud/test/compute/fixtures/cloudstack/listPortForwardingRules_default.json @@ -1 +1 @@ -{ "listportforwardingrulesresponse" : {"count": 1, "portforwardingrule": [{"protocol": "tcp", "virtualmachineid": "7d8de712-aa7a-4901-a8b1-fd223f0ca459", "ipaddress": "178.170.71.253", "cidrlist": "", "tags": [], "ipaddressid": "50cd9456-d4db-4a48-8cf5-950dba8d2fdb", "virtualmachinedisplayname": "yoyo", "privateendport": "22", "state": "Active", "publicendport": "22", "privateport": "22", "virtualmachinename": "yoyo", "publicport": "22", "id": "4644652a-7573-4e50-aafb-48a171c9bcb2"}]}} +{ "listportforwardingrulesresponse" : { "count":1 ,"portforwardingrule" : [ {"id":"bc7ea3ee-a2c3-4b86-a53f-01bdaa1b2e32","privateport":"33","privateendport":"33","protocol":"tcp","publicport":"33","publicendport":"33","virtualmachineid":"2600","virtualmachinename":"testlib","virtualmachinedisplayname":"testlib","ipaddressid":"96dac96f-0b5d-42c1-b5de-8a97f3e34c43","ipaddress":"1.1.1.116","state":"Active","cidrlist":"","tags":[]} ] } } diff --git a/libcloud/test/compute/fixtures/cloudstack/listPublicIpAddresses_default.json b/libcloud/test/compute/fixtures/cloudstack/listPublicIpAddresses_default.json index b9b8527..ca80e12 100644 --- a/libcloud/test/compute/fixtures/cloudstack/listPublicIpAddresses_default.json +++ b/libcloud/test/compute/fixtures/cloudstack/listPublicIpAddresses_default.json @@ -1 +1 @@ -{ "listpublicipaddressesresponse" : { "publicipaddress" : [ {"id":34000,"ipaddress":"1.1.1.49","allocated":"2011-06-23T05:20:39+0000","zoneid":1,"zonename":"Sydney","issourcenat":false,"account":"fakeaccount","domainid":801,"domain":"AA000062-libcloud-dev","forvirtualnetwork":true,"isstaticnat":false,"associatednetworkid":860,"networkid":200,"state":"Allocated"}, {"id":33999,"ipaddress":"1.1.1.48","allocated":"2011-06-23T05:20:34+0000","zoneid":1,"zonename":"Sydney","issourcenat":false,"account":"fakeaccount","domainid":801,"domain":"AA000062-libcloud-dev","forvirtualnetwork":true,"isstaticnat":false,"associatednetworkid":860,"networkid":200,"state":"Allocated"}, {"id":33998,"ipaddress":"1.1.1.47","allocated":"2011-06-23T05:20:30+0000","zoneid":1,"zonename":"Sydney","issourcenat":false,"account":"fakeaccount","domainid":801,"domain":"AA000062-libcloud-dev","forvirtualnetwork":true,"isstaticnat":false,"associatednetworkid":860,"networkid":200,"state":"Allocated"}, {"id":33970,"ipaddress":"1.1.1.19","allocated":"2011-06-20T04:08:34+0000","zoneid":1,"zonename":"Sydney","issourcenat":true,"account":"fakeaccount","domainid":801,"domain":"AA000062-libcloud-dev","forvirtualnetwork":true,"isstaticnat":false,"associatednetworkid":860,"networkid":200,"state":"Allocated"} ] } } +{ "listpublicipaddressesresponse" : { "publicipaddress" : [ {"id":34000,"ipaddress":"1.1.1.116","virtualmachineid":"2600","allocated":"2011-06-23T05:20:39+0000","zoneid":1,"zonename":"Sydney","issourcenat":false,"account":"fakeaccount","domainid":801,"domain":"AA000062-libcloud-dev","forvirtualnetwork":true,"isstaticnat":false,"associatednetworkid":860,"networkid":200,"state":"Allocated"}, {"id":33999,"ipaddress":"1.1.1.48","allocated":"2011-06-23T05:20:34+0000","zoneid":1,"zonename":"Sydney","issourcenat":false,"account":"fakeaccount","domainid":801,"domain":"AA000062-libcloud-dev","forvirtualnetwork":true,"isstaticnat":false,"associatednetworkid":860,"networkid":200,"state":"Allocated"}, {"id":33998,"ipaddress":"1.1.1.47","allocated":"2011-06-23T05:20:30+0000","zoneid":1,"zonename":"Sydney","issourcenat":false,"account":"fakeaccount","domainid":801,"domain":"AA000062-libcloud-dev","forvirtualnetwork":true,"isstaticnat":false,"associatednetworkid":860,"networkid":200,"state":"Allocated"}, {"id":33970,"ipaddress":"1.1.1.19","allocated":"2011-06-20T04:08:34+0000","zoneid":1,"zonename":"Sydney","issourcenat":true,"account":"fakeaccount","domainid":801,"domain":"AA000062-libcloud-dev","forvirtualnetwork":true,"isstaticnat":false,"associatednetworkid":860,"networkid":200,"state":"Allocated"} ] } } diff --git a/libcloud/test/compute/fixtures/cloudstack/listSecurityGroups_default.json b/libcloud/test/compute/fixtures/cloudstack/listSecurityGroups_default.json index fa9977a..fcc25fa 100644 --- a/libcloud/test/compute/fixtures/cloudstack/listSecurityGroups_default.json +++ b/libcloud/test/compute/fixtures/cloudstack/listSecurityGroups_default.json @@ -1 +1 @@ -{"listsecuritygroupsresponse":{"count":1,"securitygroup":[{"egressrule":[],"account":"runseb@gmail.com","domainid":"ab53d864-6f78-4993-bb28-9b8667b535a1","description":"Default Security Group","tags":[],"domain":"runseb@gmail.com","ingressrule":[{"startport":22,"cidr":"0.0.0.0/0","protocol":"tcp","endport":22,"ruleid":"489e83b2-5498-4c17-8a28-e6a96b35ac2d"}],"id":"ebfa2339-e9ae-4dcb-b73c-a76cd3fce39e","name":"default"}]}} +{ "listsecuritygroupsresponse" : { "count":2 ,"securitygroup" : [ {"id":"ebfa2339","name":"default","description":"Default Security Group","account":"gmail.com","domainid":"ab53d864","domain":"gmail.com","ingressrule":[{"ruleid":"b83428c0-7f4c-44d1-bc96-4e1720168fdf","protocol":"tcp","startport":22,"endport":22,"cidr":"0.0.0.0/0"},{"ruleid":"bcb528e7-1a77-48f5-9bac-65cdcbc760e8","protocol":"tcp","startport":9200,"endport":9200,"cidr":"0.0.0.0/0"},{"ruleid":"80cca966-aa85-4bf0-9cb3-6b318b5d577f","protocol":"tcp","startport":9200,"endport":9300,"securitygroupname":"default","account":"runseb@gmail.com"},{"ruleid":"04f1264d-d0af-4c51-bcf9-4776166bba7d","protocol":"tcp","startport":8080,"endport":8080,"cidr":"0.0.0.0/0"}],"egressrule":[],"tags":[]}, {"id":"efae588b-5d74-4d0f-aeb8-96250d45fdee","name":"mongodb","description":"A SG for replica sets","account":"runseb@gmail.com","domainid":"ab53d864-6f78-4993-bb28-9b8667b535a1","domain":"runseb@gmail.com","ingressrule":[{"ruleid":"ed30a29e-4456-4df6-ba26-26b350da0bd9","protocol":"tcp","startport":27017,"endport":27017,"securitygroupname":"default","account":"runseb@gmail.com"},{"ruleid":"4b5722f0-fc04-4263-93e7-c93564e5619c","protocol":"tcp","startport":22,"endport":22,"cidr":"0.0.0.0/0"},{"ruleid":"2430f851-189f-4d10-9bcd-b2276bc7d6a3","protocol":"tcp","startport":27017,"endport":27017,"cidr":"0.0.0.0/0"}],"egressrule":[],"tags":[]} ] } } diff --git a/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11111.json b/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11111.json new file mode 100644 index 0000000..bb31181 --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11111.json @@ -0,0 +1 @@ +{ "queryasyncjobresultresponse" : {"accountid":"cb13887","userid":"11110","cmd":"org.apache.cloudstack.api.command.user.address.AssociateIPAddrCmd","jobstatus":1,"jobprocstatus":0,"jobresultcode":0,"jobresulttype":"object","jobresult":{"ipaddress":{"id":"10987171-8cc9-4d0a-b98f-1698c09ddd2d","ipaddress":"7.5.6.1","allocated":"2013-09-05T06:19:59-0400","zoneid":"d06193b2-7980-4ad1-b5d8-7b2f2eda63c3","zonename":"SanJose","issourcenat":false,"account":"admin","domainid":"0ce03bf9-540d-47da-b3f3-75df64fddf2f","domain":"ROOT","forvirtualnetwork":true,"vlanid":"0cf2e30a-1d75-4108-8a50-259e0590faf9","vlanname":"67","isstaticnat":false,"issystem":false,"associatednetworkid":"edd15baf-b5af-4805-8484-3478ad236372","associatednetworkname":"defaultown","networkid":"9a3b3ed4-40f4-4def-aecb-8b9f54536693","state":"Allocating","physicalnetworkid":"3a997df4-ea89-4b53-b523-010857a9087b","tags":[]}},"created":"2013-09-05T06:19:59-0400","jobid":"11111"} } diff --git a/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11112.json b/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11112.json new file mode 100644 index 0000000..ed79afa --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11112.json @@ -0,0 +1 @@ +{ "queryasyncjobresultresponse" : {"accountid":"cb13887c-7c6a-464d-aa8f-c6971f9dd458","userid":"11110e27-5a51-4109-9598-7df34141761a","cmd":"org.apache.cloudstack.api.command.user.address.DisassociateIPAddrCmd","jobstatus":1,"jobprocstatus":0,"jobresultcode":0,"jobresulttype":"object","jobresult":{"success":true},"created":"2013-09-05T06:36:44-0400","jobid":"11112"} } diff --git a/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11113.json b/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11113.json new file mode 100644 index 0000000..9ca41c9 --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11113.json @@ -0,0 +1 @@ +{ "queryasyncjobresultresponse" : {"accountid":"cb13887c","userid":"11110","cmd":"org.apache.cloudstack.api.command.user.firewall.CreatePortForwardingRuleCmd","jobstatus":1,"jobprocstatus":0,"jobresultcode":0,"jobresulttype":"object","jobresult":{"portforwardingrule":{"id":"bc7ea3ee-a2c3-4b86-a53f-01bdaa1b2e32","privateport":"33","privateendport":"33","protocol":"tcp","publicport":"33","publicendport":"33","virtualmachineid":"8879e159-d4a6-4a1d-bc75-074c097bef2a","virtualmachinename":"testlib","virtualmachinedisplayname":"libcloud","ipaddressid":"96dac96f-0b5d-42c1-b5de-8a97f3e34c43","ipaddress":"7.5.1.7","state":"Active","cidrlist":"","tags":[]}},"created":"2013-09-05T07:33:43-0400","jobid":"11113"} } diff --git a/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11114.json b/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11114.json new file mode 100644 index 0000000..5d501eb --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11114.json @@ -0,0 +1 @@ +{ "queryasyncjobresultresponse" : {"accountid":"cb13887c-7c6a-464d-aa8f-c6971f9dd458","userid":"11110e27-5a51-4109-9598-7df34141761a","cmd":"org.apache.cloudstack.api.command.user.firewall.DeletePortForwardingRuleCmd","jobstatus":1,"jobprocstatus":0,"jobresultcode":0,"jobresulttype":"object","jobresult":{"success":true},"created":"2013-09-05T09:09:01-0400","jobid":"11114"} } diff --git a/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11115.json b/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11115.json new file mode 100644 index 0000000..a8f8b53 --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11115.json @@ -0,0 +1 @@ +{ "queryasyncjobresultresponse" : {"accountid":"b8c0baab","userid":"968f6b4e","cmd":"com.cloud.api.commands.DeployVMCmd","jobstatus":1,"jobprocstatus":0,"jobresultcode":0,"jobresulttype":"object","jobresult":{"virtualmachine":{"id":"fc4fd31a-16d3-49db-814a-56b39b9ef986","name":"test","displayname":"test","account":"runseb@gmail.com","domainid":"ab53d864-6f78-4993-bb28-9b8667b535a1","domain":"runseb@gmail.com","created":"2013-09-05T15:45:11+0200","state":"Running","haenable":false,"zoneid":"1128bd56-b4d9-4ac6-a7b9-c715b187ce11","zonename":"CH-GV2","templateid":"a17b40d6-83e4-4f2a-9ef0-dce6af575789","templatename":"Linux Ubuntu 12.04 LTS 64-bit","templatedisplaytext":"Linux Ubuntu 12.04 LTS 64-bit 10GB Disk","passwordenabled":true,"serviceofferingid":"71004023-bb72-4a97-b1e9-bc66dfce9470","serviceofferingname":"Micro","cpunumber":1,"cpuspeed":2198,"memory":512,"guestosid":"113038d0-a8cd-4d20-92be-ea313f87c3ac","rootdeviceid":0,"rootdevicetype":"Filesystem","securitygroup":[{"id":"efae588b-5d74-4d0f-aeb8-96250d45fdee","name":"default","description":"A SG for replica sets"},{"id":"ebfa2339-e9ae-4dcb-b73c-a76cd3fce39e","name":"mongodb","description":"Default Security Group"}],"password":"iQ7hbmrjw","nic":[{"id":"09a806c7-ab1e-452d-a779-dda974ea7e41","networkid":"00304a04-c7ea-4e77-a786-18bc64347bf7","netmask":"255.255.254.0","gateway":"185.19.28.1","ipaddress":"185.19.28.98","traffictype":"Guest","type":"Shared","isdefault":true,"macaddress":"06:54:5a:00:00:95"}],"hypervisor":"KVM","tags":[]}},"created":"2013-09-05T15:45:11+0200","jobid":"10046ad6-917f-4c25-add3-e08cd98e0e87"} } diff --git a/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11116.json b/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11116.json new file mode 100644 index 0000000..40358b1 --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11116.json @@ -0,0 +1 @@ +{ "queryasyncjobresultresponse" : {"accountid":"b8c0baab-18a1-44c0-ab67-e24049212925","userid":"968f6b4e-b382-4802-afea-dd731d4cf9b9","cmd":"com.cloud.api.commands.DeployVMCmd","jobstatus":1,"jobprocstatus":0,"jobresultcode":0,"jobresulttype":"object","jobresult":{"virtualmachine":{"id":"94fa7e76-9a39-4e5a-8f84-40e496650780","name":"test","displayname":"test","account":"runseb@gmail.com","domainid":"ab53d864-6f78-4993-bb28-9b8667b535a1","domain":"runseb@gmail.com","created":"2012-09-05T16:05:50+0200","state":"Running","haenable":false,"zoneid":"1128bd56-b4d9-4ac6-a7b9-c715b187ce11","zonename":"CH-GV2","templateid":"a17b40d6-83e4-4f2a-9ef0-dce6af575789","templatename":"Linux Ubuntu 12.04 LTS 64-bit","templatedisplaytext":"Linux Ubuntu 12.04 LTS 64-bit 10GB Disk","passwordenabled":true,"serviceofferingid":"71004023-bb72-4a97-b1e9-bc66dfce9470","serviceofferingname":"Micro","cpunumber":1,"cpuspeed":2198,"memory":512,"guestosid":"113038d0-a8cd-4d20-92be-ea313f87c3ac","rootdeviceid":0,"rootdevicetype":"Filesystem","securitygroup":[{"id":"ebfa2339-e9ae-4dcb-b73c-a76cd3fce39e","name":"default","description":"Default Security Group"}],"password":"zU3gwurmi","nic":[{"id":"2bd513cf-7453-4594-87c2-2d8b17ae8fad","networkid":"00304a04-c7ea-4e77-a786-18bc64347bf7","netmask":"255.255.254.0","gateway":"185.19.28.1","ipaddress":"185.19.28.96","traffictype":"Guest","type":"Shared","isdefault":true,"macaddress":"06:84:e0:00:00:93"}],"hypervisor":"KVM","tags":[],"keypair":"foobar"}},"created":"2013-09-05T16:05:51+0200","jobid":"a0c97348-4d21-43ba-879e-9d8340ec0805"} } diff --git a/libcloud/test/compute/test_cloudstack.py b/libcloud/test/compute/test_cloudstack.py index ece5f2a..c0a55e7 100644 --- a/libcloud/test/compute/test_cloudstack.py +++ b/libcloud/test/compute/test_cloudstack.py @@ -101,11 +101,39 @@ class CloudStackNodeDriverTest(unittest.TestCase, TestCaseMixin): self.assertEqual(node.private_ips, ['192.168.1.2']) self.assertEqual(node.extra['zoneid'], default_location.id) + def test_create_node_ex_security_groups(self): + size = self.driver.list_sizes()[0] + image = self.driver.list_images()[0] + location = self.driver.list_locations()[0] + sg = [sg['name'] for sg in self.driver.ex_list_security_groups()] + CloudStackMockHttp.fixture_tag = 'deploysecuritygroup' + node = self.driver.create_node(name='test', + location=location, + image=image, + size=size, + ex_security_groups=sg) + self.assertEqual(node.name, 'test') + self.assertEqual(node.extra['securitygroup'], sg) + self.assertEqual(node.id, 'fc4fd31a-16d3-49db-814a-56b39b9ef986') + + def test_create_node_ex_keyname(self): + size = self.driver.list_sizes()[0] + image = self.driver.list_images()[0] + location = self.driver.list_locations()[0] + CloudStackMockHttp.fixture_tag = 'deploykeyname' + node = self.driver.create_node(name='test', + location=location, + image=image, + size=size, + ex_keyname='foobar') + self.assertEqual(node.name, 'test') + self.assertEqual(node.extra['key_name'], 'foobar') + def test_list_images_no_images_available(self): CloudStackMockHttp.fixture_tag = 'notemplates' images = self.driver.list_images() - self.assertEquals(0, len(images)) + self.assertEqual(0, len(images)) def test_list_images(self): _, fixture = CloudStackMockHttp()._load_fixture( @@ -119,17 +147,17 @@ class CloudStackNodeDriverTest(unittest.TestCase, TestCaseMixin): tid = str(templates[i]['id']) tname = templates[i]['name'] self.assertIsInstance(image.driver, CloudStackNodeDriver) - self.assertEquals(image.id, tid) - self.assertEquals(image.name, tname) + self.assertEqual(image.id, tid) + self.assertEqual(image.name, tname) def test_ex_list_disk_offerings(self): diskOfferings = self.driver.ex_list_disk_offerings() - self.assertEquals(1, len(diskOfferings)) + self.assertEqual(1, len(diskOfferings)) diskOffering, = diskOfferings - self.assertEquals('Disk offer 1', diskOffering.name) - self.assertEquals(10, diskOffering.size) + self.assertEqual('Disk offer 1', diskOffering.name) + self.assertEqual(10, diskOffering.size) def test_ex_list_networks(self): _, fixture = CloudStackMockHttp()._load_fixture( @@ -139,14 +167,14 @@ class CloudStackNodeDriverTest(unittest.TestCase, TestCaseMixin): networks = self.driver.ex_list_networks() for i, network in enumerate(networks): - self.assertEquals(network.id, fixture_networks[i]['id']) - self.assertEquals( + self.assertEqual(network.id, fixture_networks[i]['id']) + self.assertEqual( network.displaytext, fixture_networks[i]['displaytext']) - self.assertEquals(network.name, fixture_networks[i]['name']) - self.assertEquals( + self.assertEqual(network.name, fixture_networks[i]['name']) + self.assertEqual( network.networkofferingid, fixture_networks[i]['networkofferingid']) - self.assertEquals(network.zoneid, fixture_networks[i]['zoneid']) + self.assertEqual(network.zoneid, fixture_networks[i]['zoneid']) def test_create_volume(self): volumeName = 'vol-0' @@ -154,8 +182,8 @@ class CloudStackNodeDriverTest(unittest.TestCase, TestCaseMixin): volume = self.driver.create_volume(10, volumeName, location) - self.assertEquals(volumeName, volume.name) - self.assertEquals(10, volume.size) + self.assertEqual(volumeName, volume.name) + self.assertEqual(10, volume.size) def test_create_volume_no_noncustomized_offering_with_size(self): """If the sizes of disk offerings are not configurable and there @@ -177,7 +205,7 @@ class CloudStackNodeDriverTest(unittest.TestCase, TestCaseMixin): volume = self.driver.create_volume(10, volumeName, location) - self.assertEquals(volumeName, volume.name) + self.assertEqual(volumeName, volume.name) def test_attach_volume(self): node = self.driver.list_nodes()[0] @@ -205,35 +233,40 @@ class CloudStackNodeDriverTest(unittest.TestCase, TestCaseMixin): def test_list_volumes(self): volumes = self.driver.list_volumes() - self.assertEquals(1, len(volumes)) - self.assertEquals('ROOT-69942', volumes[0].name) + self.assertEqual(1, len(volumes)) + self.assertEqual('ROOT-69942', volumes[0].name) def test_list_nodes(self): - node = self.driver.list_nodes()[0] - self.assertEquals('test', node.name) + nodes = self.driver.list_nodes() + self.assertEqual(2, len(nodes)) + self.assertEqual('test', nodes[0].name) + self.assertEqual('2600', nodes[0].id) + self.assertEqual([], nodes[0].extra['securitygroup']) + self.assertEqual(None, nodes[0].extra['key_name']) def test_list_locations(self): location = self.driver.list_locations()[0] - self.assertEquals('Sydney', location.name) + self.assertEqual('1', location.id) + self.assertEqual('Sydney', location.name) def test_list_sizes(self): sizes = self.driver.list_sizes() - self.assertEquals('Compute Micro PRD', sizes[0].name) - self.assertEquals('105', sizes[0].id) - self.assertEquals(384, sizes[0].ram) - self.assertEquals('Compute Large PRD', sizes[2].name) - self.assertEquals('69', sizes[2].id) - self.assertEquals(6964, sizes[2].ram) + self.assertEqual('Compute Micro PRD', sizes[0].name) + self.assertEqual('105', sizes[0].id) + self.assertEqual(384, sizes[0].ram) + self.assertEqual('Compute Large PRD', sizes[2].name) + self.assertEqual('69', sizes[2].id) + self.assertEqual(6964, sizes[2].ram) def test_ex_start_node(self): node = self.driver.list_nodes()[0] res = node.ex_start() - self.assertEquals('Starting', res) + self.assertEqual('Starting', res) def test_ex_stop_node(self): node = self.driver.list_nodes()[0] res = node.ex_stop() - self.assertEquals('Stopped', res) + self.assertEqual('Stopped', res) def test_destroy_node(self): node = self.driver.list_nodes()[0] @@ -278,15 +311,18 @@ class CloudStackNodeDriverTest(unittest.TestCase, TestCaseMixin): path = os.path.join(os.path.dirname(__file__), "fixtures", "cloudstack", "dummy_rsa.pub") - + fh = open(path) res = self.driver.ex_import_keypair_from_string('foobar', - open(path).read()) + fh.read()) + fh.close() self.assertEqual(res['keyName'], 'foobar') self.assertEqual(res['keyFingerprint'], fingerprint) def test_ex_list_security_groups(self): groups = self.driver.ex_list_security_groups() + self.assertEqual(2, len(groups)) self.assertEqual(groups[0]['name'], 'default') + self.assertEqual(groups[1]['name'], 'mongodb') def test_ex_create_security_group(self): group = self.driver.ex_create_security_group(name='MySG') @@ -306,7 +342,48 @@ class CloudStackNodeDriverTest(unittest.TestCase, TestCaseMixin): def test_ex_list_public_ips(self): ips = self.driver.ex_list_public_ips() - self.assertEqual(ips[0].address, '1.1.1.49') + self.assertEqual(ips[0].address, '1.1.1.116') + + def test_ex_allocate_public_ip(self): + addr = self.driver.ex_allocate_public_ip() + self.assertEqual(addr.address, '7.5.6.1') + self.assertEqual(addr.id, '10987171-8cc9-4d0a-b98f-1698c09ddd2d') + + def test_ex_release_public_ip(self): + addresses = self.driver.ex_list_public_ips() + res = self.driver.ex_release_public_ip(addresses[0]) + self.assertTrue(res) + + def test_ex_create_port_forwarding_rule(self): + node = self.driver.list_nodes()[0] + address = self.driver.ex_list_public_ips()[0] + private_port = 33 + public_port = 33 + protocol = 'TCP' + rule = self.driver.ex_create_port_forwarding_rule(address, + private_port, + public_port, + protocol, + node) + self.assertEqual(rule.address, address) + self.assertEqual(rule.protocol, protocol) + self.assertEqual(rule.public_port, public_port) + self.assertEqual(rule.private_port, private_port) + + def test_ex_list_port_forwarding_rules(self): + rules = self.driver.ex_list_port_forwarding_rules() + self.assertEqual(len(rules), 1) + rule = rules[0] + self.assertEqual(rule.protocol, 'tcp') + self.assertEqual(rule.public_port, '33') + self.assertEqual(rule.private_port, '33') + self.assertEqual(rule.address.address, '1.1.1.116') + + def test_ex_delete_port_forwarding_rule(self): + node = self.driver.list_nodes()[0] + rule = self.driver.ex_list_port_forwarding_rules()[0] + res = self.driver.ex_delete_port_forwarding_rule(node, rule) + self.assertTrue(res) class CloudStackMockHttp(MockHttpTestCase): -- 1.8.4