Updated Branches:
  refs/heads/trunk 6e5d77f27 -> 48f1369a8

LIBCLOUD-391: Increases test coverage for CloudStack driver

Signed-off-by: Tomaz Muraus <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/48f1369a
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/48f1369a
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/48f1369a

Branch: refs/heads/trunk
Commit: 48f1369a803a6890bcb129868cf7b9682ce33a9b
Parents: 6e5d77f
Author: Sebastien Goasguen <[email protected]>
Authored: Fri Sep 6 10:38:28 2013 +0200
Committer: Tomaz Muraus <[email protected]>
Committed: Mon Sep 9 15:45:07 2013 +0200

----------------------------------------------------------------------
 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 +
 ...eployVirtualMachine_deploysecuritygroup.json |   1 +
 .../disassociateIpAddress_default.json          |   1 +
 .../listPortForwardingRules_default.json        |   2 +-
 .../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(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/compute/drivers/cloudstack.py
----------------------------------------------------------------------
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']
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/test/common/test_cloudstack.py
----------------------------------------------------------------------
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)
 

http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/test/compute/fixtures/cloudstack/associateIpAddress_default.json
----------------------------------------------------------------------
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} }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/test/compute/fixtures/cloudstack/createPortForwardingRule_default.json
----------------------------------------------------------------------
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"} }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/test/compute/fixtures/cloudstack/deletePortForwardingRule_default.json
----------------------------------------------------------------------
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"} }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/test/compute/fixtures/cloudstack/deployVirtualMachine_deploykeyname.json
----------------------------------------------------------------------
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"} }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/test/compute/fixtures/cloudstack/deployVirtualMachine_deploysecuritygroup.json
----------------------------------------------------------------------
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"} }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/test/compute/fixtures/cloudstack/disassociateIpAddress_default.json
----------------------------------------------------------------------
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"} }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/test/compute/fixtures/cloudstack/listPortForwardingRules_default.json
----------------------------------------------------------------------
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":[]}
 ] } }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/test/compute/fixtures/cloudstack/listPublicIpAddresses_default.json
----------------------------------------------------------------------
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,"ipadd
 
ress":"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":"Allo
 cated"}, 
{"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"}
 ] } }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/test/compute/fixtures/cloudstack/listSecurityGroups_default.json
----------------------------------------------------------------------
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":"[email protected]","domainid":"ab53d864-6f78-4993-bb28-9b8667b535a1","description":"Default
 Security 
Group","tags":[],"domain":"[email protected]","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":"[email protected]"},{"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":"[email protected]","domainid":"ab53d864-6f78-4993-bb28-9b8667b535a1","domain":"[email protected]","ingressrule":[{"ruleid":"ed30a29
 
e-4456-4df6-ba26-26b350da0bd9","protocol":"tcp","startport":27017,"endport":27017,"securitygroupname":"default","account":"[email protected]"},{"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":[]}
 ] } }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11111.json
----------------------------------------------------------------------
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"}
 }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11112.json
----------------------------------------------------------------------
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"}
 }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11113.json
----------------------------------------------------------------------
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"}
 }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11114.json
----------------------------------------------------------------------
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"}
 }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11115.json
----------------------------------------------------------------------
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":"[email protected]","domainid":"ab53d864-6f78-4993-bb28-9b8667b535a1","domain":"[email protected]","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":"efae
 588b-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"}
 }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/test/compute/fixtures/cloudstack/queryAsyncJobResult_11116.json
----------------------------------------------------------------------
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":"[email protected]","domainid":"ab53d864-6f78-4993-bb28-9b8667b535a1","domain":"[email protected]","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,"r
 
ootdevicetype":"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"}
 }

http://git-wip-us.apache.org/repos/asf/libcloud/blob/48f1369a/libcloud/test/compute/test_cloudstack.py
----------------------------------------------------------------------
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):

Reply via email to