Merge "Make conductor's quota methods pass project_id properly"
This commit is contained in:
commit
4aac62be59
@ -324,22 +324,12 @@ class LocalAPI(object):
|
|||||||
migration)
|
migration)
|
||||||
|
|
||||||
def quota_commit(self, context, reservations, project_id=None):
|
def quota_commit(self, context, reservations, project_id=None):
|
||||||
# FIXME(comstud): bug 1153795: Conductor manager should accept
|
return self._manager.quota_commit(context, reservations,
|
||||||
# a project_id kwarg to be able to pass to the quota commit call.
|
project_id=project_id)
|
||||||
if project_id is None:
|
|
||||||
project_id = context.project_id
|
|
||||||
with utils.temporary_mutation(context, project_id=project_id):
|
|
||||||
return self._manager.quota_commit(context,
|
|
||||||
reservations=reservations)
|
|
||||||
|
|
||||||
def quota_rollback(self, context, reservations, project_id=None):
|
def quota_rollback(self, context, reservations, project_id=None):
|
||||||
# FIXME(comstud): bug 1153795: Conductor manager should accept
|
return self._manager.quota_rollback(context, reservations,
|
||||||
# a project_id kwarg to be able to pass to the quota rollback call.
|
project_id=project_id)
|
||||||
if project_id is None:
|
|
||||||
project_id = context.project_id
|
|
||||||
with utils.temporary_mutation(context, project_id=project_id):
|
|
||||||
return self._manager.quota_rollback(context,
|
|
||||||
reservations=reservations)
|
|
||||||
|
|
||||||
def get_ec2_ids(self, context, instance):
|
def get_ec2_ids(self, context, instance):
|
||||||
return self._manager.get_ec2_ids(context, instance)
|
return self._manager.get_ec2_ids(context, instance)
|
||||||
@ -669,20 +659,12 @@ class API(object):
|
|||||||
migration)
|
migration)
|
||||||
|
|
||||||
def quota_commit(self, context, reservations, project_id=None):
|
def quota_commit(self, context, reservations, project_id=None):
|
||||||
# FIXME(comstud): bug 1153795: Conductor manager should accept
|
return self.conductor_rpcapi.quota_commit(context, reservations,
|
||||||
# a project_id kwarg to be able to pass to the quota commit call.
|
project_id=project_id)
|
||||||
if project_id is None:
|
|
||||||
project_id = context.project_id
|
|
||||||
with utils.temporary_mutation(context, project_id=project_id):
|
|
||||||
return self.conductor_rpcapi.quota_commit(context, reservations)
|
|
||||||
|
|
||||||
def quota_rollback(self, context, reservations, project_id=None):
|
def quota_rollback(self, context, reservations, project_id=None):
|
||||||
# FIXME(comstud): bug 1153795: Conductor manager should accept
|
return self.conductor_rpcapi.quota_rollback(context, reservations,
|
||||||
# a project_id kwarg to be able to pass to the quota rollback call.
|
project_id=project_id)
|
||||||
if project_id is None:
|
|
||||||
project_id = context.project_id
|
|
||||||
with utils.temporary_mutation(context, project_id=project_id):
|
|
||||||
return self.conductor_rpcapi.quota_rollback(context, reservations)
|
|
||||||
|
|
||||||
def get_ec2_ids(self, context, instance):
|
def get_ec2_ids(self, context, instance):
|
||||||
return self.conductor_rpcapi.get_ec2_ids(context, instance)
|
return self.conductor_rpcapi.get_ec2_ids(context, instance)
|
||||||
|
@ -49,7 +49,7 @@ datetime_fields = ['launched_at', 'terminated_at', 'updated_at']
|
|||||||
class ConductorManager(manager.Manager):
|
class ConductorManager(manager.Manager):
|
||||||
"""Mission: TBD."""
|
"""Mission: TBD."""
|
||||||
|
|
||||||
RPC_API_VERSION = '1.44'
|
RPC_API_VERSION = '1.45'
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(ConductorManager, self).__init__(*args, **kwargs)
|
super(ConductorManager, self).__init__(*args, **kwargs)
|
||||||
@ -398,11 +398,11 @@ class ConductorManager(manager.Manager):
|
|||||||
def network_migrate_instance_finish(self, context, instance, migration):
|
def network_migrate_instance_finish(self, context, instance, migration):
|
||||||
self.network_api.migrate_instance_finish(context, instance, migration)
|
self.network_api.migrate_instance_finish(context, instance, migration)
|
||||||
|
|
||||||
def quota_commit(self, context, reservations):
|
def quota_commit(self, context, reservations, project_id=None):
|
||||||
quota.QUOTAS.commit(context, reservations)
|
quota.QUOTAS.commit(context, reservations, project_id=project_id)
|
||||||
|
|
||||||
def quota_rollback(self, context, reservations):
|
def quota_rollback(self, context, reservations, project_id=None):
|
||||||
quota.QUOTAS.rollback(context, reservations)
|
quota.QUOTAS.rollback(context, reservations, project_id=project_id)
|
||||||
|
|
||||||
def get_ec2_ids(self, context, instance):
|
def get_ec2_ids(self, context, instance):
|
||||||
ec2_ids = {}
|
ec2_ids = {}
|
||||||
|
@ -82,6 +82,7 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy):
|
|||||||
1.42 - Added get_ec2_ids, aggregate_metadata_get_by_host
|
1.42 - Added get_ec2_ids, aggregate_metadata_get_by_host
|
||||||
1.43 - Added compute_stop
|
1.43 - Added compute_stop
|
||||||
1.44 - Added compute_node_delete
|
1.44 - Added compute_node_delete
|
||||||
|
1.45 - Added project_id to quota_commit and quota_rollback
|
||||||
"""
|
"""
|
||||||
|
|
||||||
BASE_RPC_API_VERSION = '1.0'
|
BASE_RPC_API_VERSION = '1.0'
|
||||||
@ -414,15 +415,17 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy):
|
|||||||
instance=instance_p, migration=migration_p)
|
instance=instance_p, migration=migration_p)
|
||||||
return self.call(context, msg, version='1.41')
|
return self.call(context, msg, version='1.41')
|
||||||
|
|
||||||
def quota_commit(self, context, reservations):
|
def quota_commit(self, context, reservations, project_id=None):
|
||||||
reservations_p = jsonutils.to_primitive(reservations)
|
reservations_p = jsonutils.to_primitive(reservations)
|
||||||
msg = self.make_msg('quota_commit', reservations=reservations_p)
|
msg = self.make_msg('quota_commit', reservations=reservations_p,
|
||||||
return self.call(context, msg, version='1.41')
|
project_id=project_id)
|
||||||
|
return self.call(context, msg, version='1.45')
|
||||||
|
|
||||||
def quota_rollback(self, context, reservations):
|
def quota_rollback(self, context, reservations, project_id=None):
|
||||||
reservations_p = jsonutils.to_primitive(reservations)
|
reservations_p = jsonutils.to_primitive(reservations)
|
||||||
msg = self.make_msg('quota_rollback', reservations=reservations_p)
|
msg = self.make_msg('quota_rollback', reservations=reservations_p,
|
||||||
return self.call(context, msg, version='1.41')
|
project_id=project_id)
|
||||||
|
return self.call(context, msg, version='1.45')
|
||||||
|
|
||||||
def get_ec2_ids(self, context, instance):
|
def get_ec2_ids(self, context, instance):
|
||||||
instance_p = jsonutils.to_primitive(instance)
|
instance_p = jsonutils.to_primitive(instance)
|
||||||
|
@ -2119,25 +2119,31 @@ class ComputeTestCase(BaseTestCase):
|
|||||||
for operation in actions:
|
for operation in actions:
|
||||||
self._test_state_revert(instance, *operation)
|
self._test_state_revert(instance, *operation)
|
||||||
|
|
||||||
def _ensure_quota_reservations_committed(self):
|
def _ensure_quota_reservations_committed(self, expect_project=False):
|
||||||
"""Mock up commit of quota reservations."""
|
"""Mock up commit of quota reservations."""
|
||||||
reservations = list('fake_res')
|
reservations = list('fake_res')
|
||||||
self.mox.StubOutWithMock(nova.quota.QUOTAS, 'commit')
|
self.mox.StubOutWithMock(nova.quota.QUOTAS, 'commit')
|
||||||
nova.quota.QUOTAS.commit(mox.IgnoreArg(), reservations)
|
nova.quota.QUOTAS.commit(mox.IgnoreArg(), reservations,
|
||||||
|
project_id=(expect_project and
|
||||||
|
self.context.project_id or
|
||||||
|
None))
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
return reservations
|
return reservations
|
||||||
|
|
||||||
def _ensure_quota_reservations_rolledback(self):
|
def _ensure_quota_reservations_rolledback(self, expect_project=False):
|
||||||
"""Mock up rollback of quota reservations."""
|
"""Mock up rollback of quota reservations."""
|
||||||
reservations = list('fake_res')
|
reservations = list('fake_res')
|
||||||
self.mox.StubOutWithMock(nova.quota.QUOTAS, 'rollback')
|
self.mox.StubOutWithMock(nova.quota.QUOTAS, 'rollback')
|
||||||
nova.quota.QUOTAS.rollback(mox.IgnoreArg(), reservations)
|
nova.quota.QUOTAS.rollback(mox.IgnoreArg(), reservations,
|
||||||
|
project_id=(expect_project and
|
||||||
|
self.context.project_id or
|
||||||
|
None))
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
return reservations
|
return reservations
|
||||||
|
|
||||||
def test_quotas_succesful_delete(self):
|
def test_quotas_succesful_delete(self):
|
||||||
instance = jsonutils.to_primitive(self._create_fake_instance())
|
instance = jsonutils.to_primitive(self._create_fake_instance())
|
||||||
resvs = self._ensure_quota_reservations_committed()
|
resvs = self._ensure_quota_reservations_committed(True)
|
||||||
self.compute.terminate_instance(self.context, instance,
|
self.compute.terminate_instance(self.context, instance,
|
||||||
bdms=None, reservations=resvs)
|
bdms=None, reservations=resvs)
|
||||||
|
|
||||||
@ -2150,7 +2156,7 @@ class ComputeTestCase(BaseTestCase):
|
|||||||
self.stubs.Set(self.compute, '_shutdown_instance',
|
self.stubs.Set(self.compute, '_shutdown_instance',
|
||||||
fake_shutdown_instance)
|
fake_shutdown_instance)
|
||||||
|
|
||||||
resvs = self._ensure_quota_reservations_rolledback()
|
resvs = self._ensure_quota_reservations_rolledback(True)
|
||||||
self.assertRaises(test.TestingException,
|
self.assertRaises(test.TestingException,
|
||||||
self.compute.terminate_instance,
|
self.compute.terminate_instance,
|
||||||
self.context, instance,
|
self.context, instance,
|
||||||
@ -2159,7 +2165,7 @@ class ComputeTestCase(BaseTestCase):
|
|||||||
def test_quotas_succesful_soft_delete(self):
|
def test_quotas_succesful_soft_delete(self):
|
||||||
instance = jsonutils.to_primitive(self._create_fake_instance(
|
instance = jsonutils.to_primitive(self._create_fake_instance(
|
||||||
params=dict(task_state=task_states.SOFT_DELETING)))
|
params=dict(task_state=task_states.SOFT_DELETING)))
|
||||||
resvs = self._ensure_quota_reservations_committed()
|
resvs = self._ensure_quota_reservations_committed(True)
|
||||||
self.compute.soft_delete_instance(self.context, instance,
|
self.compute.soft_delete_instance(self.context, instance,
|
||||||
reservations=resvs)
|
reservations=resvs)
|
||||||
|
|
||||||
@ -2173,7 +2179,7 @@ class ComputeTestCase(BaseTestCase):
|
|||||||
self.stubs.Set(self.compute.driver, 'soft_delete',
|
self.stubs.Set(self.compute.driver, 'soft_delete',
|
||||||
fake_soft_delete)
|
fake_soft_delete)
|
||||||
|
|
||||||
resvs = self._ensure_quota_reservations_rolledback()
|
resvs = self._ensure_quota_reservations_rolledback(True)
|
||||||
self.assertRaises(test.TestingException,
|
self.assertRaises(test.TestingException,
|
||||||
self.compute.soft_delete_instance,
|
self.compute.soft_delete_instance,
|
||||||
self.context, instance,
|
self.context, instance,
|
||||||
|
@ -546,15 +546,19 @@ class _BaseTestCase(object):
|
|||||||
|
|
||||||
def test_quota_commit(self):
|
def test_quota_commit(self):
|
||||||
self.mox.StubOutWithMock(quota.QUOTAS, 'commit')
|
self.mox.StubOutWithMock(quota.QUOTAS, 'commit')
|
||||||
quota.QUOTAS.commit(self.context, 'reservations')
|
quota.QUOTAS.commit(self.context, 'reservations', project_id=None)
|
||||||
|
quota.QUOTAS.commit(self.context, 'reservations', project_id='proj')
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
self.conductor.quota_commit(self.context, 'reservations')
|
self.conductor.quota_commit(self.context, 'reservations')
|
||||||
|
self.conductor.quota_commit(self.context, 'reservations', 'proj')
|
||||||
|
|
||||||
def test_quota_rollback(self):
|
def test_quota_rollback(self):
|
||||||
self.mox.StubOutWithMock(quota.QUOTAS, 'rollback')
|
self.mox.StubOutWithMock(quota.QUOTAS, 'rollback')
|
||||||
quota.QUOTAS.rollback(self.context, 'reservations')
|
quota.QUOTAS.rollback(self.context, 'reservations', project_id=None)
|
||||||
|
quota.QUOTAS.rollback(self.context, 'reservations', project_id='proj')
|
||||||
self.mox.ReplayAll()
|
self.mox.ReplayAll()
|
||||||
self.conductor.quota_rollback(self.context, 'reservations')
|
self.conductor.quota_rollback(self.context, 'reservations')
|
||||||
|
self.conductor.quota_rollback(self.context, 'reservations', 'proj')
|
||||||
|
|
||||||
def test_get_ec2_ids(self):
|
def test_get_ec2_ids(self):
|
||||||
expected = {
|
expected = {
|
||||||
@ -1067,40 +1071,6 @@ class ConductorAPITestCase(_BaseTestCase, test.TestCase):
|
|||||||
self.conductor.security_groups_trigger_handler(self.context,
|
self.conductor.security_groups_trigger_handler(self.context,
|
||||||
'event', 'arg')
|
'event', 'arg')
|
||||||
|
|
||||||
def test_quota_commit_with_project_id(self):
|
|
||||||
diff_proj_id = 'diff_fake_proj_id'
|
|
||||||
self.assertNotEqual(self.context.project_id, diff_proj_id)
|
|
||||||
call_info = {}
|
|
||||||
|
|
||||||
def mgr_quota_commit(ctxt, reservations):
|
|
||||||
call_info['resvs'] = reservations
|
|
||||||
call_info['project_id'] = ctxt.project_id
|
|
||||||
|
|
||||||
self.stubs.Set(self.conductor_manager, 'quota_commit',
|
|
||||||
mgr_quota_commit)
|
|
||||||
|
|
||||||
self.conductor.quota_commit(self.context, 'fake_resvs',
|
|
||||||
project_id=diff_proj_id)
|
|
||||||
self.assertEqual(diff_proj_id, call_info['project_id'])
|
|
||||||
self.assertEqual('fake_resvs', call_info['resvs'])
|
|
||||||
|
|
||||||
def test_quota_rollback_with_project_id(self):
|
|
||||||
diff_proj_id = 'diff_fake_proj_id'
|
|
||||||
self.assertNotEqual(self.context.project_id, diff_proj_id)
|
|
||||||
call_info = {}
|
|
||||||
|
|
||||||
def mgr_quota_rollback(ctxt, reservations):
|
|
||||||
call_info['resvs'] = reservations
|
|
||||||
call_info['project_id'] = ctxt.project_id
|
|
||||||
|
|
||||||
self.stubs.Set(self.conductor_manager, 'quota_rollback',
|
|
||||||
mgr_quota_rollback)
|
|
||||||
|
|
||||||
self.conductor.quota_rollback(self.context, 'fake_resvs',
|
|
||||||
project_id=diff_proj_id)
|
|
||||||
self.assertEqual(diff_proj_id, call_info['project_id'])
|
|
||||||
self.assertEqual('fake_resvs', call_info['resvs'])
|
|
||||||
|
|
||||||
|
|
||||||
class ConductorLocalAPITestCase(ConductorAPITestCase):
|
class ConductorLocalAPITestCase(ConductorAPITestCase):
|
||||||
"""Conductor LocalAPI Tests."""
|
"""Conductor LocalAPI Tests."""
|
||||||
|
Loading…
Reference in New Issue
Block a user