From 1b18a7a084494755630483b07f9d77a0d56949f0 Mon Sep 17 00:00:00 2001 From: Ian White Date: Tue, 9 Aug 2016 11:46:43 -0500 Subject: [PATCH 1/6] [LIBCLOUD-845] check for None as tag value and just use tag name when deleting --- libcloud/compute/drivers/ec2.py | 3 ++- libcloud/test/compute/test_ec2.py | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libcloud/compute/drivers/ec2.py b/libcloud/compute/drivers/ec2.py index 93857ef..34ba97c 100644 --- a/libcloud/compute/drivers/ec2.py +++ b/libcloud/compute/drivers/ec2.py @@ -4310,7 +4310,8 @@ class BaseEC2NodeDriver(NodeDriver): 'ResourceId.0': resource.id} for i, key in enumerate(tags): params['Tag.%d.Key' % i] = key - params['Tag.%d.Value' % i] = tags[key] + if tags[key] != None: + params['Tag.%d.Value' % i] = tags[key] res = self.connection.request(self.path, params=params.copy()).object diff --git a/libcloud/test/compute/test_ec2.py b/libcloud/test/compute/test_ec2.py index 7fe69c3..2716be2 100644 --- a/libcloud/test/compute/test_ec2.py +++ b/libcloud/test/compute/test_ec2.py @@ -681,6 +681,11 @@ class EC2Tests(LibcloudTestCase, TestCaseMixin): def test_ex_delete_tags(self): node = Node('i-4382922a', None, None, None, None, self.driver) self.driver.ex_delete_tags(node, {'sample': 'tag'}) + + def test_ex_delete_tags2(self): + node = Node('i-4382922a', None, None, None, None, self.driver) + self.driver.ex_create_tags(node, {'sample': 'another tag'}) + self.driver.ex_delete_tags(node, {'sample':None}) def test_ex_describe_addresses_for_node(self): node1 = Node('i-4382922a', None, None, None, None, self.driver) -- 1.9.5 (Apple Git-50.3) From 8bd8cd188c7716d33105010be449796f3ea2884f Mon Sep 17 00:00:00 2001 From: Ian White Date: Tue, 9 Aug 2016 12:06:49 -0500 Subject: [PATCH 2/6] [LIBCLOUD-845] fixed code formatting --- libcloud/compute/drivers/ec2.py | 2 +- libcloud/test/compute/test_ec2.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libcloud/compute/drivers/ec2.py b/libcloud/compute/drivers/ec2.py index 34ba97c..bc382e4 100644 --- a/libcloud/compute/drivers/ec2.py +++ b/libcloud/compute/drivers/ec2.py @@ -4310,7 +4310,7 @@ class BaseEC2NodeDriver(NodeDriver): 'ResourceId.0': resource.id} for i, key in enumerate(tags): params['Tag.%d.Key' % i] = key - if tags[key] != None: + if tags[key] is not None: params['Tag.%d.Value' % i] = tags[key] res = self.connection.request(self.path, diff --git a/libcloud/test/compute/test_ec2.py b/libcloud/test/compute/test_ec2.py index 2716be2..307b2e3 100644 --- a/libcloud/test/compute/test_ec2.py +++ b/libcloud/test/compute/test_ec2.py @@ -681,11 +681,11 @@ class EC2Tests(LibcloudTestCase, TestCaseMixin): def test_ex_delete_tags(self): node = Node('i-4382922a', None, None, None, None, self.driver) self.driver.ex_delete_tags(node, {'sample': 'tag'}) - + def test_ex_delete_tags2(self): node = Node('i-4382922a', None, None, None, None, self.driver) self.driver.ex_create_tags(node, {'sample': 'another tag'}) - self.driver.ex_delete_tags(node, {'sample':None}) + self.driver.ex_delete_tags(node, {'sample': None}) def test_ex_describe_addresses_for_node(self): node1 = Node('i-4382922a', None, None, None, None, self.driver) -- 1.9.5 (Apple Git-50.3) From adb75493f05019666e623d56eeb29c0091129e38 Mon Sep 17 00:00:00 2001 From: Ian White Date: Tue, 9 Aug 2016 11:46:43 -0500 Subject: [PATCH 3/6] check for None as tag value and just use tag name when deleting --- libcloud/compute/drivers/ec2.py | 3 ++- libcloud/test/compute/test_ec2.py | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libcloud/compute/drivers/ec2.py b/libcloud/compute/drivers/ec2.py index 93857ef..34ba97c 100644 --- a/libcloud/compute/drivers/ec2.py +++ b/libcloud/compute/drivers/ec2.py @@ -4310,7 +4310,8 @@ class BaseEC2NodeDriver(NodeDriver): 'ResourceId.0': resource.id} for i, key in enumerate(tags): params['Tag.%d.Key' % i] = key - params['Tag.%d.Value' % i] = tags[key] + if tags[key] != None: + params['Tag.%d.Value' % i] = tags[key] res = self.connection.request(self.path, params=params.copy()).object diff --git a/libcloud/test/compute/test_ec2.py b/libcloud/test/compute/test_ec2.py index 7fe69c3..2716be2 100644 --- a/libcloud/test/compute/test_ec2.py +++ b/libcloud/test/compute/test_ec2.py @@ -681,6 +681,11 @@ class EC2Tests(LibcloudTestCase, TestCaseMixin): def test_ex_delete_tags(self): node = Node('i-4382922a', None, None, None, None, self.driver) self.driver.ex_delete_tags(node, {'sample': 'tag'}) + + def test_ex_delete_tags2(self): + node = Node('i-4382922a', None, None, None, None, self.driver) + self.driver.ex_create_tags(node, {'sample': 'another tag'}) + self.driver.ex_delete_tags(node, {'sample':None}) def test_ex_describe_addresses_for_node(self): node1 = Node('i-4382922a', None, None, None, None, self.driver) -- 1.9.5 (Apple Git-50.3) From 5268f2b7723d8f6db86677618388bddb74acb446 Mon Sep 17 00:00:00 2001 From: Ian White Date: Tue, 9 Aug 2016 12:06:49 -0500 Subject: [PATCH 4/6] fixed code formatting Closes #849 --- libcloud/compute/drivers/ec2.py | 2 +- libcloud/test/compute/test_ec2.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libcloud/compute/drivers/ec2.py b/libcloud/compute/drivers/ec2.py index 34ba97c..bc382e4 100644 --- a/libcloud/compute/drivers/ec2.py +++ b/libcloud/compute/drivers/ec2.py @@ -4310,7 +4310,7 @@ class BaseEC2NodeDriver(NodeDriver): 'ResourceId.0': resource.id} for i, key in enumerate(tags): params['Tag.%d.Key' % i] = key - if tags[key] != None: + if tags[key] is not None: params['Tag.%d.Value' % i] = tags[key] res = self.connection.request(self.path, diff --git a/libcloud/test/compute/test_ec2.py b/libcloud/test/compute/test_ec2.py index 2716be2..307b2e3 100644 --- a/libcloud/test/compute/test_ec2.py +++ b/libcloud/test/compute/test_ec2.py @@ -681,11 +681,11 @@ class EC2Tests(LibcloudTestCase, TestCaseMixin): def test_ex_delete_tags(self): node = Node('i-4382922a', None, None, None, None, self.driver) self.driver.ex_delete_tags(node, {'sample': 'tag'}) - + def test_ex_delete_tags2(self): node = Node('i-4382922a', None, None, None, None, self.driver) self.driver.ex_create_tags(node, {'sample': 'another tag'}) - self.driver.ex_delete_tags(node, {'sample':None}) + self.driver.ex_delete_tags(node, {'sample': None}) def test_ex_describe_addresses_for_node(self): node1 = Node('i-4382922a', None, None, None, None, self.driver) -- 1.9.5 (Apple Git-50.3) From a3dbf97c7a2935f127f1ac620c97f11abfb90b13 Mon Sep 17 00:00:00 2001 From: Max Illfelder Date: Wed, 10 Aug 2016 13:54:35 -0700 Subject: [PATCH 5/6] Allow undeprecation of an image. Closes #851 --- libcloud/compute/drivers/gce.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libcloud/compute/drivers/gce.py b/libcloud/compute/drivers/gce.py index 337b109..4b2c2a2 100644 --- a/libcloud/compute/drivers/gce.py +++ b/libcloud/compute/drivers/gce.py @@ -500,7 +500,7 @@ class GCENodeImage(NodeImage): :type replacement: ``str`` or :class: `GCENodeImage` :param state: Deprecation state of this image. Possible values include - \'DELETED\', \'DEPRECATED\' or \'OBSOLETE\'. + \'ACTIVE\', \'DELETED\', \'DEPRECATED\' or \'OBSOLETE\'. :type state: ``str`` :param deprecated: RFC3339 timestamp to mark DEPRECATED @@ -3873,7 +3873,7 @@ class GCENodeDriver(NodeDriver): if state is None: state = 'DEPRECATED' - possible_states = ['DELETED', 'DEPRECATED', 'OBSOLETE'] + possible_states = ['ACTIVE', 'DELETED', 'DEPRECATED', 'OBSOLETE'] if state not in possible_states: raise ValueError('state must be one of %s' -- 1.9.5 (Apple Git-50.3) From c5b6fc29b33a9aacd8b959eb4d3de959e69a7996 Mon Sep 17 00:00:00 2001 From: Anthony Shaw Date: Thu, 11 Aug 2016 15:45:37 +1000 Subject: [PATCH 6/6] changes for #851 --- CHANGES.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index ad78fde..8425c40 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -17,6 +17,10 @@ General Compute ~~~~~~~ +- [gce] Allow undeprecation of an image. + (GITHUB-851) + [Max Illfelder] + - [cloudstack] BUGFIX Values with wildcards failed signature validation (GITHUB-846) [Ronald van Zantvoot] -- 1.9.5 (Apple Git-50.3)