From 1fa2a8023cd4b1acee891a09311f4fd1b803e85d Mon Sep 17 00:00:00 2001 From: Niels van Adrichem Date: Wed, 24 Oct 2018 14:07:33 +0000 Subject: [PATCH] Enable support for auto-converge and post-copy Implement missing configuration options and context to support configuration of: live_migration_permit_auto_converge live_migration_permit_post_copy in nova.conf. The configuration parameters are only added to the nova.conf template when live-migration is actually enabled, since they have no purpose without live-migration enabled. The options are added to version Newton and upwards as that is the Nova version since they were first supported. Change-Id: I1bb3cee4ac532d0867b4297c742707668566a527 Closes-Bug: #1799916 --- config.yaml | 12 +++++++ hooks/nova_compute_context.py | 6 ++++ templates/newton/nova.conf | 6 ++++ templates/ocata/nova.conf | 6 ++++ templates/pike/nova.conf | 6 ++++ unit_tests/test_nova_compute_contexts.py | 44 ++++++++++++++++++++++++ 6 files changed, 80 insertions(+) diff --git a/config.yaml b/config.yaml index 6fb5293a..e160c5d4 100644 --- a/config.yaml +++ b/config.yaml @@ -108,6 +108,18 @@ options: description: | TCP authentication scheme for libvirt live migration. Available options include ssh. + live-migration-permit-post-copy: + type: boolean + default: False + description: | + If live-migration is enabled, this option allows Nova to switch an on- + going live migration to post-copy mode. + live-migration-permit-auto-converge: + type: boolean + default: False + description: | + If live-migration is enabled, this option allows Nova to throttle down + CPU when an on-going live migration is slow. authorized-keys-path: type: string default: '{homedir}/.ssh/authorized_keys' diff --git a/hooks/nova_compute_context.py b/hooks/nova_compute_context.py index d11938a4..0d7dde68 100644 --- a/hooks/nova_compute_context.py +++ b/hooks/nova_compute_context.py @@ -198,6 +198,12 @@ class NovaComputeLibvirtContext(context.OSContextGenerator): # nova.conf ctxt['live_migration_uri'] = 'qemu+ssh://%s/system' + if config('enable-live-migration'): + ctxt['live_migration_permit_post_copy'] = \ + config('live-migration-permit-post-copy') + ctxt['live_migration_permit_auto_converge'] = \ + config('live-migration-permit-auto-converge') + if config('instances-path') is not None: ctxt['instances_path'] = config('instances-path') diff --git a/templates/newton/nova.conf b/templates/newton/nova.conf index fdd3fbd3..46984388 100644 --- a/templates/newton/nova.conf +++ b/templates/newton/nova.conf @@ -199,6 +199,12 @@ rbd_secret_uuid = {{ rbd_secret_uuid }} {% if live_migration_uri -%} live_migration_uri = {{ live_migration_uri }} {% endif -%} +{% if live_migration_permit_post_copy -%} +live_migration_permit_post_copy = {{ live_migration_permit_post_copy }} +{% endif -%} +{% if live_migration_permit_auto_converge -%} +live_migration_permit_auto_converge = {{ live_migration_permit_auto_converge }} +{% endif -%} {% if disk_cachemodes -%} disk_cachemodes = {{ disk_cachemodes }} {% endif %} diff --git a/templates/ocata/nova.conf b/templates/ocata/nova.conf index 592e2027..21fc7b62 100644 --- a/templates/ocata/nova.conf +++ b/templates/ocata/nova.conf @@ -203,6 +203,12 @@ rbd_secret_uuid = {{ rbd_secret_uuid }} {% if live_migration_uri -%} live_migration_uri = {{ live_migration_uri }} {% endif -%} +{% if live_migration_permit_post_copy -%} +live_migration_permit_post_copy = {{ live_migration_permit_post_copy }} +{% endif -%} +{% if live_migration_permit_auto_converge -%} +live_migration_permit_auto_converge = {{ live_migration_permit_auto_converge }} +{% endif -%} {% if disk_cachemodes -%} disk_cachemodes = {{ disk_cachemodes }} {% endif %} diff --git a/templates/pike/nova.conf b/templates/pike/nova.conf index a78d3bed..3dd60761 100644 --- a/templates/pike/nova.conf +++ b/templates/pike/nova.conf @@ -211,6 +211,12 @@ rbd_secret_uuid = {{ rbd_secret_uuid }} {% if live_migration_uri -%} live_migration_uri = {{ live_migration_uri }} {% endif -%} +{% if live_migration_permit_post_copy -%} +live_migration_permit_post_copy = {{ live_migration_permit_post_copy }} +{% endif -%} +{% if live_migration_permit_auto_converge -%} +live_migration_permit_auto_converge = {{ live_migration_permit_auto_converge }} +{% endif -%} {% if disk_cachemodes -%} disk_cachemodes = {{ disk_cachemodes }} {% endif %} diff --git a/unit_tests/test_nova_compute_contexts.py b/unit_tests/test_nova_compute_contexts.py index 743e547d..42086786 100644 --- a/unit_tests/test_nova_compute_contexts.py +++ b/unit_tests/test_nova_compute_contexts.py @@ -250,6 +250,50 @@ class NovaComputeContextTests(CharmTestCase): 'listen_tls': 0, 'host_uuid': self.host_uuid, 'live_migration_uri': 'qemu+ssh://%s/system', + 'live_migration_permit_auto_converge': False, + 'live_migration_permit_post_copy': False, + 'force_raw_images': True, + 'reserved_host_memory': 512}, libvirt()) + + def test_libvirt_bin_context_migration_tcp_listen_with_auto_converge(self): + self.kv.return_value = FakeUnitdata(**{'host_uuid': self.host_uuid}) + self.lsb_release.return_value = {'DISTRIB_CODENAME': 'lucid'} + self.test_config.set('enable-live-migration', True) + self.test_config.set('live-migration-permit-auto-converge', True) + libvirt = context.NovaComputeLibvirtContext() + + self.assertEqual( + {'libvirtd_opts': '-d -l', + 'libvirt_user': 'libvirtd', + 'arch': platform.machine(), + 'ksm': 'AUTO', + 'kvm_hugepages': 0, + 'listen_tls': 0, + 'host_uuid': self.host_uuid, + 'live_migration_uri': 'qemu+ssh://%s/system', + 'live_migration_permit_auto_converge': True, + 'live_migration_permit_post_copy': False, + 'force_raw_images': True, + 'reserved_host_memory': 512}, libvirt()) + + def test_libvirt_bin_context_migration_tcp_listen_with_post_copy(self): + self.kv.return_value = FakeUnitdata(**{'host_uuid': self.host_uuid}) + self.lsb_release.return_value = {'DISTRIB_CODENAME': 'lucid'} + self.test_config.set('enable-live-migration', True) + self.test_config.set('live-migration-permit-post-copy', True) + libvirt = context.NovaComputeLibvirtContext() + + self.assertEqual( + {'libvirtd_opts': '-d -l', + 'libvirt_user': 'libvirtd', + 'arch': platform.machine(), + 'ksm': 'AUTO', + 'kvm_hugepages': 0, + 'listen_tls': 0, + 'host_uuid': self.host_uuid, + 'live_migration_uri': 'qemu+ssh://%s/system', + 'live_migration_permit_auto_converge': False, + 'live_migration_permit_post_copy': True, 'force_raw_images': True, 'reserved_host_memory': 512}, libvirt())