[deployment handler] Add Roles and Status classes 49/28449/5
authorjose.lausuch <jose.lausuch@ericsson.com>
Fri, 10 Feb 2017 16:10:18 +0000 (17:10 +0100)
committerjose.lausuch <jose.lausuch@ericsson.com>
Tue, 14 Feb 2017 20:06:22 +0000 (21:06 +0100)
By doing this, we can handle roles and status as a
list in the node object.

Output: http://pastebin.com/raw/PAMrWRJi

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

index cb827d8..225e174 100644 (file)
@@ -35,28 +35,34 @@ class ApexAdapter(manager.DeploymentHandler):
             return None
 
         for line in lines:
-            if 'controller' in line:
-                roles = "controller"
-            elif 'compute' in line:
-                roles = "compute"
-            else:
+            roles = []
+            if any(x in line for x in ['-----', 'Networks']):
                 continue
-            if 'Daylight' in line:
-                roles += ", OpenDaylight"
+            if 'controller' in line:
+                roles.append(manager.Role.CONTROLLER)
+            if 'compute' in line:
+                roles.append(manager.Role.COMPUTE)
+            if 'opendaylight' in line.lower():
+                roles.append(manager.Role.ODL)
+
             fields = line.split('|')
             id = re.sub('[!| ]', '', fields[1]).encode()
             name = re.sub('[!| ]', '', fields[2]).encode()
-            status_node = re.sub('[!| ]', '', fields[3]).encode()
+            status_node = re.sub('[!| ]', '', fields[3]).encode().lower()
             ip = re.sub('[!| ctlplane=]', '', fields[4]).encode()
 
-            if status_node.lower() == 'active':
-                status = manager.Node.STATUS_OK
+            ssh_client = None
+            if 'active' in status_node:
+                status = manager.NodeStatus.STATUS_OK
                 ssh_client = ssh_utils.get_ssh_client(hostname=ip,
                                                       username='heat-admin',
                                                       pkey_file=self.pkey_file)
+            elif 'error' in status_node:
+                status = manager.NodeStatus.STATUS_ERROR
+            elif 'off' in status_node:
+                status = manager.NodeStatus.STATUS_OFFLINE
             else:
-                status = manager.Node.STATUS_INACTIVE
-                ssh_client = None
+                status = manager.NodeStatus.STATUS_INACTIVE
 
             node = manager.Node(id, ip, name, status, roles, ssh_client)
             nodes.append(node)
@@ -73,8 +79,9 @@ class ApexAdapter(manager.DeploymentHandler):
                      "grep Description|sed 's/^.*\: //'")
         cmd_ver = ("sudo yum info opendaylight 2>/dev/null|"
                    "grep Version|sed 's/^.*\: //'")
+        description = None
         for node in self.nodes:
-            if 'controller' in node.get_attribute('roles'):
+            if node.is_controller():
                 description = node.run_cmd(cmd_descr)
                 version = node.run_cmd(cmd_ver)
                 break
index 3e6ef50..9e22ba8 100644 (file)
@@ -124,26 +124,36 @@ class FuelAdapter(manager.DeploymentHandler):
             fields = lines[i].rsplit(' | ')
             id = fields[index_id].strip().encode()
             ip = fields[index_ip].strip().encode()
-            status_node = fields[index_status].strip().encode()
+            status_node = fields[index_status].strip().encode().lower()
             name = fields[index_name].strip().encode()
-            roles = fields[index_roles].strip().encode()
+            roles_all = fields[index_roles].strip().encode().lower()
+
+            roles = [x for x in [manager.Role.CONTROLLER,
+                                 manager.Role.COMPUTE,
+                                 manager.Role.ODL] if x in roles_all]
 
             dict = {"cluster": fields[index_cluster].strip().encode(),
                     "mac": fields[index_mac].strip().encode(),
                     "status_node": status_node,
                     "online": fields[index_online].strip().encode()}
 
+            ssh_client = None
             if status_node == 'ready':
