From 2cef1f6b841d4daff60bd9a6bc52f4c6e36d6a65 Mon Sep 17 00:00:00 2001 From: Andrew Hutchings Date: Tue, 13 Nov 2012 12:45:16 +0000 Subject: [PATCH] Fix mgm api server edge case Fixes the small case where the API server has given a node count, the pool manager server spins up a node and then the pool manager cannot give the details to the API server. In this scenario the new node is deleted if possible. Fixes bug #1076446 Change-Id: If1f3ff13046fcee78dd865b27dd269cf9937cb48 --- libra/mgm/mgm.py | 12 +++++++++++- libra/mgm/nova.py | 10 +++++++--- tests/test_lbaas_mgm.py | 4 ++-- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/libra/mgm/mgm.py b/libra/mgm/mgm.py index f1bdeeca..0670d4b5 100644 --- a/libra/mgm/mgm.py +++ b/libra/mgm/mgm.py @@ -120,11 +120,21 @@ class Server(object): if not address['addr'].startswith('10.'): break body['address'] = address['addr'] - self.logger.info('Adding server {name} on {ip}' + self.logger.info('Adding node {name} on {ip}' .format(name=body['name'], ip=body['address'])) # TODO: store failed uploads to API server to retry status, response = api.add_node(body) if not status: + self.logger.error( + 'Could not upload node {name} to API server, deleting' + .format(name=data['name']) + ) + status, response = nova.delete(data['id']) + if not status: + self.logger.error(response) + else: + self.logger.info('Delete succeeded') + self.logger.warning('Aborting node building') return count = count - 1 diff --git a/libra/mgm/nova.py b/libra/mgm/nova.py index 0dc217dc..7323bb44 100644 --- a/libra/mgm/nova.py +++ b/libra/mgm/nova.py @@ -71,12 +71,16 @@ class Node(object): try: resp = self._delete(node_id) except: - return False + return False, 'Error deleting node {nid} exception {exc}'.format( + nid=node_id, exc=sys.exc_info()[0] + ) if resp['status'] != '204': - return False + return False, 'Error deleting node {nid} status {stat}'.format( + node=node_id, stat=status['status'] + ) - return True + return True, '' def _create(self, node_id): """ create a nova node """ diff --git a/tests/test_lbaas_mgm.py b/tests/test_lbaas_mgm.py index 0fa809de..3b8cdc3b 100644 --- a/tests/test_lbaas_mgm.py +++ b/tests/test_lbaas_mgm.py @@ -56,11 +56,11 @@ class TestLBaaSMgmNova(unittest.TestCase): def testDeleteNodeFail(self): with mock.patch.object(httplib2.Http, "request", mock_bad_request): with mock.patch('time.time', mock.Mock(return_value=1234)): - resp = self.api.delete('1234') + resp, data = self.api.delete('1234') self.assertFalse(resp) def testDeleteNodeSucceed(self): with mock.patch.object(httplib2.Http, "request", mock_del_request): with mock.patch('time.time', mock.Mock(return_value=1234)): - resp = self.api.delete('1234') + resp, data = self.api.delete('1234') self.assertTrue(resp)