From 0f4655c7d753cd5e34bebb5d924568de6c27782e Mon Sep 17 00:00:00 2001 From: Sebastien Goasguen Date: Tue, 29 Oct 2013 15:53:58 +0100 Subject: [PATCH] LIBCLOUD-418: Added Advanced zone in CloudStackNodeLocation and added tests with a new fixture --- libcloud/compute/drivers/cloudstack.py | 34 +++++++++++++++--- .../fixtures/cloudstack/listZones_advanced.json | 1 + .../fixtures/cloudstack/listZones_basic.json | 1 + libcloud/test/compute/test_cloudstack.py | 41 +++++++++++++++++++++- 4 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 libcloud/test/compute/fixtures/cloudstack/listZones_advanced.json create mode 100644 libcloud/test/compute/fixtures/cloudstack/listZones_basic.json diff --git a/libcloud/compute/drivers/cloudstack.py b/libcloud/compute/drivers/cloudstack.py index 2692f0b..f90bf9f 100644 --- a/libcloud/compute/drivers/cloudstack.py +++ b/libcloud/compute/drivers/cloudstack.py @@ -179,6 +179,18 @@ class CloudStackNetwork(object): self.networkofferingid, self.zoneid, self.driver.name)) +class CloudStackNodeLocation(NodeLocation): + def __init__(self, id, name, country, driver, network_type): + super(CloudStackNodeLocation, self).__init__(id, name, country, driver) + self.network_type = network_type + + def __repr__(self): + return (('') + % (self.id, self.name, self.country, + self.network_type, self.driver.name)) + + class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): """Driver for the CloudStack API. @@ -231,6 +243,14 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): NodeDriver.__init__(self, key=key, secret=secret, secure=secure, host=host, port=port) + def _check_advanced_zone(self): + """Check Zone type""" + if self.list_locations()[0].network_type != "Advanced": + raise Exception('The zone is not an Advanced zone' + + 'The API call being made requires advanced zone') + else: + return + def list_images(self, location=None): args = { 'templatefilter': 'executable' @@ -258,7 +278,8 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): locs = self._sync_request('listZones') locations = [] for loc in locs['zone']: - locations.append(NodeLocation(loc['id'], loc['name'], 'AU', self)) + locations.append(CloudStackNodeLocation(loc['id'], loc['name'], + 'AU', self, loc['networktype'])) return locations def list_nodes(self): @@ -656,6 +677,7 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype: ``list`` of :class:`CloudStackAddress` """ + self._check_advanced_zone() ips = [] res = self._sync_request('listPublicIpAddresses') @@ -677,6 +699,7 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype: :class:`CloudStackAddress` """ + self._check_advanced_zone() if location is None: location = self.list_locations()[0] @@ -694,6 +717,7 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype: ``bool`` """ + self._check_advanced_zone() res = self._async_request('disassociateIpAddress', id=address.id) return res['success'] @@ -703,6 +727,7 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype: ``list`` of :class:`CloudStackPortForwardingRule` """ + self._check_advanced_zone() rules = [] result = self._sync_request('listPortForwardingRules') if result != {}: @@ -750,6 +775,7 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype: :class:`CloudStackPortForwardingRule` """ + self._check_advanced_zone() args = { 'ipaddressid': address.id, 'protocol': protocol, @@ -789,7 +815,7 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype: ``bool`` """ - + self._check_advanced_zone() node.extra['port_forwarding_rules'].remove(rule) node.public_ips.remove(rule.address.address) res = self._async_request('deletePortForwardingRule', id=rule.id) @@ -817,7 +843,7 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype: :class:`CloudStackForwardingRule` """ - + self._check_advanced_zone() protocol = protocol.upper() if protocol not in ('TCP', 'UDP'): return None @@ -849,7 +875,7 @@ class CloudStackNodeDriver(CloudStackDriverMixIn, NodeDriver): :rtype: ``bool`` """ - + self._check_advanced_zone() node.extra['ip_forwarding_rules'].remove(rule) self._async_request('deleteIpForwardingRule', id=rule.id) return True diff --git a/libcloud/test/compute/fixtures/cloudstack/listZones_advanced.json b/libcloud/test/compute/fixtures/cloudstack/listZones_advanced.json new file mode 100644 index 0000000..0316936 --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/listZones_advanced.json @@ -0,0 +1 @@ +{ "listzonesresponse" : { "zone" : [ {"id":1,"name":"Sydney","networktype":"Advanced","securitygroupsenabled":false} ] } } diff --git a/libcloud/test/compute/fixtures/cloudstack/listZones_basic.json b/libcloud/test/compute/fixtures/cloudstack/listZones_basic.json new file mode 100644 index 0000000..e80bcdd --- /dev/null +++ b/libcloud/test/compute/fixtures/cloudstack/listZones_basic.json @@ -0,0 +1 @@ +{ "listzonesresponse" : { "count":1 ,"zone" : [ {"id":"1","name":"CH-GV2","networktype":"Basic","securitygroupsenabled":true,"allocationstate":"Enabled","dhcpprovider":"VirtualRouter","localstorageenabled":true} ] } } diff --git a/libcloud/test/compute/test_cloudstack.py b/libcloud/test/compute/test_cloudstack.py index 546b182..4cb88d8 100644 --- a/libcloud/test/compute/test_cloudstack.py +++ b/libcloud/test/compute/test_cloudstack.py @@ -247,6 +247,20 @@ class CloudStackNodeDriverTest(unittest.TestCase, TestCaseMixin): self.assertEqual('1', location.id) self.assertEqual('Sydney', location.name) + def test_list_location_advanced(self): + CloudStackMockHttp.fixture_tag = 'advanced' + location = self.driver.list_locations()[0] + self.assertEqual('1', location.id) + self.assertEqual('Sydney', location.name) + self.assertEqual('Advanced', location.network_type) + + def test_list_location_basic(self): + CloudStackMockHttp.fixture_tag = 'basic' + location = self.driver.list_locations()[0] + self.assertEqual('1', location.id) + self.assertEqual('CH-GV2', location.name) + self.assertEqual('Basic', location.network_type) + def test_list_sizes(self): sizes = self.driver.list_sizes() self.assertEqual('Compute Micro PRD', sizes[0].name) @@ -341,17 +355,30 @@ 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.116') + + + def test_ex_list_public_ips_basic(self): + CloudStackMockHttp.fixture_tag = 'basic' + self.assertRaises(Exception, self.driver.ex_list_public_ips) 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_allocate_public_ip_basic(self): + CloudStackMockHttp.fixture_tag = 'basic' + self.assertRaises(Exception, self.driver.ex_allocate_public_ip) + 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_release_public_ip_basic(self): + CloudStackMockHttp.fixture_tag = 'basic' + self.assertRaises(Exception, self.driver.ex_release_public_ip) + def test_ex_create_port_forwarding_rule(self): node = self.driver.list_nodes()[0] address = self.driver.ex_list_public_ips()[0] @@ -376,6 +403,10 @@ class CloudStackNodeDriverTest(unittest.TestCase, TestCaseMixin): self.assertEqual(rule.private_port, private_port) self.assertEqual(rule.private_end_port, private_end_port) + def test_ex_create_port_forwarding_rule_basic(self): + CloudStackMockHttp.fixture_tag = 'basic' + self.assertRaises(Exception, self.driver.ex_create_port_forwarding_rule) + def test_ex_list_port_forwarding_rules(self): rules = self.driver.ex_list_port_forwarding_rules() self.assertEqual(len(rules), 1) @@ -388,12 +419,20 @@ class CloudStackNodeDriverTest(unittest.TestCase, TestCaseMixin): self.assertEqual(rule.private_end_port, '34') self.assertEqual(rule.address.address, '1.1.1.116') + def test_ex_list_port_forwarding_rules_basic(self): + CloudStackMockHttp.fixture_tag = 'basic' + self.assertRaises(Exception, self.driver.ex_list_port_forwarding_rules) + 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) + def test_ex_delete_port_forwarding_rule_basic(self): + CloudStackMockHttp.fixture_tag = 'basic' + self.assertRaises(Exception, self.driver.ex_delete_port_forwarding_rule) + class CloudStackMockHttp(MockHttpTestCase): fixtures = ComputeFileFixtures('cloudstack') -- 1.8.4