Make number of cpus configurable in dha file 59/10959/10
authorNikolas Hermanns <nikolas.hermanns@ericsson.com>
Fri, 4 Mar 2016 09:01:22 +0000 (10:01 +0100)
committerSzilard Cserey <szilard.cserey@gmail.com>
Wed, 9 Mar 2016 17:44:10 +0000 (17:44 +0000)
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
deploy/config/labs/devel-pipeline/elx/fuel/config/dha.yaml
deploy/dea.py
deploy/dha_adapters/hardware_adapter.py
deploy/environments/execution_environment.py
deploy/environments/libvirt_environment.py
deploy/environments/virtual_fuel.py

index 3d3017e..07d5d57 100644 (file)
@@ -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):
index e70d8ca..8515098 100644 (file)
@@ -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
index b5b63f7..1ac048e 100644 (file)
@@ -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']:
index 2cd5ab8..55bb400 100644 (file)
@@ -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)
index 38e5bcd..c2e7a0b 100644 (file)
@@ -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)
index 2a09117..380262c 100644 (file)
@@ -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):
index 0e7f273..6208218 100644 (file)
@@ -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):