Merge "Apex: fixes missing GS_URL for CSIT"
authorTim Rozet <trozet@redhat.com>
Fri, 10 Feb 2017 15:41:54 +0000 (15:41 +0000)
committerGerrit Code Review <gerrit@opnfv.org>
Fri, 10 Feb 2017 15:41:54 +0000 (15:41 +0000)
22 files changed:
jjb/daisy4nfv/daisy4nfv-merge-jobs.yml
modules/opnfv/deployment/__init__.py [moved from modules/opnfv/installer_adapters/__init__.py with 100% similarity]
modules/opnfv/deployment/apex/__init__.py [moved from modules/opnfv/installer_adapters/apex/__init__.py with 100% similarity]
modules/opnfv/deployment/apex/adapter.py [new file with mode: 0644]
modules/opnfv/deployment/example.py [new file with mode: 0644]
modules/opnfv/deployment/factory.py [new file with mode: 0644]
modules/opnfv/deployment/fuel/__init__.py [moved from modules/opnfv/installer_adapters/compass/__init__.py with 100% similarity]
modules/opnfv/deployment/fuel/adapter.py [new file with mode: 0644]
modules/opnfv/deployment/manager.py [new file with mode: 0644]
modules/opnfv/installer_adapters/InstallerHandler.py [deleted file]
modules/opnfv/installer_adapters/apex/ApexAdapter.py [deleted file]
modules/opnfv/installer_adapters/apex/example.py [deleted file]
modules/opnfv/installer_adapters/compass/CompassAdapter.py [deleted file]
modules/opnfv/installer_adapters/daisy/DaisyAdapter.py [deleted file]
modules/opnfv/installer_adapters/daisy/__init__.py [deleted file]
modules/opnfv/installer_adapters/fuel/FuelAdapter.py [deleted file]
modules/opnfv/installer_adapters/fuel/__init__.py [deleted file]
modules/opnfv/installer_adapters/fuel/example.py [deleted file]
modules/opnfv/installer_adapters/joid/JoidAdapter.py [deleted file]
modules/opnfv/installer_adapters/joid/__init__.py [deleted file]
modules/opnfv/utils/opnfv_logger.py [moved from modules/opnfv/utils/OPNFVLogger.py with 100% similarity]
modules/opnfv/utils/ssh_utils.py [moved from modules/opnfv/utils/SSHUtils.py with 95% similarity]

index 11cdc1b..a6659b2 100644 (file)
     name: 'daisy-merge-build-macro'
     builders:
         - shell:
-            !include-raw-escape: ./daisy4nfv-basic.sh
+            !include-raw: ./daisy4nfv-basic.sh
         - shell:
-            !include-raw-escape: ./daisy4nfv-build.sh
+            !include-raw: ./daisy4nfv-build.sh
         - shell:
-            !include-raw-escape: ./daisy4nfv-upload-artifact.sh
+            !include-raw: ./daisy4nfv-upload-artifact.sh
         - shell:
-            !include-raw-escape: ./daisy4nfv-workspace-cleanup.sh
+            !include-raw: ./daisy4nfv-workspace-cleanup.sh
 
 - builder:
     name: 'daisy-merge-deploy-virtual-macro'
     builders:
         - shell:
-            !include-raw-escape: ./daisy4nfv-download-artifact.sh
+            !include-raw: ./daisy4nfv-download-artifact.sh
         - shell:
-            !include-raw-escape: ./daisy4nfv-virtual-deploy.sh
+            !include-raw: ./daisy4nfv-virtual-deploy.sh
         - shell:
-            !include-raw-escape: ./daisy4nfv-workspace-cleanup.sh
+            !include-raw: ./daisy4nfv-workspace-cleanup.sh
 
 #####################################
 # parameter macros
