2e59431227
Volumes tabs should be enabled when volumev2 endpoint is registered. Currently, Horizon considers no volume service is running if there is no V1 endpoint, which doesn't make sense as Horizon no longer supports the cinder V1 protocol. Co-Authored-By: itxaka <itxaka@redhat.com> Change-Id: I35d821eedb75f73f9330ed11f921694104eed0c6 Closes-Bug: 1415712
134 lines
5.6 KiB
Python
134 lines
5.6 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.
|
|
|
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from horizon import exceptions
|
|
from horizon import forms
|
|
from horizon import workflows
|
|
|
|
import logging
|
|
|
|
from openstack_dashboard.api import cinder
|
|
from openstack_dashboard.api import nova
|
|
from openstack_dashboard.usage import quotas
|
|
|
|
ALL_NOVA_QUOTA_FIELDS = quotas.NOVA_QUOTA_FIELDS + quotas.MISSING_QUOTA_FIELDS
|
|
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 + quotas.MISSING_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 ALL_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
|