Coverage for nova/api/openstack/compute/views/limits.py: 100%
28 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-24 11:16 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-24 11:16 +0000
1# Copyright 2010-2011 OpenStack Foundation
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
17class ViewBuilder(object):
18 """OpenStack API base limits view builder."""
20 limit_names = {}
22 def __init__(self):
23 self.limit_names = {
24 "ram": ["maxTotalRAMSize"],
25 "instances": ["maxTotalInstances"],
26 "cores": ["maxTotalCores"],
27 "key_pairs": ["maxTotalKeypairs"],
28 "floating_ips": ["maxTotalFloatingIps"],
29 "metadata_items": ["maxServerMeta", "maxImageMeta"],
30 "injected_files": ["maxPersonality"],
31 "injected_file_content_bytes": ["maxPersonalitySize"],
32 "security_groups": ["maxSecurityGroups"],
33 "security_group_rules": ["maxSecurityGroupRules"],
34 "server_groups": ["maxServerGroups"],
35 "server_group_members": ["maxServerGroupMembers"]
36 }
38 def build(self, request, quotas, filtered_limits=None,
39 max_image_meta=True):
40 filtered_limits = filtered_limits or []
41 absolute_limits = self._build_absolute_limits(
42 quotas, filtered_limits,
43 max_image_meta=max_image_meta)
45 used_limits = self._build_used_limits(
46 request, quotas, filtered_limits)
48 absolute_limits.update(used_limits)
49 output = {
50 "limits": {
51 "rate": [],
52 "absolute": absolute_limits,
53 },
54 }
56 return output
58 def _build_absolute_limits(self, quotas, filtered_limits=None,
59 max_image_meta=True):
60 """Builder for absolute limits
62 absolute_limits should be given as a dict of limits.
63 For example: {"ram": 512, "gigabytes": 1024}.
65 filtered_limits is an optional list of limits to exclude from the
66 result set.
67 """
68 absolute_limits = {k: v['limit'] for k, v in quotas.items()}
69 limits = {}
70 for name, value in absolute_limits.items():
71 if (name in self.limit_names and
72 value is not None and name not in filtered_limits):
73 for limit_name in self.limit_names[name]:
74 if not max_image_meta and limit_name == "maxImageMeta":
75 continue
76 limits[limit_name] = value
77 return limits
79 def _build_used_limits(self, request, quotas, filtered_limits):
80 quota_map = {
81 'totalRAMUsed': 'ram',
82 'totalCoresUsed': 'cores',
83 'totalInstancesUsed': 'instances',
84 'totalFloatingIpsUsed': 'floating_ips',
85 'totalSecurityGroupsUsed': 'security_groups',
86 'totalServerGroupsUsed': 'server_groups',
87 }
88 used_limits = {}
89 for display_name, key in quota_map.items():
90 if (key in quotas and key not in filtered_limits):
91 used_limits[display_name] = quotas[key]['in_use']
93 return used_limits