Itxaka 4958805863 Merge "missing" quotas with nova quotas
There was an extra variable for the so called "missing"
quotas since 2013. This patch merges them with the
normal nova quotas, cleans up the tests, removes any
usage of that special var and as a side effect, adds
the missing keys to the project quota update page.

Change-Id: Icaac1ebb1749e13fdfc307e89dcc6bbd64bef922
Closes-Bug: 1655393
2017-03-01 15:30:33 +00:00

132 lines
5.5 KiB
Python

# Copyright 2013 Kylin, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import logging
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import workflows
from openstack_dashboard.api import cinder
from openstack_dashboard.api import nova
from openstack_dashboard.usage import quotas
LOG = logging.getLogger(__name__)
class UpdateDefaultQuotasAction(workflows.Action):
ifcb_label = _("Injected File Content Bytes")
ifpb_label = _("Length of Injected File Path")
injected_file_content_bytes = forms.IntegerField(min_value=-1,
label=ifcb_label)
metadata_items = forms.IntegerField(min_value=-1,
label=_("Metadata Items"))
ram = forms.IntegerField(min_value=-1, label=_("RAM (MB)"))
floating_ips = forms.IntegerField(min_value=-1, label=_("Floating IPs"))
key_pairs = forms.IntegerField(min_value=-1, label=_("Key Pairs"))
injected_file_path_bytes = forms.IntegerField(min_value=-1,
label=ifpb_label)
instances = forms.IntegerField(min_value=-1, label=_("Instances"))
security_group_rules = forms.IntegerField(min_value=-1,
label=_("Security Group Rules"))
injected_files = forms.IntegerField(min_value=-1,
label=_("Injected Files"))
cores = forms.IntegerField(min_value=-1, label=_("VCPUs"))
security_groups = forms.IntegerField(min_value=-1,
label=_("Security Groups"))
gigabytes = forms.IntegerField(
min_value=-1,
label=_("Total Size of Volumes and Snapshots (GiB)"))
snapshots = forms.IntegerField(min_value=-1, label=_("Volume Snapshots"))
volumes = forms.IntegerField(min_value=-1, label=_("Volumes"))
def __init__(self, request, *args, **kwargs):
super(UpdateDefaultQuotasAction, self).__init__(request,
*args,
**kwargs)
disabled_quotas = quotas.get_disabled_quotas(request)
for field in disabled_quotas:
if field in self.fields:
self.fields[field].required = False
self.fields[field].widget = forms.HiddenInput()
class Meta(object):
name = _("Default Quotas")
slug = 'update_default_quotas'
help_text = _("From here you can update the default quotas "
"(max limits).")
class UpdateDefaultQuotasStep(workflows.Step):
action_class = UpdateDefaultQuotasAction
contributes = quotas.QUOTA_FIELDS
class UpdateDefaultQuotas(workflows.Workflow):
slug = "update_default_quotas"
name = _("Update Default Quotas")
finalize_button_name = _("Update Defaults")
success_message = _('Default quotas updated.')
failure_message = _('Unable to update default quotas.')
success_url = "horizon:admin:defaults:index"
default_steps = (UpdateDefaultQuotasStep,)
def handle(self, request, data):
# Update the default quotas.
# `fixed_ips` update for quota class is not supported by novaclient
nova_data = dict([(key, data[key]) for key in quotas.NOVA_QUOTA_FIELDS
if key != 'fixed_ips'])
is_error_nova = False
is_error_cinder = False
is_volume_service_enabled = cinder.is_volume_service_enabled(request)
# Update the default quotas for nova.
try:
nova.default_quota_update(request, **nova_data)
except Exception:
is_error_nova = True
# Update the default quotas for cinder.
try:
if is_volume_service_enabled:
cinder_data = dict([(key, data[key]) for key in
quotas.CINDER_QUOTA_FIELDS])
cinder.default_quota_update(request, **cinder_data)
else:
LOG.debug('Unable to update Cinder default quotas'
' because the Cinder volume service is disabled.')
except Exception:
is_error_cinder = True
# Analyze errors (if any) to determine what success and error messages
# to display to the user.
if is_error_nova and not is_error_cinder:
if is_volume_service_enabled:
self.success_message = _('Default quotas updated for Cinder.')
exceptions.handle(request,
_('Unable to update default quotas'
' for Nova.'))
else:
return False
elif is_error_cinder and not is_error_nova:
self.success_message = _('Default quotas updated for Nova.')
exceptions.handle(request,
_('Unable to update default quotas for Cinder.'))
elif is_error_nova and is_error_cinder:
return False
return True