Merge "Initial add of VES job file"
[releng.git] / modules / opnfv / deployment / manager.py
index 9be5166..e1fd949 100644 (file)
@@ -27,7 +27,7 @@ class Deployment(object):
                  status,
                  openstack_version,
                  sdn_controller,
-                 nodes=[]):
+                 nodes=None):
 
         self.deployment_info = {
             'installer': installer,
@@ -89,7 +89,7 @@ class Deployment(object):
             sdn_controller=self.deployment_info['sdn_controller'])
 
         for node in self.deployment_info['nodes']:
-            s += '\t\t{node_object}\n'.format(node_object=node)
+            s += '{node_object}\n'.format(node_object=node)
 
         return s
 
@@ -116,9 +116,9 @@ class Node(object):
                  ip,
                  name,
                  status,
-                 roles=[],
+                 roles=None,
                  ssh_client=None,
-                 info={}):
+                 info=None):
         self.id = id
         self.ip = ip
         self.name = name
@@ -127,6 +127,16 @@ class Node(object):
         self.roles = roles
         self.info = info
 
+        self.cpu_info = 'unknown'
+        self.memory = 'unknown'
+        self.ovs = 'unknown'
+
+        if ssh_client:
+            sys_info = self.get_system_info()
+            self.cpu_info = sys_info['cpu_info']
+            self.memory = sys_info['memory']
+            self.ovs = self.get_ovs_info()
+
     def get_file(self, src, dest):
         '''
         SCP file from a node
@@ -164,8 +174,8 @@ class Node(object):
         Run command remotely on a node
         '''
         if self.status is not NodeStatus.STATUS_OK:
-            logger.info("The node %s is not active" % self.ip)
-            return 1
+            logger.error("The node %s is not active" % self.ip)
+            return None
         _, stdout, stderr = (self.ssh_client.exec_command(cmd))
         error = stderr.readlines()
         if len(error) > 0:
@@ -184,15 +194,12 @@ class Node(object):
             'name': self.name,
             'status': self.status,
             'roles': self.roles,
+            'cpu_info': self.cpu_info,
+            'memory': self.memory,
+            'ovs': self.ovs,
             '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
@@ -209,8 +216,57 @@ class Node(object):
             return True
         return False
 
+    def get_ovs_info(self):
+        '''
+        Returns the ovs version installed
+        '''
+        cmd = "ovs-vsctl --version|head -1| sed 's/^.*) //'"
+        return self.run_cmd(cmd)
+
+    def get_system_info(self):
+        '''
+        Returns the ovs version installed
+        '''
+        cmd = 'grep MemTotal /proc/meminfo'
+        memory = self.run_cmd(cmd).partition('MemTotal:')[-1].strip().encode()
+
+        cpu_info = {}
+        cmd = 'lscpu'
+        result = self.run_cmd(cmd)
+        for line in result.splitlines():
+            if line.startswith('CPU(s)'):
+                cpu_info['num_cpus'] = line.split(' ')[-1].encode()
+            elif line.startswith('Thread(s) per core'):
+                cpu_info['threads/core'] = line.split(' ')[-1].encode()
+            elif line.startswith('Core(s) per socket'):
+                cpu_info['cores/socket'] = line.split(' ')[-1].encode()
+            elif line.startswith('Model name'):
+                cpu_info['model'] = line.partition(
+                    'Model name:')[-1].strip().encode()
+            elif line.startswith('Architecture'):
+                cpu_info['arch'] = line.split(' ')[-1].encode()
+
+        return {'memory': memory, 'cpu_info': cpu_info}
+
     def __str__(self):
-        return str(self.get_dict())
+        return '''
+            name:    {name}
+            id:      {id}
+            ip:      {ip}
+            status:  {status}
+            roles:   {roles}
+            cpu:     {cpu_info}
+            memory:  {memory}
+            ovs:     {ovs}
+            info:    {info}'''.format(name=self.name,
+                                      id=self.id,
+                                      ip=self.ip,
+                                      status=self.status,
+                                      roles=self.roles,
+                                      cpu_info=self.cpu_info,
+                                      memory=self.memory,
+                                      ovs=self.ovs,
+                                      info=self.info)
 
 
 class DeploymentHandler(object):