From d82fc3347da6106790b4b2bf24df667269188031 Mon Sep 17 00:00:00 2001 From: Alexander Kharkov Date: Thu, 3 Aug 2017 09:09:07 +0000 Subject: [PATCH] Implemented resume_state_on_host_boot driver callback As result it is possible to use nova configuration option 'resume_guests_state_on_host_boot' option. This option allow to keep instance RUNNING state across reboots so if instance was in RUNNING state before reboot it will started after reboot. Change-Id: I884e0d1bf136488c1930673b25a560d0add12beb Closes-Bug: 1708393 --- nova/tests/unit/virt/lxd/test_driver.py | 17 +++++++++++++++++ nova/virt/lxd/driver.py | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/nova/tests/unit/virt/lxd/test_driver.py b/nova/tests/unit/virt/lxd/test_driver.py index ed45e157..daaab781 100644 --- a/nova/tests/unit/virt/lxd/test_driver.py +++ b/nova/tests/unit/virt/lxd/test_driver.py @@ -922,6 +922,23 @@ class LXDDriverTest(test.NoDBTestCase): self.client.containers.get.assert_called_once_with(instance.name) container.unfreeze.assert_called_once_with(wait=True) + def test_resume_state_on_host_boot(self): + container = mock.Mock() + state = mock.Mock() + state.memory = dict({'usage': 0, 'usage_peak': 0}) + state.status_code = 102 + container.state.return_value = state + self.client.containers.get.return_value = container + ctx = context.get_admin_context() + instance = fake_instance.fake_instance_obj( + ctx, name='test', memory_mb=0) + + lxd_driver = driver.LXDDriver(None) + lxd_driver.init_host(None) + + lxd_driver.resume_state_on_host_boot(ctx, instance, None, None) + container.start.assert_called_once_with(wait=True) + def test_rescue(self): profile = mock.Mock() profile.devices = { diff --git a/nova/virt/lxd/driver.py b/nova/virt/lxd/driver.py index d0b19e11..7e7473b3 100644 --- a/nova/virt/lxd/driver.py +++ b/nova/virt/lxd/driver.py @@ -797,6 +797,23 @@ class LXDDriver(driver.ComputeDriver): """ self.unpause(instance) + def resume_state_on_host_boot(self, context, instance, network_info, + block_device_info=None): + """resume guest state when a host is booted.""" + try: + state = self.get_info(instance).state + ignored_states = (power_state.RUNNING, + power_state.SUSPENDED, + power_state.NOSTATE, + power_state.PAUSED) + + if state in ignored_states: + return + + self.power_on(context, instance, network_info, block_device_info) + except (exception.InternalError, exception.InstanceNotFound): + pass + def rescue(self, context, instance, network_info, image_meta, rescue_password): """Rescue a LXD container.