diff options
Diffstat (limited to 'tuskar_ui/infrastructure/nodes/forms.py')
-rw-r--r-- | tuskar_ui/infrastructure/nodes/forms.py | 319 |
1 files changed, 0 insertions, 319 deletions
diff --git a/tuskar_ui/infrastructure/nodes/forms.py b/tuskar_ui/infrastructure/nodes/forms.py deleted file mode 100644 index 6ec6b6e8..00000000 --- a/tuskar_ui/infrastructure/nodes/forms.py +++ /dev/null @@ -1,319 +0,0 @@ -# -*- coding: utf8 -*- -# -# 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 django.forms -from django.utils.translation import ugettext_lazy as _ -from horizon import exceptions -from horizon import forms -from horizon import messages - -from tuskar_ui import api -import tuskar_ui.forms -from tuskar_ui.utils import utils - - -DEFAULT_KERNEL_IMAGE_NAME = 'bm-deploy-kernel' -DEFAULT_RAMDISK_IMAGE_NAME = 'bm-deploy-ramdisk' - -CPU_ARCH_CHOICES = [ - ('', _("unspecified")), - ('amd64', _("amd64")), - ('x86', _("x86")), - ('x86_64', _("x86_64")), -] -DRIVER_CHOICES = [ - ('pxe_ipmitool', _("IPMI Driver")), - ('pxe_ssh', _("PXE + SSH")), -] - - -def get_driver_info_dict(data): - driver = data['driver'] - driver_dict = {'driver': driver, - 'deployment_kernel': data['deployment_kernel'], - 'deployment_ramdisk': data['deployment_ramdisk'], - } - if driver == 'pxe_ipmitool': - driver_dict.update( - ipmi_address=data['ipmi_address'], - ipmi_username=data.get('ipmi_username'), - ipmi_password=data.get('ipmi_password'), - ) - elif driver == 'pxe_ssh': - driver_dict.update( - ssh_address=data['ssh_address'], - ssh_username=data['ssh_username'], - ssh_key_contents=data['ssh_key_contents'], - ) - return driver_dict - - -def create_node(request, data): - cpu_arch = data.get('cpu_arch') - cpus = data.get('cpus') - memory_mb = data.get('memory_mb') - local_gb = data.get('local_gb') - - kwargs = get_driver_info_dict(data) - kwargs.update( - cpu_arch=cpu_arch, - cpus=cpus, - memory_mb=memory_mb, - local_gb=local_gb, - mac_addresses=data['mac_addresses'].split(), - ) - success = True - try: - node = api.node.Node.create(request, **kwargs) - except Exception: - success = False - exceptions.handle(request, _(u"Unable to register node.")) - else: - # If not all the parameters have been filled in, - # run the auto-discovery. Note, that the node has been created, - # so even if we fail here, we report success. - if not all([cpu_arch, cpus, memory_mb, local_gb]): - node_uuid = node.uuid - try: - api.node.Node.set_maintenance(request, node_uuid, True) - except Exception: - exceptions.handle(request, _( - u"Can't set maintenance mode on node {0}." - ).format(node_uuid)) - else: - try: - api.node.Node.discover(request, [node_uuid]) - except Exception: - exceptions.handle(request, _( - u"Can't start discovery on node {0}." - ).format(node_uuid)) - return success - - -class NodeForm(django.forms.Form): - id = django.forms.IntegerField( - label="", - required=False, - widget=django.forms.HiddenInput(), - ) - - driver = django.forms.ChoiceField( - label=_("Driver"), - choices=DRIVER_CHOICES, - required=True, - widget=django.forms.Select(attrs={ - 'class': 'form-control switchable', - 'data-slug': 'driver', - }), - ) - - ipmi_address = django.forms.IPAddressField( - label=_("IPMI Address"), - required=False, - widget=django.forms.TextInput(attrs={ - 'class': 'form-control switched', - 'data-switch-on': 'driver', - 'data-driver-pxe_ipmitool': _("IPMI Driver"), - }), - ) - ipmi_username = django.forms.CharField( - label=_("IPMI User"), - required=False, - widget=django.forms.TextInput(attrs={ - 'class': 'form-control switched', - 'data-switch-on': 'driver', - 'data-driver-pxe_ipmitool': _("IPMI Driver"), - }), - ) - ipmi_password = django.forms.CharField( - label=_("IPMI Password"), - required=False, - widget=django.forms.PasswordInput(render_value=True, attrs={ - 'class': 'form-control switched', - 'data-switch-on': 'driver', - 'data-driver-pxe_ipmitool': _("IPMI Driver"), - }), - ) - ssh_address = django.forms.IPAddressField( - label=_("SSH Address"), - required=False, - widget=django.forms.TextInput(attrs={ - 'class': 'form-control switched', - 'data-switch-on': 'driver', - 'data-driver-pxe_ssh': _("PXE + SSH"), - }), - ) - ssh_username = django.forms.CharField( - label=_("SSH User"), - required=False, - widget=django.forms.TextInput(attrs={ - 'class': 'form-control switched', - 'data-switch-on': 'driver', - 'data-driver-pxe_ssh': _("PXE + SSH"), - }), - ) - ssh_key_contents = django.forms.CharField( - label=_("SSH Key Contents"), - required=False, - widget=django.forms.Textarea(attrs={ - 'class': 'form-control switched', - 'data-switch-on': 'driver', - 'data-driver-pxe_ssh': _("PXE + SSH"), - 'rows': 2, - }), - ) - mac_addresses = tuskar_ui.forms.MultiMACField( - label=_("NIC MAC Addresses"), - required=True, - widget=django.forms.Textarea(attrs={ - 'placeholder': _('unspecified'), - 'rows': '2', - }), - ) - cpu_arch = django.forms.ChoiceField( - label=_("Architecture"), - required=False, - choices=CPU_ARCH_CHOICES, - widget=django.forms.Select( - attrs={'placeholder': _('unspecified')}), - ) - cpus = django.forms.IntegerField( - label=_("CPUs"), - required=False, - min_value=0, - widget=tuskar_ui.forms.NumberInput( - attrs={'placeholder': _('unspecified')}), - ) - memory_mb = django.forms.IntegerField( - label=_("Memory"), - required=False, - min_value=0, - widget=tuskar_ui.forms.NumberInput( - attrs={'placeholder': _('unspecified')}), - ) - local_gb = django.forms.IntegerField( - label=_("Local Disk"), - required=False, - min_value=0, - widget=tuskar_ui.forms.NumberInput( - attrs={'placeholder': _('unspecified')}), - ) - deployment_kernel = django.forms.ChoiceField( - label=_("Kernel"), - required=False, - choices=[], - widget=django.forms.Select(), - ) - deployment_ramdisk = django.forms.ChoiceField( - label=_("Ramdisk"), - required=False, - choices=[], - widget=django.forms.Select(), - ) - - def get_name(self): - try: - name = (self.fields['ipmi_address'].value() or - self.fields['ssh_address'].value()) - except AttributeError: - # when the field is not bound - name = _("Undefined node") - return name - - def handle(self, request, data): - return create_node(request, data) - - def clean_ipmi_username(self): - return self.cleaned_data.get('ipmi_username') or None - - def clean_ipmi_password(self): - return self.cleaned_data.get('ipmi_password') or None - - def _require_field(self, field_name, cleaned_data): - if cleaned_data.get(field_name): - return - self._errors[field_name] = self.error_class([_( - u"This field is required" - )]) - - def clean(self): - cleaned_data = super(NodeForm, self).clean() - driver = cleaned_data['driver'] - - if driver == 'pxe_ipmitool': - self._require_field('ipmi_address', cleaned_data) - elif driver == 'pxe_ssh': - self._require_field('ssh_address', cleaned_data) - self._require_field('ssh_username', cleaned_data) - self._require_field('ssh_key_contents', cleaned_data) - - return cleaned_data - - -class BaseNodeFormset(tuskar_ui.forms.SelfHandlingFormset): - def __init__(self, *args, **kwargs): - self.kernel_images = kwargs.pop('kernel_images') - self.ramdisk_images = kwargs.pop('ramdisk_images') - super(BaseNodeFormset, self).__init__(*args, **kwargs) - - def add_fields(self, form, index): - deployment_kernel_choices = [(kernel.id, kernel.name) - for kernel in self.kernel_images] - deployment_ramdisk_choices = [(ramdisk.id, ramdisk.name) - for ramdisk in self.ramdisk_images] - form.fields['deployment_kernel'].choices = deployment_kernel_choices - form.fields['deployment_ramdisk'].choices = deployment_ramdisk_choices - - def clean(self): - all_macs = api.node.Node.get_all_mac_addresses(self.request) - bad_macs = set() - bad_macs_error = _("Duplicate MAC addresses submitted: %s.") - - for form in self: - if not form.cleaned_data: - raise django.forms.ValidationError( - _("Please provide node data for all nodes.")) - - new_macs = form.cleaned_data.get('mac_addresses') - if not new_macs: - continue - new_macs = set(new_macs.split()) - - # Prevent submitting duplicated MAC addresses - # or MAC addresses of existing nodes - bad_macs |= all_macs & new_macs - all_macs |= new_macs - - if bad_macs: - raise django.forms.ValidationError( - bad_macs_error % ", ".join(bad_macs)) - - -class UploadNodeForm(forms.SelfHandlingForm): - csv_file = forms.FileField(label='', required=False) - - def handle(self, request, data): - return True - - def get_data(self): - try: - output = utils.parse_csv_file(self.cleaned_data['csv_file']) - except ValueError as e: - messages.error(self.request, e.message) - output = [] - - return output - - -RegisterNodeFormset = django.forms.formsets.formset_factory( - NodeForm, extra=1, formset=BaseNodeFormset) |