From 1ef2a5abcdacf3274e4ed17c612835ae10cb34d8 Mon Sep 17 00:00:00 2001
From: Nikolas Hermanns <nikolas.hermanns@ericsson.com>
Date: Fri, 4 Mar 2016 10:01:22 +0100
Subject: Make number of cpus configurable in dha file

Some compones of openstack produce a lot of CPU load.
With this commit it is possible to
make more use of the Hypervisor where the virtual
nodes runs on.

Change-Id: Ide567dd0823c5526171c29073f2a36aa5f27d4b6
---
 deploy/cloud/deploy.py                                     |  4 ++--
 deploy/config/labs/devel-pipeline/elx/fuel/config/dha.yaml |  5 +++++
 deploy/dea.py                                              |  8 +++++++-
 deploy/dha_adapters/hardware_adapter.py                    |  5 +++++
 deploy/environments/execution_environment.py               |  8 ++++++--
 deploy/environments/libvirt_environment.py                 | 12 +++++-------
 deploy/environments/virtual_fuel.py                        |  3 ++-
 7 files changed, 32 insertions(+), 13 deletions(-)

(limited to 'deploy')

diff --git a/deploy/cloud/deploy.py b/deploy/cloud/deploy.py
index 3d3017e42..07d5d578f 100644
--- a/deploy/cloud/deploy.py
+++ b/deploy/cloud/deploy.py
@@ -43,8 +43,8 @@ class Deploy(object):
     def assign_roles_to_cluster_node_ids(self):
         self.node_roles_dict = {}
         for blade, node in self.blade_node_dict.iteritems():
-            if self.dea.get_node_role(blade):
-                roles = commafy(self.dea.get_node_role(blade))
+            if self.dea.get_node_roles(blade):
+                roles = commafy(self.dea.get_node_roles(blade))
                 self.node_roles_dict[node] = (roles, blade)
 
     def configure_environment(self):
diff --git a/deploy/config/labs/devel-pipeline/elx/fuel/config/dha.yaml b/deploy/config/labs/devel-pipeline/elx/fuel/config/dha.yaml
index e70d8ca82..851509871 100644
--- a/deploy/config/labs/devel-pipeline/elx/fuel/config/dha.yaml
+++ b/deploy/config/labs/devel-pipeline/elx/fuel/config/dha.yaml
@@ -36,3 +36,8 @@ disks:
   fuel: 100G
   controller: 100G
   compute: 100G
+
+number_cpus:
+  # Entry is not mandatory! If it is left empty
+  # the default is 2 cpus per node
+  controller: 2
diff --git a/deploy/dea.py b/deploy/dea.py
index b5b63f7cc..1ac048e06 100644
--- a/deploy/dea.py
+++ b/deploy/dea.py
@@ -65,9 +65,15 @@ class DeploymentEnvironmentAdapter(object):
             if node['id'] == node_id and property_name in node:
                 return node[property_name]
 
-    def get_node_role(self, node_id):
+    def get_node_roles(self, node_id):
         return self.get_node_property(node_id, 'role')
 
+    def get_node_main_role(self, node_id, fuel_node_id):
+        if node_id == fuel_node_id:
+            return 'fuel'
+        roles = self.get_node_roles(node_id)
+        return 'controller' if 'controller' in roles else 'compute'
+
     def get_node_ids(self):
         node_ids = []
         for node in self.dea_struct['nodes']:
diff --git a/deploy/dha_adapters/hardware_adapter.py b/deploy/dha_adapters/hardware_adapter.py
index 2cd5ab842..55bb4002e 100644
--- a/deploy/dha_adapters/hardware_adapter.py
+++ b/deploy/dha_adapters/hardware_adapter.py
@@ -58,3 +58,8 @@ class HardwareAdapter(object):
 
     def get_disks(self):
         return self.dha_struct['disks']
+
+    def get_number_cpus(self, role):
+        role_cpus_dict = self.dha_struct.get('number_cpus')
+        if role_cpus_dict:
+            return role_cpus_dict.get(role)
diff --git a/deploy/environments/execution_environment.py b/deploy/environments/execution_environment.py
index 38e5bcdf7..c2e7a0b23 100644
--- a/deploy/environments/execution_environment.py
+++ b/deploy/environments/execution_environment.py
@@ -50,7 +50,7 @@ class ExecutionEnvironment(object):
         for file in disk_files:
             delete(file)
 
