From 2f0c4e1baa6a45dc451142f1372c48e69a5d1565 Mon Sep 17 00:00:00 2001 From: "jose.lausuch" Date: Wed, 8 Feb 2017 14:25:34 +0100 Subject: [deployment handler] Add support for Clusters in Fuel Fix minor apex issues. Output of example.py http://pastebin.com/raw/x70Uj85V Change-Id: I6013f5c4d916126f79afd40a6d6a35278c8ed26f Signed-off-by: jose.lausuch --- opnfv/deployment/apex/adapter.py | 14 ++-- opnfv/deployment/example.py | 15 ++++ opnfv/deployment/fuel/adapter.py | 158 ++++++++++++++++++++++----------------- opnfv/deployment/manager.py | 12 +-- 4 files changed, 113 insertions(+), 86 deletions(-) diff --git a/opnfv/deployment/apex/adapter.py b/opnfv/deployment/apex/adapter.py index 1b81e78..cb827d8 100644 --- a/opnfv/deployment/apex/adapter.py +++ b/opnfv/deployment/apex/adapter.py @@ -25,9 +25,9 @@ class ApexAdapter(manager.DeploymentHandler): installer_pwd=None, pkey_file=pkey_file) - def nodes(self): + def get_nodes(self): nodes = [] - cmd = "source /home/stack/stackrc;nova list 2>/dev/null" + cmd = "source /home/stack/stackrc;openstack server list" output = self.installer_node.run_cmd(cmd) lines = output.rsplit('\n') if len(lines) < 4: @@ -44,12 +44,12 @@ class ApexAdapter(manager.DeploymentHandler): if 'Daylight' in line: roles += ", OpenDaylight" fields = line.split('|') - id = re.sub('[!| ]', '', fields[1]) - name = re.sub('[!| ]', '', fields[2]) - status_node = re.sub('[!| ]', '', fields[3]) - ip = re.sub('[!| ctlplane=]', '', fields[6]) + id = re.sub('[!| ]', '', fields[1]).encode() + name = re.sub('[!| ]', '', fields[2]).encode() + status_node = re.sub('[!| ]', '', fields[3]).encode() + ip = re.sub('[!| ctlplane=]', '', fields[4]).encode() - if status_node == 'ACTIVE': + if status_node.lower() == 'active': status = manager.Node.STATUS_OK ssh_client = ssh_utils.get_ssh_client(hostname=ip, username='heat-admin', diff --git a/opnfv/deployment/example.py b/opnfv/deployment/example.py index f456832..3999a11 100644 --- a/opnfv/deployment/example.py +++ b/opnfv/deployment/example.py @@ -3,6 +3,7 @@ from opnfv.deployment import factory +print("########## APEX ##########") handler = factory.Factory.get_handler('apex', '192.168.122.135', 'stack', @@ -19,3 +20,17 @@ for node in nodes: (node.run_cmd('hostname'), node.ip)) print(handler.get_deployment_info()) + + +print("########## FUEL ##########") +handler = factory.Factory.get_handler('fuel', + '10.20.0.2', + 'root', + installer_pwd='r00tme') + +print(handler.get_deployment_info()) + +print("List of nodes in cluster 4:") +nodes = handler.get_nodes({'cluster': '4'}) +for node in nodes: + print(node) diff --git a/opnfv/deployment/fuel/adapter.py b/opnfv/deployment/fuel/adapter.py index d53966e..3e6ef50 100644 --- a/opnfv/deployment/fuel/adapter.py +++ b/opnfv/deployment/fuel/adapter.py @@ -13,7 +13,7 @@ from opnfv.deployment import manager from opnfv.utils import opnfv_logger as logger from opnfv.utils import ssh_utils -logger = logger.Logger("FuelAdapter").getLogger() +logger = logger.Logger(__name__).getLogger() class FuelAdapter(manager.DeploymentHandler): @@ -40,7 +40,7 @@ class FuelAdapter(manager.DeploymentHandler): index_name = -1 index_release_id = -1 - for i in range(len(fields) - 1): + for i in range(len(fields)): if "id" in fields[i]: index_id = i elif "status" in fields[i]: @@ -51,7 +51,7 @@ class FuelAdapter(manager.DeploymentHandler): index_release_id = i # order env info - for i in range(2, len(lines) - 1): + for i in range(2, len(lines)): fields = lines[i].rsplit(' | ') dict = {"id": fields[index_id].strip(), "status": fields[index_status].strip(), @@ -61,81 +61,99 @@ class FuelAdapter(manager.DeploymentHandler): return environments - def nodes(self, options=None): + def get_nodes(self, options=None): + + if options and options['cluster'] and len(self.nodes) > 0: + n = [] + for node in self.nodes: + if node.info['cluster'] == options['cluster']: + n.append(node) + return n + + try: + # if we have retrieved previously all the nodes, don't do it again + # This fails the first time when the constructor calls this method + # therefore the try/except + if len(self.nodes) > 0: + return self.nodes + except: + pass + nodes = [] cmd = 'fuel node' output = self.installer_node.run_cmd(cmd) lines = output.rsplit('\n') if len(lines) < 2: logger.info("No nodes found in the deployment.") - return None - else: - # get fields indexes - fields = lines[0].rsplit(' | ') - - index_id = -1 - index_status = -1 - index_name = -1 - index_cluster = -1 - index_ip = -1 - index_mac = -1 - index_roles = -1 - index_online = -1 - - for i in range(0, len(fields) - 1): - if "id" in fields[i]: - index_id = i - elif "status" in fields[i]: - index_status = i - elif "name" in fields[i]: - index_name = i - elif "cluster" in fields[i]: - index_cluster = i - elif "ip" in fields[i]: - index_ip = i - elif "mac" in fields[i]: - index_mac = i - elif "roles " in fields[i]: - index_roles = i - elif "online" in fields[i]: - index_online = i - - # order nodes info - for i in range(2, len(lines) - 1): - fields = lines[i].rsplit(' | ') - - id = fields[index_id].strip(), - ip = fields[index_ip].strip() - status_node = fields[index_status].strip() - name = fields[index_name].strip() - roles = fields[index_roles].strip() - - dict = {"cluster": fields[index_cluster].strip(), - "mac": fields[index_mac].strip(), - "online": fields[index_online].strip()} - - if status_node == 'ready': - status = manager.Node.STATUS_OK - proxy = {'ip': self.installer_ip, - 'username': self.installer_user, - 'password': self.installer_pwd} - ssh_client = ssh_utils.get_ssh_client(hostname=ip, - username='root', - proxy=proxy) - else: - status = manager.Node.STATUS_INACTIVE - ssh_client = None - - node = manager.Node( - id, ip, name, status, roles, ssh_client, dict) + return nodes + + # get fields indexes + fields = lines[0].rsplit(' | ') + + index_id = -1 + index_status = -1 + index_name = -1 + index_cluster = -1 + index_ip = -1 + index_mac = -1 + index_roles = -1 + index_online = -1 + + for i in range(len(fields)): + if "group_id" in fields[i]: + break + elif "id" in fields[i]: + index_id = i + elif "status" in fields[i]: + index_status = i + elif "name" in fields[i]: + index_name = i + elif "cluster" in fields[i]: + index_cluster = i + elif "ip" in fields[i]: + index_ip = i + elif "mac" in fields[i]: + index_mac = i + elif "roles " in fields[i]: + index_roles = i + elif "online" in fields[i]: + index_online = i + + # order nodes info + for i in range(2, len(lines)): + fields = lines[i].rsplit(' | ') + id = fields[index_id].strip().encode() + ip = fields[index_ip].strip().encode() + status_node = fields[index_status].strip().encode() + name = fields[index_name].strip().encode() + roles = fields[index_roles].strip().encode() + + dict = {"cluster": fields[index_cluster].strip().encode(), + "mac": fields[index_mac].strip().encode(), + "status_node": status_node, + "online": fields[index_online].strip().encode()} + + if status_node == 'ready': + status = manager.Node.STATUS_OK + proxy = {'ip': self.installer_ip, + 'username': self.installer_user, + 'password': self.installer_pwd} + ssh_client = ssh_utils.get_ssh_client(hostname=ip, + username='root', + proxy=proxy) + else: + status = manager.Node.STATUS_INACTIVE + ssh_client = None + + node = manager.Node( + id, ip, name, status, roles, ssh_client, dict) + if options and options['cluster']: + if fields[index_cluster].strip() == options['cluster']: + nodes.append(node) + else: nodes.append(node) - # TODO: Add support for Fuel cluster selection - ''' - if options and options['cluster']: - if fields[index_cluster].strip() == options['cluster']: - ''' - + self.get_nodes_called = True return nodes def get_openstack_version(self): diff --git a/opnfv/deployment/manager.py b/opnfv/deployment/manager.py index 9f77ff0..8c9599b 100644 --- a/opnfv/deployment/manager.py +++ b/opnfv/deployment/manager.py @@ -243,7 +243,7 @@ class DeploymentHandler(object): raise Exception( 'Cannot establish connection to the installer node!') - self.nodes = self.nodes() + self.nodes = self.get_nodes() @abstractmethod def get_openstack_version(self): @@ -267,18 +267,12 @@ class DeploymentHandler(object): raise Exception(DeploymentHandler.FUNCTION_NOT_IMPLEMENTED) @abstractmethod - def nodes(self, options=None): + def get_nodes(self, options=None): ''' Generates a list of all the nodes in the deployment ''' raise Exception(DeploymentHandler.FUNCTION_NOT_IMPLEMENTED) - def get_nodes(self, options=None): - ''' - Returns the list of Node objects - ''' - return self.nodes - def get_installer_node(self): ''' Returns the installer node object @@ -296,4 +290,4 @@ class DeploymentHandler(object): pod=os.getenv('NODE_NAME', 'Unknown'), openstack_version=self.get_openstack_version(), sdn_controller=self.get_sdn_version(), - nodes=self.nodes) + nodes=self.get_nodes()) -- cgit 1.2.3-korg