-                status = manager.Node.STATUS_OK
+                status = manager.NodeStatus.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)
+            elif 'error' in status_node:
+                status = manager.NodeStatus.STATUS_ERROR
+            elif 'off' in status_node:
+                status = manager.NodeStatus.STATUS_OFFLINE
+            elif 'discover' in status_node:
+                status = manager.NodeStatus.STATUS_UNUSED
             else:
-                status = manager.Node.STATUS_INACTIVE
-                ssh_client = None
+                status = manager.NodeStatus.STATUS_INACTIVE
 
             node = manager.Node(
                 id, ip, name, status, roles, ssh_client, dict)
@@ -160,7 +170,7 @@ class FuelAdapter(manager.DeploymentHandler):
         cmd = 'source openrc;nova-manage version 2>/dev/null'
         version = None
         for node in self.nodes:
-            if 'controller' in node.get_attribute('roles'):
+            if node.is_controller():
                 version = node.run_cmd(cmd)
                 break
         return version
@@ -169,7 +179,7 @@ class FuelAdapter(manager.DeploymentHandler):
         cmd = "apt-cache show opendaylight|grep Version|sed 's/^.*\: //'"
         version = None
         for node in self.nodes:
-            if 'controller' in node.get_attribute('roles'):
+            if node.is_controller():
                 odl_version = node.run_cmd(cmd)
                 if odl_version:
                     version = 'OpenDaylight ' + odl_version
index 8c9599b..9be5166 100644 (file)
@@ -94,20 +94,30 @@ class Deployment(object):
         return s
 
 
-class Node(object):
+class Role():
+    CONTROLLER = 'controller'
+    COMPUTE = 'compute'
+    ODL = 'opendaylight'
+    ONOS = 'onos'
+
 
+class NodeStatus():
     STATUS_OK = 'active'
     STATUS_INACTIVE = 'inactive'
     STATUS_OFFLINE = 'offline'
-    STATUS_FAILED = 'failed'
+    STATUS_ERROR = 'error'
+    STATUS_UNUSED = 'unused'
+
+
+class Node(object):
 
     def __init__(self,
                  id,
                  ip,
                  name,
                  status,
-                 roles,
-                 ssh_client,
+                 roles=[],
+                 ssh_client=None,
                  info={}):
         self.id = id
         self.ip = ip
@@ -121,7 +131,7 @@ class Node(object):
         '''
         SCP file from a node
         '''
-        if self.status is not Node.STATUS_OK:
+        if self.status is not NodeStatus.STATUS_OK:
             logger.info("The node %s is not active" % self.ip)
             return 1
         logger.info("Fetching %s from %s" % (src, self.ip))
@@ -137,7 +147,7 @@ class Node(object):
         '''
         SCP file to a node
         '''
-        if self.status is not Node.STATUS_OK:
+        if self.status is not NodeStatus.STATUS_OK:
             logger.info("The node %s is not active" % self.ip)
             return 1
         logger.info("Copying %s to %s" % (src, self.ip))
@@ -153,7 +163,7 @@ class Node(object):
         '''
         Run command remotely on a node
         '''
-        if self.status is not Node.STATUS_OK:
+        if self.status is not NodeStatus.STATUS_OK:
             logger.info("The node %s is not active" % self.ip)
             return 1
         _, stdout, stderr = (self.ssh_client.exec_command(cmd))
@@ -187,7 +197,7 @@ class Node(object):
         '''
         Returns if the node is a controller
         '''
-        if 'controller' in self.get_attribute('roles'):
+        if 'controller' in self.roles:
             return True
         return False
 
@@ -195,7 +205,7 @@ class Node(object):
         '''
         Returns if the node is a compute
         '''
-        if 'compute' in self.get_attribute('roles'):
+        if 'compute' in self.roles:
             return True
         return False
 
@@ -236,7 +246,7 @@ class DeploymentHandler(object):
             self.installer_node = Node(id='',
                                        ip=installer_ip,
                                        name=installer,
-                                       status='active',
+                                       status=NodeStatus.STATUS_OK,
                                        ssh_client=self.installer_connection,
                                        roles='installer node')
         else: