Add network update quota "limit_check" parameter

This new parameter commands the Neutron server to first check the
resource usage before setting the new quota limit. If the resource
usage is below the new limit, the Neutron server will raise an
exception.

Depends-On: https://review.opendev.org/c/openstack/openstacksdk/+/806254
Depends-On: https://review.opendev.org/c/openstack/neutron/+/801470

Partial-Bug: #1936408
Change-Id: Idc1b99492d609eb699d0a6bef6cd760458a774f6
This commit is contained in:
Rodolfo Alonso Hernandez 2021-07-27 16:45:24 +00:00
parent 59256becc9
commit bef70397a3
4 changed files with 82 additions and 0 deletions

View File

@ -535,6 +535,12 @@ class SetQuota(common.NetDetectionMixin, command.Command):
action='store_true',
help=_('Force quota update (only supported by compute)')
)
parser.add_argument(
'--check-limit',
action='store_true',
help=_('Check quota limit when updating (only supported by '
'network)')
)
return parser
def take_action(self, parsed_args):
@ -561,6 +567,9 @@ class SetQuota(common.NetDetectionMixin, command.Command):
volume_kwargs[k] = value
network_kwargs = {}
if parsed_args.check_limit:
network_kwargs['check_limit'] = True
if self.app.client_manager.is_network_endpoint_enabled():
for k, v in NETWORK_QUOTAS.items():
value = getattr(parsed_args, k, None)

View File

@ -11,6 +11,9 @@
# under the License.
import json
import uuid
from tempest.lib import exceptions
from openstackclient.tests.functional import base
@ -165,3 +168,25 @@ class QuotaTests(base.TestCase):
# returned attributes
self.assertTrue(cmd_output["key-pairs"] >= 0)
self.assertTrue(cmd_output["snapshots"] >= 0)
def test_quota_network_set_with_check_limit(self):
if not self.haz_network:
self.skipTest('No Network service present')
if not self.is_extension_enabled('quota-check-limit'):
self.skipTest('No "quota-check-limit" extension present')
self.openstack('quota set --networks 40 ' + self.PROJECT_NAME)
cmd_output = json.loads(self.openstack(
'quota list -f json --network'
))
self.assertIsNotNone(cmd_output)
self.assertEqual(40, cmd_output[0]['Networks'])
# That will ensure we have at least two networks in the system.
for _ in range(2):
self.openstack('network create --project %s %s' %
(self.PROJECT_NAME, uuid.uuid4().hex))
self.assertRaises(exceptions.CommandFailed, self.openstack,
'quota set --networks 1 --check-limit ' +
self.PROJECT_NAME)

View File

@ -950,6 +950,49 @@ class TestQuotaSet(TestQuota):
)
self.assertIsNone(result)
def test_quota_set_with_check_limit(self):
arglist = [
'--subnets', str(network_fakes.QUOTA['subnet']),
'--volumes', str(volume_fakes.QUOTA['volumes']),
'--cores', str(compute_fakes.core_num),
'--check-limit',
self.projects[0].name,
]
verifylist = [
('subnet', network_fakes.QUOTA['subnet']),
('volumes', volume_fakes.QUOTA['volumes']),
('cores', compute_fakes.core_num),
('check_limit', True),
('project', self.projects[0].name),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
kwargs_compute = {
'cores': compute_fakes.core_num,
}
kwargs_volume = {
'volumes': volume_fakes.QUOTA['volumes'],
}
kwargs_network = {
'subnet': network_fakes.QUOTA['subnet'],
'check_limit': True,
}
self.compute_quotas_mock.update.assert_called_once_with(
self.projects[0].id,
**kwargs_compute
)
self.volume_quotas_mock.update.assert_called_once_with(
self.projects[0].id,
**kwargs_volume
)
self.network_mock.update_quota.assert_called_once_with(
self.projects[0].id,
**kwargs_network
)
self.assertIsNone(result)
class TestQuotaShow(TestQuota):

View File

@ -0,0 +1,5 @@
---
features:
- Add ``--check-limit`` option to the ``openstack quota set`` command (only
for network commands). The network quota engine will check the resource
usage before setting the new quota limit.