diff --git a/openstack_dashboard/api/neutron.py b/openstack_dashboard/api/neutron.py index f74df6806c..b8f772ea82 100644 --- a/openstack_dashboard/api/neutron.py +++ b/openstack_dashboard/api/neutron.py @@ -1223,6 +1223,12 @@ def is_quotas_extension_supported(request): is_extension_supported(request, 'quotas')) +@memoized +def is_router_enabled(request): + return (is_enabled_by_config('enable_router') and + is_extension_supported(request, 'router')) + + # Using this mechanism till a better plugin/sub-plugin detection # mechanism is available. # When using specific plugins the profile_support can be diff --git a/openstack_dashboard/dashboards/admin/defaults/tests.py b/openstack_dashboard/dashboards/admin/defaults/tests.py index 036454b712..c3173fd3e7 100644 --- a/openstack_dashboard/dashboards/admin/defaults/tests.py +++ b/openstack_dashboard/dashboards/admin/defaults/tests.py @@ -44,6 +44,7 @@ class ServicesViewTests(test.BaseAdminViewTests): self.mox.StubOutWithMock(api.base, 'is_service_enabled') if neutron_enabled: self.mox.StubOutWithMock(api.neutron, 'is_extension_supported') + self.mox.StubOutWithMock(api.neutron, 'is_router_enabled') api.cinder.is_volume_service_enabled(IsA(http.HttpRequest)) \ .MultipleTimes().AndReturn(True) @@ -60,6 +61,8 @@ class ServicesViewTests(test.BaseAdminViewTests): api.neutron.is_extension_supported( IsA(http.HttpRequest), 'security-group').MultipleTimes().AndReturn(neutron_sg_enabled) + api.neutron.is_router_enabled( + IsA(http.HttpRequest)).AndReturn(True) self.mox.ReplayAll() diff --git a/openstack_dashboard/dashboards/identity/projects/tests.py b/openstack_dashboard/dashboards/identity/projects/tests.py index 9e4e08fe8f..325d7353ee 100644 --- a/openstack_dashboard/dashboards/identity/projects/tests.py +++ b/openstack_dashboard/dashboards/identity/projects/tests.py @@ -189,7 +189,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests): 'role_list'), api.base: ('is_service_enabled',), api.cinder: ('is_volume_service_enabled',), - api.neutron: ('is_extension_supported',), + api.neutron: ('is_extension_supported', + 'is_router_enabled',), quotas: ('get_default_quota_data',)}) def test_add_project_get(self): quota = self.quotas.first() @@ -211,6 +212,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests): .AndReturn(default_domain) api.neutron.is_extension_supported( IsA(http.HttpRequest), 'security-group').AndReturn(True) + api.neutron.is_router_enabled( + IsA(http.HttpRequest)).AndReturn(True) quotas.get_default_quota_data(IsA(http.HttpRequest)).AndReturn(quota) api.keystone.get_default_role(IsA(http.HttpRequest)) \ @@ -258,7 +261,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests): 'role_list', 'domain_get'), api.neutron: ('is_extension_supported', - 'tenant_quota_get'), + 'tenant_quota_get', + 'is_router_enabled',), quotas: ('get_default_quota_data',)}) @test.update_settings(OPENSTACK_NEUTRON_NETWORK={'enable_quotas': True}) def test_add_project_get_with_neutron(self): @@ -271,6 +275,8 @@ class CreateProjectWorkflowTests(test.BaseAdminViewTests): .MultipleTimes().AndReturn(True) api.neutron.is_extension_supported( IsA(http.HttpRequest), 'security-group').AndReturn(True) + api.neutron.is_router_enabled( + IsA(http.HttpRequest)).AndReturn(True) api.neutron.tenant_quota_get(IsA(http.HttpRequest), tenant_id=self.tenant.id) \ .AndReturn(neutron_quotas) diff --git a/openstack_dashboard/dashboards/project/access_and_security/floating_ips/tests.py b/openstack_dashboard/dashboards/project/access_and_security/floating_ips/tests.py index c297c2576e..d328566638 100644 --- a/openstack_dashboard/dashboards/project/access_and_security/floating_ips/tests.py +++ b/openstack_dashboard/dashboards/project/access_and_security/floating_ips/tests.py @@ -359,6 +359,7 @@ class FloatingIpNeutronViewTests(FloatingIpViewTests): 'security_group_list', 'tenant_floating_ip_list'), api.neutron: ('is_extension_supported', + 'is_router_enabled', 'tenant_quota_get', 'network_list', 'router_list', @@ -387,6 +388,8 @@ class FloatingIpNeutronViewTests(FloatingIpViewTests): IsA(http.HttpRequest), 'security-group').AndReturn(True) api.neutron.is_extension_supported(IsA(http.HttpRequest), 'quotas') \ .AndReturn(True) + api.neutron.is_router_enabled(IsA(http.HttpRequest)) \ + .AndReturn(True) api.neutron.tenant_quota_get(IsA(http.HttpRequest), self.tenant.id) \ .AndReturn(self.neutron_quotas.first()) api.neutron.router_list(IsA(http.HttpRequest)) \ @@ -421,6 +424,7 @@ class FloatingIpNeutronViewTests(FloatingIpViewTests): 'security_group_list', 'tenant_floating_ip_list'), api.neutron: ('is_extension_supported', + 'is_router_enabled', 'tenant_quota_get', 'network_list', 'router_list', @@ -449,6 +453,8 @@ class FloatingIpNeutronViewTests(FloatingIpViewTests): IsA(http.HttpRequest), 'security-group').AndReturn(True) api.neutron.is_extension_supported(IsA(http.HttpRequest), 'quotas') \ .AndReturn(True) + api.neutron.is_router_enabled( + IsA(http.HttpRequest)).AndReturn(True) api.neutron.tenant_quota_get(IsA(http.HttpRequest), self.tenant.id) \ .AndReturn(self.neutron_quotas.first()) api.neutron.router_list(IsA(http.HttpRequest)) \ diff --git a/openstack_dashboard/test/tests/quotas.py b/openstack_dashboard/test/tests/quotas.py index d87ce85105..fafdf88c4d 100644 --- a/openstack_dashboard/test/tests/quotas.py +++ b/openstack_dashboard/test/tests/quotas.py @@ -395,3 +395,29 @@ class QuotaTests(test.APITestCase): _("Unable to retrieve volume limit information.")) self.mox.ReplayAll() quotas.tenant_limit_usages(self.request) + + @test.create_stubs({api.neutron: ('is_router_enabled', + 'is_extension_supported', + 'is_quotas_extension_supported',), + api.cinder: ('is_volume_service_enabled',), + api.base: ('is_service_enabled',)}) + def test_get_disabled_quotas_router_disabled(self): + api.cinder.is_volume_service_enabled( + IsA(http.HttpRequest) + ).AndReturn(True) + api.base.is_service_enabled(IsA(http.HttpRequest), + 'network').AndReturn(True) + api.neutron.is_extension_supported(IsA(http.HttpRequest), + 'security-group').AndReturn(True) + api.neutron.is_router_enabled(IsA(http.HttpRequest)).AndReturn(False) + api.neutron.is_quotas_extension_supported(IsA(http.HttpRequest)) \ + .AndReturn(True) + api.base.is_service_enabled(IsA(http.HttpRequest), + 'compute').AndReturn(True) + + self.mox.ReplayAll() + + disabled_quotas = quotas.get_disabled_quotas(self.request) + expected = set(['floating_ips', 'fixed_ips', 'security_groups', + 'security_group_rules', 'router', 'floatingip']) + self.assertEqual(expected, disabled_quotas) diff --git a/openstack_dashboard/usage/quotas.py b/openstack_dashboard/usage/quotas.py index 25f5fc73da..cb7d00bcc1 100644 --- a/openstack_dashboard/usage/quotas.py +++ b/openstack_dashboard/usage/quotas.py @@ -186,8 +186,8 @@ def get_tenant_quota_data(request, disabled_quotas=None, tenant_id=None): if not disabled_quotas: return qs - # Check if neutron is enabled by looking for network and router - if 'network' and 'router' not in disabled_quotas: + # Check if neutron is enabled by looking for network + if 'network' not in disabled_quotas: tenant_id = tenant_id or request.user.tenant_id neutron_quotas = neutron.tenant_quota_get(request, tenant_id) if 'floating_ips' in disabled_quotas: @@ -258,6 +258,9 @@ def get_disabled_quotas(request): # If Nova security group is used, disable Neutron quotas disabled_quotas.update(['security_group', 'security_group_rule']) + if not neutron.is_router_enabled(request): + disabled_quotas.update(['router', 'floatingip']) + try: if not neutron.is_quotas_extension_supported(request): disabled_quotas.update(NEUTRON_QUOTA_FIELDS)