
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
132 lines
5.5 KiB
Python
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
|