-    def define_vm(self, vm_name, temp_vm_file, disk_path):
+    def define_vm(self, vm_name, temp_vm_file, disk_path, number_cpus):
         log('Creating VM %s with disks %s' % (vm_name, disk_path))
         with open(temp_vm_file) as f:
             vm_xml = etree.parse(f)
@@ -60,10 +60,14 @@ class ExecutionEnvironment(object):
         uuids = vm_xml.xpath('/domain/uuid')
         for uuid in uuids:
             uuid.getparent().remove(uuid)
+        if number_cpus:
+            vcpus = vm_xml.xpath('/domain/vcpu')
+            for vcpu in vcpus:
+                vcpu.text = str(number_cpus)
         disks = vm_xml.xpath('/domain/devices/disk')
         for disk in disks:
             if (disk.get('type') == 'file' and
-                disk.get('device') == 'disk'):
+                    disk.get('device') == 'disk'):
                 sources = disk.xpath('source')
                 for source in sources:
                     disk.remove(source)
diff --git a/deploy/environments/libvirt_environment.py b/deploy/environments/libvirt_environment.py
index 2a09117bc..380262c7e 100644
--- a/deploy/environments/libvirt_environment.py
+++ b/deploy/environments/libvirt_environment.py
@@ -34,12 +34,8 @@ class LibvirtEnvironment(ExecutionEnvironment):
         self.net_names = self.collect_net_names()
 
     def create_storage(self, node_id, disk_path, disk_sizes):
-        if node_id == self.fuel_node_id:
-            disk_size = disk_sizes['fuel']
-        else:
-            roles = self.dea.get_node_role(node_id)
-            role = 'controller' if 'controller' in roles else 'compute'
-            disk_size = disk_sizes[role]
+        role = self.dea.get_node_main_role(node_id, self.fuel_node_id)
+        disk_size = disk_sizes[role]
         exec_cmd('qemu-img create -f qcow2 %s %s' % (disk_path, disk_size))
 
     def create_vms(self):
@@ -53,9 +49,11 @@ class LibvirtEnvironment(ExecutionEnvironment):
             check_file_exists(vm_template)
             disk_path = '%s/%s.raw' % (self.storage_dir, vm_name)
             self.create_storage(node_id, disk_path, disk_sizes)
+            number_cpus = self.dha.get_number_cpus(
+                self.dea.get_node_main_role(node_id, self.fuel_node_id))
             temp_vm_file = '%s/%s' % (temp_dir, vm_name)
             exec_cmd('cp %s %s' % (vm_template, temp_vm_file))
-            self.define_vm(vm_name, temp_vm_file, disk_path)
+            self.define_vm(vm_name, temp_vm_file, disk_path, number_cpus)
         delete(temp_dir)
 
     def start_vms(self):
diff --git a/deploy/environments/virtual_fuel.py b/deploy/environments/virtual_fuel.py
index 0e7f27365..62082185f 100644
--- a/deploy/environments/virtual_fuel.py
+++ b/deploy/environments/virtual_fuel.py
@@ -55,11 +55,12 @@ class VirtualFuel(ExecutionEnvironment):
         disk_path = '%s/%s.raw' % (self.storage_dir, vm_name)
         disk_sizes = self.dha.get_disks()
         disk_size = disk_sizes['fuel']
+        number_cpus = self.dha.get_number_cpus('fuel')
         exec_cmd('qemu-img create -f qcow2 %s %s' % (disk_path, disk_size))
         temp_vm_file = '%s/%s' % (temp_dir, vm_name)
         exec_cmd('cp %s %s' % (vm_template, temp_vm_file))
         self.set_vm_nic(temp_vm_file)
-        self.define_vm(vm_name, temp_vm_file, disk_path)
+        self.define_vm(vm_name, temp_vm_file, disk_path, number_cpus)
         delete(temp_dir)
 
     def setup_environment(self):
-- 
cgit