From d190f1bad171751bb01865218eef3d1d764edc28 Mon Sep 17 00:00:00 2001 From: Andrew Hutchings Date: Tue, 30 Oct 2012 20:02:38 +0000 Subject: [PATCH] Pool manager now posts nodes to API server Change-Id: I6d53a87e53a4272c26f77f5b28bc83651cb075cf --- etc/sample_libra.cfg | 2 ++ libra/mgm/mgm.py | 14 +++++++------- libra/mgm/nova.py | 5 ++++- libra/mgm/rest.py | 16 +++++++++++++++- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/etc/sample_libra.cfg b/etc/sample_libra.cfg index a0d0a063..3eaa01f7 100644 --- a/etc/sample_libra.cfg +++ b/etc/sample_libra.cfg @@ -48,3 +48,5 @@ haproxy_image = 12345 api_servers = 10.0.0.1:8889 10.0.0.2:8889 nodes = 10 check_interval = 5 +# 100 - xsmall, 101 - small, 102 - medium +image_size = 102 diff --git a/libra/mgm/mgm.py b/libra/mgm/mgm.py index 6fcd2aa1..56c814cc 100644 --- a/libra/mgm/mgm.py +++ b/libra/mgm/mgm.py @@ -69,8 +69,6 @@ class Server(object): 'Building {nodes} nodes' .format(nodes=nodes_required) ) - # TODO: - # deal with case where node is created but not sent to API self.build_nodes(nodes_required, api) else: self.logger.info('No new nodes required') @@ -95,10 +93,9 @@ class Server(object): self.args.nova_keyname, self.args.nova_secgroup, self.args.haproxy_image, - 102 + self.args.image_size ) while count > 0: - # Do stuff status, data = nova.build() if not status: self.logger.error(data) @@ -109,10 +106,13 @@ class Server(object): for address in addresses: if not address['addr'].startswith('10.'): break - body['ip'] = address['addr'] + body['address'] = address['addr'] self.logger.info('Adding server {name} on {ip}' - .format(name=body['name'], ip=body['ip'])) - # TODO: upload to API server + .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: + return count = count - 1 def exit_handler(self, signum, frame): diff --git a/libra/mgm/nova.py b/libra/mgm/nova.py index 35ddcbd1..0dc217dc 100644 --- a/libra/mgm/nova.py +++ b/libra/mgm/nova.py @@ -53,9 +53,12 @@ class Node(object): while waits > 0: time.sleep(3) status = self._status(server_id) - # Should also check if it is not spawning, so errors are detected if status['status'] == 'ACTIVE': return True, status + elif not status['status'].startswith('BUILD'): + return False, 'Error spawning node {nid} status {stat}'.format( + node=node_id, stat=status['status'] + ) waits = waits - 1 return (False, diff --git a/libra/mgm/rest.py b/libra/mgm/rest.py index 061b11ba..72745c0c 100644 --- a/libra/mgm/rest.py +++ b/libra/mgm/rest.py @@ -50,7 +50,7 @@ class APIClient(object): ) def add_node(self, node_data): - requests.post('{url}/devices', json.dumps(node_data)) + return self._post('{url}/devices'.format(url=self.url), node_data) def delete_node(self, node_id): requests.delete( @@ -76,3 +76,17 @@ class APIClient(object): .format(code=r.status_code)) return False, r.json return True, r.json + + def _post(self, url, node_data): + try: + r = requests.post(url, data=json.dumps(node_data), verify=False) + except: + self.logger.error('Exception communicating to server: {exc}' + .format(exc=sys.exc_info()[0])) + return False, None + + if r.status_code != 200: + self.logger.error('Server returned error {code}' + .format(code=r.status_code)) + return False, r.json + return True, r.json