From 0acf45ec7dd1fddcca8a223ad1b7b2b76be75b99 Mon Sep 17 00:00:00 2001 From: Jie Ren Date: Mon, 20 Feb 2017 16:42:54 +0800 Subject: [PATCH 1/3] Add join/leave security group methods for aliyun ECS --- libcloud/compute/drivers/ecs.py | 64 ++++++++++++++++++- .../ecs/join_security_group_by_id.xml | 4 ++ .../ecs/leave_security_group_by_id.xml | 4 ++ libcloud/test/compute/test_ecs.py | 8 +++ 4 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 libcloud/test/compute/fixtures/ecs/join_security_group_by_id.xml create mode 100644 libcloud/test/compute/fixtures/ecs/leave_security_group_by_id.xml diff --git a/libcloud/compute/drivers/ecs.py b/libcloud/compute/drivers/ecs.py index 03105ca084..744b5ce4af 100644 --- a/libcloud/compute/drivers/ecs.py +++ b/libcloud/compute/drivers/ecs.py @@ -872,6 +872,67 @@ def ex_list_security_group_attributes(self, group_id=None, namespace=self.namespace) return [self._to_security_group_attribute(el) for el in sga_elements] + def ex_join_security_group(self, node, group_id=None): + """ + Join a node into security group. + + :param node: The node to join security group + :type node: :class:`Node` + + :keyword group_id: security group id. + :type ex_filters: ``str`` + + + :return: join operation result. + :rtype: ``bool`` + """ + if group_id is None: + raise AttributeError('group_id is required') + + nodes = self.list_nodes(ex_node_ids=[node.id]) + if len(nodes) != 1 and node.id != nodes[0].id: + raise LibcloudError('could not find the node with id %s.' + % node.id) + current = nodes[0] + if current.state != NodeState.RUNNING and current.state != NodeState.STOPPED: + raise LibcloudError('The node state with id %s need be running or stopped .' % node.id) + + params = {'Action': 'JoinSecurityGroup', + 'InstanceId': current.id, + 'SecurityGroupId': group_id} + resp = self.connection.request(self.path, params) + return resp.success() + + def ex_leave_security_group(self, node, group_id=None): + """ + Leave a node from security group. + + :param node: The node to leave security group + :type node: :class:`Node` + + :keyword group_id: security group id. + :type ex_filters: ``str`` + + + :return: leave operation result. + :rtype: ``bool`` + """ + + nodes = self.list_nodes(ex_node_ids=[node.id]) + if len(nodes) != 1 and node.id != nodes[0].id: + raise LibcloudError('could not find the node with id %s.' + % node.id) + current = nodes[0] + if current.state != NodeState.RUNNING and current.state != NodeState.STOPPED: + raise LibcloudError('The node with id %s could not join security group, node need be running or stopped .' + % node.id) + + params = {'Action': 'LeaveSecurityGroup', + 'InstanceId': node.id, + 'SecurityGroupId': group_id} + resp = self.connection.request(self.path, params) + return resp.success() + def ex_list_zones(self, region_id=None): """ List availability zones in the given region or the current region. @@ -891,8 +952,7 @@ def ex_list_zones(self, region_id=None): zone_elements = findall(resp_body, 'Zones/Zone', namespace=self.namespace) zones = [self._to_zone(el) for el in zone_elements] - return zones - + return zones ## # Volume and snapshot management methods ## diff --git a/libcloud/test/compute/fixtures/ecs/join_security_group_by_id.xml b/libcloud/test/compute/fixtures/ecs/join_security_group_by_id.xml new file mode 100644 index 0000000000..ad8f493617 --- /dev/null +++ b/libcloud/test/compute/fixtures/ecs/join_security_group_by_id.xml @@ -0,0 +1,4 @@ + + + 473469C7-AA6F-4DC5-B3DB-A3DC0DE3C83E + diff --git a/libcloud/test/compute/fixtures/ecs/leave_security_group_by_id.xml b/libcloud/test/compute/fixtures/ecs/leave_security_group_by_id.xml new file mode 100644 index 0000000000..c6c00f958e --- /dev/null +++ b/libcloud/test/compute/fixtures/ecs/leave_security_group_by_id.xml @@ -0,0 +1,4 @@ + + + 473469C7-AA6F-4DC5-B3DB-A3DC0DE3C83E + diff --git a/libcloud/test/compute/test_ecs.py b/libcloud/test/compute/test_ecs.py index f610da8c4e..ef1b950960 100644 --- a/libcloud/test/compute/test_ecs.py +++ b/libcloud/test/compute/test_ecs.py @@ -528,6 +528,14 @@ def test_ex_list_security_groups(self): self.assertEqual('', sg.vpc_id) self.assertEqual('2015-06-26T08:35:30Z', sg.creation_time) + def test_ex_join_security_group(self): + result = self.driver.ex_join_security_group(self.fake_node, ex_security_group_id='F876FF7BA984') + self.assertTrue(result) + + def test_ex_leave_security_group(self): + result = self.driver.ex_leave_security_group(self.fake_node, ex_security_group_id='F876FF7BA984') + self.assertTrue(result) + def test_ex_list_security_groups_with_ex_filters(self): ECSMockHttp.type = 'list_sgs_filters' self.vpc_id = 'vpc1' From cc5921b7be12f27c8023bd520572c2a08a665139 Mon Sep 17 00:00:00 2001 From: Jie Ren Date: Wed, 22 Feb 2017 10:53:29 +0800 Subject: [PATCH 2/3] Modify for CI test --- libcloud/compute/drivers/ecs.py | 19 +++++++++++-------- libcloud/test/compute/test_ecs.py | 6 ++++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/libcloud/compute/drivers/ecs.py b/libcloud/compute/drivers/ecs.py index 744b5ce4af..3f12bfdacc 100644 --- a/libcloud/compute/drivers/ecs.py +++ b/libcloud/compute/drivers/ecs.py @@ -879,7 +879,7 @@ def ex_join_security_group(self, node, group_id=None): :param node: The node to join security group :type node: :class:`Node` - :keyword group_id: security group id. + :param group_id: security group id. :type ex_filters: ``str`` @@ -894,8 +894,10 @@ def ex_join_security_group(self, node, group_id=None): raise LibcloudError('could not find the node with id %s.' % node.id) current = nodes[0] - if current.state != NodeState.RUNNING and current.state != NodeState.STOPPED: - raise LibcloudError('The node state with id %s need be running or stopped .' % node.id) + if (current.state != NodeState.RUNNING) and \ + (current.state != NodeState.STOPPED): + raise LibcloudError('The node state with id % s need\ + be running or stopped .' % node.id) params = {'Action': 'JoinSecurityGroup', 'InstanceId': current.id, @@ -910,7 +912,7 @@ def ex_leave_security_group(self, node, group_id=None): :param node: The node to leave security group :type node: :class:`Node` - :keyword group_id: security group id. + :param group_id: security group id. :type ex_filters: ``str`` @@ -923,9 +925,10 @@ def ex_leave_security_group(self, node, group_id=None): raise LibcloudError('could not find the node with id %s.' % node.id) current = nodes[0] - if current.state != NodeState.RUNNING and current.state != NodeState.STOPPED: - raise LibcloudError('The node with id %s could not join security group, node need be running or stopped .' - % node.id) + if (current.state != NodeState.RUNNING) and \ + (current.state != NodeState.STOPPED): + raise LibcloudError('The node state with id %s need \ + be running or stopped .' % node.id) params = {'Action': 'LeaveSecurityGroup', 'InstanceId': node.id, @@ -952,7 +955,7 @@ def ex_list_zones(self, region_id=None): zone_elements = findall(resp_body, 'Zones/Zone', namespace=self.namespace) zones = [self._to_zone(el) for el in zone_elements] - return zones + return zones ## # Volume and snapshot management methods ## diff --git a/libcloud/test/compute/test_ecs.py b/libcloud/test/compute/test_ecs.py index ef1b950960..a31dc1a6d7 100644 --- a/libcloud/test/compute/test_ecs.py +++ b/libcloud/test/compute/test_ecs.py @@ -529,11 +529,13 @@ def test_ex_list_security_groups(self): self.assertEqual('2015-06-26T08:35:30Z', sg.creation_time) def test_ex_join_security_group(self): - result = self.driver.ex_join_security_group(self.fake_node, ex_security_group_id='F876FF7BA984') + ex_security_group_id_value='F876FF7BA984' + result = self.driver.ex_join_security_group(self.fake_node, ex_security_group_id=ex_security_group_id_value) self.assertTrue(result) def test_ex_leave_security_group(self): - result = self.driver.ex_leave_security_group(self.fake_node, ex_security_group_id='F876FF7BA984') + ex_security_group_id_value='F876FF7BA984' + result = self.driver.ex_leave_security_group(self.fake_node, ex_security_group_id=ex_security_group_id_value) self.assertTrue(result) def test_ex_list_security_groups_with_ex_filters(self): From 8d40de20fe529939e0d82ef26d85bc826b5b2e51 Mon Sep 17 00:00:00 2001 From: Jie Ren Date: Thu, 23 Feb 2017 09:00:58 +0800 Subject: [PATCH 3/3] Modify for CI test --- libcloud/test/compute/test_ecs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libcloud/test/compute/test_ecs.py b/libcloud/test/compute/test_ecs.py index a31dc1a6d7..6869587b4b 100644 --- a/libcloud/test/compute/test_ecs.py +++ b/libcloud/test/compute/test_ecs.py @@ -530,12 +530,12 @@ def test_ex_list_security_groups(self): def test_ex_join_security_group(self): ex_security_group_id_value='F876FF7BA984' - result = self.driver.ex_join_security_group(self.fake_node, ex_security_group_id=ex_security_group_id_value) + result = self.driver.ex_join_security_group(self.fake_node, group_id=ex_security_group_id_value) self.assertTrue(result) def test_ex_leave_security_group(self): ex_security_group_id_value='F876FF7BA984' - result = self.driver.ex_leave_security_group(self.fake_node, ex_security_group_id=ex_security_group_id_value) + result = self.driver.ex_leave_security_group(self.fake_node, group_id=ex_security_group_id_value) self.assertTrue(result) def test_ex_list_security_groups_with_ex_filters(self):