From 6fe31d97542467656cdecd90c2e0a9057a4f7480 Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Thu, 3 Oct 2019 13:11:17 +0100 Subject: [PATCH] nova-net: Remove 'networks' quota With the impending removal of nova-network, there's nothing that should be using this. Remove it. Change-Id: I352b71b5976d008c2b8fab8a6d6939c0e0b305be Signed-off-by: Stephen Finucane --- nova/api/openstack/compute/quota_classes.py | 2 +- nova/api/openstack/compute/quota_sets.py | 12 +++---- .../openstack/compute/schemas/quota_sets.py | 2 ++ nova/api/openstack/compute/tenant_networks.py | 18 ---------- nova/conf/network.py | 36 +------------------ nova/quota.py | 13 +------ nova/tests/fixtures.py | 13 ------- .../unit/api/openstack/compute/test_quotas.py | 19 +--------- .../openstack/compute/test_tenant_networks.py | 3 -- nova/tests/unit/objects/test_quotas.py | 4 +-- nova/tests/unit/test_quota.py | 7 ---- .../remove-nova-network-c02953ba72a1795d.yaml | 18 ++++++++++ 12 files changed, 31 insertions(+), 116 deletions(-) diff --git a/nova/api/openstack/compute/quota_classes.py b/nova/api/openstack/compute/quota_classes.py index bc4169b8e412..6ad7f43af7e9 100644 --- a/nova/api/openstack/compute/quota_classes.py +++ b/nova/api/openstack/compute/quota_classes.py @@ -34,7 +34,7 @@ EXTENDED_QUOTAS = ['server_groups', 'server_group_members'] # NOTE(gmann): Network related quotas are filter out in # microversion 2.50. Bug#1701211. -FILTERED_QUOTAS_2_50 = ["fixed_ips", "floating_ips", "networks", +FILTERED_QUOTAS_2_50 = ["fixed_ips", "floating_ips", "security_group_rules", "security_groups"] # Microversion 2.57 removes personality (injected) files from the API. diff --git a/nova/api/openstack/compute/quota_sets.py b/nova/api/openstack/compute/quota_sets.py index f5db68b9d939..867dad422009 100644 --- a/nova/api/openstack/compute/quota_sets.py +++ b/nova/api/openstack/compute/quota_sets.py @@ -37,7 +37,7 @@ from nova import quota CONF = nova.conf.CONF QUOTAS = quota.QUOTAS -FILTERED_QUOTAS_2_36 = ["fixed_ips", "floating_ips", "networks", +FILTERED_QUOTAS_2_36 = ["fixed_ips", "floating_ips", "security_group_rules", "security_groups"] FILTERED_QUOTAS_2_57 = list(FILTERED_QUOTAS_2_36) @@ -194,13 +194,11 @@ class QuotaSetsController(wsgi.Controller): quota_set = body['quota_set'] - # NOTE(alex_xu): The CONF.enable_network_quota was deprecated - # due to it is only used by nova-network, and nova-network will be - # deprecated also. So when CONF.enable_newtork_quota is removed, - # the networks quota will disappeare also. - if not CONF.enable_network_quota and 'networks' in quota_set: + # NOTE(stephenfin): network quotas were only used by nova-network and + # therefore should be explicitly rejected + if 'networks' in quota_set: raise webob.exc.HTTPBadRequest( - explanation=_('The networks quota is disabled')) + explanation=_('The networks quota has been removed')) force_update = strutils.bool_from_string(quota_set.get('force', 'False')) diff --git a/nova/api/openstack/compute/schemas/quota_sets.py b/nova/api/openstack/compute/schemas/quota_sets.py index fe45df74dc76..7dad6f70db97 100644 --- a/nova/api/openstack/compute/schemas/quota_sets.py +++ b/nova/api/openstack/compute/schemas/quota_sets.py @@ -41,6 +41,8 @@ quota_resources = { 'injected_file_path_bytes': common_quota, 'server_groups': common_quota, 'server_group_members': common_quota, + # NOTE(stephenfin): This will always be rejected since it was nova-network + # only, but we need to allow users to submit it at a minimum 'networks': common_quota } diff --git a/nova/api/openstack/compute/tenant_networks.py b/nova/api/openstack/compute/tenant_networks.py index f68c2bbcb0ac..9860f6c62c46 100644 --- a/nova/api/openstack/compute/tenant_networks.py +++ b/nova/api/openstack/compute/tenant_networks.py @@ -97,21 +97,3 @@ class TenantNetworkController(wsgi.Controller): @wsgi.expected_errors(410) def create(self, req, body): raise exc.HTTPGone() - - -def _network_count(context, project_id): - # NOTE(melwitt): This assumes a single cell. - ctx = nova_context.RequestContext(user_id=None, project_id=project_id) - ctx = ctx.elevated() - networks = nova.network.api.API().get_all(ctx) - return {'project': {'networks': len(networks)}} - - -def _register_network_quota(): - if CONF.enable_network_quota: - QUOTAS.register_resource(quota.CountableResource('networks', - _network_count, - 'quota_networks')) - - -_register_network_quota() diff --git a/nova/conf/network.py b/nova/conf/network.py index 0e588b68acb0..1efeb29480d2 100644 --- a/nova/conf/network.py +++ b/nova/conf/network.py @@ -1378,40 +1378,6 @@ Related options: ] -quota_opts = [ - cfg.BoolOpt('enable_network_quota', - deprecated_for_removal=True, - deprecated_since='14.0.0', - deprecated_reason=""" -CRUD operations on tenant networks are only available when using nova-network -and nova-network is itself deprecated.""", - default=False, - help=""" -This option is used to enable or disable quota checking for tenant networks. - -Related options: - -* quota_networks -"""), - cfg.IntOpt('quota_networks', - deprecated_for_removal=True, - deprecated_since='14.0.0', - deprecated_reason=""" -CRUD operations on tenant networks are only available when using nova-network -and nova-network is itself deprecated.""", - default=3, - min=0, - help=""" -This option controls the number of private networks that can be created per -project (or per tenant). - -Related options: - -* enable_network_quota -"""), -] - - service_opts = [ cfg.StrOpt('network_manager', choices=[ @@ -1431,7 +1397,7 @@ nova-network is deprecated, as are any related configuration options. ALL_DEFAULT_OPTS = (linux_net_opts + network_opts + ldap_dns_opts + rpcapi_opts + driver_opts + floating_ip_opts + - ipv6_opts + quota_opts + service_opts) + ipv6_opts + service_opts) def register_opts(conf): diff --git a/nova/quota.py b/nova/quota.py index 241d7ecc0810..88c2968f2c39 100644 --- a/nova/quota.py +++ b/nova/quota.py @@ -546,7 +546,7 @@ class DbQuotaDriver(object): # together. # per project quota limits (quotas that have no concept of - # user-scoping: fixed_ips, networks, floating_ips) + # user-scoping: fixed_ips, floating_ips) project_quotas = objects.Quotas.get_all_by_project(context, project_id) # per user quotas, project quota limits (for quotas that have # user-scoping, limits for the project) @@ -790,12 +790,6 @@ class BaseResource(object): @property def default(self): """Return the default value of the quota.""" - - # NOTE(mikal): special case for quota_networks, which is an API - # flag and not a quota flag - if self.flag == 'quota_networks': - return CONF[self.flag] - return CONF.quota[self.flag] if self.flag else -1 @@ -889,11 +883,6 @@ class QuotaEngine(object): self.__driver = importutils.import_object(CONF.quota.driver) return self.__driver - def register_resource(self, resource): - """Register a resource.""" - - self._resources[resource.name] = resource - def get_defaults(self, context): """Retrieve the default quotas. diff --git a/nova/tests/fixtures.py b/nova/tests/fixtures.py index 32b91a8bc9f6..90f8e502b599 100644 --- a/nova/tests/fixtures.py +++ b/nova/tests/fixtures.py @@ -46,7 +46,6 @@ from requests import adapters from sqlalchemy import exc as sqla_exc from wsgi_intercept import interceptor -from nova.api.openstack.compute import tenant_networks from nova.api.openstack import wsgi_app from nova.api import wsgi from nova.compute import multi_cell_list @@ -1231,18 +1230,6 @@ class AllServicesCurrent(fixtures.Fixture): return service_obj.SERVICE_VERSION -class RegisterNetworkQuota(fixtures.Fixture): - def setUp(self): - super(RegisterNetworkQuota, self).setUp() - # Quota resource registration modifies the global QUOTAS engine, so - # this fixture registers and unregisters network quota for a test. - tenant_networks._register_network_quota() - self.addCleanup(self.cleanup) - - def cleanup(self): - nova_quota.QUOTAS._resources.pop('networks', None) - - class _FakeNeutronClient(object): """Class representing a Neutron client which wraps a NeutronFixture. diff --git a/nova/tests/unit/api/openstack/compute/test_quotas.py b/nova/tests/unit/api/openstack/compute/test_quotas.py index 5935dc393230..81fbcf3751fa 100644 --- a/nova/tests/unit/api/openstack/compute/test_quotas.py +++ b/nova/tests/unit/api/openstack/compute/test_quotas.py @@ -22,7 +22,6 @@ from nova.db import api as db from nova import exception from nova import quota from nova import test -from nova.tests import fixtures as nova_fixtures from nova.tests.unit.api.openstack import fakes @@ -284,18 +283,6 @@ class QuotaSetsTestV21(BaseQuotaSetsTest): mock_destroy_all_by_project.assert_called_once_with( req.environ['nova.context'], 1234) - def test_update_network_quota_disabled(self): - self.flags(enable_network_quota=False) - self.assertRaises(webob.exc.HTTPBadRequest, self.controller.update, - self._get_http_request(), - 1234, body={'quota_set': {'networks': 1}}) - - def test_update_network_quota_enabled(self): - self.flags(enable_network_quota=True) - self.useFixture(nova_fixtures.RegisterNetworkQuota()) - self.controller.update(self._get_http_request(), - 1234, body={'quota_set': {'networks': 1}}) - def test_duplicate_quota_filter(self): query_string = 'user_id=1&user_id=2' req = fakes.HTTPRequest.blank('', query_string=query_string) @@ -585,10 +572,8 @@ class QuotaSetsTestV236(test.NoDBTestCase): self.stub_out('nova.api.openstack.identity.verify_project_id', lambda ctx, project_id: True) - self.flags(enable_network_quota=True) - self.useFixture(nova_fixtures.RegisterNetworkQuota()) self.old_req = fakes.HTTPRequest.blank('', version='2.1') - self.filtered_quotas = ['fixed_ips', 'floating_ips', 'networks', + self.filtered_quotas = ['fixed_ips', 'floating_ips', 'security_group_rules', 'security_groups'] self.quotas = { 'cores': {'limit': 20}, @@ -600,7 +585,6 @@ class QuotaSetsTestV236(test.NoDBTestCase): 'instances': {'limit': 10}, 'key_pairs': {'limit': 100}, 'metadata_items': {'limit': 128}, - 'networks': {'limit': 3}, 'ram': {'limit': 51200}, 'security_group_rules': {'limit': 20}, 'security_groups': {'limit': 10}, @@ -617,7 +601,6 @@ class QuotaSetsTestV236(test.NoDBTestCase): 'instances': 10, 'key_pairs': 100, 'metadata_items': 128, - 'networks': 3, 'ram': 51200, 'security_group_rules': 20, 'security_groups': 10, diff --git a/nova/tests/unit/api/openstack/compute/test_tenant_networks.py b/nova/tests/unit/api/openstack/compute/test_tenant_networks.py index 18e072415572..e6ca35881c01 100644 --- a/nova/tests/unit/api/openstack/compute/test_tenant_networks.py +++ b/nova/tests/unit/api/openstack/compute/test_tenant_networks.py @@ -22,7 +22,6 @@ from nova.api.openstack.compute import tenant_networks \ as networks_v21 from nova import exception from nova import test -from nova.tests import fixtures as nova_fixtures from nova.tests.unit.api.openstack import fakes CONF = cfg.CONF @@ -71,8 +70,6 @@ class TenantNetworksTestV21(test.NoDBTestCase): # os-tenant-networks only supports Neutron when listing networks or # showing details about a network, create and delete operations # result in a 503 and 500 response, respectively. - self.flags(enable_network_quota=True) - self.useFixture(nova_fixtures.RegisterNetworkQuota()) self.controller = self.ctrlr() self.req = fakes.HTTPRequest.blank('') self.original_value = CONF.api.use_neutron_default_nets diff --git a/nova/tests/unit/objects/test_quotas.py b/nova/tests/unit/objects/test_quotas.py index 2131c2afb314..1314b1de8306 100644 --- a/nova/tests/unit/objects/test_quotas.py +++ b/nova/tests/unit/objects/test_quotas.py @@ -248,13 +248,13 @@ class _TestQuotasObject(object): mock_get_all.return_value = {'project_id': 'fake-project', 'fixed_ips': 20, 'floating_ips': 5} mock_get_all_main.return_value = {'project_id': 'fake-project', - 'fixed_ips': 10, 'networks': 5} + 'fixed_ips': 10} quotas_dict = quotas_obj.Quotas.get_all_by_project(self.context, 'fake-project') mock_get_all.assert_called_once_with(self.context, 'fake-project') mock_get_all_main.assert_called_once_with(self.context, 'fake-project') expected = {'project_id': 'fake-project', 'fixed_ips': 20, - 'floating_ips': 5, 'networks': 5} + 'floating_ips': 5} self.assertEqual(expected, quotas_dict) @mock.patch('nova.objects.Quotas._get_all_from_db_by_project_and_user') diff --git a/nova/tests/unit/test_quota.py b/nova/tests/unit/test_quota.py index 5490ee5f9e11..fa927e7c4fab 100644 --- a/nova/tests/unit/test_quota.py +++ b/nova/tests/unit/test_quota.py @@ -405,13 +405,6 @@ class QuotaEngineTestCase(test.TestCase): quota_obj = quota.QuotaEngine(quota_driver=FakeDriver) self.assertEqual(quota_obj._driver, FakeDriver) - def test_register_resource(self): - quota_obj = quota.QuotaEngine() - resource = quota.AbsoluteResource('test_resource') - quota_obj.register_resource(resource) - - self.assertEqual(quota_obj._resources, dict(test_resource=resource)) - def _get_quota_engine(self, driver, resources=None): resources = resources or [ quota.AbsoluteResource('test_resource4'), diff --git a/releasenotes/notes/remove-nova-network-c02953ba72a1795d.yaml b/releasenotes/notes/remove-nova-network-c02953ba72a1795d.yaml index 0ab0be0b7eeb..ff6d2a9d4170 100644 --- a/releasenotes/notes/remove-nova-network-c02953ba72a1795d.yaml +++ b/releasenotes/notes/remove-nova-network-c02953ba72a1795d.yaml @@ -25,3 +25,21 @@ upgrade: * ``os_compute_api:os-security-group-default-rules`` * ``os_compute_api:os-networks`` * ``os_compute_api:os-networks-associate`` + - | + The ``networks`` quota, which was only enabled if the + ``enabled_network_quota`` config option was enabled and only useful with + *nova-network*, is removed. It will not longer be present in the responses + for the APIs while attempts to update the quota will be rejected. + + * ``GET /os-quota-sets`` + * ``GET /os-quota-sets/{project_id}`` + * ``GET /os-quota-sets/{project_id}/defaults`` + * ``GET /os-quota-sets/{project_id}/detail`` + * ``PUT /os-quota-sets/{project_id}`` + * ``GET /os-quota-class-sets/{id}`` + * ``PUT /os-quota-class-sets/{id}`` + + The following related config options have been removed. + + * ``enable_network_quota`` + * ``quota_networks``