From 0acf45ec7dd1fddcca8a223ad1b7b2b76be75b99 Mon Sep 17 00:00:00 2001 From: Jie Ren Date: Mon, 20 Feb 2017 16:42:54 +0800 Subject: [PATCH 01/13] 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 02/13] 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 03/13] 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): From c6b93653de9b7a6a4052ae5ae07eaaaee7748163 Mon Sep 17 00:00:00 2001 From: Jie Ren Date: Fri, 24 Feb 2017 11:19:04 +0800 Subject: [PATCH 04/13] Modify for CI test --- libcloud/compute/drivers/ecs.py | 26 +++++++++----------------- libcloud/test/compute/test_ecs.py | 4 ++-- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/libcloud/compute/drivers/ecs.py b/libcloud/compute/drivers/ecs.py index 3f12bfdacc..60ea19585e 100644 --- a/libcloud/compute/drivers/ecs.py +++ b/libcloud/compute/drivers/ecs.py @@ -889,18 +889,13 @@ def ex_join_security_group(self, node, group_id=None): 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): + if (node.state != NodeState.RUNNING) and \ + (node.state != NodeState.STOPPED): raise LibcloudError('The node state with id % s need\ be running or stopped .' % node.id) params = {'Action': 'JoinSecurityGroup', - 'InstanceId': current.id, + 'InstanceId': node.id, 'SecurityGroupId': group_id} resp = self.connection.request(self.path, params) return resp.success() @@ -919,15 +914,12 @@ def ex_leave_security_group(self, node, group_id=None): :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 state with id %s need \ + if group_id is None: + raise AttributeError('group_id is required') + + if (node.state != NodeState.RUNNING) and \ + (node.state != NodeState.STOPPED): + raise LibcloudError('The node state with id % s need\ be running or stopped .' % node.id) params = {'Action': 'LeaveSecurityGroup', diff --git a/libcloud/test/compute/test_ecs.py b/libcloud/test/compute/test_ecs.py index 6869587b4b..c48388e632 100644 --- a/libcloud/test/compute/test_ecs.py +++ b/libcloud/test/compute/test_ecs.py @@ -529,12 +529,12 @@ def test_ex_list_security_groups(self): self.assertEqual('2015-06-26T08:35:30Z', sg.creation_time) def test_ex_join_security_group(self): - ex_security_group_id_value='F876FF7BA984' + ex_security_group_id_value='sg-28ou0f3xa' 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' + ex_security_group_id_value='sg-28ou0f3xa' result = self.driver.ex_leave_security_group(self.fake_node, group_id=ex_security_group_id_value) self.assertTrue(result) From 55c09dc5101971845722766cf3202427918838f4 Mon Sep 17 00:00:00 2001 From: Jie Ren Date: Mon, 27 Feb 2017 09:29:07 +0800 Subject: [PATCH 05/13] Modify for test --- libcloud/test/compute/test_ecs.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libcloud/test/compute/test_ecs.py b/libcloud/test/compute/test_ecs.py index c48388e632..48c9423fc9 100644 --- a/libcloud/test/compute/test_ecs.py +++ b/libcloud/test/compute/test_ecs.py @@ -912,6 +912,14 @@ def _DescribeSecurityGroups(self, method, url, body, headers): self.assertUrlContainsQueryParams(url, params) resp_body = self.fixtures.load('describe_security_groups.xml') return (httplib.OK, resp_body, {}, httplib.responses[httplib.OK]) + + def _JoinSecurityGroup(self, method, url, body, headers): + body = self.fixtures.load('join_security_group_by_id.xml') + return (httplib.OK, body, {}, httplib.responses[httplib.OK]) + + def _LeaveSecurityGroup(self, method, url, body, headers): + body = self.fixtures.load('leave_security_group_by_id.xml') + return (httplib.OK, body, {}, httplib.responses[httplib.OK]) def _list_sgs_filters_DescribeSecurityGroups(self, method, url, body, headers): From 027cef787072fe3c7c1a96b0acdfb1a3b2c4c9f6 Mon Sep 17 00:00:00 2001 From: Jie Ren Date: Mon, 27 Feb 2017 10:15:05 +0800 Subject: [PATCH 06/13] Modify for test --- libcloud/test/compute/test_ecs.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/libcloud/test/compute/test_ecs.py b/libcloud/test/compute/test_ecs.py index 48c9423fc9..5df10abe0c 100644 --- a/libcloud/test/compute/test_ecs.py +++ b/libcloud/test/compute/test_ecs.py @@ -529,13 +529,19 @@ def test_ex_list_security_groups(self): self.assertEqual('2015-06-26T08:35:30Z', sg.creation_time) def test_ex_join_security_group(self): - ex_security_group_id_value='sg-28ou0f3xa' - result = self.driver.ex_join_security_group(self.fake_node, group_id=ex_security_group_id_value) + ex_security_group_id_value = 'sg-28ou0f3xa' + 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='sg-28ou0f3xa' - result = self.driver.ex_leave_security_group(self.fake_node, group_id=ex_security_group_id_value) + ex_security_group_id_value = 'sg-28ou0f3xa' + 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): @@ -912,11 +918,11 @@ def _DescribeSecurityGroups(self, method, url, body, headers): self.assertUrlContainsQueryParams(url, params) resp_body = self.fixtures.load('describe_security_groups.xml') return (httplib.OK, resp_body, {}, httplib.responses[httplib.OK]) - + def _JoinSecurityGroup(self, method, url, body, headers): body = self.fixtures.load('join_security_group_by_id.xml') return (httplib.OK, body, {}, httplib.responses[httplib.OK]) - + def _LeaveSecurityGroup(self, method, url, body, headers): body = self.fixtures.load('leave_security_group_by_id.xml') return (httplib.OK, body, {}, httplib.responses[httplib.OK]) From dc5db469c835c888c77cdf83a7425e175e5a2e23 Mon Sep 17 00:00:00 2001 From: Jie Ren Date: Mon, 27 Feb 2017 10:58:26 +0800 Subject: [PATCH 07/13] Modify for CI --- libcloud/compute/drivers/ecs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libcloud/compute/drivers/ecs.py b/libcloud/compute/drivers/ecs.py index 60ea19585e..14134e22ae 100644 --- a/libcloud/compute/drivers/ecs.py +++ b/libcloud/compute/drivers/ecs.py @@ -916,7 +916,7 @@ def ex_leave_security_group(self, node, group_id=None): """ if group_id is None: raise AttributeError('group_id is required') - + if (node.state != NodeState.RUNNING) and \ (node.state != NodeState.STOPPED): raise LibcloudError('The node state with id % s need\ From d4b9c25805424b9d43416d909a8954ecf8ca7316 Mon Sep 17 00:00:00 2001 From: Jie Ren Date: Mon, 27 Feb 2017 12:42:47 +0800 Subject: [PATCH 08/13] Modify for CI --- libcloud/test/compute/test_ecs.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/libcloud/test/compute/test_ecs.py b/libcloud/test/compute/test_ecs.py index 5df10abe0c..8375fc01c4 100644 --- a/libcloud/test/compute/test_ecs.py +++ b/libcloud/test/compute/test_ecs.py @@ -531,17 +531,15 @@ def test_ex_list_security_groups(self): def test_ex_join_security_group(self): ex_security_group_id_value = 'sg-28ou0f3xa' result = self.driver.ex_join_security_group( - self.fake_node, - group_id=ex_security_group_id_value - ) + 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 = 'sg-28ou0f3xa' result = self.driver.ex_leave_security_group( - self.fake_node, - group_id=ex_security_group_id_value - ) + self.fake_node, + group_id=ex_security_group_id_value) self.assertTrue(result) def test_ex_list_security_groups_with_ex_filters(self): From 7a44e85af744484de89ac7d88b18cb41063c2be2 Mon Sep 17 00:00:00 2001 From: Jie Ren Date: Mon, 27 Feb 2017 13:43:11 +0800 Subject: [PATCH 09/13] Modify for CI --- libcloud/test/compute/test_ecs.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libcloud/test/compute/test_ecs.py b/libcloud/test/compute/test_ecs.py index 8375fc01c4..1b904aad2e 100644 --- a/libcloud/test/compute/test_ecs.py +++ b/libcloud/test/compute/test_ecs.py @@ -531,15 +531,15 @@ def test_ex_list_security_groups(self): def test_ex_join_security_group(self): ex_security_group_id_value = 'sg-28ou0f3xa' result = self.driver.ex_join_security_group( - self.fake_node, - group_id=ex_security_group_id_value) + 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 = 'sg-28ou0f3xa' result = self.driver.ex_leave_security_group( - self.fake_node, - group_id=ex_security_group_id_value) + self.fake_node, + group_id=ex_security_group_id_value) self.assertTrue(result) def test_ex_list_security_groups_with_ex_filters(self): From 96b46c842ead9d983e7f963519cc1c0bca77e96f Mon Sep 17 00:00:00 2001 From: Jie Ren Date: Mon, 27 Feb 2017 15:33:27 +0800 Subject: [PATCH 10/13] Modify for CI --- libcloud/test/compute/test_ecs.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/libcloud/test/compute/test_ecs.py b/libcloud/test/compute/test_ecs.py index 1b904aad2e..d6e6627b6a 100644 --- a/libcloud/test/compute/test_ecs.py +++ b/libcloud/test/compute/test_ecs.py @@ -530,16 +530,14 @@ def test_ex_list_security_groups(self): def test_ex_join_security_group(self): ex_security_group_id_value = 'sg-28ou0f3xa' - result = self.driver.ex_join_security_group( - self.fake_node, - 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 = 'sg-28ou0f3xa' - result = self.driver.ex_leave_security_group( - self.fake_node, - 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): From 3d4cb83ba827ef9a31890cd502120c32ed05a69d Mon Sep 17 00:00:00 2001 From: Jaren Date: Thu, 6 Apr 2017 12:47:51 +0800 Subject: [PATCH 11/13] Update ecs.py fix doc --- libcloud/compute/drivers/ecs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libcloud/compute/drivers/ecs.py b/libcloud/compute/drivers/ecs.py index 14134e22ae..26ee69a8c3 100644 --- a/libcloud/compute/drivers/ecs.py +++ b/libcloud/compute/drivers/ecs.py @@ -851,7 +851,7 @@ def ex_list_security_group_attributes(self, group_id=None, List security group attributes in the current region. :keyword group_id: security group id. - :type ex_filters: ``str`` + :type group_id: ``str`` :keyword nic_type: internet|intranet. :type nic_type: ``str`` @@ -908,7 +908,7 @@ def ex_leave_security_group(self, node, group_id=None): :type node: :class:`Node` :param group_id: security group id. - :type ex_filters: ``str`` + :type group_id: ``str`` :return: leave operation result. From e4b2e336a5d8bd9997138c4ba63cf2455bd4d467 Mon Sep 17 00:00:00 2001 From: Jaren Date: Thu, 6 Apr 2017 12:50:03 +0800 Subject: [PATCH 12/13] Update ecs.py fix doc --- libcloud/compute/drivers/ecs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libcloud/compute/drivers/ecs.py b/libcloud/compute/drivers/ecs.py index 26ee69a8c3..06b6f7d35d 100644 --- a/libcloud/compute/drivers/ecs.py +++ b/libcloud/compute/drivers/ecs.py @@ -880,7 +880,7 @@ def ex_join_security_group(self, node, group_id=None): :type node: :class:`Node` :param group_id: security group id. - :type ex_filters: ``str`` + :type group_id: ``str`` :return: join operation result. From 60eafe19e2fbbb46415b585013752d0800c3a7ff Mon Sep 17 00:00:00 2001 From: Jaren Date: Thu, 6 Apr 2017 12:59:21 +0800 Subject: [PATCH 13/13] Update ecs.py fix for code review --- libcloud/compute/drivers/ecs.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libcloud/compute/drivers/ecs.py b/libcloud/compute/drivers/ecs.py index 06b6f7d35d..e92d467f4a 100644 --- a/libcloud/compute/drivers/ecs.py +++ b/libcloud/compute/drivers/ecs.py @@ -889,8 +889,8 @@ def ex_join_security_group(self, node, group_id=None): if group_id is None: raise AttributeError('group_id is required') - if (node.state != NodeState.RUNNING) and \ - (node.state != NodeState.STOPPED): + if node.state != NodeState.RUNNING and \ + node.state != NodeState.STOPPED: raise LibcloudError('The node state with id % s need\ be running or stopped .' % node.id) @@ -917,8 +917,8 @@ def ex_leave_security_group(self, node, group_id=None): if group_id is None: raise AttributeError('group_id is required') - if (node.state != NodeState.RUNNING) and \ - (node.state != NodeState.STOPPED): + if node.state != NodeState.RUNNING and \ + node.state != NodeState.STOPPED: raise LibcloudError('The node state with id % s need\ be running or stopped .' % node.id)