manila-ui/manila_ui/dashboards/project/share_groups/forms.py

266 lines
11 KiB
Python

# Copyright 2017 Mirantis, Inc.
# All rights reserved.
#
# 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.core.urlresolvers import reverse
from django.forms import ValidationError # noqa
from django.utils.translation import ugettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import messages
from horizon.utils import memoized
import six
from manila_ui.api import manila
class CreateShareGroupForm(forms.SelfHandlingForm):
name = forms.CharField(label=_("Name"), max_length="255", required=True)
description = forms.CharField(
label=_("Description"),
max_length="255",
widget=forms.Textarea(attrs={"rows": 3}),
required=False)
def __init__(self, request, *args, **kwargs):
super(CreateShareGroupForm, self).__init__(request, *args, **kwargs)
self.st_field_name_prefix = "share-type-choices-"
self.fields["source_type"] = forms.ChoiceField(
label=_("Source Type"),
widget=forms.Select(attrs={
"class": "switchable",
"data-slug": "source",
}),
required=False)
self.fields["snapshot"] = forms.ChoiceField(
label=_("Use share group snapshot as a source"),
widget=forms.SelectWidget(attrs={
"class": "switched",
"data-switch-on": "source",
"data-source-snapshot": _("Share Group Snapshot"),
}),
required=True)
if ("snapshot_id" in request.GET or
kwargs.get("data", {}).get("snapshot")):
try:
snapshot = self.get_share_group_snapshot(
request,
request.GET.get(
"snapshot_id",
kwargs.get("data", {}).get("snapshot")))
self.fields["name"].initial = snapshot.name
self.fields["snapshot"].choices = (
(snapshot.id, snapshot.name or snapshot.id),
)
try:
# Set the share group type from the original share group
orig_sg = manila.share_group_get(
request, snapshot.share_group_id)
self.fields["sgt"].initial = orig_sg.share_group_type_id
except Exception:
pass
del self.fields["source_type"]
except Exception:
exceptions.handle(
request,
_("Unable to load the specified share group snapshot."))
else:
source_type_choices = []
try:
snapshot_list = manila.share_group_snapshot_list(request)
snapshots = [s for s in snapshot_list
if s.status == "available"]
if snapshots:
source_type_choices.append(("snapshot", _("Snapshot")))
self.fields["snapshot"].choices = (
[("", _("Choose a snapshot"))] +
[(s.id, s.name or s.id) for s in snapshots]
)
else:
del self.fields["snapshot"]
except Exception:
exceptions.handle(
request,
_("Unable to retrieve share group snapshots."))
if source_type_choices:
choices = ([('none', _("No source, empty share group"))] +
source_type_choices)
self.fields["source_type"].choices = choices
else:
del self.fields["source_type"]
self.fields["az"] = forms.ChoiceField(
label=_("Availability Zone"),
widget=forms.SelectWidget(attrs={
"class": "switched",
"data-switch-on": "source",
"data-source-none": _("Availability Zone"),
}),
required=False)
availability_zones = manila.availability_zone_list(request)
self.fields["az"].choices = (
[("", "")] + [(az.name, az.name) for az in availability_zones])
share_group_types = manila.share_group_type_list(request)
self.fields["sgt"] = forms.ChoiceField(
label=_("Share Group Type"),
widget=forms.fields.SelectWidget(attrs={
"class": "switched switchable",
"data-switch-on": "source",
"data-source-none": _("Share Group Type"),
"data-slug": "sgt",
}),
required=True)
self.fields["sgt"].choices = (
[("", "")] + [(sgt.id, sgt.name) for sgt in share_group_types])
# NOTE(vponomaryov): create separate set of available share types
# for each of share group types.
share_types = manila.share_type_list(request)
for sgt in share_group_types:
st_choices = (
[(st.id, st.name)
for st in share_types if st.id in sgt.share_types])
amount_of_choices = len(st_choices)
st_field_name = self.st_field_name_prefix + sgt.id
if amount_of_choices < 2:
st_field = forms.ChoiceField(
label=_("Share Types"),
choices=st_choices,
widget=forms.fields.SelectWidget(attrs={
"class": "switched",
"data-switch-on": "sgt",
"data-sgt-%s" % sgt.id: _(
"Share Types (one available)"),
}),
required=True)
else:
height = min(30 * amount_of_choices, 155)
st_field = forms.MultipleChoiceField(
label=_("Share Types"),
choices=st_choices,
widget=forms.fields.widgets.SelectMultiple(attrs={
"style": "max-height: %spx;" % height,
"class": "switched",
"data-switch-on": "sgt",
"data-sgt-%s" % sgt.id: _(
"Share Types (multiple available)"),
}),
required=False)
st_field.initial = st_choices[0]
self.fields[st_field_name] = st_field
self.fields["share_network"] = forms.ChoiceField(
label=_("Share Network"),
widget=forms.fields.SelectWidget(attrs={
"class": "switched",
"data-switch-on": "source",
"data-source-none": _("Share Network"),
}),
required=False)
share_networks = manila.share_network_list(request)
self.fields["share_network"].choices = (
[("", "")] +
[(sn.id, sn.name or sn.id) for sn in share_networks])
def clean(self):
cleaned_data = super(CreateShareGroupForm, self).clean()
form_errors = list(self.errors)
for error in form_errors:
sgt_name = error.split(self.st_field_name_prefix)[-1]
chosen_sgt = cleaned_data.get("sgt")
if (error.startswith(self.st_field_name_prefix) and
sgt_name != chosen_sgt):
cleaned_data[error] = "Not set"
self.errors.pop(error, None)
source_type = cleaned_data.get("source_type")
if source_type != "snapshot":
self.errors.pop("snapshot", None)
share_group_type = cleaned_data.get("sgt")
if share_group_type:
cleaned_data["share_types"] = cleaned_data.get(
self.st_field_name_prefix + share_group_type)
if isinstance(cleaned_data["share_types"], six.string_types):
cleaned_data["share_types"] = [cleaned_data["share_types"]]
else:
self.errors.pop("sgt", None)
return cleaned_data
def handle(self, request, data):
try:
source_type = data.get('source_type')
if (data.get("snapshot") and source_type in (None, 'snapshot')):
snapshot = self.get_share_group_snapshot(
request, data["snapshot"])
snapshot_id = snapshot.id
source_sg = manila.share_group_get(
request, snapshot.share_group_id)
data['sgt'] = source_sg.share_group_type_id
else:
snapshot_id = None
share_group = manila.share_group_create(
request,
name=data['name'],
description=data['description'],
share_group_type=data['sgt'],
share_types=None if snapshot_id else data.get('share_types'),
share_network=(
None if snapshot_id else data.get('share_network')),
source_share_group_snapshot=snapshot_id,
availability_zone=None if snapshot_id else data['az'])
message = _('Creating share group "%s"') % data['name']
messages.success(request, message)
return share_group
except ValidationError as e:
self.api_error(e.messages[0])
return False
except Exception:
exceptions.handle(request, ignore=True)
self.api_error(_("Unable to create share group."))
return False
@memoized.memoized
def get_share_group_snapshot(self, request, sg_snapshot_id):
return manila.share_group_snapshot_get(request, sg_snapshot_id)
class UpdateShareGroupForm(forms.SelfHandlingForm):
name = forms.CharField(
max_length="255", label=_("Share Group Name"))
description = forms.CharField(
widget=forms.Textarea, label=_("Description"), required=False)
def handle(self, request, data):
sg_id = self.initial['share_group_id']
try:
manila.share_group_update(
request, sg_id, data['name'], data['description'])
message = _('Updating share group "%s"') % data['name']
messages.success(request, message)
return True
except Exception:
redirect = reverse("horizon:project:share_groups:index")
exceptions.handle(
request, _('Unable to update share group.'), redirect=redirect)
return False