From 7c847bc659e7c493cf009adc417be2e884c3c616 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Fri, 1 Jun 2012 02:52:57 +0000 Subject: Cleans up power_off and power_on semantics compute.api changes: * improves state handling for delete/restrore * removes hack to deal with SHUTOFF on start * fixes api tests (volume shouldn't detach on stop) compute.manager changes: * uses power_off/power_on for stop/start virt.libvirt changes: * implements power_off/power_on for libvirt * synchronizes usage of domain.create() * cleans up usage of instance.name * added tests for power_on and power_off * fixes bug 1006950 Change-Id: I91845a643e3f97955e7c81ca57c6ee5aa0a3d295 --- nova/tests/api/ec2/test_cloud.py | 10 +++++----- nova/tests/compute/test_compute.py | 40 +++++++++++++++++++------------------- nova/tests/test_virt_drivers.py | 16 +++++++++++++++ 3 files changed, 41 insertions(+), 25 deletions(-) (limited to 'nova/tests') diff --git a/nova/tests/api/ec2/test_cloud.py b/nova/tests/api/ec2/test_cloud.py index 58cba6d15..31f6abf5f 100644 --- a/nova/tests/api/ec2/test_cloud.py +++ b/nova/tests/api/ec2/test_cloud.py @@ -1963,9 +1963,10 @@ class CloudTestCase(test.TestCase): self.assertTrue(result) vol = db.volume_get(self.context, vol1['id']) - self._assert_volume_detached(vol) + self._assert_volume_attached(vol, instance_uuid, '/dev/vdb') + vol = db.volume_get(self.context, vol2['id']) - self._assert_volume_detached(vol) + self._assert_volume_attached(vol, instance_uuid, '/dev/vdc') self.cloud.start_instances(self.context, [ec2_instance_id]) vols = db.volume_get_all_by_instance_uuid(self.context, instance_uuid) @@ -2034,9 +2035,8 @@ class CloudTestCase(test.TestCase): result = self.cloud.stop_instances(self.context, [ec2_instance_id]) self.assertTrue(result) - for vol_id in (vol1['id'], vol2['id']): - vol = db.volume_get(self.context, vol_id) - self._assert_volume_detached(vol) + vol = db.volume_get(self.context, vol2['id']) + self._assert_volume_attached(vol, instance_uuid, '/dev/vdc') self.cloud.start_instances(self.context, [ec2_instance_id]) vols = db.volume_get_all_by_instance_uuid(self.context, instance_uuid) diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py index 6f03e9c84..03fee4703 100644 --- a/nova/tests/compute/test_compute.py +++ b/nova/tests/compute/test_compute.py @@ -445,7 +445,7 @@ class ComputeTestCase(BaseTestCase): def fake_driver_power_on(self, instance): called['power_on'] = True - self.stubs.Set(nova.virt.driver.ComputeDriver, 'power_on', + self.stubs.Set(nova.virt.fake.FakeDriver, 'power_on', fake_driver_power_on) instance = self._create_fake_instance() @@ -463,7 +463,7 @@ class ComputeTestCase(BaseTestCase): def fake_driver_power_off(self, instance): called['power_off'] = True - self.stubs.Set(nova.virt.driver.ComputeDriver, 'power_off', + self.stubs.Set(nova.virt.fake.FakeDriver, 'power_off', fake_driver_power_off) instance = self._create_fake_instance() @@ -1700,8 +1700,8 @@ class ComputeTestCase(BaseTestCase): ).AndReturn([instance]) self.mox.StubOutWithMock(self.compute, "_shutdown_instance") - self.compute._shutdown_instance(admin_context, instance, - 'Terminating').AndReturn(None) + self.compute._shutdown_instance(admin_context, + instance).AndReturn(None) self.mox.StubOutWithMock(self.compute, "_cleanup_volumes") self.compute._cleanup_volumes(admin_context, @@ -2256,13 +2256,8 @@ class ComputeAPITestCase(BaseTestCase): check_state(instance_uuid, power_state.NOSTATE, vm_states.SHUTOFF, None) - start_check_state(instance_uuid, - power_state.NOSTATE, vm_states.SHUTOFF, None) - - db.instance_update(self.context, instance_uuid, - {'shutdown_terminate': False}) start_check_state(instance_uuid, power_state.NOSTATE, - vm_states.STOPPED, task_states.STARTING) + vm_states.SHUTOFF, task_states.STARTING) db.instance_destroy(self.context, instance['id']) @@ -2338,6 +2333,10 @@ class ComputeAPITestCase(BaseTestCase): instance = db.instance_get_by_uuid(self.context, instance_uuid) self.assertEqual(instance['task_state'], task_states.POWERING_OFF) + # set the state that the instance gets when soft_delete finishes + instance = db.instance_update(self.context, instance['uuid'], + {'vm_state': vm_states.SOFT_DELETE}) + self.compute_api.force_delete(self.context, instance) instance = db.instance_get_by_uuid(self.context, instance_uuid) @@ -2402,9 +2401,8 @@ class ComputeAPITestCase(BaseTestCase): self.compute.pause_instance(self.context, instance_uuid) # set the state that the instance gets when pause finishes - db.instance_update(self.context, instance['uuid'], + instance = db.instance_update(self.context, instance['uuid'], {'vm_state': vm_states.PAUSED}) - instance = db.instance_get_by_uuid(self.context, instance['uuid']) self.compute_api.unpause(self.context, instance) @@ -2425,6 +2423,10 @@ class ComputeAPITestCase(BaseTestCase): instance = db.instance_get_by_uuid(self.context, instance_uuid) self.assertEqual(instance['task_state'], task_states.POWERING_OFF) + # set the state that the instance gets when soft_delete finishes + instance = db.instance_update(self.context, instance['uuid'], + {'vm_state': vm_states.SOFT_DELETE}) + self.compute_api.restore(self.context, instance) instance = db.instance_get_by_uuid(self.context, instance_uuid) @@ -2766,10 +2768,9 @@ class ComputeAPITestCase(BaseTestCase): {'instance_uuid': instance['uuid'], 'status': 'finished'}) # set the state that the instance gets when resize finishes - db.instance_update(self.context, instance['uuid'], - {'task_state': task_states.RESIZE_VERIFY, - 'vm_state': vm_states.ACTIVE}) - instance = db.instance_get_by_uuid(context, instance['uuid']) + instance = db.instance_update(self.context, instance['uuid'], + {'task_state': task_states.RESIZE_VERIFY, + 'vm_state': vm_states.ACTIVE}) self.compute_api.confirm_resize(context, instance) self.compute.terminate_instance(context, instance['uuid']) @@ -2787,10 +2788,9 @@ class ComputeAPITestCase(BaseTestCase): {'instance_uuid': instance['uuid'], 'status': 'finished'}) # set the state that the instance gets when resize finishes - db.instance_update(self.context, instance['uuid'], - {'task_state': task_states.RESIZE_VERIFY, - 'vm_state': vm_states.ACTIVE}) - instance = db.instance_get_by_uuid(context, instance['uuid']) + instance = db.instance_update(self.context, instance['uuid'], + {'task_state': task_states.RESIZE_VERIFY, + 'vm_state': vm_states.ACTIVE}) self.compute_api.revert_resize(context, instance) diff --git a/nova/tests/test_virt_drivers.py b/nova/tests/test_virt_drivers.py index d4be2b463..774450e02 100644 --- a/nova/tests/test_virt_drivers.py +++ b/nova/tests/test_virt_drivers.py @@ -176,6 +176,22 @@ class _VirtDriverTestCase(test.TestCase): self.ctxt, instance_ref, 'dest_host', instance_type_ref, network_info) + @catch_notimplementederror + def test_power_off(self): + instance_ref, network_info = self._get_running_instance() + self.connection.power_off(instance_ref) + + @catch_notimplementederror + def test_test_power_on_running(self): + instance_ref, network_info = self._get_running_instance() + self.connection.power_on(instance_ref) + + @catch_notimplementederror + def test_test_power_on_powered_off(self): + instance_ref, network_info = self._get_running_instance() + self.connection.power_off(instance_ref) + self.connection.power_on(instance_ref) + @catch_notimplementederror def test_pause(self): instance_ref, network_info = self._get_running_instance() -- cgit