diff options
| author | Chris Behrens <cbehrens@codestud.com> | 2013-06-18 21:13:01 +0000 |
|---|---|---|
| committer | Dan Smith <danms@us.ibm.com> | 2013-06-20 19:07:26 -0700 |
| commit | a02766e28101381207ea7a48396a9448ca610348 (patch) | |
| tree | bc4a2700d59508dfd76d1513dedad6d1cea86516 | |
| parent | 022bd8d6c16a1a06a3996f1fa827bc17b4272af7 (diff) | |
| download | nova-a02766e28101381207ea7a48396a9448ca610348.tar.gz nova-a02766e28101381207ea7a48396a9448ca610348.tar.xz nova-a02766e28101381207ea7a48396a9448ca610348.zip | |
Make sure instance_type has extra_specs
Make sure that when scheduling, the instance_type used in filters
contains the 'extra_specs'. This is a bit ugly, but will get cleaned up
with objects.
Fixes bug 1192331
Change-Id: I3614f3a858840c9561b4e618fc30f3d3ae5ac689
| -rw-r--r-- | nova/cells/scheduler.py | 3 | ||||
| -rw-r--r-- | nova/conductor/manager.py | 3 | ||||
| -rw-r--r-- | nova/scheduler/utils.py | 11 | ||||
| -rw-r--r-- | nova/tests/cells/test_cells_scheduler.py | 8 | ||||
| -rw-r--r-- | nova/tests/conductor/test_conductor.py | 18 |
5 files changed, 31 insertions, 12 deletions
diff --git a/nova/cells/scheduler.py b/nova/cells/scheduler.py index c54b9b578..aa081a726 100644 --- a/nova/cells/scheduler.py +++ b/nova/cells/scheduler.py @@ -214,7 +214,8 @@ class CellsScheduler(base.Base): instance_uuids = [inst['uuid'] for inst in build_inst_kwargs['instances']] instances = build_inst_kwargs['instances'] - request_spec = scheduler_utils.build_request_spec(image, instances) + request_spec = scheduler_utils.build_request_spec(message.ctxt, + image, instances) filter_properties = copy.copy(build_inst_kwargs['filter_properties']) filter_properties.update({'context': message.ctxt, 'scheduler': self, diff --git a/nova/conductor/manager.py b/nova/conductor/manager.py index 3b8c5f55d..b794c8b9f 100644 --- a/nova/conductor/manager.py +++ b/nova/conductor/manager.py @@ -541,7 +541,8 @@ class ComputeTaskManager(object): def build_instances(self, context, instances, image, filter_properties, admin_password, injected_files, requested_networks, security_groups, block_device_mapping): - request_spec = scheduler_utils.build_request_spec(image, instances) + request_spec = scheduler_utils.build_request_spec(context, image, + instances) # NOTE(alaski): For compatibility until a new scheduler method is used. request_spec.update({'block_device_mapping': block_device_mapping, 'security_group': security_groups}) diff --git a/nova/scheduler/utils.py b/nova/scheduler/utils.py index 028c72ff7..b707f424c 100644 --- a/nova/scheduler/utils.py +++ b/nova/scheduler/utils.py @@ -15,19 +15,26 @@ """Utility methods for scheduling.""" from nova.compute import flavors +from nova import db from nova.openstack.common import jsonutils -def build_request_spec(image, instances): +def build_request_spec(ctxt, image, instances): """Build a request_spec for the scheduler. The request_spec assumes that all instances to be scheduled are the same type. """ instance = instances[0] + instance_type = flavors.extract_flavor(instance) + # NOTE(comstud): This is a bit ugly, but will get cleaned up when + # we're passing an InstanceType internal object. + extra_specs = db.instance_type_extra_specs_get(ctxt, + instance_type['flavorid']) + instance_type['extra_specs'] = extra_specs request_spec = { 'image': image, 'instance_properties': instance, - 'instance_type': flavors.extract_flavor(instance), + 'instance_type': instance_type, 'instance_uuids': [inst['uuid'] for inst in instances]} return jsonutils.to_primitive(request_spec) diff --git a/nova/tests/cells/test_cells_scheduler.py b/nova/tests/cells/test_cells_scheduler.py index 9cd637cdf..600867f43 100644 --- a/nova/tests/cells/test_cells_scheduler.py +++ b/nova/tests/cells/test_cells_scheduler.py @@ -178,7 +178,7 @@ class CellsSchedulerTestCase(test.TestCase): call_info['target_cell'] = target_cell call_info['build_inst_kwargs'] = build_inst_kwargs - def fake_build_request_spec(image, instances): + def fake_build_request_spec(ctxt, image, instances): request_spec = { 'instance_uuids': [inst['uuid'] for inst in instances], 'image': image} @@ -264,7 +264,7 @@ class CellsSchedulerTestCase(test.TestCase): def fake_rpc_build_instances(ctxt, **build_inst_kwargs): call_info['build_inst_kwargs'] = build_inst_kwargs - def fake_build_request_spec(image, instances): + def fake_build_request_spec(ctxt, image, instances): request_spec = { 'instance_uuids': [inst['uuid'] for inst in instances], 'image': image} @@ -341,7 +341,7 @@ class CellsSchedulerTestCase(test.TestCase): self.assertEqual(vm_states.ERROR, values['vm_state']) call_info['errored_uuids'].append(instance_uuid) - def fake_build_request_spec(image, instances): + def fake_build_request_spec(ctxt, image, instances): request_spec = { 'instance_uuids': [inst['uuid'] for inst in instances], 'image': image} @@ -385,7 +385,7 @@ class CellsSchedulerTestCase(test.TestCase): self.assertEqual(vm_states.ERROR, instance['vm_state']) call_info['errored_uuids2'].append(instance['uuid']) - def fake_build_request_spec(image, instances): + def fake_build_request_spec(ctxt, image, instances): request_spec = { 'instance_uuids': [inst['uuid'] for inst in instances], 'image': image} diff --git a/nova/tests/conductor/test_conductor.py b/nova/tests/conductor/test_conductor.py index 9bb2c00ec..a2a015313 100644 --- a/nova/tests/conductor/test_conductor.py +++ b/nova/tests/conductor/test_conductor.py @@ -1183,18 +1183,28 @@ class _BaseTaskTestCase(object): def test_build_instances(self): instance_type = flavors.get_default_flavor() system_metadata = flavors.save_flavor_info({}, instance_type) - # NOTE(alaski): instance_type -> system_metadata -> instance_type loses - # some data (extra_specs) so we need both for testing. - instance_type_extract = flavors.extract_flavor( + # NOTE(alaski): instance_type -> system_metadata -> instance_type + # loses some data (extra_specs). This build process is using + # scheduler/utils:build_request_spec() which extracts flavor from + # system_metadata and will re-query the DB for extra_specs.. so + # we need to test this properly + expected_instance_type = flavors.extract_flavor( {'system_metadata': system_metadata}) + expected_instance_type['extra_specs'] = 'fake-specs' + + self.mox.StubOutWithMock(db, 'instance_type_extra_specs_get') self.mox.StubOutWithMock(self.conductor_manager.scheduler_rpcapi, 'run_instance') + + db.instance_type_extra_specs_get( + self.context, + instance_type['flavorid']).AndReturn('fake-specs') self.conductor_manager.scheduler_rpcapi.run_instance(self.context, request_spec={ 'image': {'fake_data': 'should_pass_silently'}, 'instance_properties': {'system_metadata': system_metadata, 'uuid': 'fakeuuid'}, - 'instance_type': instance_type_extract, + 'instance_type': expected_instance_type, 'instance_uuids': ['fakeuuid', 'fakeuuid2'], 'block_device_mapping': 'block_device_mapping', 'security_group': 'security_groups'}, |
