diff --git a/_60_tuskar_boxes.py.example b/_60_tuskar_boxes.py.example index 524a990..16b307a 100644 --- a/_60_tuskar_boxes.py.example +++ b/_60_tuskar_boxes.py.example @@ -2,3 +2,6 @@ PANEL = 'overview' PANEL_DASHBOARD = 'infrastructure' PANEL_GROUP = 'infrastructure' ADD_PANEL = 'tuskar_boxes.overview.panel.Overview' +ADD_INSTALLED_APPS = [ + 'tuskar_boxes', +] diff --git a/tuskar_boxes/overview/forms.py b/tuskar_boxes/overview/forms.py new file mode 100644 index 0000000..0d52997 --- /dev/null +++ b/tuskar_boxes/overview/forms.py @@ -0,0 +1,59 @@ +# -*- 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 logging + +import django.forms +from django.utils.translation import ugettext_lazy as _ +import horizon.exceptions +from tuskar_ui.infrastructure.overview import forms + + +LOG = logging.getLogger(__name__) + + +class EditPlan(forms.EditPlan): + def __init__(self, *args, **kwargs): + super(EditPlan, self).__init__(*args, **kwargs) + self.fields.update(self._role_flavor_fields(self.plan)) + + def _role_flavor_fields(self, plan): + fields = {} + for role in plan.role_list: + field = django.forms.CharField( + label=_("Flavor for {0}").format(role.name), + initial=role.flavor(plan).name if role.flavor(plan) else '', + required=False, + widget=django.forms.HiddenInput(attrs={ + 'class': "boxes-flavor", + }), + ) + field.role = role + fields['%s-flavor' % role.id] = field + return fields + + + def handle(self, request, data): + result = super(EditPlan, self).handle(request, data) + parameters = dict( + (field.role.flavor_parameter_name, data[name]) + for (name, field) in self.fields.items() if name.endswith('-flavor') + ) + try: + self.plan = self.plan.patch(request, self.plan.uuid, parameters) + except Exception as e: + horizon.exceptions.handle(request, _("Unable to update the plan.")) + LOG.exception(e) + return False + return result diff --git a/tuskar_boxes/overview/views.py b/tuskar_boxes/overview/views.py index 7fcebac..c64f3e3 100644 --- a/tuskar_boxes/overview/views.py +++ b/tuskar_boxes/overview/views.py @@ -14,6 +14,7 @@ from tuskar_ui import api from tuskar_ui.infrastructure.overview import views +from tuskar_boxes.overview import forms def flavor_nodes(request, flavor): @@ -27,25 +28,38 @@ def flavor_nodes(request, flavor): ]): yield node + class IndexView(views.IndexView): template_name = "tuskar_boxes/overview/index.html" + form_class = forms.EditPlan def get_context_data(self, *args, **kwargs): context = super(IndexView, self).get_context_data(*args, **kwargs) flavors = api.flavor.Flavor.list(self.request) flavors.sort(key=lambda np: (np.vcpus, np.ram, np.disk)) + for role in context['roles']: + flavor = role['role'].flavor(context['plan']) + role['flavor_name'] = flavor.name if flavor else '' context['flavors'] = [] for flavor in flavors: nodes = [{ 'role': '', } for node in flavor_nodes(self.request, flavor)] + roles = [role for role in context['roles'] + if role['flavor_name'] == flavor.name] flavor = { 'name': flavor.name, 'vcpus': flavor.vcpus, 'ram': flavor.ram, 'disk': flavor.disk, 'nodes': nodes, + 'roles': roles, } - if nodes: # Don't list empty flavors + if nodes or roles: # Don't list empty flavors context['flavors'].append(flavor) + context['free_roles'] = [role for role in context['roles'] + if not role['flavor_name']] + if not context['stack']: + for role in context['roles']: + role['flavor_field'] = context['form'][role['id'] + '-flavor'] return context diff --git a/tuskar_boxes/templates/tuskar_boxes/overview/role_nodes_edit.html b/tuskar_boxes/templates/tuskar_boxes/overview/role_nodes_edit.html index 178c3ca..0367ec5 100644 --- a/tuskar_boxes/templates/tuskar_boxes/overview/role_nodes_edit.html +++ b/tuskar_boxes/templates/tuskar_boxes/overview/role_nodes_edit.html @@ -3,14 +3,14 @@ {% load form_helpers %}