summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVishvananda Ishaya <vishvananda@gmail.com>2011-11-03 19:55:00 -0700
committerVishvananda Ishaya <vishvananda@gmail.com>2011-11-03 20:06:12 -0700
commit36f6da47b08680de13fffa13015a4ae2902d2e63 (patch)
tree4a6b6db714ad6733bc0a7e7208d2483705372423
parent7c5fa147eaf2133485255b0558afd4cd6ce42bc3 (diff)
downloadnova-36f6da47b08680de13fffa13015a4ae2902d2e63.tar.gz
nova-36f6da47b08680de13fffa13015a4ae2902d2e63.tar.xz
nova-36f6da47b08680de13fffa13015a4ae2902d2e63.zip
Allows non-admin users to use simple scheduler
Fixes bug 885955 Change-Id: I88be04cbc55e272162328a33656fc5d6e1831c32
-rw-r--r--nova/scheduler/simple.py16
-rw-r--r--nova/tests/scheduler/test_scheduler.py19
2 files changed, 28 insertions, 7 deletions
diff --git a/nova/scheduler/simple.py b/nova/scheduler/simple.py
index 6768205ad..cae4a5b7e 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 @@ class SimpleScheduler(chance.ChanceScheduler):
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 @@ class SimpleScheduler(chance.ChanceScheduler):
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 @@ class SimpleScheduler(chance.ChanceScheduler):
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 @@ class SimpleScheduler(chance.ChanceScheduler):
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 472def879..b311cec52 100644
--- a/nova/tests/scheduler/test_scheduler.py
+++ b/nova/tests/scheduler/test_scheduler.py
@@ -286,6 +286,25 @@ class SimpleDriverTestCase(test.TestCase):
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