quota: Migrate 'quota *' to SDK
This is done for both the compute and block storage services. The network service was already using SDK. Change-Id: Id7a6943b8b4d7d1330e7d7f13705f027d1b67189 Signed-off-by: Stephen Finucane <stephenfin@redhat.com> Depends-on: https://review.opendev.org/c/openstack/openstacksdk/+/923864
This commit is contained in:
parent
b4f30a1583
commit
6127b44d0a
@ -19,6 +19,7 @@ import itertools
|
|||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
from openstack import exceptions as sdk_exceptions
|
||||||
from osc_lib.command import command
|
from osc_lib.command import command
|
||||||
from osc_lib import exceptions
|
from osc_lib import exceptions
|
||||||
from osc_lib import utils
|
from osc_lib import utils
|
||||||
@ -104,11 +105,8 @@ def _xform_get_quota(data, value, keys):
|
|||||||
|
|
||||||
def get_project(app, project):
|
def get_project(app, project):
|
||||||
if project is not None:
|
if project is not None:
|
||||||
identity_client = app.client_manager.identity
|
identity_client = app.client_manager.sdk_connection.identity
|
||||||
project = utils.find_resource(
|
project = identity_client.find_project(project, ignore_missing=False)
|
||||||
identity_client.projects,
|
|
||||||
project,
|
|
||||||
)
|
|
||||||
project_id = project.id
|
project_id = project.id
|
||||||
project_name = project.name
|
project_name = project.name
|
||||||
elif app.client_manager.auth_ref:
|
elif app.client_manager.auth_ref:
|
||||||
@ -134,16 +132,18 @@ def get_compute_quotas(
|
|||||||
default=False,
|
default=False,
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
client = app.client_manager.compute
|
client = app.client_manager.sdk_connection.compute
|
||||||
if default:
|
if default:
|
||||||
quota = client.quotas.defaults(project_id)
|
quota = client.get_quota_set_defaults(project_id)
|
||||||
else:
|
else:
|
||||||
quota = client.quotas.get(project_id, detail=detail)
|
quota = client.get_quota_set(project_id, usage=detail)
|
||||||
except Exception as e:
|
except sdk_exceptions.EndpointNotFound:
|
||||||
if type(e).__name__ == 'EndpointNotFound':
|
return {}
|
||||||
return {}
|
data = quota.to_dict()
|
||||||
raise
|
if not detail:
|
||||||
return quota._info
|
del data['usage']
|
||||||
|
del data['reservation']
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
def get_volume_quotas(
|
def get_volume_quotas(
|
||||||
@ -154,17 +154,18 @@ def get_volume_quotas(
|
|||||||
default=False,
|
default=False,
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
client = app.client_manager.volume
|
client = app.client_manager.sdk_connection.volume
|
||||||
if default:
|
if default:
|
||||||
quota = client.quotas.defaults(project_id)
|
quota = client.get_quota_set_defaults(project_id)
|
||||||
else:
|
else:
|
||||||
quota = client.quotas.get(project_id, usage=detail)
|
quota = client.get_quota_set(project_id, usage=detail)
|
||||||
except Exception as e:
|
except sdk_exceptions.EndpointNotFound:
|
||||||
if type(e).__name__ == 'EndpointNotFound':
|
return {}
|
||||||
return {}
|
data = quota.to_dict()
|
||||||
else:
|
if not detail:
|
||||||
raise
|
del data['usage']
|
||||||
return quota._info
|
del data['reservation']
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
def get_network_quotas(
|
def get_network_quotas(
|
||||||
@ -242,37 +243,35 @@ class ListQuota(command.Lister):
|
|||||||
return parser
|
return parser
|
||||||
|
|
||||||
def _list_quota_compute(self, parsed_args, project_ids):
|
def _list_quota_compute(self, parsed_args, project_ids):
|
||||||
compute_client = self.app.client_manager.compute
|
compute_client = self.app.client_manager.sdk_connection.compute
|
||||||
result = []
|
result = []
|
||||||
|
|
||||||
for p in project_ids:
|
for project_id in project_ids:
|
||||||
try:
|
try:
|
||||||
data = compute_client.quotas.get(p)
|
project_data = compute_client.get_quota_set(project_id)
|
||||||
except Exception as ex:
|
except (
|
||||||
if (
|
sdk_exceptions.NotFoundException,
|
||||||
type(ex).__name__ == 'NotFound'
|
sdk_exceptions.ForbiddenException,
|
||||||
or ex.http_status >= 400
|
) as exc:
|
||||||
and ex.http_status <= 499
|
# Project not found, move on to next one
|
||||||
):
|
LOG.warning(f"Project {project_id} not found: {exc}")
|
||||||
# Project not found, move on to next one
|
continue
|
||||||
LOG.warning(f"Project {p} not found: {ex}")
|
|
||||||
continue
|
|
||||||
else:
|
|
||||||
raise
|
|
||||||
|
|
||||||
result_data = _xform_get_quota(
|
project_result = _xform_get_quota(
|
||||||
data,
|
project_data,
|
||||||
p,
|
project_id,
|
||||||
COMPUTE_QUOTAS.keys(),
|
COMPUTE_QUOTAS.keys(),
|
||||||
)
|
)
|
||||||
default_data = compute_client.quotas.defaults(p)
|
|
||||||
result_default = _xform_get_quota(
|
default_data = compute_client.get_quota_set_defaults(project_id)
|
||||||
|
default_result = _xform_get_quota(
|
||||||
default_data,
|
default_data,
|
||||||
p,
|
project_id,
|
||||||
COMPUTE_QUOTAS.keys(),
|
COMPUTE_QUOTAS.keys(),
|
||||||
)
|
)
|
||||||
if result_default != result_data:
|
|
||||||
result += result_data
|
if default_result != project_result:
|
||||||
|
result += project_result
|
||||||
|
|
||||||
columns = (
|
columns = (
|
||||||
'id',
|
'id',
|
||||||
@ -306,33 +305,35 @@ class ListQuota(command.Lister):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def _list_quota_volume(self, parsed_args, project_ids):
|
def _list_quota_volume(self, parsed_args, project_ids):
|
||||||
volume_client = self.app.client_manager.volume
|
volume_client = self.app.client_manager.sdk_connection.volume
|
||||||
result = []
|
result = []
|
||||||
|
|
||||||
for p in project_ids:
|
for project_id in project_ids:
|
||||||
try:
|
try:
|
||||||
data = volume_client.quotas.get(p)
|
project_data = volume_client.get_quota_set(project_id)
|
||||||
except Exception as ex:
|
except (
|
||||||
if type(ex).__name__ == 'NotFound':
|
sdk_exceptions.NotFoundException,
|
||||||
# Project not found, move on to next one
|
sdk_exceptions.ForbiddenException,
|
||||||
LOG.warning(f"Project {p} not found: {ex}")
|
) as exc:
|
||||||
continue
|
# Project not found, move on to next one
|
||||||
else:
|
LOG.warning(f"Project {project_id} not found: {exc}")
|
||||||
raise
|
continue
|
||||||
|
|
||||||
result_data = _xform_get_quota(
|
project_result = _xform_get_quota(
|
||||||
data,
|
project_data,
|
||||||
p,
|
project_id,
|
||||||
VOLUME_QUOTAS.keys(),
|
VOLUME_QUOTAS.keys(),
|
||||||
)
|
)
|
||||||
default_data = volume_client.quotas.defaults(p)
|
|
||||||
result_default = _xform_get_quota(
|
default_data = volume_client.get_quota_set_defaults(project_id)
|
||||||
|
default_result = _xform_get_quota(
|
||||||
default_data,
|
default_data,
|
||||||
p,
|
project_id,
|
||||||
VOLUME_QUOTAS.keys(),
|
VOLUME_QUOTAS.keys(),
|
||||||
)
|
)
|
||||||
if result_default != result_data:
|
|
||||||
result += result_data
|
if default_result != project_result:
|
||||||
|
result += project_result
|
||||||
|
|
||||||
columns = (
|
columns = (
|
||||||
'id',
|
'id',
|
||||||
@ -359,33 +360,35 @@ class ListQuota(command.Lister):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def _list_quota_network(self, parsed_args, project_ids):
|
def _list_quota_network(self, parsed_args, project_ids):
|
||||||
client = self.app.client_manager.network
|
network_client = self.app.client_manager.network
|
||||||
result = []
|
result = []
|
||||||
|
|
||||||
for p in project_ids:
|
for project_id in project_ids:
|
||||||
try:
|
try:
|
||||||
data = client.get_quota(p)
|
project_data = network_client.get_quota(project_id)
|
||||||
except Exception as ex:
|
except (
|
||||||
if type(ex).__name__ == 'NotFound':
|
sdk_exceptions.NotFoundException,
|
||||||
# Project not found, move on to next one
|
sdk_exceptions.ForbiddenException,
|
||||||
LOG.warning(f"Project {p} not found: {ex}")
|
) as exc:
|
||||||
continue
|
# Project not found, move on to next one
|
||||||
else:
|
LOG.warning(f"Project {project_id} not found: {exc}")
|
||||||
raise
|
continue
|
||||||
|
|
||||||
result_data = _xform_get_quota(
|
project_result = _xform_get_quota(
|
||||||
data,
|
project_data,
|
||||||
p,
|
project_id,
|
||||||
NETWORK_KEYS,
|
NETWORK_KEYS,
|
||||||
)
|
)
|
||||||
default_data = client.get_quota_default(p)
|
|
||||||
result_default = _xform_get_quota(
|
default_data = network_client.get_quota_default(project_id)
|
||||||
|
default_result = _xform_get_quota(
|
||||||
default_data,
|
default_data,
|
||||||
p,
|
project_id,
|
||||||
NETWORK_KEYS,
|
NETWORK_KEYS,
|
||||||
)
|
)
|
||||||
if result_default != result_data:
|
|
||||||
result += result_data
|
if default_result != project_result:
|
||||||
|
result += project_result
|
||||||
|
|
||||||
columns = (
|
columns = (
|
||||||
'id',
|
'id',
|
||||||
@ -419,7 +422,8 @@ class ListQuota(command.Lister):
|
|||||||
|
|
||||||
def take_action(self, parsed_args):
|
def take_action(self, parsed_args):
|
||||||
project_ids = [
|
project_ids = [
|
||||||
p.id for p in self.app.client_manager.identity.projects.list()
|
p.id
|
||||||
|
for p in self.app.client_manager.sdk_connection.identity.projects()
|
||||||
]
|
]
|
||||||
if parsed_args.compute:
|
if parsed_args.compute:
|
||||||
return self._list_quota_compute(parsed_args, project_ids)
|
return self._list_quota_compute(parsed_args, project_ids)
|
||||||
@ -561,8 +565,8 @@ class SetQuota(common.NetDetectionMixin, command.Command):
|
|||||||
msg = _('--force cannot be used with --class or --default')
|
msg = _('--force cannot be used with --class or --default')
|
||||||
raise exceptions.CommandError(msg)
|
raise exceptions.CommandError(msg)
|
||||||
|
|
||||||
compute_client = self.app.client_manager.compute
|
compute_client = self.app.client_manager.sdk_connection.compute
|
||||||
volume_client = self.app.client_manager.volume
|
volume_client = self.app.client_manager.sdk_connection.volume
|
||||||
|
|
||||||
compute_kwargs = {}
|
compute_kwargs = {}
|
||||||
for k, v in COMPUTE_QUOTAS.items():
|
for k, v in COMPUTE_QUOTAS.items():
|
||||||
@ -570,7 +574,7 @@ class SetQuota(common.NetDetectionMixin, command.Command):
|
|||||||
if value is not None:
|
if value is not None:
|
||||||
compute_kwargs[k] = value
|
compute_kwargs[k] = value
|
||||||
|
|
||||||
if parsed_args.force is True:
|
if compute_kwargs and parsed_args.force is True:
|
||||||
compute_kwargs['force'] = parsed_args.force
|
compute_kwargs['force'] = parsed_args.force
|
||||||
|
|
||||||
volume_kwargs = {}
|
volume_kwargs = {}
|
||||||
@ -604,12 +608,12 @@ class SetQuota(common.NetDetectionMixin, command.Command):
|
|||||||
|
|
||||||
if parsed_args.quota_class or parsed_args.default:
|
if parsed_args.quota_class or parsed_args.default:
|
||||||
if compute_kwargs:
|
if compute_kwargs:
|
||||||
compute_client.quota_classes.update(
|
compute_client.update_quota_class_set(
|
||||||
parsed_args.project or 'default',
|
parsed_args.project or 'default',
|
||||||
**compute_kwargs,
|
**compute_kwargs,
|
||||||
)
|
)
|
||||||
if volume_kwargs:
|
if volume_kwargs:
|
||||||
volume_client.quota_classes.update(
|
volume_client.update_quota_class_set(
|
||||||
parsed_args.project or 'default',
|
parsed_args.project or 'default',
|
||||||
**volume_kwargs,
|
**volume_kwargs,
|
||||||
)
|
)
|
||||||
@ -625,9 +629,9 @@ class SetQuota(common.NetDetectionMixin, command.Command):
|
|||||||
project = project_info['id']
|
project = project_info['id']
|
||||||
|
|
||||||
if compute_kwargs:
|
if compute_kwargs:
|
||||||
compute_client.quotas.update(project, **compute_kwargs)
|
compute_client.update_quota_set(project, **compute_kwargs)
|
||||||
if volume_kwargs:
|
if volume_kwargs:
|
||||||
volume_client.quotas.update(project, **volume_kwargs)
|
volume_client.update_quota_set(project, **volume_kwargs)
|
||||||
if (
|
if (
|
||||||
network_kwargs
|
network_kwargs
|
||||||
and self.app.client_manager.is_network_endpoint_enabled()
|
and self.app.client_manager.is_network_endpoint_enabled()
|
||||||
@ -765,14 +769,24 @@ and ``server-group-members`` output for a given quota class."""
|
|||||||
if 'id' in info:
|
if 'id' in info:
|
||||||
del info['id']
|
del info['id']
|
||||||
|
|
||||||
# Remove the 'location' field for resources from openstacksdk
|
# Remove the sdk-derived fields
|
||||||
if 'location' in info:
|
for field in ('location', 'name', 'force'):
|
||||||
del info['location']
|
if field in info:
|
||||||
|
del info[field]
|
||||||
|
|
||||||
if not parsed_args.usage:
|
if not parsed_args.usage:
|
||||||
result = [{'resource': k, 'limit': v} for k, v in info.items()]
|
result = [{'resource': k, 'limit': v} for k, v in info.items()]
|
||||||
else:
|
else:
|
||||||
result = [{'resource': k, **v} for k, v in info.items()]
|
result = [
|
||||||
|
{
|
||||||
|
'resource': k,
|
||||||
|
'limit': v or 0,
|
||||||
|
'in_use': info['usage'].get(k, 0),
|
||||||
|
'reserved': info['reservation'].get(k, 0),
|
||||||
|
}
|
||||||
|
for k, v in info.items()
|
||||||
|
if k not in ('usage', 'reservation')
|
||||||
|
]
|
||||||
|
|
||||||
columns = (
|
columns = (
|
||||||
'resource',
|
'resource',
|
||||||
@ -850,21 +864,20 @@ class DeleteQuota(command.Command):
|
|||||||
return parser
|
return parser
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
def take_action(self, parsed_args):
|
||||||
identity_client = self.app.client_manager.identity
|
identity_client = self.app.client_manager.sdk_connection.identity
|
||||||
project = utils.find_resource(
|
project = identity_client.find_project(
|
||||||
identity_client.projects,
|
parsed_args.project, ignore_missing=False
|
||||||
parsed_args.project,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# compute quotas
|
# compute quotas
|
||||||
if parsed_args.service in {'all', 'compute'}:
|
if parsed_args.service in {'all', 'compute'}:
|
||||||
compute_client = self.app.client_manager.compute
|
compute_client = self.app.client_manager.sdk_connection.compute
|
||||||
compute_client.quotas.delete(project.id)
|
compute_client.revert_quota_set(project.id)
|
||||||
|
|
||||||
# volume quotas
|
# volume quotas
|
||||||
if parsed_args.service in {'all', 'volume'}:
|
if parsed_args.service in {'all', 'volume'}:
|
||||||
volume_client = self.app.client_manager.volume
|
volume_client = self.app.client_manager.sdk_connection.volume
|
||||||
volume_client.quotas.delete(project.id)
|
volume_client.revert_quota_set(project.id)
|
||||||
|
|
||||||
# network quotas (but only if we're not using nova-network, otherwise
|
# network quotas (but only if we're not using nova-network, otherwise
|
||||||
# we already deleted the quotas in the compute step)
|
# we already deleted the quotas in the compute step)
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -46,42 +46,6 @@ from openstackclient.tests.unit.network.v2 import fakes as network_fakes
|
|||||||
from openstackclient.tests.unit import utils
|
from openstackclient.tests.unit import utils
|
||||||
from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes
|
from openstackclient.tests.unit.volume.v3 import fakes as volume_fakes
|
||||||
|
|
||||||
floating_ip_num = 100
|
|
||||||
fix_ip_num = 100
|
|
||||||
injected_file_num = 100
|
|
||||||
injected_file_size_num = 10240
|
|
||||||
injected_path_size_num = 255
|
|
||||||
key_pair_num = 100
|
|
||||||
core_num = 20
|
|
||||||
ram_num = 51200
|
|
||||||
instance_num = 10
|
|
||||||
property_num = 128
|
|
||||||
secgroup_rule_num = 20
|
|
||||||
secgroup_num = 10
|
|
||||||
servgroup_num = 10
|
|
||||||
servgroup_members_num = 10
|
|
||||||
project_name = 'project_test'
|
|
||||||
QUOTA = {
|
|
||||||
'project': project_name,
|
|
||||||
'floating-ips': floating_ip_num,
|
|
||||||
'fix-ips': fix_ip_num,
|
|
||||||
'injected-files': injected_file_num,
|
|
||||||
'injected-file-size': injected_file_size_num,
|
|
||||||
'injected-path-size': injected_path_size_num,
|
|
||||||
'key-pairs': key_pair_num,
|
|
||||||
'cores': core_num,
|
|
||||||
'ram': ram_num,
|
|
||||||
'instances': instance_num,
|
|
||||||
'properties': property_num,
|
|
||||||
'secgroup_rules': secgroup_rule_num,
|
|
||||||
'secgroups': secgroup_num,
|
|
||||||
'server-groups': servgroup_num,
|
|
||||||
'server-group-members': servgroup_members_num,
|
|
||||||
}
|
|
||||||
|
|
||||||
QUOTA_columns = tuple(sorted(QUOTA))
|
|
||||||
QUOTA_data = tuple(QUOTA[x] for x in sorted(QUOTA))
|
|
||||||
|
|
||||||
|
|
||||||
class FakeComputev2Client:
|
class FakeComputev2Client:
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
@ -105,12 +69,6 @@ class FakeComputev2Client:
|
|||||||
self.flavor_access = mock.Mock()
|
self.flavor_access = mock.Mock()
|
||||||
self.flavor_access.resource_class = fakes.FakeResource(None, {})
|
self.flavor_access.resource_class = fakes.FakeResource(None, {})
|
||||||
|
|
||||||
self.quotas = mock.Mock()
|
|
||||||
self.quotas.resource_class = fakes.FakeResource(None, {})
|
|
||||||
|
|
||||||
self.quota_classes = mock.Mock()
|
|
||||||
self.quota_classes.resource_class = fakes.FakeResource(None, {})
|
|
||||||
|
|
||||||
self.usage = mock.Mock()
|
self.usage = mock.Mock()
|
||||||
self.usage.resource_class = fakes.FakeResource(None, {})
|
self.usage.resource_class = fakes.FakeResource(None, {})
|
||||||
|
|
||||||
@ -1077,98 +1035,6 @@ def create_usages(attrs=None, count=2):
|
|||||||
return usages
|
return usages
|
||||||
|
|
||||||
|
|
||||||
def create_one_comp_quota(attrs=None):
|
|
||||||
"""Create one quota"""
|
|
||||||
|
|
||||||
attrs = attrs or {}
|
|
||||||
|
|
||||||
quota_attrs = {
|
|
||||||
'id': 'project-id-' + uuid.uuid4().hex,
|
|
||||||
'cores': 20,
|
|
||||||
'fixed_ips': 30,
|
|
||||||
'injected_files': 100,
|
|
||||||
'injected_file_content_bytes': 10240,
|
|
||||||
'injected_file_path_bytes': 255,
|
|
||||||
'instances': 50,
|
|
||||||
'key_pairs': 20,
|
|
||||||
'metadata_items': 10,
|
|
||||||
'ram': 51200,
|
|
||||||
'server_groups': 10,
|
|
||||||
'server_group_members': 10,
|
|
||||||
}
|
|
||||||
|
|
||||||
quota_attrs.update(attrs)
|
|
||||||
quota = fakes.FakeResource(info=copy.deepcopy(quota_attrs), loaded=True)
|
|
||||||
|
|
||||||
quota.project_id = quota_attrs['id']
|
|
||||||
|
|
||||||
return quota
|
|
||||||
|
|
||||||
|
|
||||||
def create_one_default_comp_quota(attrs=None):
|
|
||||||
"""Create one quota"""
|
|
||||||
|
|
||||||
attrs = attrs or {}
|
|
||||||
|
|
||||||
quota_attrs = {
|
|
||||||
'id': 'project-id-' + uuid.uuid4().hex,
|
|
||||||
'cores': 10,
|
|
||||||
'fixed_ips': 10,
|
|
||||||
'injected_files': 100,
|
|
||||||
'injected_file_content_bytes': 10240,
|
|
||||||
'injected_file_path_bytes': 255,
|
|
||||||
'instances': 20,
|
|
||||||
'key_pairs': 20,
|
|
||||||
'metadata_items': 10,
|
|
||||||
'ram': 51200,
|
|
||||||
'server_groups': 10,
|
|
||||||
'server_group_members': 10,
|
|
||||||
}
|
|
||||||
|
|
||||||
quota_attrs.update(attrs)
|
|
||||||
quota = fakes.FakeResource(info=copy.deepcopy(quota_attrs), loaded=True)
|
|
||||||
|
|
||||||
quota.project_id = quota_attrs['id']
|
|
||||||
|
|
||||||
return quota
|
|
||||||
|
|
||||||
|
|
||||||
def create_one_comp_detailed_quota(attrs=None):
|
|
||||||
"""Create one quota"""
|
|
||||||
|
|
||||||
attrs = attrs or {}
|
|
||||||
|
|
||||||
quota_attrs = {
|
|
||||||
'id': 'project-id-' + uuid.uuid4().hex,
|
|
||||||
'cores': {'reserved': 0, 'in_use': 0, 'limit': 20},
|
|
||||||
'fixed_ips': {'reserved': 0, 'in_use': 0, 'limit': 30},
|
|
||||||
'injected_files': {'reserved': 0, 'in_use': 0, 'limit': 100},
|
|
||||||
'injected_file_content_bytes': {
|
|
||||||
'reserved': 0,
|
|
||||||
'in_use': 0,
|
|
||||||
'limit': 10240,
|
|
||||||
},
|
|
||||||
'injected_file_path_bytes': {
|
|
||||||
'reserved': 0,
|
|
||||||
'in_use': 0,
|
|
||||||
'limit': 255,
|
|
||||||
},
|
|
||||||
'instances': {'reserved': 0, 'in_use': 0, 'limit': 50},
|
|
||||||
'key_pairs': {'reserved': 0, 'in_use': 0, 'limit': 20},
|
|
||||||
'metadata_items': {'reserved': 0, 'in_use': 0, 'limit': 10},
|
|
||||||
'ram': {'reserved': 0, 'in_use': 0, 'limit': 51200},
|
|
||||||
'server_groups': {'reserved': 0, 'in_use': 0, 'limit': 10},
|
|
||||||
'server_group_members': {'reserved': 0, 'in_use': 0, 'limit': 10},
|
|
||||||
}
|
|
||||||
|
|
||||||
quota_attrs.update(attrs)
|
|
||||||
quota = fakes.FakeResource(info=copy.deepcopy(quota_attrs), loaded=True)
|
|
||||||
|
|
||||||
quota.project_id = quota_attrs['id']
|
|
||||||
|
|
||||||
return quota
|
|
||||||
|
|
||||||
|
|
||||||
def create_limits(attrs=None):
|
def create_limits(attrs=None):
|
||||||
"""Create a fake limits object."""
|
"""Create a fake limits object."""
|
||||||
attrs = attrs or {}
|
attrs = attrs or {}
|
||||||
|
@ -42,22 +42,6 @@ from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
|
|||||||
from openstackclient.tests.unit import utils
|
from openstackclient.tests.unit import utils
|
||||||
|
|
||||||
|
|
||||||
QUOTA = {
|
|
||||||
"subnet": 10,
|
|
||||||
"network": 10,
|
|
||||||
"floatingip": 50,
|
|
||||||
"subnetpool": -1,
|
|
||||||
"security_group_rule": 100,
|
|
||||||
"security_group": 10,
|
|
||||||
"router": 10,
|
|
||||||
"rbac_policy": -1,
|
|
||||||
"port": 50,
|
|
||||||
"vip": 10,
|
|
||||||
"member": 10,
|
|
||||||
"healthmonitor": 10,
|
|
||||||
"l7policy": 5,
|
|
||||||
}
|
|
||||||
|
|
||||||
RULE_TYPE_BANDWIDTH_LIMIT = 'bandwidth-limit'
|
RULE_TYPE_BANDWIDTH_LIMIT = 'bandwidth-limit'
|
||||||
RULE_TYPE_DSCP_MARKING = 'dscp-marking'
|
RULE_TYPE_DSCP_MARKING = 'dscp-marking'
|
||||||
RULE_TYPE_MINIMUM_BANDWIDTH = 'minimum-bandwidth'
|
RULE_TYPE_MINIMUM_BANDWIDTH = 'minimum-bandwidth'
|
||||||
@ -990,82 +974,6 @@ class FakeNetworkServiceProvider:
|
|||||||
return service_providers
|
return service_providers
|
||||||
|
|
||||||
|
|
||||||
class FakeQuota:
|
|
||||||
"""Fake quota"""
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def create_one_net_quota(attrs=None):
|
|
||||||
"""Create one quota"""
|
|
||||||
attrs = attrs or {}
|
|
||||||
|
|
||||||
quota_attrs = {
|
|
||||||
'floating_ips': 20,
|
|
||||||
'networks': 25,
|
|
||||||
'ports': 11,
|
|
||||||
'rbac_policies': 15,
|
|
||||||
'routers': 40,
|
|
||||||
'security_groups': 10,
|
|
||||||
'security_group_rules': 100,
|
|
||||||
'subnets': 20,
|
|
||||||
'subnet_pools': 30,
|
|
||||||
}
|
|
||||||
|
|
||||||
quota_attrs.update(attrs)
|
|
||||||
|
|
||||||
quota = fakes.FakeResource(
|
|
||||||
info=copy.deepcopy(quota_attrs), loaded=True
|
|
||||||
)
|
|
||||||
return quota
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def create_one_default_net_quota(attrs=None):
|
|
||||||
"""Create one quota"""
|
|
||||||
attrs = attrs or {}
|
|
||||||
|
|
||||||
quota_attrs = {
|
|
||||||
'floatingip': 30,
|
|
||||||
'network': 20,
|
|
||||||
'port': 10,
|
|
||||||
'rbac_policy': 25,
|
|
||||||
'router': 30,
|
|
||||||
'security_group': 30,
|
|
||||||
'security_group_rule': 200,
|
|
||||||
'subnet': 10,
|
|
||||||
'subnetpool': 20,
|
|
||||||
}
|
|
||||||
|
|
||||||
quota_attrs.update(attrs)
|
|
||||||
|
|
||||||
quota = fakes.FakeResource(
|
|
||||||
info=copy.deepcopy(quota_attrs), loaded=True
|
|
||||||
)
|
|
||||||
return quota
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def create_one_net_detailed_quota(attrs=None):
|
|
||||||
"""Create one quota"""
|
|
||||||
attrs = attrs or {}
|
|
||||||
|
|
||||||
quota_attrs = {
|
|
||||||
'floating_ips': {'used': 0, 'reserved': 0, 'limit': 20},
|
|
||||||
'networks': {'used': 0, 'reserved': 0, 'limit': 25},
|
|
||||||
'ports': {'used': 0, 'reserved': 0, 'limit': 11},
|
|
||||||
'rbac_policies': {'used': 0, 'reserved': 0, 'limit': 15},
|
|
||||||
'routers': {'used': 0, 'reserved': 0, 'limit': 40},
|
|
||||||
'security_groups': {'used': 0, 'reserved': 0, 'limit': 10},
|
|
||||||
'security_group_rules': {'used': 0, 'reserved': 0, 'limit': 100},
|
|
||||||
'subnets': {'used': 0, 'reserved': 0, 'limit': 20},
|
|
||||||
'subnet_pools': {'used': 0, 'reserved': 0, 'limit': 30},
|
|
||||||
}
|
|
||||||
|
|
||||||
quota_attrs.update(attrs)
|
|
||||||
|
|
||||||
quota = fakes.FakeResource(
|
|
||||||
info=copy.deepcopy(quota_attrs), loaded=True
|
|
||||||
)
|
|
||||||
return quota
|
|
||||||
|
|
||||||
|
|
||||||
class FakeFloatingIPPortForwarding:
|
class FakeFloatingIPPortForwarding:
|
||||||
"""Fake one or more Port forwarding"""
|
"""Fake one or more Port forwarding"""
|
||||||
|
|
||||||
|
@ -33,19 +33,6 @@ from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes
|
|||||||
from openstackclient.tests.unit import utils
|
from openstackclient.tests.unit import utils
|
||||||
|
|
||||||
|
|
||||||
QUOTA = {
|
|
||||||
"gigabytes": 1000,
|
|
||||||
"volumes": 11,
|
|
||||||
"snapshots": 10,
|
|
||||||
"backups": 10,
|
|
||||||
"backup_gigabytes": 1000,
|
|
||||||
"per_volume_gigabytes": -1,
|
|
||||||
"gigabytes_volume_type_backend": -1,
|
|
||||||
"volumes_volume_type_backend": -1,
|
|
||||||
"snapshots_volume_type_backend": -1,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class FakeVolumeClient:
|
class FakeVolumeClient:
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
self.auth_token = kwargs['token']
|
self.auth_token = kwargs['token']
|
||||||
@ -68,10 +55,6 @@ class FakeVolumeClient:
|
|||||||
self.pools.resource_class = fakes.FakeResource(None, {})
|
self.pools.resource_class = fakes.FakeResource(None, {})
|
||||||
self.qos_specs = mock.Mock()
|
self.qos_specs = mock.Mock()
|
||||||
self.qos_specs.resource_class = fakes.FakeResource(None, {})
|
self.qos_specs.resource_class = fakes.FakeResource(None, {})
|
||||||
self.quota_classes = mock.Mock()
|
|
||||||
self.quota_classes.resource_class = fakes.FakeResource(None, {})
|
|
||||||
self.quotas = mock.Mock()
|
|
||||||
self.quotas.resource_class = fakes.FakeResource(None, {})
|
|
||||||
self.restores = mock.Mock()
|
self.restores = mock.Mock()
|
||||||
self.restores.resource_class = fakes.FakeResource(None, {})
|
self.restores.resource_class = fakes.FakeResource(None, {})
|
||||||
self.services = mock.Mock()
|
self.services = mock.Mock()
|
||||||
@ -991,74 +974,3 @@ def create_one_encryption_volume_type(attrs=None):
|
|||||||
info=copy.deepcopy(encryption_info), loaded=True
|
info=copy.deepcopy(encryption_info), loaded=True
|
||||||
)
|
)
|
||||||
return encryption_type
|
return encryption_type
|
||||||
|
|
||||||
|
|
||||||
def create_one_vol_quota(attrs=None):
|
|
||||||
"""Create one quota"""
|
|
||||||
attrs = attrs or {}
|
|
||||||
|
|
||||||
quota_attrs = {
|
|
||||||
'id': 'project-id-' + uuid.uuid4().hex,
|
|
||||||
'backups': 100,
|
|
||||||
'backup_gigabytes': 100,
|
|
||||||
'gigabytes': 10,
|
|
||||||
'per_volume_gigabytes': 10,
|
|
||||||
'snapshots': 0,
|
|
||||||
'volumes': 10,
|
|
||||||
}
|
|
||||||
|
|
||||||
quota_attrs.update(attrs)
|
|
||||||
|
|
||||||
quota = fakes.FakeResource(info=copy.deepcopy(quota_attrs), loaded=True)
|
|
||||||
quota.project_id = quota_attrs['id']
|
|
||||||
|
|
||||||
return quota
|
|
||||||
|
|
||||||
|
|
||||||
def create_one_default_vol_quota(attrs=None):
|
|
||||||
"""Create one quota"""
|
|
||||||
attrs = attrs or {}
|
|
||||||
|
|
||||||
quota_attrs = {
|
|
||||||
'id': 'project-id-' + uuid.uuid4().hex,
|
|
||||||
'backups': 100,
|
|
||||||
'backup_gigabytes': 100,
|
|
||||||
'gigabytes': 100,
|
|
||||||
'per_volume_gigabytes': 100,
|
|
||||||
'snapshots': 100,
|
|
||||||
'volumes': 100,
|
|
||||||
}
|
|
||||||
|
|
||||||
quota_attrs.update(attrs)
|
|
||||||
|
|
||||||
quota = fakes.FakeResource(info=copy.deepcopy(quota_attrs), loaded=True)
|
|
||||||
quota.project_id = quota_attrs['id']
|
|
||||||
|
|
||||||
return quota
|
|
||||||
|
|
||||||
|
|
||||||
def create_one_detailed_quota(attrs=None):
|
|
||||||
"""Create one quota"""
|
|
||||||
attrs = attrs or {}
|
|
||||||
|
|
||||||
quota_attrs = {
|
|
||||||
'volumes': {'limit': 3, 'in_use': 1, 'reserved': 0},
|
|
||||||
'per_volume_gigabytes': {'limit': -1, 'in_use': 0, 'reserved': 0},
|
|
||||||
'snapshots': {'limit': 10, 'in_use': 0, 'reserved': 0},
|
|
||||||
'gigabytes': {'limit': 1000, 'in_use': 5, 'reserved': 0},
|
|
||||||
'backups': {'limit': 10, 'in_use': 0, 'reserved': 0},
|
|
||||||
'backup_gigabytes': {'limit': 1000, 'in_use': 0, 'reserved': 0},
|
|
||||||
'volumes_lvmdriver-1': {'limit': -1, 'in_use': 1, 'reserved': 0},
|
|
||||||
'gigabytes_lvmdriver-1': {'limit': -1, 'in_use': 5, 'reserved': 0},
|
|
||||||
'snapshots_lvmdriver-1': {'limit': -1, 'in_use': 0, 'reserved': 0},
|
|
||||||
'volumes___DEFAULT__': {'limit': -1, 'in_use': 0, 'reserved': 0},
|
|
||||||
'gigabytes___DEFAULT__': {'limit': -1, 'in_use': 0, 'reserved': 0},
|
|
||||||
'snapshots___DEFAULT__': {'limit': -1, 'in_use': 0, 'reserved': 0},
|
|
||||||
'groups': {'limit': 10, 'in_use': 0, 'reserved': 0},
|
|
||||||
'id': uuid.uuid4().hex,
|
|
||||||
}
|
|
||||||
quota_attrs.update(attrs)
|
|
||||||
|
|
||||||
quota = fakes.FakeResource(info=copy.deepcopy(quota_attrs), loaded=True)
|
|
||||||
|
|
||||||
return quota
|
|
||||||
|
@ -58,10 +58,6 @@ class FakeVolumeClient:
|
|||||||
self.group_types.resource_class = fakes.FakeResource(None, {})
|
self.group_types.resource_class = fakes.FakeResource(None, {})
|
||||||
self.messages = mock.Mock()
|
self.messages = mock.Mock()
|
||||||
self.messages.resource_class = fakes.FakeResource(None, {})
|
self.messages.resource_class = fakes.FakeResource(None, {})
|
||||||
self.quota_classes = mock.Mock()
|
|
||||||
self.quota_classes.resource_class = fakes.FakeResource(None, {})
|
|
||||||
self.quotas = mock.Mock()
|
|
||||||
self.quotas.resource_class = fakes.FakeResource(None, {})
|
|
||||||
self.resource_filters = mock.Mock()
|
self.resource_filters = mock.Mock()
|
||||||
self.resource_filters.resource_class = fakes.FakeResource(None, {})
|
self.resource_filters.resource_class = fakes.FakeResource(None, {})
|
||||||
self.restores = mock.Mock()
|
self.restores = mock.Mock()
|
||||||
|
@ -7,7 +7,7 @@ pbr!=2.1.0,>=2.0.0 # Apache-2.0
|
|||||||
cryptography>=2.7 # BSD/Apache-2.0
|
cryptography>=2.7 # BSD/Apache-2.0
|
||||||
cliff>=3.5.0 # Apache-2.0
|
cliff>=3.5.0 # Apache-2.0
|
||||||
iso8601>=0.1.11 # MIT
|
iso8601>=0.1.11 # MIT
|
||||||
openstacksdk>=3.2.0 # Apache-2.0
|
openstacksdk>=3.3.0 # Apache-2.0
|
||||||
osc-lib>=2.3.0 # Apache-2.0
|
osc-lib>=2.3.0 # Apache-2.0
|
||||||
oslo.i18n>=3.15.3 # Apache-2.0
|
oslo.i18n>=3.15.3 # Apache-2.0
|
||||||
python-keystoneclient>=3.22.0 # Apache-2.0
|
python-keystoneclient>=3.22.0 # Apache-2.0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user