summaryrefslogtreecommitdiffstats
path: root/nova/tests/compute/test_compute.py
diff options
context:
space:
mode:
Diffstat (limited to 'nova/tests/compute/test_compute.py')
-rw-r--r--nova/tests/compute/test_compute.py217
1 files changed, 138 insertions, 79 deletions
diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py
index fc3e0126b..211838ea1 100644
--- a/nova/tests/compute/test_compute.py
+++ b/nova/tests/compute/test_compute.py
@@ -34,6 +34,7 @@ import nova
from nova import compute
from nova.compute import api as compute_api
from nova.compute import flavors
+from nova.compute import instance_actions
from nova.compute import manager as compute_manager
from nova.compute import power_state
from nova.compute import rpcapi as compute_rpcapi
@@ -48,6 +49,7 @@ from nova.image import glance
from nova.network import api as network_api
from nova.network import model as network_model
from nova.network.security_group import openstack_driver
+from nova.objects import instance as instance_obj
from nova.openstack.common import importutils
from nova.openstack.common import jsonutils
from nova.openstack.common import log as logging
@@ -62,6 +64,7 @@ from nova import quota
from nova import test
from nova.tests.compute import fake_resource_tracker
from nova.tests.db import fakes as db_fakes
+from nova.tests import fake_instance
from nova.tests import fake_instance_actions
from nova.tests import fake_network
from nova.tests import fake_network_cache_model
@@ -236,6 +239,7 @@ class BaseTestCase(test.TestCase):
inst = {}
inst['vm_state'] = vm_states.ACTIVE
+ inst['task_state'] = None
inst['image_ref'] = FAKE_IMAGE_REF
inst['reservation_id'] = 'r-fakeres'
inst['user_id'] = self.user_id
@@ -252,11 +256,27 @@ class BaseTestCase(test.TestCase):
inst['architecture'] = 'x86_64'
inst['os_type'] = 'Linux'
inst['system_metadata'] = make_fake_sys_meta()
+ inst['locked'] = False
inst.update(params)
_create_service_entries(self.context.elevated(),
{'fake_zone': [inst['host']]})
return db.instance_create(self.context, inst)
+ def _create_instance_obj(self, params=None, type_name='m1.tiny'):
+ """Create a test instance object."""
+ instance = instance_obj.Instance()
+ instance.uuid = uuidutils.generate_uuid()
+ instance.cell_name = 'api!child'
+
+ def _fake_db_create(_ctxt, inst):
+ for k, v in inst.items():
+ setattr(instance, k, v)
+ return instance
+
+ self.stubs.Set(db, 'instance_create', _fake_db_create)
+ return self._create_fake_instance(params=params,
+ type_name=type_name)
+
def _create_instance(self, params=None, type_name='m1.tiny'):
"""Create a test instance. Returns uuid."""
return self._create_fake_instance(params, type_name=type_name)
@@ -691,6 +711,16 @@ class ComputeTestCase(BaseTestCase):
self.assertTrue(called['finished'])
self.assertEqual('An unknown exception occurred.', called['message'])
+ def test_object_compat(self):
+ db_inst = fake_instance.fake_db_instance()
+
+ @compute_manager.object_compat
+ def test_fn(_self, context, instance):
+ self.assertTrue(isinstance(instance, instance_obj.Instance))
+ self.assertEqual(instance.uuid, db_inst['uuid'])
+
+ test_fn(None, self.context, instance=db_inst)
+
def test_create_instance_with_img_ref_associates_config_drive(self):
# Make sure create associates a config drive.
@@ -1238,7 +1268,12 @@ class ComputeTestCase(BaseTestCase):
self.compute.run_instance(self.context, instance=instance)
db.instance_update(self.context, instance['uuid'],
{"task_state": task_states.POWERING_OFF})
- self.compute.stop_instance(self.context, instance=instance)
+ inst_uuid = instance['uuid']
+ extra = ['system_metadata', 'metadata']
+ inst_obj = instance_obj.Instance.get_by_uuid(self.context,
+ inst_uuid,
+ expected_attrs=extra)
+ self.compute.stop_instance(self.context, instance=inst_obj)
self.compute.terminate_instance(self.context, instance=instance)
def test_start(self):
@@ -1247,10 +1282,15 @@ class ComputeTestCase(BaseTestCase):
self.compute.run_instance(self.context, instance=instance)
db.instance_update(self.context, instance['uuid'],
{"task_state": task_states.POWERING_OFF})
- self.compute.stop_instance(self.context, instance=instance)
- db.instance_update(self.context, instance['uuid'],
- {"task_state": task_states.POWERING_ON})
- self.compute.start_instance(self.context, instance=instance)
+ extra = ['system_metadata', 'metadata']
+ inst_uuid = instance['uuid']
+ inst_obj = instance_obj.Instance.get_by_uuid(self.context,
+ inst_uuid,
+ expected_attrs=extra)
+ self.compute.stop_instance(self.context, instance=inst_obj)
+ inst_obj.task_state = task_states.POWERING_ON
+ inst_obj.save(self.context)
+ self.compute.start_instance(self.context, instance=inst_obj)
self.compute.terminate_instance(self.context, instance=instance)
def test_stop_start_no_image(self):
@@ -1259,10 +1299,15 @@ class ComputeTestCase(BaseTestCase):
self.compute.run_instance(self.context, instance=instance)
db.instance_update(self.context, instance['uuid'],
{"task_state": task_states.POWERING_OFF})
- self.compute.stop_instance(self.context, instance=instance)
- db.instance_update(self.context, instance['uuid'],
- {"task_state": task_states.POWERING_ON})
- self.compute.start_instance(self.context, instance=instance)
+ extra = ['system_metadata', 'metadata']
+ inst_uuid = instance['uuid']
+ inst_obj = instance_obj.Instance.get_by_uuid(self.context,
+ inst_uuid,
+ expected_attrs=extra)
+ self.compute.stop_instance(self.context, instance=inst_obj)
+ inst_obj.task_state = task_states.POWERING_ON
+ inst_obj.save(self.context)
+ self.compute.start_instance(self.context, instance=inst_obj)
self.compute.terminate_instance(self.context, instance=instance)
def test_rescue(self):
@@ -1338,11 +1383,15 @@ class ComputeTestCase(BaseTestCase):
instance = jsonutils.to_primitive(self._create_fake_instance())
self.compute.run_instance(self.context, instance=instance)
- db.instance_update(self.context, instance['uuid'],
- {"task_state": task_states.POWERING_ON})
- self.compute.start_instance(self.context, instance=instance)
+ extra = ['system_metadata', 'metadata']
+ inst_obj = instance_obj.Instance.get_by_uuid(self.context,
+ instance['uuid'],
+ expected_attrs=extra)
+ inst_obj.task_state = task_states.POWERING_ON
+ inst_obj.save(self.context)
+ self.compute.start_instance(self.context, instance=inst_obj)
self.assertTrue(called['power_on'])
- self.compute.terminate_instance(self.context, instance=instance)
+ self.compute.terminate_instance(self.context, instance=inst_obj)
def test_power_off(self):
# Ensure instance can be powered off.
@@ -1357,11 +1406,15 @@ class ComputeTestCase(BaseTestCase):
instance = jsonutils.to_primitive(self._create_fake_instance())
self.compute.run_instance(self.context, instance=instance)
- db.instance_update(self.context, instance['uuid'],
- {"task_state": task_states.POWERING_OFF})
- self.compute.stop_instance(self.context, instance=instance)
+ extra = ['system_metadata', 'metadata']
+ inst_obj = instance_obj.Instance.get_by_uuid(self.context,
+ instance['uuid'],
+ expected_attrs=extra)
+ inst_obj.task_state = task_states.POWERING_OFF
+ inst_obj.save(self.context)
+ self.compute.stop_instance(self.context, instance=inst_obj)
self.assertTrue(called['power_off'])
- self.compute.terminate_instance(self.context, instance=instance)
+ self.compute.terminate_instance(self.context, instance=inst_obj)
def test_pause(self):
# Ensure instance can be paused and unpaused.
@@ -5334,47 +5387,85 @@ class ComputeAPITestCase(BaseTestCase):
db.instance_destroy(self.context, ref[0]['uuid'])
def test_start(self):
- instance = jsonutils.to_primitive(self._create_fake_instance())
- instance_uuid = instance['uuid']
- self.compute.run_instance(self.context, instance=instance)
-
- db.instance_update(self.context, instance['uuid'],
- {"task_state": task_states.POWERING_OFF})
- self.compute.stop_instance(self.context, instance=instance)
+ # Undo setUp() stubs (test_compute_cells)
+ self.stubs.UnsetAll()
+ instance = self._create_instance_obj()
+ instance.vm_state = vm_states.STOPPED
+
+ self.mox.StubOutWithMock(instance, 'save')
+ self.mox.StubOutWithMock(self.compute_api,
+ '_record_action_start')
+ self.mox.StubOutWithMock(
+ self.compute_api.compute_rpcapi,
+ 'start_instance')
+
+ instance.save(expected_task_state=None)
+ self.compute_api._record_action_start(self.context,
+ instance, instance_actions.START)
+ self.compute_api.compute_rpcapi.start_instance(
+ self.context, instance)
- instance = db.instance_get_by_uuid(self.context, instance_uuid)
- self.assertEqual(instance['task_state'], None)
+ self.mox.ReplayAll()
self.compute_api.start(self.context, instance)
+ self.assertEqual(task_states.POWERING_ON,
+ instance.task_state)
- instance = db.instance_get_by_uuid(self.context, instance_uuid)
- self.assertEqual(instance['task_state'], task_states.POWERING_ON)
-
- db.instance_destroy(self.context, instance['uuid'])
+ def test_start_invalid_state(self):
+ # Undo setUp() stubs (test_compute_cells)
+ self.stubs.UnsetAll()
+ instance = self._create_instance_obj()
+ instance.vm_state = vm_states.ACTIVE
+ self.assertRaises(exception.InstanceInvalidState,
+ self.compute_api.start,
+ self.context, instance)
def test_start_no_host(self):
- instance = self._create_fake_instance(params={'host': ''})
-
+ # Undo setUp() stubs (test_compute_cells)
+ self.stubs.UnsetAll()
+ instance = self._create_instance_obj()
+ instance.vm_state = vm_states.STOPPED
+ instance.host = ''
self.assertRaises(exception.InstanceNotReady,
self.compute_api.start,
self.context, instance)
- db.instance_destroy(self.context, instance['uuid'])
-
def test_stop(self):
- instance = jsonutils.to_primitive(self._create_fake_instance())
- instance_uuid = instance['uuid']
- self.compute.run_instance(self.context, instance=instance)
+ # Undo setUp() stubs (test_compute_cells)
+ self.stubs.UnsetAll()
+ instance = self._create_instance_obj()
+ instance.task_state = None
+ # Make sure this gets reset
+ instance.progress = 99
+
+ self.mox.StubOutWithMock(instance, 'save')
+ self.mox.StubOutWithMock(self.compute_api,
+ '_record_action_start')
+ self.mox.StubOutWithMock(
+ self.compute_api.compute_rpcapi,
+ 'stop_instance')
+
+ instance.save(expected_task_state=None)
+ self.compute_api._record_action_start(self.context,
+ instance, instance_actions.STOP)
+ self.compute_api.compute_rpcapi.stop_instance(
+ self.context, instance, cast=True)
- instance = db.instance_get_by_uuid(self.context, instance_uuid)
- self.assertEqual(instance['task_state'], None)
+ self.mox.ReplayAll()
self.compute_api.stop(self.context, instance)
+ self.assertEqual(task_states.POWERING_OFF,
+ instance.task_state)
+ self.assertEqual(0, instance.progress)
- instance = db.instance_get_by_uuid(self.context, instance_uuid)
- self.assertEqual(instance['task_state'], task_states.POWERING_OFF)
-
- db.instance_destroy(self.context, instance['uuid'])
+ def test_stop_invalid_state(self):
+ # Undo setUp() stubs (test_compute_cells)
+ self.stubs.UnsetAll()
+ instance = self._create_instance_obj()
+ instance.vm_state = vm_states.PAUSED
+ self.assertRaises(exception.InstanceInvalidState,
+ self.compute_api.stop,
+ self.context, instance)
def test_stop_a_stopped_inst(self):
instance = jsonutils.to_primitive(self._create_fake_instance(
@@ -5387,46 +5478,14 @@ class ComputeAPITestCase(BaseTestCase):
db.instance_destroy(self.context, instance['uuid'])
def test_stop_no_host(self):
- instance = self._create_fake_instance(params={'host': ''})
-
+ # Undo setUp() stubs (test_compute_cells)
+ self.stubs.UnsetAll()
+ instance = self._create_instance_obj()
+ instance.host = ''
self.assertRaises(exception.InstanceNotReady,
self.compute_api.stop,
self.context, instance)
- db.instance_destroy(self.context, instance['uuid'])
-
- def test_start_shutdown(self):
- def check_state(instance_uuid, power_state_, vm_state_, task_state_):
- instance = db.instance_get_by_uuid(self.context, instance_uuid)
- self.assertEqual(instance['power_state'], power_state_)
- self.assertEqual(instance['vm_state'], vm_state_)
- self.assertEqual(instance['task_state'], task_state_)
-
- def start_check_state(instance_uuid,
- power_state_, vm_state_, task_state_):
- instance = db.instance_get_by_uuid(self.context, instance_uuid)
- self.compute_api.start(self.context, instance)
- check_state(instance_uuid, power_state_, vm_state_, task_state_)
-
- instance = jsonutils.to_primitive(self._create_fake_instance())
- self.compute.run_instance(self.context, instance=instance)
-
- check_state(instance['uuid'], power_state.RUNNING, vm_states.ACTIVE,
- None)
-
- # NOTE(yamahata): emulate compute.manager._sync_power_state() that
- # the instance is shutdown by itself
- db.instance_update(self.context, instance['uuid'],
- {'power_state': power_state.NOSTATE,
- 'vm_state': vm_states.STOPPED})
- check_state(instance['uuid'], power_state.NOSTATE, vm_states.STOPPED,
- None)
-
- start_check_state(instance['uuid'], power_state.NOSTATE,
- vm_states.STOPPED, task_states.POWERING_ON)
-
- db.instance_destroy(self.context, instance['uuid'])
-
def test_delete(self):
instance, instance_uuid = self._run_instance(params={
'host': CONF.host})