Repository: libcloud Updated Branches: refs/heads/trunk f18f65365 -> 8b8e13382
Allow setting of load balancer port to None The documentation for the Dimension Data Cloud REST API v2.2-20160222 states that a load balancer port can be an integer in the range of 1-65535 and, if not supplied, will be taken to mean 'Any Port'. This change fixes the libcloud driver to conform to the docs. Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/9a07d7e4 Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/9a07d7e4 Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/9a07d7e4 Branch: refs/heads/trunk Commit: 9a07d7e47cd1125bee0e5c288b71950da4006ef3 Parents: f18f653 Author: Mark S. Maglana <mmagl...@gmail.com> Authored: Fri Jun 17 09:23:59 2016 -0700 Committer: Anthony Shaw <anthonys...@apache.org> Committed: Fri Jun 24 13:43:19 2016 +1000 ---------------------------------------------------------------------- libcloud/loadbalancer/drivers/dimensiondata.py | 28 ++++++----- .../test/loadbalancer/test_dimensiondata.py | 50 +++++++++++++++++++- 2 files changed, 64 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/libcloud/blob/9a07d7e4/libcloud/loadbalancer/drivers/dimensiondata.py ---------------------------------------------------------------------- diff --git a/libcloud/loadbalancer/drivers/dimensiondata.py b/libcloud/loadbalancer/drivers/dimensiondata.py index eed15b4..ca5e75b 100644 --- a/libcloud/loadbalancer/drivers/dimensiondata.py +++ b/libcloud/loadbalancer/drivers/dimensiondata.py @@ -98,16 +98,17 @@ class DimensionDataLBDriver(Driver): kwargs['region'] = self.selected_region return kwargs - def create_balancer(self, name, port, protocol, algorithm, members): + def create_balancer(self, name, port=None, protocol=None, + algorithm=None, members=None): """ Create a new load balancer instance :param name: Name of the new load balancer (required) :type name: ``str`` - :param port: Port the load balancer should listen on, - defaults to 80 (required) - :type port: ``str`` + :param port: An integer in the range of 1-65535. If not supplied, + it will be taken to mean 'Any Port' + :type port: ``int`` :param protocol: Loadbalancer protocol, defaults to http. :type protocol: ``str`` @@ -121,8 +122,6 @@ class DimensionDataLBDriver(Driver): :rtype: :class:`LoadBalancer` """ network_domain_id = self.network_domain_id - if port is None: - port = 80 if protocol is None: protocol = 'http' if algorithm is None: @@ -559,8 +558,8 @@ class DimensionDataLBDriver(Driver): network_domain_id, name, ex_description, - port, - pool, + port=None, + pool=None, listener_ip_address=None, persistence_profile=None, fallback_persistence_profile=None, @@ -581,8 +580,9 @@ class DimensionDataLBDriver(Driver): :param ex_description: Description of the node (required) :type ex_description: ``str`` - :param port: Description of the node (required) - :type port: ``str`` + :param port: An integer in the range of 1-65535. If not supplied, + it will be taken to mean 'Any Port' + :type port: ``int`` :param pool: The pool to use for the listener :type pool: :class:`DimensionDataPool` @@ -636,7 +636,8 @@ class DimensionDataLBDriver(Driver): if listener_ip_address is not None: ET.SubElement(create_node_elm, "listenerIpAddress").text = \ str(listener_ip_address) - ET.SubElement(create_node_elm, "port").text = str(port) + if port is not None: + ET.SubElement(create_node_elm, "port").text = str(port) ET.SubElement(create_node_elm, "enabled").text = 'true' ET.SubElement(create_node_elm, "connectionLimit") \ .text = str(connection_limit) @@ -644,8 +645,9 @@ class DimensionDataLBDriver(Driver): .text = str(connection_rate_limit) ET.SubElement(create_node_elm, "sourcePortPreservation") \ .text = source_port_preservation - ET.SubElement(create_node_elm, "poolId") \ - .text = pool.id + if pool is not None: + ET.SubElement(create_node_elm, "poolId") \ + .text = pool.id if persistence_profile is not None: ET.SubElement(create_node_elm, "persistenceProfileId") \ .text = persistence_profile.id http://git-wip-us.apache.org/repos/asf/libcloud/blob/9a07d7e4/libcloud/test/loadbalancer/test_dimensiondata.py ---------------------------------------------------------------------- diff --git a/libcloud/test/loadbalancer/test_dimensiondata.py b/libcloud/test/loadbalancer/test_dimensiondata.py index 93a24ab..86bafbe 100644 --- a/libcloud/test/loadbalancer/test_dimensiondata.py +++ b/libcloud/test/loadbalancer/test_dimensiondata.py @@ -78,7 +78,7 @@ class DimensionDataTests(unittest.TestCase): self.assertEqual(balancer.name, 'test') self.assertEqual(balancer.id, '8334f461-0df0-42d5-97eb-f4678eb26bea') self.assertEqual(balancer.ip, '165.180.12.22') - self.assertEqual(balancer.port, 80) + self.assertEqual(balancer.port, None) self.assertEqual(balancer.extra['pool_id'], '9e6b496d-5261-4542-91aa-b50c7f569c54') self.assertEqual(balancer.extra['network_domain_id'], '1234') @@ -163,6 +163,28 @@ class DimensionDataTests(unittest.TestCase): member = self.driver.balancer_attach_member(balancer, member) self.assertEqual(member.id, '3dd806a2-c2c8-4c0c-9a4f-5219ea9266c0') + def test_balancer_attach_member_without_port(self): + extra = {'pool_id': '4d360b1f-bc2c-4ab7-9884-1f03ba2768f7', + 'network_domain_id': '1234'} + balancer = LoadBalancer( + id='234', + name='test', + state=State.RUNNING, + ip='1.2.3.4', + port=1234, + driver=self.driver, + extra=extra + ) + member = Member( + id=None, + ip='112.12.2.2', + port=None, + balancer=balancer, + extra=None) + member = self.driver.balancer_attach_member(balancer, member) + self.assertEqual(member.id, '3dd806a2-c2c8-4c0c-9a4f-5219ea9266c0') + self.assertEqual(member.port, None) + def test_balancer_detach_member(self): extra = {'pool_id': '4d360b1f-bc2c-4ab7-9884-1f03ba2768f7', 'network_domain_id': '1234'} @@ -291,6 +313,32 @@ class DimensionDataTests(unittest.TestCase): self.assertEqual(listener.id, '8334f461-0df0-42d5-97eb-f4678eb26bea') self.assertEqual(listener.name, 'test') + def test_ex_create_virtual_listener_without_port(self): + listener = self.driver.ex_create_virtual_listener( + network_domain_id='12345', + name='test', + ex_description='test', + pool=DimensionDataPool( + id='1234', + name='test', + description='test', + status=State.RUNNING, + health_monitor_id=None, + load_balance_method=None, + service_down_action=None, + slow_ramp_time=None + )) + self.assertEqual(listener.id, '8334f461-0df0-42d5-97eb-f4678eb26bea') + self.assertEqual(listener.name, 'test') + + def test_ex_create_virtual_listener_without_pool(self): + listener = self.driver.ex_create_virtual_listener( + network_domain_id='12345', + name='test', + ex_description='test') + self.assertEqual(listener.id, '8334f461-0df0-42d5-97eb-f4678eb26bea') + self.assertEqual(listener.name, 'test') + def test_get_balancer(self): bal = self.driver.get_balancer('6115469d-a8bb-445b-bb23-d23b5283f2b9') self.assertEqual(bal.name, 'myProduction.Virtual.Listener')