From 36f6da47b08680de13fffa13015a4ae2902d2e63 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Thu, 3 Nov 2011 19:55:00 -0700 Subject: [PATCH] Allows non-admin users to use simple scheduler Fixes bug 885955 Change-Id: I88be04cbc55e272162328a33656fc5d6e1831c32 --- nova/scheduler/simple.py | 16 +++++++++------- nova/tests/scheduler/test_scheduler.py | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/nova/scheduler/simple.py b/nova/scheduler/simple.py index 6768205ad6e..cae4a5b7e7f 100644 --- a/nova/scheduler/simple.py +++ b/nova/scheduler/simple.py @@ -40,6 +40,7 @@ class SimpleScheduler(chance.ChanceScheduler): def _schedule_instance(self, context, instance_opts, *_args, **_kwargs): """Picks a host that is up and has the fewest running instances.""" + elevated = context.elevated() availability_zone = instance_opts.get('availability_zone') @@ -48,13 +49,12 @@ def _schedule_instance(self, context, instance_opts, *_args, **_kwargs): zone, _x, host = availability_zone.partition(':') if host and context.is_admin: - service = db.service_get_by_args(context.elevated(), host, - 'nova-compute') + service = db.service_get_by_args(elevated, host, 'nova-compute') if not self.service_is_up(service): raise driver.WillNotSchedule(_("Host %s is not alive") % host) return host - results = db.service_get_all_compute_sorted(context) + results = db.service_get_all_compute_sorted(elevated) if zone: results = [(service, cores) for (service, cores) in results if service['availability_zone'] == zone] @@ -90,6 +90,8 @@ def schedule_start_instance(self, context, instance_id, *_args, **_kwargs): def schedule_create_volume(self, context, volume_id, *_args, **_kwargs): """Picks a host that is up and has the fewest volumes.""" + elevated = context.elevated() + volume_ref = db.volume_get(context, volume_id) availability_zone = volume_ref.get('availability_zone') @@ -97,15 +99,14 @@ def schedule_create_volume(self, context, volume_id, *_args, **_kwargs): if availability_zone: zone, _x, host = availability_zone.partition(':') if host and context.is_admin: - service = db.service_get_by_args(context.elevated(), host, - 'nova-volume') + service = db.service_get_by_args(elevated, host, 'nova-volume') if not self.service_is_up(service): raise driver.WillNotSchedule(_("Host %s not available") % host) driver.cast_to_volume_host(context, host, 'create_volume', volume_id=volume_id, **_kwargs) return None - results = db.service_get_all_volume_sorted(context) + results = db.service_get_all_volume_sorted(elevated) if zone: results = [(service, gigs) for (service, gigs) in results if service['availability_zone'] == zone] @@ -124,8 +125,9 @@ def schedule_create_volume(self, context, volume_id, *_args, **_kwargs): def schedule_set_network_host(self, context, *_args, **_kwargs): """Picks a host that is up and has the fewest networks.""" + elevated = context.elevated() - results = db.service_get_all_network_sorted(context) + results = db.service_get_all_network_sorted(elevated) for result in results: (service, instance_count) = result if instance_count >= FLAGS.max_networks: diff --git a/nova/tests/scheduler/test_scheduler.py b/nova/tests/scheduler/test_scheduler.py index 472def87974..b311cec523c 100644 --- a/nova/tests/scheduler/test_scheduler.py +++ b/nova/tests/scheduler/test_scheduler.py @@ -286,6 +286,25 @@ def _create_compute_service(self, **kwargs): db.compute_node_create(self.context, dic) return db.service_get(self.context, s_ref['id']) + def test_regular_user_can_schedule(self): + """Ensures a non-admin can run an instance""" + compute1 = service.Service('host1', + 'nova-compute', + 'compute', + FLAGS.compute_manager) + compute1.start() + instance_id = _create_instance()['id'] + ctxt = context.RequestContext('fake', 'fake', False) + global instance_ids + instance_ids = [] + self.stubs.Set(SimpleScheduler, + 'create_instance_db_entry', _fake_create_instance_db_entry) + self.stubs.Set(driver, + 'cast_to_compute_host', _fake_cast_to_compute_host) + request_spec = _create_request_spec() + self.scheduler.driver.schedule_run_instance(ctxt, request_spec) + compute1.kill() + def test_doesnt_report_disabled_hosts_as_up_no_queue(self): """Ensures driver doesn't find hosts before they are enabled""" # NOTE(vish): constructing service without create method