Pool manager now creates Nova nodes

Change-Id: Ifff48d96aad014f6fb11bc27ad38b54944d862ac
This commit is contained in:
Andrew Hutchings 2012-10-30 19:23:06 +00:00
parent 8e9970ac07
commit 87f26a39b0
3 changed files with 43 additions and 8 deletions

View File

@ -22,6 +22,7 @@ import sys
import threading
from libra.mgm.rest import APIClient
from libra.mgm.nova import Node
from libra.common.options import Options, setup_logging
@ -63,14 +64,14 @@ class Server(object):
return
if usage['free'] < self.args.nodes:
# we need to build new nodes
nodes_required = self.args.nodes - usage['free']
self.logger.info(
'Building {nodes} nodes'
.format(nodes=self.args.nodes - usage['free'])
.format(nodes=nodes_required)
)
# TODO:
# build nodes
# send to API server
# 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')
else:
@ -84,6 +85,36 @@ class Server(object):
self.check_nodes, ())
self.ct.start()
def build_nodes(self, count, api):
nova = Node(
self.args.nova_user,
self.args.nova_pass,
self.args.nova_tenant,
self.args.nova_auth_url,
self.args.nova_region,
self.args.nova_keyname,
self.args.nova_secgroup,
self.args.haproxy_image,
102
)
while count > 0:
# Do stuff
status, data = nova.build()
if not status:
self.logger.error(data)
return
body = {}
body['name'] = data['name']
addresses = data['addresses']['private']
for address in addresses:
if not address['addr'].startswith('10.'):
break
body['ip'] = address['addr']
self.logger.info('Adding server {name} on {ip}'
.format(name=body['name'], ip=body['ip']))
# TODO: upload to API server
count = count - 1
def exit_handler(self, signum, frame):
signal.signal(signal.SIGINT, signal.SIG_IGN)
signal.signal(signal.SIGTERM, signal.SIG_IGN)

View File

@ -14,6 +14,7 @@
import uuid
import time
import sys
from novaclient import client
@ -42,7 +43,9 @@ class Node(object):
try:
body = self._create(node_id)
except:
return False, 'Error creating node {nid}'.format(nid=node_id)
return False, 'Error creating node {nid} exception {exc}'.format(
nid=node_id, exc=sys.exc_info()[0]
)
server_id = body['server']['id']
# try for 40 * 3 seconds
@ -50,8 +53,9 @@ class Node(object):
while waits > 0:
time.sleep(3)
status = self._status(server_id)
if status == 'ACTIVE':
return True, body
# Should also check if it is not spawning, so errors are detected
if status['status'] == 'ACTIVE':
return True, status
waits = waits - 1
return (False,
@ -91,7 +95,7 @@ class Node(object):
""" used to keep scanning to see if node is up """
url = "/servers/{0}".format(node_id)
resp, body = self.nova.get(url)
return body['server']['status']
return body['server']
def _delete(self, node_id):
""" delete a nova node, return 204 succeed """

View File

@ -44,7 +44,7 @@ class TestLBaaSMgmNova(unittest.TestCase):
with mock.patch('time.time', mock.Mock(return_value=1234)):
resp, data = self.api.build()
self.assertTrue(resp)
self.assertEqual(data['server']['id'], 417773)
self.assertEqual(data['id'], 417773)
def testCreateNodeFail(self):
with mock.patch.object(httplib2.Http, "request", mock_bad_request):