summaryrefslogtreecommitdiffstats
path: root/nova/tests/scheduler/test_chance_scheduler.py
diff options
context:
space:
mode:
authorMike Milner <mike.milner@canonical.com>2012-02-23 15:13:51 -0400
committerMike Milner <mike.milner@canonical.com>2012-02-23 21:34:52 -0400
commite3530a06c4d84e101e07bbe22075a0e2b3a72086 (patch)
tree7fd3f10776ea91582b6652524be8ba1577cca5b4 /nova/tests/scheduler/test_chance_scheduler.py
parent7c4e31e639c0a96778fb7a158f6e5106bc3f2abb (diff)
downloadnova-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.py53
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'