[deployment handler] Add support for Clusters in Fuel 81/28281/8
authorjose.lausuch <jose.lausuch@ericsson.com>
Wed, 8 Feb 2017 13:25:34 +0000 (14:25 +0100)
committerJose Lausuch <jose.lausuch@ericsson.com>
Tue, 14 Feb 2017 17:48:07 +0000 (17:48 +0000)
Fix minor apex issues.

Output of example.py
http://pastebin.com/raw/x70Uj85V

Change-Id: I6013f5c4d916126f79afd40a6d6a35278c8ed26f
Signed-off-by: jose.lausuch <jose.lausuch@ericsson.com>
modules/opnfv/deployment/apex/adapter.py
modules/opnfv/deployment/example.py
modules/opnfv/deployment/fuel/adapter.py
modules/opnfv/deployment/manager.py

index 1b81e78..cb827d8 100644 (file)
@@ -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',
index f456832..3999a11 100644 (file)
@@ -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)
index d53966e..3e6ef50 100644 (file)
@@ -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):
index 9f77ff0..8c9599b 100644 (file)
@@ -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())