Pool manager now creates Nova nodes
Change-Id: Ifff48d96aad014f6fb11bc27ad38b54944d862ac
This commit is contained in:
parent
8e9970ac07
commit
87f26a39b0
@ -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)
|
||||
|
@ -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 """
|
||||
|
@ -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):
|
||||
|
Loading…
x
Reference in New Issue
Block a user