From e3530a06c4d84e101e07bbe22075a0e2b3a72086 Mon Sep 17 00:00:00 2001 From: Mike Milner Date: Thu, 23 Feb 2012 15:13:51 -0400 Subject: 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 --- nova/tests/scheduler/test_chance_scheduler.py | 53 +++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) (limited to 'nova/tests/scheduler/test_chance_scheduler.py') 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' -- cgit