diff --git a/modules/opnfv/deployment/apex/adapter.py b/modules/opnfv/deployment/apex/adapter.py
new file mode 100644 (file)
index 0000000..1b81e78
--- /dev/null
@@ -0,0 +1,93 @@
+##############################################################################
+# Copyright (c) 2017 Ericsson AB and others.
+# Author: Jose Lausuch (jose.lausuch@ericsson.com)
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+import re
+
+from opnfv.deployment import manager
+from opnfv.utils import opnfv_logger as logger
+from opnfv.utils import ssh_utils
+
+logger = logger.Logger(__name__).getLogger()
+
+
+class ApexAdapter(manager.DeploymentHandler):
+
+    def __init__(self, installer_ip, installer_user, pkey_file):
+        super(ApexAdapter, self).__init__(installer='apex',
+                                          installer_ip=installer_ip,
+                                          installer_user=installer_user,
+                                          installer_pwd=None,
+                                          pkey_file=pkey_file)
+
+    def nodes(self):
+        nodes = []
+        cmd = "source /home/stack/stackrc;nova list 2>/dev/null"
+        output = self.installer_node.run_cmd(cmd)
+        lines = output.rsplit('\n')
+        if len(lines) < 4:
+            logger.info("No nodes found in the deployment.")
+            return None
+
+        for line in lines:
+            if 'controller' in line:
+                roles = "controller"
+            elif 'compute' in line:
+                roles = "compute"
+            else:
+                continue
+            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])
+
+            if status_node == 'ACTIVE':
+                status = manager.Node.STATUS_OK
+                ssh_client = ssh_utils.get_ssh_client(hostname=ip,
+                                                      username='heat-admin',
+                                                      pkey_file=self.pkey_file)
+            else:
+                status = manager.Node.STATUS_INACTIVE
+                ssh_client = None
+
+            node = manager.Node(id, ip, name, status, roles, ssh_client)
+            nodes.append(node)
+
+        return nodes
+
+    def get_openstack_version(self):
+        cmd = 'source overcloudrc;sudo nova-manage version'
+        result = self.installer_node.run_cmd(cmd)
+        return result
+
+    def get_sdn_version(self):
+        cmd_descr = ("sudo yum info opendaylight 2>/dev/null|"
+                     "grep Description|sed 's/^.*\: //'")
+        cmd_ver = ("sudo yum info opendaylight 2>/dev/null|"
+                   "grep Version|sed 's/^.*\: //'")
+        for node in self.nodes:
+            if 'controller' in node.get_attribute('roles'):
+                description = node.run_cmd(cmd_descr)
+                version = node.run_cmd(cmd_ver)
+                break
+
+        if description is None:
+            return None
+        else:
+            return description + ':' + version
+
+    def get_deployment_status(self):
+        cmd = 'source stackrc;openstack stack list|grep CREATE_COMPLETE'
+        result = self.installer_node.run_cmd(cmd)
+        if result is None or len(result) == 0:
+            return 'failed'
+        else:
+            return 'active'
diff --git a/modules/opnfv/deployment/example.py b/modules/opnfv/deployment/example.py
new file mode 100644 (file)
index 0000000..6a76eb9
--- /dev/null
@@ -0,0 +1,21 @@
+# This is an example of usage of this Tool
+# Author: Jose Lausuch (jose.lausuch@ericsson.com)
+
+from opnfv.deployment import factory
+
+handler = factory.Factory.get_handler('apex',
+                                      '192.168.122.135',
+                                      'stack',
+                                      pkey_file='/root/.ssh/id_rsa')
+
+
+installer_node = handler.get_installer_node()
+print("Hello, I am node '%s'" % installer_node.run_cmd('hostname'))
+installer_node.get_file('/home/stack/overcloudrc', './overcloudrc')
+
+nodes = handler.get_nodes()
+for node in nodes:
+    print("Hello, I am node '%s' and my ip is %s." %
+          (node.run_cmd('hostname'), node.ip))
+
+print handler.get_deployment_info()
diff --git a/modules/opnfv/deployment/factory.py b/modules/opnfv/deployment/factory.py
new file mode 100644 (file)
index 0000000..e48a751
--- /dev/null
@@ -0,0 +1,44 @@
+##############################################################################
+# Copyright (c) 2017 Ericsson AB and others.
+# Author: Jose Lausuch (jose.lausuch@ericsson.com)
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+
+from opnfv.deployment.apex import adapter as apex_adapter
+from opnfv.deployment.fuel import adapter as fuel_adapter
+from opnfv.utils import opnfv_logger as logger
+
+logger = logger.Logger(__name__).getLogger()
+
+
+class Factory(object):
+
+    INSTALLERS = ["fuel", "apex", "compass", "joid", "daisy"]
+
+    def __init__(self):
+        pass
+
+    @staticmethod
+    def get_handler(installer,
+                    installer_ip,
+                    installer_user,
+                    installer_pwd=None,
+                    pkey_file=None):
+
+        if installer not in Factory.INSTALLERS:
+            raise Exception("This is not an OPNFV installer.")
+
+        if installer.lower() == "apex":
+            return apex_adapter.ApexAdapter(installer_ip=installer_ip,
+                                            installer_user=installer_user,
+                                            pkey_file=pkey_file)
+        elif installer.lower() == "fuel":
+            return fuel_adapter.FuelAdapter(installer_ip=installer_ip,
+                                            installer_user=installer_user,
+                                            installer_pwd=installer_pwd)
+        else:
+            raise Exception("Installer adapter is not implemented.")
diff --git a/modules/opnfv/deployment/fuel/adapter.py b/modules/opnfv/deployment/fuel/adapter.py
new file mode 100644 (file)
index 0000000..d53966e
--- /dev/null
@@ -0,0 +1,167 @@
+##############################################################################
+# Copyright (c) 2017 Ericsson AB and others.
+# Author: Jose Lausuch (jose.lausuch@ericsson.com)
+#         George Paraskevopoulos (geopar@intracom-telecom.com)
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+
+from opnfv.deployment import manager
+from opnfv.utils import opnfv_logger as logger
+from opnfv.utils import ssh_utils
+
+logger = logger.Logger("FuelAdapter").getLogger()
+
+
+class FuelAdapter(manager.DeploymentHandler):
+
+    def __init__(self, installer_ip, installer_user, installer_pwd):
+        super(FuelAdapter, self).__init__(installer='fuel',
+                                          installer_ip=installer_ip,
+                                          installer_user=installer_user,
+                                          installer_pwd=installer_pwd,
+                                          pkey_file=None)
+
+    def _get_clusters(self):
+        environments = []
+        output = self.runcmd_fuel_env()
+        lines = output.rsplit('\n')
+        if len(lines) < 2:
+            logger.info("No environments found in the deployment.")
+            return None
+        else:
+            fields = lines[0].rsplit(' | ')
+
+            index_id = -1
+            index_status = -1
+            index_name = -1
+            index_release_id = -1
+
+            for i in range(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 "release_id" in fields[i]:
+                    index_release_id = i
+
+            # order env info
+            for i in range(2, len(lines) - 1):
+                fields = lines[i].rsplit(' | ')
+                dict = {"id": fields[index_id].strip(),
+                        "status": fields[index_status].strip(),
+                        "name": fields[index_name].strip(),
+                        "release_id": fields[index_release_id].strip()}
+                environments.append(dict)
+
+        return environments
+
+    def nodes(self, options=None):
+        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)
+                nodes.append(node)
+
+                # TODO: Add support for Fuel cluster selection
+                '''
+                if options and options['cluster']:
+                    if fields[index_cluster].strip() == options['cluster']:
+                '''
+
+        return nodes
+
+    def get_openstack_version(self):
+        cmd = 'source openrc;nova-manage version 2>/dev/null'
+        version = None
+        for node in self.nodes:
+            if 'controller' in node.get_attribute('roles'):
+                version = node.run_cmd(cmd)
+                break
+        return version
+
+    def get_sdn_version(self):
+        cmd = "apt-cache show opendaylight|grep Version|sed 's/^.*\: //'"
+        version = None
+        for node in self.nodes:
+            if 'controller' in node.get_attribute('roles'):
+                odl_version = node.run_cmd(cmd)
+                if odl_version:
+                    version = 'OpenDaylight ' + odl_version
+                break
+        return version
+
+    def get_deployment_status(self):
+        cmd = 'fuel env|grep operational'
+        result = self.installer_node.run_cmd(cmd)
+        if result is None or len(result) == 0:
+            return 'failed'
+        else:
+            return 'active'
diff --git a/modules/opnfv/deployment/manager.py b/modules/opnfv/deployment/manager.py
new file mode 100644 (file)
index 0000000..f0e4429
--- /dev/null
@@ -0,0 +1,299 @@
+##############################################################################
+# Copyright (c) 2017 Ericsson AB and others.
+# Author: Jose Lausuch (jose.lausuch@ericsson.com)
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+from abc import abstractmethod
+import os
+
+
+from opnfv.utils import opnfv_logger as logger
+from opnfv.utils import ssh_utils
+
+logger = logger.Logger(__name__).getLogger()
+
+
+class Deployment(object):
+
+    def __init__(self,
+                 installer,
+                 installer_ip,
+                 scenario,
+                 pod,
+                 status,
+                 openstack_version,
+                 sdn_controller,
+                 nodes=[]):
+
+        self.deployment_info = {
+            'installer': installer,
+            'installer_ip': installer_ip,
+            'scenario': scenario,
+            'pod': pod,
+            'status': status,
+            'openstack_version': openstack_version,
+            'sdn_controller': sdn_controller,
+            'nodes': nodes
+        }
+
+    def _get_openstack_release(self):
+        '''
+        Translates an openstack version into the release name
+        '''
+        os_versions = {
+            '12': 'Liberty',
+            '13': 'Mitaka',
+            '14': 'Newton',
+            '15': 'Ocata',
+            '16': 'Pike',
+            '17': 'Queens'
+        }
+        try:
+            version = self.deployment_info['openstack_version'].split('.')[0]
+            name = os_versions[version]
+            return name
+        except Exception as e:
+            return 'Unknown release'
+
+    def get_dict(self):
+        '''
+        Returns a dictionary will all the attributes
+        '''
+        return self.deployment_info
+
+    def __str__(self):
+        '''
+        Override of the str method
+        '''
+        s = '''
+        INSTALLER:    {installer}
+        SCENARIO:     {scenario}
+        INSTALLER IP: {installer_ip}
+        POD:          {pod}
+        STATUS:       {status}
+        OPENSTACK:    {openstack_version} ({openstack_release})
+        SDN:          {sdn_controller}
+        NODES:
+    '''.format(installer=self.deployment_info['installer'],
+               scenario=self.deployment_info['scenario'],
+               installer_ip=self.deployment_info['installer_ip'],
+               pod=self.deployment_info['pod'],
+               status=self.deployment_info['status'],
+               openstack_version=self.deployment_info[
+            'openstack_version'],
+            openstack_release=self._get_openstack_release(),
+            sdn_controller=self.deployment_info['sdn_controller'])
+
+        for node in self.deployment_info['nodes']:
+            s += '\t\t{node_object}\n'.format(node_object=node)
+
+        return s
+
+
+class Node(object):
+
+    STATUS_OK = 'active'
+    STATUS_INACTIVE = 'inactive'
+    STATUS_OFFLINE = 'offline'
+    STATUS_FAILED = 'failed'
+
+    def __init__(self,
+                 id,
+                 ip,
+                 name,
+                 status,
+                 roles,
+                 ssh_client,
+                 info={}):
+        self.id = id
+        self.ip = ip
+        self.name = name
+        self.status = status
+        self.ssh_client = ssh_client
+        self.roles = roles
+        self.info = info
+
+    def get_file(self, src, dest):
+        '''
+        SCP file from a node
+        '''
+        if self.status is not Node.STATUS_OK:
+            logger.info("The node %s is not active" % self.ip)
+            return 1
+        logger.info("Fetching %s from %s" % (src, self.ip))
+        get_file_result = ssh_utils.get_file(self.ssh_client, src, dest)
+        if get_file_result is None:
+            logger.error("SFTP failed to retrieve the file.")
+        else:
+            logger.info("Successfully copied %s:%s to %s" %
+                        (self.ip, src, dest))
+        return get_file_result
+
+    def put_file(self, src, dest):
+        '''
+        SCP file to a node
+        '''
+        if self.status is not Node.STATUS_OK:
+            logger.info("The node %s is not active" % self.ip)
+            return 1
+        logger.info("Copying %s to %s" % (src, self.ip))
+        put_file_result = ssh_utils.put_file(self.ssh_client, src, dest)
+        if put_file_result is None:
+            logger.error("SFTP failed to retrieve the file.")
+        else:
+            logger.info("Successfully copied %s to %s:%s" %
+                        (src, dest, self.ip))
+        return put_file_result
+
+    def run_cmd(self, cmd):
+        '''
+        Run command remotely on a node
+        '''
+        if self.status is not Node.STATUS_OK:
+            logger.info("The node %s is not active" % self.ip)
+            return 1
+        _, stdout, stderr = (self.ssh_client.exec_command(cmd))
+        error = stderr.readlines()
+        if len(error) > 0:
+            logger.error("error %s" % ''.join(error))
+            return error
+        output = ''.join(stdout.readlines()).rstrip()
+        return output
+
+    def get_dict(self):
+        '''
+        Returns a dictionary with all the attributes
+        '''
+        return {
+            'id': self.id,
+            'ip': self.ip,
+            'name': self.name,
+            'status': self.status,
+            'roles': self.roles,
+            'info': self.info
+        }
+
+    def get_attribute(self, attribute):
+        '''
+        Returns an attribute given the name
+        '''
+        return self.get_dict()[attribute]
+
+    def is_controller(self):
+        '''
+        Returns if the node is a controller
+        '''
+        if 'controller' in self.get_attribute('roles'):
+            return True
+        return False
+
+    def is_compute(self):
+        '''
+        Returns if the node is a compute
+        '''
+        if 'compute' in self.get_attribute('roles'):
+            return True
+        return False
+
+    def __str__(self):
+        return str(self.get_dict())
+
+
+class DeploymentHandler(object):
+
+    EX_OK = os.EX_OK
+    EX_ERROR = os.EX_SOFTWARE
+    FUNCTION_NOT_IMPLEMENTED = "Function not implemented by adapter!"
+
+    def __init__(self,
+                 installer,
+                 installer_ip,
+                 installer_user,
+                 installer_pwd=None,
+                 pkey_file=None):
+
+        self.installer = installer.lower()
+        self.installer_ip = installer_ip
+        self.installer_user = installer_user
+        self.installer_pwd = installer_pwd
+        self.pkey_file = pkey_file
+
+        if pkey_file is not None and not os.path.isfile(pkey_file):
+            raise Exception(
+                'The private key file %s does not exist!' % pkey_file)
+
+        self.installer_connection = ssh_utils.get_ssh_client(
+            hostname=self.installer_ip,
+            username=self.installer_user,
+            password=self.installer_pwd,
+            pkey_file=self.pkey_file)
+
+        if self.installer_connection:
+            self.installer_node = Node(id='',
+                                       ip=installer_ip,
+                                       name=installer,
+                                       status='active',
+                                       ssh_client=self.installer_connection,
+                                       roles='installer node')
+        else:
+            raise Exception(
+                'Cannot establish connection to the installer node!')
+
+        self.nodes = self.nodes()
+
+    @abstractmethod
+    def get_openstack_version(self):
+        '''
+        Returns a string of the openstack version (nova-compute)
+        '''
+        raise Exception(DeploymentHandler.FUNCTION_NOT_IMPLEMENTED)
+
+    @abstractmethod
+    def get_sdn_version(self):
+        '''
+        Returns a string of the sdn controller and its version, if exists
+        '''
+        raise Exception(DeploymentHandler.FUNCTION_NOT_IMPLEMENTED)
+
+    @abstractmethod
+    def get_deployment_status(self):
+        '''
+        Returns a string of the status of the deployment
+        '''
+        raise Exception(DeploymentHandler.FUNCTION_NOT_IMPLEMENTED)
+
+    @abstractmethod
+    def 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
+        '''
+        return self.installer_node
+
+    def get_deployment_info(self):
+        '''
+            Returns an object of type Deployment
+        '''
+        return Deployment(installer=self.installer,
+                          installer_ip=self.installer_ip,
+                          scenario=os.getenv('DEPLOY_SCENARIO', 'Unknown'),
+                          status=self.get_deployment_status(),
+                          pod=os.getenv('NODE_NAME', 'Unknown'),
+                          openstack_version=self.get_openstack_version(),
+                          sdn_controller=self.get_sdn_version(),
+                          nodes=self.nodes)
diff --git a/modules/opnfv/installer_adapters/InstallerHandler.py b/modules/opnfv/installer_adapters/InstallerHandler.py
deleted file mode 100644 (file)
index 6c43a46..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-##############################################################################
-# Copyright (c) 2017 Ericsson AB and others.
-# Author: Jose Lausuch (jose.lausuch@ericsson.com)
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-from opnfv.installer_adapters.fuel.FuelAdapter import FuelAdapter
-from opnfv.installer_adapters.apex.ApexAdapter import ApexAdapter
-from opnfv.installer_adapters.compass.CompassAdapter import CompassAdapter
-from opnfv.installer_adapters.joid.JoidAdapter import JoidAdapter
-from opnfv.installer_adapters.daisy.DaisyAdapter import DaisyAdapter
-
-
-INSTALLERS = ["fuel", "apex", "compass", "joid", "daisy"]
-
-
-class InstallerHandler:
-
-    def __init__(self,
-                 installer,
-                 installer_ip,
-                 installer_user,
-                 installer_pwd=None,
-                 private_key_file=None):
-        self.installer = installer.lower()
-        self.installer_ip = installer_ip
-        self.installer_user = installer_user
-        self.installer_pwd = installer_pwd
-        self.private_key_file = private_key_file
-
-        if self.installer == INSTALLERS[0]:
-            self.InstallerAdapter = FuelAdapter(self.installer_ip,
-                                                self.installer_user,
-                                                self.installer_pwd)
-        elif self.installer == INSTALLERS[1]:
-            self.InstallerAdapter = ApexAdapter(installer_ip=self.installer_ip,
-                                                user=self.installer_user,
-                                                pkey_file=self.private_key_file)
-        elif self.installer == INSTALLERS[2]:
-            self.InstallerAdapter = CompassAdapter(self.installer_ip)
-        elif self.installer == INSTALLERS[3]:
-            self.InstallerAdapter = JoidAdapter(self.installer_ip)
-        elif self.installer == INSTALLERS[4]:
-            self.InstallerAdapter = DaisyAdapter(self.installer_ip)
-        else:
-            print("Installer %s is  not valid. "
-                  "Please use one of the followings: %s"
-                  % (self.installer, INSTALLERS))
-            exit(1)
-
-    def get_deployment_info(self):
-        return self.InstallerAdapter.get_deployment_info()
-
-    def get_nodes(self, options=None):
-        return self.InstallerAdapter.get_nodes(options=options)
-
-    def get_controller_ips(self, options=None):
-        return self.InstallerAdapter.get_controller_ips(options=options)
-
-    def get_compute_ips(self, options=None):
-        return self.InstallerAdapter.get_compute_ips(options=options)
-
-    def get_file_from_installer(self,
-                                remote_path,
-                                local_path,
-                                options=None):
-        return self.InstallerAdapter.get_file_from_installer(remote_path,
-                                                             local_path,
-                                                             options=options)
-
-    def get_file_from_controller(self,
-                                 remote_path,
-                                 local_path,
-                                 ip=None,
-                                 options=None):
-        return self.InstallerAdapter.get_file_from_controller(remote_path,
-                                                              local_path,
-                                                              ip=ip,
-                                                              options=options)
-
-    def get_all(self):
-        pass
diff --git a/modules/opnfv/installer_adapters/apex/ApexAdapter.py b/modules/opnfv/installer_adapters/apex/ApexAdapter.py
deleted file mode 100644 (file)
index 29637d7..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-##############################################################################
-# Copyright (c) 2016 Ericsson AB and others.
-# Author: Jose Lausuch (jose.lausuch@ericsson.com)
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import os
-import re
-
-import opnfv.utils.SSHUtils as ssh_utils
-import opnfv.utils.OPNFVLogger as logger
-
-
-class ApexAdapter:
-
-    def __init__(self, installer_ip, pkey_file, user="stack"):
-        self.installer_ip = installer_ip
-        self.installer_user = user
-        self.pkey_file = pkey_file
-        self.installer_connection = ssh_utils.get_ssh_client(
-            self.installer_ip,
-            self.installer_user,
-            pkey_file=self.pkey_file)
-        self.logger = logger.Logger("ApexHandler").getLogger()
-
-    def runcmd_apex_installer(self, cmd):
-        _, stdout, stderr = (self.installer_connection.exec_command(cmd))
-        error = stderr.readlines()
-        if len(error) > 0:
-            self.logger.error("error %s" % ''.join(error))
-            return error
-        output = ''.join(stdout.readlines())
-        return output
-
-    def get_nodes(self):
-        nodes = []
-        output = self.runcmd_apex_installer(
-            "source /home/stack/stackrc;nova list")
-        lines = output.rsplit('\n')
-        if len(lines) < 4:
-            self.logger.info("No nodes found in the deployment.")
-            return None
-
-        for line in lines:
-            if 'controller' in line:
-                roles = "controller"
-            elif 'compute' in line:
-                roles = "compute"
-            else:
-                continue
-            if 'Daylight' in line:
-                roles = + ", OpenDaylight"
-            fields = line.split('|')
-            dict = {"id": re.sub('[!| ]', '', fields[1]),
-                    "roles": roles,
-                    "name": re.sub('[!| ]', '', fields[2]),
-                    "status": re.sub('[!| ]', '', fields[3]),
-                    "ip": re.sub('[!| ctlplane=]', '', fields[6])}
-            nodes.append(dict)
-
-        return nodes
-
-    def get_deployment_info(self):
-        str = "Deployment details:\n"
-        str += "\tINSTALLER:   Apex\n"
-        str += ("\tSCENARIO:    %s\n" %
-                os.getenv('DEPLOY_SCENARIO', 'Unknown'))
-        sdn = "None"
-
-        nodes = self.get_nodes()
-        if nodes is None:
-            self.logger.info("No nodes found in the deployment.")
-            return
-        num_nodes = len(nodes)
-        num_controllers = 0
-        num_computes = 0
-        for node in nodes:
-            if 'controller' in node['roles']:
-                num_controllers += 1
-            if 'compute' in node['roles']:
-                num_computes += 1
-            if 'Daylight' in node['name']:
-                sdn = 'OpenDaylight'
-
-        ha = str(num_controllers >= 3)
-
-        str += "\tHA:          %s\n" % ha
-        str += "\tNUM.NODES:   %s\n" % num_nodes
-        str += "\tCONTROLLERS: %s\n" % num_controllers
-        str += "\tCOMPUTES:    %s\n" % num_computes
-        str += "\tSDN CONTR.:  %s\n\n" % sdn
-
-        str += "\tNODES:\n"
-        for node in nodes:
-            str += ("\t  ID:     %s\n" % node['id'])
-            str += ("\t  Name:   %s\n" % node['name'])
-            str += ("\t  Roles:  %s\n" % node['roles'])
-            str += ("\t  Status: %s\n" % node['status'])
-            str += ("\t  IP:     %s\n\n" % node['ip'])
-
-        return str
-
-    def get_controller_ips(self, options=None):
-        nodes = self.get_nodes()
-        controllers = []
-        for node in nodes:
-            if "controller" in node["roles"]:
-                controllers.append(node['ip'])
-        return controllers
-
-    def get_compute_ips(self, options=None):
-        nodes = self.get_nodes()
-        computes = []
-        for node in nodes:
-            if "compute" in node["roles"]:
-                computes.append(node['ip'])
-        return computes
-
-    def get_file_from_installer(self, remote_path, local_path, options=None):
-        self.logger.debug("Fetching %s from Undercloud %s" %
-                          (remote_path, self.installer_ip))
-        get_file_result = ssh_utils.get_file(self.installer_connection,
-                                             remote_path,
-                                             local_path)
-        if get_file_result is None:
-            self.logger.error("SFTP failed to retrieve the file.")
-            return 1
-        self.logger.info("%s successfully copied from Undercloud to %s" %
-                         (remote_path, local_path))
-
-    def get_file_from_controller(self,
-                                 remote_path,
-                                 local_path,
-                                 ip=None,
-                                 options=None):
-        if ip is None:
-            controllers = self.get_controller_ips()
-            ip = controllers[0]
-
-        connection = ssh_utils.get_ssh_client(ip,
-                                              'heat-admin',
-                                              pkey_file=self.pkey_file)
-
-        get_file_result = ssh_utils.get_file(connection,
-                                             remote_path,
-                                             local_path)
-        if get_file_result is None:
-            self.logger.error("SFTP failed to retrieve the file.")
-            return 1
-        self.logger.info("%s successfully copied from %s to %s" %
-                         (remote_path, ip, local_path))
diff --git a/modules/opnfv/installer_adapters/apex/example.py b/modules/opnfv/installer_adapters/apex/example.py
deleted file mode 100644 (file)
index c8c4737..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-# This is an example of usage of this Tool
-# Author: Jose Lausuch (jose.lausuch@ericsson.com)
-
-import opnfv.installer_adapters.InstallerHandler as ins_handler
-
-apex_handler = ins_handler.InstallerHandler(installer='apex',
-                                            installer_ip='192.168.122.135',
-                                            installer_user='stack',
-                                            private_key_file='/root/.ssh/id_rsa')
-apex_handler.get_file_from_installer(
-    '/home/stack/overcloudrc', './overcloudrc')
-
-print("\n%s\n" % apex_handler.get_deployment_info())
-
-apex_handler.get_file_from_controller(
-    '/etc/resolv.conf', './resolv.conf')
diff --git a/modules/opnfv/installer_adapters/compass/CompassAdapter.py b/modules/opnfv/installer_adapters/compass/CompassAdapter.py
deleted file mode 100644 (file)
index 47cbc64..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-##############################################################################
-# Copyright (c) 2016 Ericsson AB and others.
-# Author: Jose Lausuch (jose.lausuch@ericsson.com)
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-
-class CompassAdapter:
-
-    def __init__(self, installer_ip):
-        self.installer_ip = installer_ip
-
-    def get_deployment_info(self):
-        pass
-
-    def get_nodes(self):
-        pass
-
-    def get_controller_ips(self):
-        pass
-
-    def get_compute_ips(self):
-        pass
-
-    def get_file_from_installer(self, origin, target, options=None):
-        pass
-
-    def get_file_from_controller(self, origin, target, ip=None, options=None):
-        pass
diff --git a/modules/opnfv/installer_adapters/daisy/DaisyAdapter.py b/modules/opnfv/installer_adapters/daisy/DaisyAdapter.py
deleted file mode 100644 (file)
index 9b06f4c..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-##############################################################################
-# Copyright (c) 2016 Ericsson AB and others.
-# Author: Jose Lausuch (jose.lausuch@ericsson.com)
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-
-class DaisyAdapter:
-
-    def __init__(self, installer_ip):
-        self.installer_ip = installer_ip
-
-    def get_deployment_info(self):
-        pass
-
-    def get_nodes(self):
-        pass
-
-    def get_controller_ips(self):
-        pass
-
-    def get_compute_ips(self):
-        pass
-
-    def get_file_from_installer(self, origin, target, options=None):
-        pass
-
-    def get_file_from_controller(self, origin, target, ip=None, options=None):
-        pass
diff --git a/modules/opnfv/installer_adapters/daisy/__init__.py b/modules/opnfv/installer_adapters/daisy/__init__.py
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/modules/opnfv/installer_adapters/fuel/FuelAdapter.py b/modules/opnfv/installer_adapters/fuel/FuelAdapter.py
deleted file mode 100644 (file)
index 8ed8f89..0000000
+++ /dev/null
@@ -1,236 +0,0 @@
-##############################################################################
-# Copyright (c) 2016 Ericsson AB and others.
-# Author: Jose Lausuch (jose.lausuch@ericsson.com)
-#         George Paraskevopoulos (geopar@intracom-telecom.com)
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-import opnfv.utils.SSHUtils as ssh_utils
-import opnfv.utils.OPNFVLogger as logger
-
-
-class FuelAdapter:
-
-    def __init__(self, installer_ip, user="root", password="r00tme"):
-        self.installer_ip = installer_ip
-        self.installer_user = user
-        self.installer_password = password
-        self.installer_connection = ssh_utils.get_ssh_client(
-            installer_ip,
-            self.installer_user,
-            password=self.installer_password)
-        self.logger = logger.Logger("FuelHandler").getLogger()
-
-    def runcmd_fuel_installer(self, cmd):
-        _, stdout, stderr = (self
-                             .installer_connection
-                             .exec_command(cmd))
-        error = stderr.readlines()
-        if len(error) > 0:
-            self.logger.error("error %s" % ''.join(error))
-            return error
-        output = ''.join(stdout.readlines())
-        return output
-
-    def runcmd_fuel_nodes(self):
-        return self.runcmd_fuel_installer('fuel nodes')
-
-    def runcmd_fuel_env(self):
-        return self.runcmd_fuel_installer('fuel env')
-
-    def get_clusters(self):
-        environments = []
-        output = self.runcmd_fuel_env()
-        lines = output.rsplit('\n')
-        if len(lines) < 2:
-            self.logger.infp("No environments found in the deployment.")
-            return None
-        else:
-            fields = lines[0].rsplit(' | ')
-
-            index_id = -1
-            index_status = -1
-            index_name = -1
-            index_release_id = -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 "release_id" in fields[i]:
-                    index_release_id = i
-
-            # order env info
-            for i in range(2, len(lines) - 1):
-                fields = lines[i].rsplit(' | ')
-                dict = {"id": fields[index_id].strip(),
-                        "status": fields[index_status].strip(),
-                        "name": fields[index_name].strip(),
-                        "release_id": fields[index_release_id].strip()}
-                environments.append(dict)
-
-        return environments
-
-    def get_nodes(self, options=None):
-        nodes = []
-        output = self.runcmd_fuel_nodes()
-        lines = output.rsplit('\n')
-        if len(lines) < 2:
-            self.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(' | ')
-                dict = {"id": fields[index_id].strip(),
-                        "status": fields[index_status].strip(),
-                        "name": fields[index_name].strip(),
-                        "cluster": fields[index_cluster].strip(),
-                        "ip": fields[index_ip].strip(),
-                        "mac": fields[index_mac].strip(),
-                        "roles": fields[index_roles].strip(),
-                        "online": fields[index_online].strip()}
-                if options and options['cluster']:
-                    if fields[index_cluster].strip() == options['cluster']:
-                        nodes.append(dict)
-                else:
-                    nodes.append(dict)
-
-        return nodes
-
-    def get_controller_ips(self, options):
-        nodes = self.get_nodes(options=options)
-        controllers = []
-        for node in nodes:
-            if "controller" in node["roles"]:
-                controllers.append(node['ip'])
-        return controllers
-
-    def get_compute_ips(self, options=None):
-        nodes = self.get_nodes(options=options)
-        computes = []
-        for node in nodes:
-            if "compute" in node["roles"]:
-                computes.append(node['ip'])
-        return computes
-
-    def get_deployment_info(self):
-        str = "Deployment details:\n"
-        str += "\tInstaller:  Fuel\n"
-        str += "\tScenario:   Unknown\n"
-        sdn = "None"
-        clusters = self.get_clusters()
-        str += "\tN.Clusters: %s\n" % len(clusters)
-        for cluster in clusters:
-            cluster_dic = {'cluster': cluster['id']}
-            str += "\tCluster info:\n"
-            str += "\t   ID:          %s\n" % cluster['id']
-            str += "\t   NAME:        %s\n" % cluster['name']
-            str += "\t   STATUS:      %s\n" % cluster['status']
-            nodes = self.get_nodes(options=cluster_dic)
-            num_nodes = len(nodes)
-            for node in nodes:
-                if "opendaylight" in node['roles']:
-                    sdn = "OpenDaylight"
-                elif "onos" in node['roles']:
-                    sdn = "ONOS"
-            num_controllers = len(
-                self.get_controller_ips(options=cluster_dic))
-            num_computes = len(self.get_compute_ips(options=cluster_dic))
-            ha = False
-            if num_controllers > 1:
-                ha = True
-
-            str += "\t   HA:          %s\n" % ha
-            str += "\t   NUM.NODES:   %s\n" % num_nodes
-            str += "\t   CONTROLLERS: %s\n" % num_controllers
-            str += "\t   COMPUTES:    %s\n" % num_computes
-            str += "\t   SDN CONTR.:  %s\n\n" % sdn
-        str += self.runcmd_fuel_nodes()
-        return str
-
-    def get_file_from_installer(self, remote_path, local_path, options=None):
-        self.logger.debug("Fetching %s from %s" %
-                          (remote_path, self.installer_ip))
-        get_file_result = ssh_utils.get_file(self.installer_connection,
-                                             remote_path,
-                                             local_path)
-        if get_file_result is None:
-            self.logger.error("SFTP failed to retrieve the file.")
-            return 1
-        self.logger.info("%s successfully copied from Fuel to %s" %
-                         (remote_path, local_path))
-
-    def get_file_from_controller(self,
-                                 remote_path,
-                                 local_path,
-                                 ip=None,
-                                 user='root',
-                                 options=None):
-        if ip is None:
-            controllers = self.get_controller_ips(options=options)
-            if len(controllers) == 0:
-                self.logger.info("No controllers found in the deployment.")
-                return 1
-            else:
-                target_ip = controllers[0]
-        else:
-            target_ip = ip
-
-        installer_proxy = {
-            'ip': self.installer_ip,
-            'username': self.installer_user,
-            'password': self.installer_password
-        }
-        controller_conn = ssh_utils.get_ssh_client(
-            target_ip,
-            user,
-            proxy=installer_proxy)
-
-        self.logger.debug("Fetching %s from %s" %
-                          (remote_path, target_ip))
-
-        get_file_result = ssh_utils.get_file(controller_conn,
-                                             remote_path,
-                                             local_path)
-        if get_file_result is None:
-            self.logger.error("SFTP failed to retrieve the file.")
-            return 1
-        self.logger.info("%s successfully copied from %s to %s" %
-                         (remote_path, target_ip, local_path))
diff --git a/modules/opnfv/installer_adapters/fuel/__init__.py b/modules/opnfv/installer_adapters/fuel/__init__.py
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/modules/opnfv/installer_adapters/fuel/example.py b/modules/opnfv/installer_adapters/fuel/example.py
deleted file mode 100644 (file)
index 7fea4df..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-# This is an example of usage of this Tool
-# Author: Jose Lausuch (jose.lausuch@ericsson.com)
-
-import opnfv.installer_adapters.InstallerHandler as ins_handler
-
-fuel_handler = ins_handler.InstallerHandler(installer='fuel',
-                                            installer_ip='10.20.0.2',
-                                            installer_user='root',
-                                            installer_pwd='r00tme')
-print("Nodes in cluster 1:\n%s\n" %
-      fuel_handler.get_nodes(options={'cluster': '1'}))
-print("Nodes in cluster 2:\n%s\n" %
-      fuel_handler.get_nodes(options={'cluster': '2'}))
-print("Nodes:\n%s\n" % fuel_handler.get_nodes())
-print("Controller nodes:\n%s\n" % fuel_handler.get_controller_ips())
-print("Compute nodes:\n%s\n" % fuel_handler.get_compute_ips())
-print("\n%s\n" % fuel_handler.get_deployment_info())
-fuel_handler.get_file_from_installer('/root/deploy/dea.yaml', './dea.yaml')
-fuel_handler.get_file_from_controller(
-    '/etc/neutron/neutron.conf', './neutron.conf')
-fuel_handler.get_file_from_controller(
-    '/root/openrc', './openrc')
diff --git a/modules/opnfv/installer_adapters/joid/JoidAdapter.py b/modules/opnfv/installer_adapters/joid/JoidAdapter.py
deleted file mode 100644 (file)
index be8c2eb..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-##############################################################################
-# Copyright (c) 2016 Ericsson AB and others.
-# Author: Jose Lausuch (jose.lausuch@ericsson.com)
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-
-class JoidAdapter:
-
-    def __init__(self, installer_ip):
-        self.installer_ip = installer_ip
-
-    def get_deployment_info(self):
-        pass
-
-    def get_nodes(self):
-        pass
-
-    def get_controller_ips(self):
-        pass
-
-    def get_compute_ips(self):
-        pass
-
-    def get_file_from_installer(self, origin, target, options=None):
-        pass
-
-    def get_file_from_controller(self, origin, target, ip=None, options=None):
-        pass
diff --git a/modules/opnfv/installer_adapters/joid/__init__.py b/modules/opnfv/installer_adapters/joid/__init__.py
deleted file mode 100644 (file)
index e69de29..0000000
similarity index 95%
rename from modules/opnfv/utils/SSHUtils.py
rename to modules/opnfv/utils/ssh_utils.py
index e0a830c..f900455 100644 (file)
@@ -9,11 +9,12 @@
 ##############################################################################
 
 
-import paramiko
-import opnfv.utils.OPNFVLogger as OPNFVLogger
 import os
+import paramiko
+
+from opnfv.utils import opnfv_logger as logger
 
-logger = OPNFVLogger.Logger('SSHUtils').getLogger()
+logger = logger.Logger("SSH utils").getLogger()
 
 
 def get_ssh_client(hostname,
@@ -79,7 +80,6 @@ class ProxyHopClient(paramiko.SSHClient):
     '''
 
     def __init__(self, *args, **kwargs):
-        self.logger = OPNFVLogger.Logger("ProxyHopClient").getLogger()
         self.proxy_ssh = None
         self.proxy_transport = None
         self.proxy_channel = None
@@ -129,4 +129,4 @@ class ProxyHopClient(paramiko.SSHClient):
                                                 sock=self.proxy_channel)
             os.remove(self.local_ssh_key)
         except Exception, e:
-            self.logger.error(e)
+            logger.error(e)