diff --git a/bin/nova-manage b/bin/nova-manage index f8127243..a4eaf9d6 100755 --- a/bin/nova-manage +++ b/bin/nova-manage @@ -105,6 +105,8 @@ flags.DECLARE('vpn_start', 'nova.network.manager') flags.DECLARE('default_floating_pool', 'nova.network.manager') flags.DECLARE('public_interface', 'nova.network.linux_net') +QUOTAS = quota.QUOTAS + # Decorators for actions def args(*args, **kwargs): @@ -493,11 +495,11 @@ class ProjectCommands(object): db.quota_update(ctxt, project_id, key, value) except exception.ProjectQuotaNotFound: db.quota_create(ctxt, project_id, key, value) - project_quota = quota.get_project_quotas(ctxt, project_id) + project_quota = QUOTAS.get_project_quotas(ctxt, project_id) for key, value in project_quota.iteritems(): - if value is None: - value = 'unlimited' - print '%s: %s' % (key, value) + if value['limit'] < 0 or value['limit'] is None: + value['limit'] = 'unlimited' + print '%s: %s' % (key, value['limit']) @args('--project', dest="project_id", metavar='', help='Project name') diff --git a/nova/scheduler/rpcapi.py b/nova/scheduler/rpcapi.py index 4d7449c9..0e4052a7 100644 --- a/nova/scheduler/rpcapi.py +++ b/nova/scheduler/rpcapi.py @@ -41,14 +41,15 @@ class SchedulerAPI(nova.rpc.proxy.RpcProxy): def run_instance(self, ctxt, topic, request_spec, admin_password, injected_files, requested_networks, is_first_time, - filter_properties, call=True): + filter_properties, reservations, call=True): rpc_method = self.call if call else self.cast return rpc_method(ctxt, self.make_msg('run_instance', topic=topic, request_spec=request_spec, admin_password=admin_password, injected_files=injected_files, requested_networks=requested_networks, is_first_time=is_first_time, - filter_properties=filter_properties)) + filter_properties=filter_properties, + reservations=reservations)) def prep_resize(self, ctxt, topic, instance_uuid, instance_type_id, image, update_db, request_spec, filter_properties): diff --git a/nova/scheduler/simple.py b/nova/scheduler/simple.py index 651b50af..820eaaa3 100644 --- a/nova/scheduler/simple.py +++ b/nova/scheduler/simple.py @@ -91,7 +91,8 @@ class SimpleScheduler(chance.ChanceScheduler): msg = _("Is the appropriate service running?") raise exception.NoValidHost(reason=msg) - def schedule_run_instance(self, context, request_spec, *_args, **_kwargs): + def schedule_run_instance(self, context, request_spec, reservations, + *_args, **_kwargs): num_instances = request_spec.get('num_instances', 1) instances = [] for num in xrange(num_instances): @@ -99,7 +100,7 @@ class SimpleScheduler(chance.ChanceScheduler): request_spec['instance_properties'], *_args, **_kwargs) request_spec['instance_properties']['launch_index'] = num instance_ref = self.create_instance_db_entry(context, - request_spec) + request_spec, reservations) driver.cast_to_compute_host(context, host, 'run_instance', instance_uuid=instance_ref['uuid'], **_kwargs) instances.append(driver.encode_instance(instance_ref)) diff --git a/nova/tests/scheduler/test_rpcapi.py b/nova/tests/scheduler/test_rpcapi.py index 3f5a77fa..3617cecd 100644 --- a/nova/tests/scheduler/test_rpcapi.py +++ b/nova/tests/scheduler/test_rpcapi.py @@ -68,14 +68,16 @@ class SchedulerRpcAPITestCase(test.TestCase): topic='fake_topic', request_spec='fake_request_spec', admin_password='pw', injected_files='fake_injected_files', requested_networks='fake_requested_networks', - is_first_time=True, filter_properties='fake_filter_properties') + is_first_time=True, filter_properties='fake_filter_properties', + reservations=None) def test_run_instance_cast(self): self._test_scheduler_api('run_instance', rpc_method='cast', topic='fake_topic', request_spec='fake_request_spec', admin_password='pw', injected_files='fake_injected_files', requested_networks='fake_requested_networks', - is_first_time=True, filter_properties='fake_filter_properties') + is_first_time=True, filter_properties='fake_filter_properties', + reservations=None) def test_prep_resize(self): self._test_scheduler_api('prep_resize', rpc_method='cast', diff --git a/nova/tests/test_volume.py b/nova/tests/test_volume.py index 607b0d49..f9b54bad 100644 --- a/nova/tests/test_volume.py +++ b/nova/tests/test_volume.py @@ -32,10 +32,12 @@ from nova import log as logging from nova.notifier import test_notifier from nova.openstack.common import importutils import nova.policy +from nova import quota from nova import rpc from nova import test import nova.volume.api +QUOTAS = quota.QUOTAS FLAGS = flags.FLAGS LOG = logging.getLogger(__name__) @@ -90,6 +92,20 @@ class VolumeTestCase(test.TestCase): def test_create_delete_volume(self): """Test volume can be created and deleted.""" + # Need to stub out reserve, commit, and rollback + def fake_reserve(context, expire=None, **deltas): + return ["RESERVATION"] + + def fake_commit(context, reservations): + pass + + def fake_rollback(context, reservations): + pass + + self.stubs.Set(QUOTAS, "reserve", fake_reserve) + self.stubs.Set(QUOTAS, "commit", fake_commit) + self.stubs.Set(QUOTAS, "rollback", fake_rollback) + volume = self._create_volume() volume_id = volume['id'] self.assertEquals(len(test_notifier.NOTIFICATIONS), 0)