diff options
author | Mike Milner <mike.milner@canonical.com> | 2012-02-23 15:13:51 -0400 |
---|---|---|
committer | Mike Milner <mike.milner@canonical.com> | 2012-02-23 21:34:52 -0400 |
commit | e3530a06c4d84e101e07bbe22075a0e2b3a72086 (patch) | |
tree | 7fd3f10776ea91582b6652524be8ba1577cca5b4 /nova/tests/scheduler/test_chance_scheduler.py | |
parent | 7c4e31e639c0a96778fb7a158f6e5106bc3f2abb (diff) | |
download | nova-e3530a06c4d84e101e07bbe22075a0e2b3a72086.tar.gz nova-e3530a06c4d84e101e07bbe22075a0e2b3a72086.tar.xz nova-e3530a06c4d84e101e07bbe22075a0e2b3a72086.zip |
Include launch_index when creating instances.
Fixes bug 934534.
The launch_index column in the database is used as the ami-launch-index value
provided by the metadata service.
If launch_index is not specified it defaults to 1. This is incorrect for the
single instance case (should be 0) and doesn't correctly handle multi-instance
starts.
This branch changes the default launch_index to 0 (to handle the single
instance case) and adds the launch_index in the schedulers for multi-instance
starts.
Change-Id: Ifc45abf4cd9f50f732ba4a4b68c0a6242a6c9710
Diffstat (limited to 'nova/tests/scheduler/test_chance_scheduler.py')
-rw-r--r-- | nova/tests/scheduler/test_chance_scheduler.py | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/nova/tests/scheduler/test_chance_scheduler.py b/nova/tests/scheduler/test_chance_scheduler.py index 8f82ea16f..ed6ffeba4 100644 --- a/nova/tests/scheduler/test_chance_scheduler.py +++ b/nova/tests/scheduler/test_chance_scheduler.py @@ -20,6 +20,8 @@ Tests For Chance Scheduler. import random +import mox + from nova import context from nova import exception from nova.scheduler import driver @@ -114,6 +116,57 @@ class ChanceSchedulerTestCase(test_scheduler.SchedulerTestCase): expected = [instance1_encoded, instance2_encoded] self.assertEqual(result, expected) + def test_scheduler_includes_launch_index(self): + ctxt = "fake-context" + instance_opts = {'fake_opt1': 'meow'} + request_spec = {'num_instances': 2, + 'instance_properties': instance_opts} + instance1 = {'uuid': 'fake-uuid1'} + instance2 = {'uuid': 'fake-uuid2'} + + # create_instance_db_entry() usually does this, but we're + # stubbing it. + def _add_uuid(num): + """Return a function that adds the provided uuid number.""" + def _add_uuid_num(_, spec): + spec['instance_properties']['uuid'] = 'fake-uuid%d' % num + return _add_uuid_num + + def _has_launch_index(expected_index): + """Return a function that verifies the expected index.""" + def _check_launch_index(value): + if 'instance_properties' in value: + if 'launch_index' in value['instance_properties']: + index = value['instance_properties']['launch_index'] + if index == expected_index: + return True + return False + return _check_launch_index + + self.mox.StubOutWithMock(self.driver, '_schedule') + self.mox.StubOutWithMock(self.driver, 'create_instance_db_entry') + self.mox.StubOutWithMock(driver, 'cast_to_compute_host') + self.mox.StubOutWithMock(driver, 'encode_instance') + # instance 1 + self.driver._schedule(ctxt, 'compute', request_spec).AndReturn('host') + self.driver.create_instance_db_entry( + ctxt, mox.Func(_has_launch_index(0)) + ).WithSideEffects(_add_uuid(1)).AndReturn(instance1) + driver.cast_to_compute_host(ctxt, 'host', 'run_instance', + instance_uuid=instance1['uuid']) + driver.encode_instance(instance1).AndReturn(instance1) + # instance 2 + self.driver._schedule(ctxt, 'compute', request_spec).AndReturn('host') + self.driver.create_instance_db_entry( + ctxt, mox.Func(_has_launch_index(1)) + ).WithSideEffects(_add_uuid(2)).AndReturn(instance2) + driver.cast_to_compute_host(ctxt, 'host', 'run_instance', + instance_uuid=instance2['uuid']) + driver.encode_instance(instance2).AndReturn(instance2) + self.mox.ReplayAll() + + self.driver.schedule_run_instance(ctxt, request_spec) + def test_basic_schedule_run_instance_no_hosts(self): ctxt = context.RequestContext('fake', 'fake', False) ctxt_elevated = 'fake-context-elevated' |