From 1700603b0dd257cd934e5a39aea6b571f9d29c94 Mon Sep 17 00:00:00 2001 From: Chris MacNaughton Date: Wed, 11 Jul 2018 15:01:17 +0200 Subject: [PATCH] Add configuration for cpu model flags Change-Id: Ia26d0f2d4f540dd5b35743d0348aa6e2b8ab1954 Closes-Bug: #1750829 --- config.yaml | 5 +++++ hooks/nova_compute_context.py | 4 ++++ templates/ocata/nova.conf | 3 +++ templates/pike/nova.conf | 3 +++ unit_tests/test_nova_compute_contexts.py | 8 ++++++++ 5 files changed, 23 insertions(+) diff --git a/config.yaml b/config.yaml index a66fbe1d..1488e8b4 100644 --- a/config.yaml +++ b/config.yaml @@ -259,6 +259,11 @@ options: Set to a named libvirt CPU model (see names listed in /usr/share/libvirt/cpu_map.xml). Only has effect if cpu_mode='custom' and virt_type='kvm|qemu'. + cpu-model-extra-flags: + type: string + default: + description: | + Space delimited list of specific CPU flags for libvirt. # Storage config libvirt-image-backend: type: string diff --git a/hooks/nova_compute_context.py b/hooks/nova_compute_context.py index 4bab6adc..eda02379 100644 --- a/hooks/nova_compute_context.py +++ b/hooks/nova_compute_context.py @@ -210,6 +210,10 @@ class NovaComputeLibvirtContext(context.OSContextGenerator): if config('cpu-model'): ctxt['cpu_model'] = config('cpu-model') + if config('cpu-model-extra-flags'): + ctxt['cpu_model_extra_flags'] = ', '.join( + config('cpu-model-extra-flags').split(' ')) + if config('hugepages'): ctxt['hugepages'] = True ctxt['kvm_hugepages'] = 1 diff --git a/templates/ocata/nova.conf b/templates/ocata/nova.conf index 5d98d8c7..86ad2b23 100644 --- a/templates/ocata/nova.conf +++ b/templates/ocata/nova.conf @@ -184,6 +184,9 @@ cpu_mode = {{ cpu_mode }} {% if cpu_model -%} cpu_model = {{ cpu_model }} {% endif -%} +{% if cpu_model_extra_flags %} +cpu_model_extra_flags = {{ cpu_model_extra_flags }} +{% endif %} {% if libvirt_images_type -%} images_type = {{ libvirt_images_type }} {% endif -%} diff --git a/templates/pike/nova.conf b/templates/pike/nova.conf index 067728f1..ace821c9 100644 --- a/templates/pike/nova.conf +++ b/templates/pike/nova.conf @@ -187,6 +187,9 @@ cpu_mode = {{ cpu_mode }} {% if cpu_model -%} cpu_model = {{ cpu_model }} {% endif -%} +{% if cpu_model_extra_flags %} +cpu_model_extra_flags = {{ cpu_model_extra_flags }} +{% endif %} {% if libvirt_images_type -%} images_type = {{ libvirt_images_type }} {% endif -%} diff --git a/unit_tests/test_nova_compute_contexts.py b/unit_tests/test_nova_compute_contexts.py index 83e6362a..af4c2c83 100644 --- a/unit_tests/test_nova_compute_contexts.py +++ b/unit_tests/test_nova_compute_contexts.py @@ -501,6 +501,14 @@ class NovaComputeContextTests(CharmTestCase): self.assertEqual(context.nova_metadata_requirement(), (True, None)) + def test_nova_compute_extra_flags(self): + self.test_config.set('cpu-model-extra-flags', 'pcid vmx pdpe1gb') + self.lsb_release.return_value = {'DISTRIB_CODENAME': 'bionic'} + libvirt = context.NovaComputeLibvirtContext() + + self.assertEqual(libvirt()['cpu_model_extra_flags'], + 'pcid, vmx, pdpe1gb') + class SerialConsoleContextTests(CharmTestCase):