From 84e15441ee40e93a6e88bd4988ad29c0ece318d9 Mon Sep 17 00:00:00 2001 From: Allard Hoeve Date: Fri, 23 Sep 2016 10:46:23 +0200 Subject: [PATCH 1/2] Fix case where node does not exist on OpenStack - Add case where the node does not exist on OS - Fix code that tries to return None if the node does not exist --- CHANGES.rst | 5 +++++ libcloud/compute/drivers/openstack.py | 10 +++++++--- libcloud/test/compute/test_openstack.py | 7 +++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index eb027dad64..669c8a026f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -13,6 +13,11 @@ Compute (GITHUB-857) [Allard Hoeve] +- When fetching the node details of a non-existing node, OpenStack would raise a + `BaseHTTPError` instead of returning `None`, as was intended. Fixed tests and code. + (GITHUB-864) + [Allard Hoeve] + Container ~~~~~~~~~ diff --git a/libcloud/compute/drivers/openstack.py b/libcloud/compute/drivers/openstack.py index 88622d29c4..5357cad6f8 100644 --- a/libcloud/compute/drivers/openstack.py +++ b/libcloud/compute/drivers/openstack.py @@ -15,6 +15,7 @@ """ OpenStack driver """ +from libcloud.common.exceptions import BaseHTTPError from libcloud.utils.iso8601 import parse_date try: @@ -322,9 +323,12 @@ def ex_get_node_details(self, node_id): node_id = node_id.id uri = '/servers/%s' % (node_id) - resp = self.connection.request(uri, method='GET') - if resp.status == httplib.NOT_FOUND: - return None + try: + resp = self.connection.request(uri, method='GET') + except BaseHTTPError as e: + if e.code == httplib.NOT_FOUND: + return None + raise return self._to_node_from_obj(resp.object) diff --git a/libcloud/test/compute/test_openstack.py b/libcloud/test/compute/test_openstack.py index 1a0cdabc54..86dacaf3c4 100644 --- a/libcloud/test/compute/test_openstack.py +++ b/libcloud/test/compute/test_openstack.py @@ -1129,6 +1129,10 @@ def test_ex_get_node_details(self): self.assertEqual(node.id, '12064') self.assertEqual(node.name, 'lc-test') + def test_ex_get_node_details_returns_none_if_node_does_not_exist(self): + node = self.driver.ex_get_node_details('does-not-exist') + self.assertIsNone(node) + def test_ex_get_size(self): size_id = '7' size = self.driver.ex_get_size(size_id) @@ -1562,6 +1566,9 @@ def _v1_1_slug_servers_detail_ERROR_STATE_NO_IMAGE_ID(self, method, url, body, h body = self.fixtures.load('_servers_detail_ERROR_STATE.json') return (httplib.OK, body, self.json_content_headers, httplib.responses[httplib.OK]) + def _v2_1337_servers_does_not_exist(self, *args, **kwargs): + return httplib.NOT_FOUND, None, {}, httplib.responses[httplib.NOT_FOUND] + def _v1_1_slug_flavors_detail(self, method, url, body, headers): body = self.fixtures.load('_flavors_detail.json') return (httplib.OK, body, self.json_content_headers, httplib.responses[httplib.OK]) From bc34ec431f9ce819d0b1f850e9d5dda323a0a07b Mon Sep 17 00:00:00 2001 From: Allard Hoeve Date: Fri, 23 Sep 2016 11:12:38 +0200 Subject: [PATCH 2/2] Fix python2.6 compat in test --- libcloud/test/compute/test_openstack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libcloud/test/compute/test_openstack.py b/libcloud/test/compute/test_openstack.py index 86dacaf3c4..cd5a992e24 100644 --- a/libcloud/test/compute/test_openstack.py +++ b/libcloud/test/compute/test_openstack.py @@ -1131,7 +1131,7 @@ def test_ex_get_node_details(self): def test_ex_get_node_details_returns_none_if_node_does_not_exist(self): node = self.driver.ex_get_node_details('does-not-exist') - self.assertIsNone(node) + self.assertTrue(node is None) def test_ex_get_size(self): size_id = '7'