Fix a issue on retrieving default quota in Create Project
quota names for security group are different between nova and neutron,
so the same appoach can be used for floating IP. This commit reverts
the change in get_default_quota_data in commit c44552fe66
and changes
get_disabled_quotas to determine security group and rules quotas come
from nova or neutron.
Change-Id: I9e39ac99f1e8c7ccdce64b2e2ab79615cac50892
Closes-Bug: #1235053
This commit is contained in:
parent
92708aef2c
commit
9fa87dad19
|
@ -103,11 +103,14 @@ class UpdateDefaultQuotasTests(test.BaseAdminViewTests):
|
|||
|
||||
@test.create_stubs({api.nova: ('default_quota_update', ),
|
||||
api.cinder: ('default_quota_update', ),
|
||||
quotas: ('get_default_quota_data', )})
|
||||
quotas: ('get_default_quota_data',
|
||||
'get_disabled_quotas')})
|
||||
def test_update_default_quotas(self):
|
||||
quota = self.quotas.first()
|
||||
|
||||
# init
|
||||
quotas.get_disabled_quotas(IsA(http.HttpRequest)) \
|
||||
.AndReturn(self.disabled_quotas.first())
|
||||
quotas.get_default_quota_data(IsA(http.HttpRequest)).AndReturn(quota)
|
||||
|
||||
# update some fields
|
||||
|
|
|
@ -133,6 +133,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
'user_list',
|
||||
'group_list',
|
||||
'role_list'),
|
||||
api.base: ('is_service_enabled',),
|
||||
api.neutron: ('is_extension_supported',),
|
||||
quotas: ('get_default_quota_data',)})
|
||||
def test_add_project_get(self):
|
||||
quota = self.quotas.first()
|
||||
|
@ -144,8 +146,14 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
roles = self.roles.list()
|
||||
|
||||
# init
|
||||
api.base.is_service_enabled(IsA(http.HttpRequest), 'network') \
|
||||
.MultipleTimes().AndReturn(True)
|
||||
api.base.is_service_enabled(IsA(http.HttpRequest), 'volume') \
|
||||
.MultipleTimes().AndReturn(True)
|
||||
api.keystone.get_default_domain(IsA(http.HttpRequest)) \
|
||||
.AndReturn(default_domain)
|
||||
api.neutron.is_extension_supported(
|
||||
IsA(http.HttpRequest), 'security-group').AndReturn(True)
|
||||
quotas.get_default_quota_data(IsA(http.HttpRequest)).AndReturn(quota)
|
||||
|
||||
api.keystone.get_default_role(IsA(http.HttpRequest)) \
|
||||
|
@ -203,6 +211,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
.AndReturn(quota)
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest), 'quotas') \
|
||||
.MultipleTimes().AndReturn(True)
|
||||
api.neutron.is_extension_supported(
|
||||
IsA(http.HttpRequest), 'security-group').AndReturn(True)
|
||||
api.neutron.tenant_quota_get(IsA(http.HttpRequest),
|
||||
tenant_id=self.tenant.id) \
|
||||
.AndReturn(neutron_quotas)
|
||||
|
@ -240,7 +250,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
'group_list',
|
||||
'role_list',
|
||||
'domain_get'),
|
||||
quotas: ('get_default_quota_data',),
|
||||
quotas: ('get_default_quota_data',
|
||||
'get_disabled_quotas'),
|
||||
api.cinder: ('tenant_quota_update',),
|
||||
api.nova: ('tenant_quota_update',)})
|
||||
def test_add_project_post(self):
|
||||
|
@ -254,6 +265,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
roles = self.roles.list()
|
||||
|
||||
# init
|
||||
quotas.get_disabled_quotas(IsA(http.HttpRequest)) \
|
||||
.AndReturn(self.disabled_quotas.first())
|
||||
quotas.get_default_quota_data(IsA(http.HttpRequest)).AndReturn(quota)
|
||||
|
||||
api.keystone.get_default_role(IsA(http.HttpRequest)) \
|
||||
|
@ -325,6 +338,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
neutron_updated_quota = dict([(key, quota_data.get(key).limit)
|
||||
for key in quotas.NEUTRON_QUOTA_FIELDS])
|
||||
|
||||
api.neutron.is_extension_supported(
|
||||
IsA(http.HttpRequest), 'security-group').AndReturn(True)
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest), 'quotas') \
|
||||
.MultipleTimes().AndReturn(True)
|
||||
api.neutron.tenant_quota_update(IsA(http.HttpRequest),
|
||||
|
@ -337,7 +352,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
'group_list',
|
||||
'get_default_domain',
|
||||
'get_default_role'),
|
||||
quotas: ('get_default_quota_data',)})
|
||||
quotas: ('get_default_quota_data',
|
||||
'get_disabled_quotas')})
|
||||
def test_add_project_quota_defaults_error(self):
|
||||
default_role = self.roles.first()
|
||||
default_domain = self._get_default_domain()
|
||||
|
@ -349,6 +365,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
# init
|
||||
api.keystone.get_default_domain(IsA(http.HttpRequest)) \
|
||||
.AndReturn(default_domain)
|
||||
quotas.get_disabled_quotas(IsA(http.HttpRequest)) \
|
||||
.AndReturn(self.disabled_quotas.first())
|
||||
quotas.get_default_quota_data(IsA(http.HttpRequest)) \
|
||||
.AndRaise(self.exceptions.nova)
|
||||
|
||||
|
@ -381,7 +399,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
'group_list',
|
||||
'get_default_domain',
|
||||
'get_default_role'),
|
||||
quotas: ('get_default_quota_data',)})
|
||||
quotas: ('get_default_quota_data',
|
||||
'get_disabled_quotas')})
|
||||
def test_add_project_tenant_create_error(self):
|
||||
project = self.tenants.first()
|
||||
quota = self.quotas.first()
|
||||
|
@ -395,6 +414,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
# init
|
||||
api.keystone.get_default_domain(IsA(http.HttpRequest)) \
|
||||
.AndReturn(default_domain)
|
||||
quotas.get_disabled_quotas(IsA(http.HttpRequest)) \
|
||||
.AndReturn(self.disabled_quotas.first())
|
||||
quotas.get_default_quota_data(IsA(http.HttpRequest)).AndReturn(quota)
|
||||
|
||||
api.keystone.get_default_role(IsA(http.HttpRequest)) \
|
||||
|
@ -435,7 +456,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
'get_default_domain',
|
||||
'get_default_role',
|
||||
'add_tenant_user_role'),
|
||||
quotas: ('get_default_quota_data',),
|
||||
quotas: ('get_default_quota_data',
|
||||
'get_disabled_quotas'),
|
||||
api.nova: ('tenant_quota_update',)})
|
||||
def test_add_project_quota_update_error(self):
|
||||
project = self.tenants.first()
|
||||
|
@ -450,6 +472,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
# init
|
||||
api.keystone.get_default_domain(IsA(http.HttpRequest)) \
|
||||
.AndReturn(default_domain)
|
||||
quotas.get_disabled_quotas(IsA(http.HttpRequest)) \
|
||||
.AndReturn(self.disabled_quotas.first())
|
||||
quotas.get_default_quota_data(IsA(http.HttpRequest)).AndReturn(quota)
|
||||
|
||||
api.keystone.get_default_role(IsA(http.HttpRequest)) \
|
||||
|
@ -516,7 +540,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
'get_default_domain',
|
||||
'get_default_role',
|
||||
'add_tenant_user_role'),
|
||||
quotas: ('get_default_quota_data',),
|
||||
quotas: ('get_default_quota_data',
|
||||
'get_disabled_quotas'),
|
||||
api.cinder: ('tenant_quota_update',),
|
||||
api.nova: ('tenant_quota_update',)})
|
||||
def test_add_project_user_update_error(self):
|
||||
|
@ -532,6 +557,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
# init
|
||||
api.keystone.get_default_domain(IsA(http.HttpRequest)) \
|
||||
.AndReturn(default_domain)
|
||||
quotas.get_disabled_quotas(IsA(http.HttpRequest)) \
|
||||
.AndReturn(self.disabled_quotas.first())
|
||||
quotas.get_default_quota_data(IsA(http.HttpRequest)).AndReturn(quota)
|
||||
|
||||
api.keystone.get_default_role(IsA(http.HttpRequest)) \
|
||||
|
@ -596,7 +623,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
'group_list',
|
||||
'get_default_domain',
|
||||
'get_default_role'),
|
||||
quotas: ('get_default_quota_data',)})
|
||||
quotas: ('get_default_quota_data',
|
||||
'get_disabled_quotas')})
|
||||
def test_add_project_missing_field_error(self):
|
||||
project = self.tenants.first()
|
||||
quota = self.quotas.first()
|
||||
|
@ -610,6 +638,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
# init
|
||||
api.keystone.get_default_domain(IsA(http.HttpRequest)) \
|
||||
.AndReturn(default_domain)
|
||||
quotas.get_disabled_quotas(IsA(http.HttpRequest)) \
|
||||
.AndReturn(self.disabled_quotas.first())
|
||||
quotas.get_default_quota_data(IsA(http.HttpRequest)).AndReturn(quota)
|
||||
|
||||
api.keystone.get_default_role(IsA(http.HttpRequest)) \
|
||||
|
@ -683,7 +713,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
'roles_for_group',
|
||||
'group_list',
|
||||
'role_list'),
|
||||
quotas: ('get_tenant_quota_data',)})
|
||||
quotas: ('get_tenant_quota_data',
|
||||
'get_disabled_quotas')})
|
||||
def test_update_project_get(self):
|
||||
project = self.tenants.first()
|
||||
quota = self.quotas.first()
|
||||
|
@ -699,6 +730,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
.AndReturn(project)
|
||||
api.keystone.domain_get(IsA(http.HttpRequest), domain_id) \
|
||||
.AndReturn(self.domain)
|
||||
quotas.get_disabled_quotas(IsA(http.HttpRequest)) \
|
||||
.AndReturn(self.disabled_quotas.first())
|
||||
quotas.get_tenant_quota_data(IsA(http.HttpRequest),
|
||||
tenant_id=self.tenant.id) \
|
||||
.AndReturn(quota)
|
||||
|
@ -764,7 +797,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
'role_list'),
|
||||
api.nova: ('tenant_quota_update',),
|
||||
api.cinder: ('tenant_quota_update',),
|
||||
quotas: ('get_tenant_quota_data',)})
|
||||
quotas: ('get_tenant_quota_data',
|
||||
'get_disabled_quotas')})
|
||||
def test_update_project_save(self):
|
||||
project = self.tenants.first()
|
||||
quota = self.quotas.first()
|
||||
|
@ -782,6 +816,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
.AndReturn(project)
|
||||
api.keystone.domain_get(IsA(http.HttpRequest), domain_id) \
|
||||
.AndReturn(self.domain)
|
||||
quotas.get_disabled_quotas(IsA(http.HttpRequest)) \
|
||||
.AndReturn(self.disabled_quotas.first())
|
||||
quotas.get_tenant_quota_data(IsA(http.HttpRequest),
|
||||
tenant_id=self.tenant.id) \
|
||||
.AndReturn(quota)
|
||||
|
@ -993,7 +1029,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
'add_group_role',
|
||||
'group_list',
|
||||
'role_list'),
|
||||
quotas: ('get_tenant_quota_data',),
|
||||
quotas: ('get_tenant_quota_data',
|
||||
'get_disabled_quotas'),
|
||||
api.nova: ('tenant_quota_update',)})
|
||||
def test_update_project_tenant_update_error(self):
|
||||
project = self.tenants.first()
|
||||
|
@ -1011,6 +1048,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
.AndReturn(project)
|
||||
api.keystone.domain_get(IsA(http.HttpRequest), domain_id) \
|
||||
.AndReturn(self.domain)
|
||||
quotas.get_disabled_quotas(IsA(http.HttpRequest)) \
|
||||
.AndReturn(self.disabled_quotas.first())
|
||||
quotas.get_tenant_quota_data(IsA(http.HttpRequest),
|
||||
tenant_id=self.tenant.id) \
|
||||
.AndReturn(quota)
|
||||
|
@ -1094,7 +1133,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
'add_group_role',
|
||||
'group_list',
|
||||
'role_list'),
|
||||
quotas: ('get_tenant_quota_data',),
|
||||
quotas: ('get_tenant_quota_data',
|
||||
'get_disabled_quotas'),
|
||||
api.nova: ('tenant_quota_update',)})
|
||||
def test_update_project_quota_update_error(self):
|
||||
project = self.tenants.first()
|
||||
|
@ -1113,6 +1153,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
.AndReturn(project)
|
||||
api.keystone.domain_get(IsA(http.HttpRequest), domain_id) \
|
||||
.AndReturn(self.domain)
|
||||
quotas.get_disabled_quotas(IsA(http.HttpRequest)) \
|
||||
.AndReturn(self.disabled_quotas.first())
|
||||
quotas.get_tenant_quota_data(IsA(http.HttpRequest),
|
||||
tenant_id=self.tenant.id) \
|
||||
.AndReturn(quota)
|
||||
|
@ -1255,7 +1297,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
'add_group_role',
|
||||
'group_list',
|
||||
'role_list'),
|
||||
quotas: ('get_tenant_quota_data',)})
|
||||
quotas: ('get_tenant_quota_data',
|
||||
'get_disabled_quotas')})
|
||||
def test_update_project_member_update_error(self):
|
||||
project = self.tenants.first()
|
||||
quota = self.quotas.first()
|
||||
|
@ -1272,6 +1315,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
.AndReturn(project)
|
||||
api.keystone.domain_get(IsA(http.HttpRequest), domain_id) \
|
||||
.AndReturn(self.domain)
|
||||
quotas.get_disabled_quotas(IsA(http.HttpRequest)) \
|
||||
.AndReturn(self.disabled_quotas.first())
|
||||
quotas.get_tenant_quota_data(IsA(http.HttpRequest),
|
||||
tenant_id=self.tenant.id) \
|
||||
.AndReturn(quota)
|
||||
|
@ -1363,7 +1408,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
@test.create_stubs({api.keystone: ('get_default_role',
|
||||
'tenant_get',
|
||||
'domain_get'),
|
||||
quotas: ('get_tenant_quota_data',)})
|
||||
quotas: ('get_tenant_quota_data',
|
||||
'get_disabled_quotas')})
|
||||
def test_update_project_when_default_role_does_not_exist(self):
|
||||
project = self.tenants.first()
|
||||
domain_id = project.domain_id
|
||||
|
@ -1376,6 +1422,8 @@ class UpdateProjectWorkflowTests(test.BaseAdminViewTests):
|
|||
.AndReturn(project)
|
||||
api.keystone.domain_get(IsA(http.HttpRequest), domain_id) \
|
||||
.AndReturn(self.domain)
|
||||
quotas.get_disabled_quotas(IsA(http.HttpRequest)) \
|
||||
.AndReturn(self.disabled_quotas.first())
|
||||
quotas.get_tenant_quota_data(IsA(http.HttpRequest),
|
||||
tenant_id=self.tenant.id) \
|
||||
.AndReturn(quota)
|
||||
|
|
|
@ -64,6 +64,10 @@ class UpdateProjectQuotaAction(workflows.Action):
|
|||
label=_("Security Group Rules"))
|
||||
|
||||
# Neutron
|
||||
security_group = forms.IntegerField(min_value=-1,
|
||||
label=_("Security Groups"))
|
||||
security_group_rule = forms.IntegerField(min_value=-1,
|
||||
label=_("Security Group Rules"))
|
||||
floatingip = forms.IntegerField(min_value=-1, label=_("Floating IPs"))
|
||||
network = forms.IntegerField(min_value=-1, label=_("Networks"))
|
||||
port = forms.IntegerField(min_value=-1, label=_("Ports"))
|
||||
|
|
|
@ -202,6 +202,8 @@ class FloatingIpNeutronViewTests(FloatingIpViewTests):
|
|||
.AndReturn(self.snapshots.list())
|
||||
api.cinder.tenant_quota_get(IsA(http.HttpRequest), '1') \
|
||||
.AndReturn(self.cinder_quotas.first())
|
||||
api.neutron.is_extension_supported(
|
||||
IsA(http.HttpRequest), 'security-group').AndReturn(True)
|
||||
api.neutron.is_extension_supported(IsA(http.HttpRequest), 'quotas') \
|
||||
.AndReturn(True)
|
||||
api.neutron.tenant_quota_get(IsA(http.HttpRequest), self.tenant.id) \
|
||||
|
|
|
@ -159,6 +159,7 @@ def data(TEST):
|
|||
TEST.volumes = utils.TestDataContainer()
|
||||
TEST.quotas = utils.TestDataContainer()
|
||||
TEST.quota_usages = utils.TestDataContainer()
|
||||
TEST.disabled_quotas = utils.TestDataContainer()
|
||||
TEST.floating_ips = utils.TestDataContainer()
|
||||
TEST.floating_ips_uuid = utils.TestDataContainer()
|
||||
TEST.usages = utils.TestDataContainer()
|
||||
|
@ -362,6 +363,11 @@ def data(TEST):
|
|||
TEST.quotas.nova = base.QuotaSet(quota)
|
||||
TEST.quotas.add(base.QuotaSet(quota))
|
||||
|
||||
# nova quotas disabled when neutron is enabled
|
||||
disabled_quotas_nova = ['floating_ips', 'fixed_ips',
|
||||
'security_groups', 'security_group_rules']
|
||||
TEST.disabled_quotas.add(disabled_quotas_nova)
|
||||
|
||||
# Quota Usages
|
||||
quota_usage_data = {'gigabytes': {'used': 0,
|
||||
'quota': 1000},
|
||||
|
|
|
@ -39,7 +39,10 @@ NEUTRON_QUOTA_FIELDS = ("network",
|
|||
"subnet",
|
||||
"port",
|
||||
"router",
|
||||
"floatingip",)
|
||||
"floatingip",
|
||||
"security_group",
|
||||
"security_group_rule",
|
||||
)
|
||||
|
||||
QUOTA_FIELDS = NOVA_QUOTA_FIELDS + CINDER_QUOTA_FIELDS + NEUTRON_QUOTA_FIELDS
|
||||
|
||||
|
@ -106,23 +109,10 @@ def _get_quota_data(request, method_name, disabled_quotas=None,
|
|||
|
||||
|
||||
def get_default_quota_data(request, disabled_quotas=None, tenant_id=None):
|
||||
qs = _get_quota_data(request,
|
||||
"default_quota_get",
|
||||
disabled_quotas=disabled_quotas,
|
||||
tenant_id=tenant_id)
|
||||
|
||||
# Remove quotas information for resources provided by Neutron.
|
||||
# TODO(amotoki): There is no API to get the default system quotas
|
||||
# in Neutron (cf. LP#1204956), so we need to remove such quotas
|
||||
# information from quotas set.
|
||||
# This should be handled in _get_quota_data() eventually.
|
||||
if base.is_service_enabled(request, 'network'):
|
||||
if neutron.is_security_group_extension_supported(request):
|
||||
sg_fields = ['security_groups', 'security_group_rules']
|
||||
qs = [quota for quota in qs
|
||||
if quota.name not in sg_fields]
|
||||
|
||||
return qs
|
||||
return _get_quota_data(request,
|
||||
"default_quota_get",
|
||||
disabled_quotas=disabled_quotas,
|
||||
tenant_id=tenant_id)
|
||||
|
||||
|
||||
def get_tenant_quota_data(request, disabled_quotas=None, tenant_id=None):
|
||||
|
@ -164,6 +154,13 @@ def get_disabled_quotas(request):
|
|||
# Remove the nova network quotas
|
||||
disabled_quotas.extend(['floating_ips', 'fixed_ips'])
|
||||
|
||||
if neutron.is_security_group_extension_supported(request):
|
||||
# If Neutron security group is supported, disable Nova quotas
|
||||
disabled_quotas.extend(['security_groups', 'security_group_rules'])
|
||||
else:
|
||||
# If Nova security group is used, disable Neutron quotas
|
||||
disabled_quotas.extend(['security_group', 'security_group_rule'])
|
||||
|
||||
try:
|
||||
if not neutron.is_quotas_extension_supported(request):
|
||||
disabled_quotas.extend(NEUTRON_QUOTA_FIELDS)
|
||||
|
|
Loading…
Reference in New Issue