From 05e505c5c62b6885cf39ca8bb435b92461f1c726 Mon Sep 17 00:00:00 2001 From: Radomir Dopieralski Date: Thu, 2 Oct 2014 15:43:44 +0200 Subject: [PATCH] Sexy boxes drag and drop The plan edit page is modified to show the flavors with a visualisation of the nodes. Roles can be dragged and dropped on the flavors. TODO: actually save the flavor for a role in the form TODO: add a popup for adding the roles to flavors Change-Id: I9b97f39e3800b5b6c2e5639fcfd186b4196d0190 --- MANIFEST.in | 2 +- README.md => README.rst | 0 tuskar_boxes/overview/panel.py | 6 +- .../overview/_deploy_confirmation.html | 26 --- .../templates/overview/_post_deploy_init.html | 27 --- .../overview/_undeploy_confirmation.html | 25 --- .../overview/deploy_confirmation.html | 11 - .../templates/overview/deployment_base.html | 22 -- .../templates/overview/deployment_failed.html | 44 ---- .../overview/deployment_initialize.html | 23 -- .../templates/overview/deployment_live.html | 33 --- .../templates/overview/deployment_plan.html | 43 ---- .../overview/deployment_progress.html | 61 ------ .../templates/overview/post_deploy_init.html | 11 - .../templates/overview/role_nodes_edit.html | 32 --- .../templates/overview/role_nodes_status.html | 28 --- .../overview/undeploy_confirmation.html | 11 - tuskar_boxes/overview/urls.py | 6 +- tuskar_boxes/overview/views.py | 35 ++- .../tuskar_boxes}/overview/index.html | 9 +- .../overview/role_nodes_edit.html | 205 ++++++++++++++++++ 21 files changed, 249 insertions(+), 411 deletions(-) rename README.md => README.rst (100%) delete mode 100644 tuskar_boxes/overview/templates/overview/_deploy_confirmation.html delete mode 100644 tuskar_boxes/overview/templates/overview/_post_deploy_init.html delete mode 100644 tuskar_boxes/overview/templates/overview/_undeploy_confirmation.html delete mode 100644 tuskar_boxes/overview/templates/overview/deploy_confirmation.html delete mode 100644 tuskar_boxes/overview/templates/overview/deployment_base.html delete mode 100644 tuskar_boxes/overview/templates/overview/deployment_failed.html delete mode 100644 tuskar_boxes/overview/templates/overview/deployment_initialize.html delete mode 100644 tuskar_boxes/overview/templates/overview/deployment_live.html delete mode 100644 tuskar_boxes/overview/templates/overview/deployment_plan.html delete mode 100644 tuskar_boxes/overview/templates/overview/deployment_progress.html delete mode 100644 tuskar_boxes/overview/templates/overview/post_deploy_init.html delete mode 100644 tuskar_boxes/overview/templates/overview/role_nodes_edit.html delete mode 100644 tuskar_boxes/overview/templates/overview/role_nodes_status.html delete mode 100644 tuskar_boxes/overview/templates/overview/undeploy_confirmation.html rename tuskar_boxes/{overview/templates => templates/tuskar_boxes}/overview/index.html (84%) create mode 100644 tuskar_boxes/templates/tuskar_boxes/overview/role_nodes_edit.html diff --git a/MANIFEST.in b/MANIFEST.in index f71cb1a..02327c2 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -7,7 +7,7 @@ include AUTHORS include LICENSE include Makefile include manage.py -include README.md +include README.rst include run_tests.sh include tox.ini include doc/Makefile diff --git a/README.md b/README.rst similarity index 100% rename from README.md rename to README.rst diff --git a/tuskar_boxes/overview/panel.py b/tuskar_boxes/overview/panel.py index fb5e303..844f938 100644 --- a/tuskar_boxes/overview/panel.py +++ b/tuskar_boxes/overview/panel.py @@ -16,7 +16,8 @@ from django.utils.translation import ugettext_lazy as _ import horizon -from tuskar_ui.infrastructure import dashboard +import tuskar_ui.infrastructure.dashboard as tuskar_dashboard +from tuskar_ui.infrastructure.overview.panel import Overview as TuskarOverview class Overview(horizon.Panel): @@ -24,4 +25,5 @@ class Overview(horizon.Panel): slug = "overview" -dashboard.Infrastructure.register(Overview) +tuskar_dashboard.Infrastructure.unregister(TuskarOverview) +tuskar_dashboard.Infrastructure.register(Overview) diff --git a/tuskar_boxes/overview/templates/overview/_deploy_confirmation.html b/tuskar_boxes/overview/templates/overview/_deploy_confirmation.html deleted file mode 100644 index c8b5e84..0000000 --- a/tuskar_boxes/overview/templates/overview/_deploy_confirmation.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "horizon/common/_modal_form.html" %} -{% load i18n %} -{% load url from future %} - -{% block form_id %}provision_form{% endblock %} -{% block form_action %}{% url 'horizon:infrastructure:overview:deploy_confirmation' %}{% endblock %} - -{% block modal_id %}provision_modal{% endblock %} -{% block modal-header %}{% trans "Deployment Confirmation" %}{% endblock %} - -{% block modal-body %} -
-

{% trans "You are about deploy your overcloud" %} -

- {% if autogenerated_parameters %} - These parameters will be randomly generated before the deployment: -

{{ autogenerated_parameters|join:", " }}

- {% endif %} -

{% trans "This operation cannot be undone. Are you sure you want to do that?" %}

-
-{% endblock %} - -{% block modal-footer %} - - {% trans "Cancel" %} -{% endblock %} diff --git a/tuskar_boxes/overview/templates/overview/_post_deploy_init.html b/tuskar_boxes/overview/templates/overview/_post_deploy_init.html deleted file mode 100644 index 9e5dfee..0000000 --- a/tuskar_boxes/overview/templates/overview/_post_deploy_init.html +++ /dev/null @@ -1,27 +0,0 @@ -{% extends "horizon/common/_modal_form.html" %} -{% load i18n %} -{% load url from future %} - -{% block form_id %}post_deploy_init_form{% endblock %} -{% block form_action %}{% url 'horizon:infrastructure:overview:post_deploy_init' %}{% endblock %} - -{% block modal_id %}provision_modal{% endblock %} -{% block modal-header %}{% trans "Initialize Overcloud" %}{% endblock %} - -{% block modal-body %} -
-
-
- {% include "horizon/common/_form_fields.html" %} -
-
- {% trans "Your OpenStack cloud nodes are deployed. They need to be initialized before your cloud will be live."%} -
-
-
-{% endblock %} - -{% block modal-footer %} - - {% trans "Cancel" %} -{% endblock %} diff --git a/tuskar_boxes/overview/templates/overview/_undeploy_confirmation.html b/tuskar_boxes/overview/templates/overview/_undeploy_confirmation.html deleted file mode 100644 index 9fc0c5e..0000000 --- a/tuskar_boxes/overview/templates/overview/_undeploy_confirmation.html +++ /dev/null @@ -1,25 +0,0 @@ -{% extends "horizon/common/_modal_form.html" %} -{% load i18n %} -{% load url from future %} - -{% block form_id %}provision_form{% endblock %} -{% block form_action %}{% url 'horizon:infrastructure:overview:undeploy_confirmation' %}{% endblock %} - -{% block modal_id %}provision_modal{% endblock %} -{% block modal-header %}{% trans "Undeployment Confirmation" %}{% endblock %} - -{% block modal-body %} -
-

{% trans "You are about undeploy your overcloud" %} -

-

{% trans "This operation cannot be undone. Are you sure you want to do that?" %}

-
- {% include "horizon/common/_form_fields.html" %} -
-
-{% endblock %} - -{% block modal-footer %} - - {% trans "Cancel" %} -{% endblock %} diff --git a/tuskar_boxes/overview/templates/overview/deploy_confirmation.html b/tuskar_boxes/overview/templates/overview/deploy_confirmation.html deleted file mode 100644 index 74f6dc8..0000000 --- a/tuskar_boxes/overview/templates/overview/deploy_confirmation.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends 'infrastructure/base.html' %} -{% load i18n %} -{% block title %}{% trans "Deploy overcloud" %}{% endblock %} - -{% block page_header %} - {% include "horizon/common/_page_header.html" with title=_("Deploy overcloud") %} -{% endblock page_header %} - -{% block infrastructure_main %} - {% include "infrastructure/overview/_deploy_confirmation.html" %} -{% endblock %} diff --git a/tuskar_boxes/overview/templates/overview/deployment_base.html b/tuskar_boxes/overview/templates/overview/deployment_base.html deleted file mode 100644 index ca55e96..0000000 --- a/tuskar_boxes/overview/templates/overview/deployment_base.html +++ /dev/null @@ -1,22 +0,0 @@ -{% load i18n %} -{% load url from future%} - -
- {% block deployment-icon %} - - {% endblock %} -
-
-

{% block deployment-title %}{% endblock %}

- {% block deployment-info %}{% endblock %} -
- {% block deployment-buttons %} - - - {% trans "Undeploy" %} - - {% endblock %} -
-
diff --git a/tuskar_boxes/overview/templates/overview/deployment_failed.html b/tuskar_boxes/overview/templates/overview/deployment_failed.html deleted file mode 100644 index d7add0c..0000000 --- a/tuskar_boxes/overview/templates/overview/deployment_failed.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends "infrastructure/overview/deployment_base.html" %} - -{% load i18n %} -{% load url from future%} - -{% block deployment-icon %} - -{% endblock %} - -{% block deployment-title %} - {% if stack.is_delete_failed %} - {% trans "Undeploying failed" %} - {% elif stack.is_failed %} - {% trans "Deployment failed" %} - {% else %} - {% trans "Failure" %} - {% endif %} -{% endblock %} - -{% block deployment-info %} -{% if last_failed_events %} -{% trans "Last failed events:" %} -{% for event in last_failed_events %} -
-
-
{% trans "Timestamp" %}
-
-
{% trans "Resource Name" %}
-
{{ event.resource_name }}
-
{% trans "Status" %}
-
{{ event.resource_status }}
-
{% trans "Reason" %}
-
{{ event.resource_status_reason }}
-
-
-{% endfor %} -{% endif %} -

See full log

-{% endblock %} - -{% block deployment-buttons %} - {{ block.super }} -{% endblock %} - diff --git a/tuskar_boxes/overview/templates/overview/deployment_initialize.html b/tuskar_boxes/overview/templates/overview/deployment_initialize.html deleted file mode 100644 index 65419b9..0000000 --- a/tuskar_boxes/overview/templates/overview/deployment_initialize.html +++ /dev/null @@ -1,23 +0,0 @@ -{% extends "infrastructure/overview/deployment_base.html" %} - -{% load i18n %} -{% load url from future%} - -{% block deployment-icon %} - -{% endblock %} - -{% block deployment-title %}{% trans "Initialization" %}{% endblock %} - -{% block deployment-info %} -

{% trans "Your OpenStack cloud is deployed but it needs to get initialized in order to get live." %}

-{% endblock %} - -{% block deployment-buttons %} - {{ block.super }} - - - {% trans "Initialize" %} - -{% endblock %} diff --git a/tuskar_boxes/overview/templates/overview/deployment_live.html b/tuskar_boxes/overview/templates/overview/deployment_live.html deleted file mode 100644 index 92ab9f8..0000000 --- a/tuskar_boxes/overview/templates/overview/deployment_live.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends "infrastructure/overview/deployment_base.html" %} - -{% load i18n %} -{% load url from future%} - -{% block deployment-icon %} - -{% endblock %} -{% block deployment-title %}{% trans "Deployment is live" %}{% endblock %} -{% block deployment-info %} -{% trans "Access information" %} -
- {% for dashboard_url in dashboard_urls %} -
{% trans "Horizon URL" %}
-
{{ dashboard_url }}
- {% endfor %} -
{% trans "User name" %}
-
admin
-
-
-
-
-
- -
- -
-
-
-
-
-
-{% endblock %} diff --git a/tuskar_boxes/overview/templates/overview/deployment_plan.html b/tuskar_boxes/overview/templates/overview/deployment_plan.html deleted file mode 100644 index 9c90617..0000000 --- a/tuskar_boxes/overview/templates/overview/deployment_plan.html +++ /dev/null @@ -1,43 +0,0 @@ -{% extends "infrastructure/overview/deployment_base.html" %} - -{% load i18n %} -{% load url from future%} - -{% block deployment-icon %} -{% if plan_invalid %} - -{% else %} - -{% endif %} -{% endblock %} - -{% block deployment-title %} -{% if plan_invalid %} - {% trans "Design your deployment" %} -{% else %} - {% trans "Ready to get deployed" %} -{% endif %} -{% endblock %} - -{% block deployment-info %} - -{% endblock %} - -{% block deployment-buttons %} - - -{% trans "Deploy" %} - -{% endblock %} diff --git a/tuskar_boxes/overview/templates/overview/deployment_progress.html b/tuskar_boxes/overview/templates/overview/deployment_progress.html deleted file mode 100644 index d4ee783..0000000 --- a/tuskar_boxes/overview/templates/overview/deployment_progress.html +++ /dev/null @@ -1,61 +0,0 @@ -{% extends "infrastructure/overview/deployment_base.html" %} - -{% load i18n %} -{% load url from future%} - -{% block deployment-icon %} - -{% endblock %} - -{% block deployment-title %} - {% if stack.is_deleting %} - {% trans "Undeploying..." %} - {% elif stack.is_deploying %} - {% trans "Deploying..." %} - {% endif %} -{% endblock %} - -{% block deployment-info %} -{% if progress %} -
-
{{ progress }}% {% trans "Complete" %}
-
-{% endif %} -{% if last_failed_events %} - {% trans "Last failed events:" %} -{% for event in last_failed_events %} -
-
-
{% trans "Timestamp" %}
-
-
{% trans "Resource Name" %}
-
{{ event.resource_name }}
-
{% trans "Status" %}
-
{{ event.resource_status }}
-
{% trans "Reason" %}
-
{{ event.resource_status_reason }}
-
-
-{% endfor %} -{% endif %} -

See full log

-{% endblock %} - -{% block deployment-buttons %} - {% if stack.is_deploying %} - - - {% trans "Stop" %} - - {% endif %} -{% endblock %} - diff --git a/tuskar_boxes/overview/templates/overview/post_deploy_init.html b/tuskar_boxes/overview/templates/overview/post_deploy_init.html deleted file mode 100644 index 835c0e5..0000000 --- a/tuskar_boxes/overview/templates/overview/post_deploy_init.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends 'infrastructure/base.html' %} -{% load i18n %} -{% block title %}{% trans "Initialize" %}{% endblock %} - -{% block page_header %} - {% include "horizon/common/_page_header.html" with title=_("Initialize Overcloud") %} -{% endblock page_header %} - -{% block infrastructure_main %} - {% include "infrastructure/overview/_post_deploy_init.html" %} -{% endblock %} diff --git a/tuskar_boxes/overview/templates/overview/role_nodes_edit.html b/tuskar_boxes/overview/templates/overview/role_nodes_edit.html deleted file mode 100644 index 2b0f5bc..0000000 --- a/tuskar_boxes/overview/templates/overview/role_nodes_edit.html +++ /dev/null @@ -1,32 +0,0 @@ -{% load i18n %} -{% load url from future %} -{% load form_helpers %} - -

{% trans "Deployment Roles" %}

-
-{% csrf_token %} -{% include 'horizon/common/_form_errors.html' with form=form %} -{% for role in roles %} -
-
- {{ role.field|add_bootstrap_class }} -
-
- {{ role.name }} - {% for error in role.field.errors %} - - {{ error }} - - {% endfor %} -
-
-{% endfor %} -
- -
diff --git a/tuskar_boxes/overview/templates/overview/role_nodes_status.html b/tuskar_boxes/overview/templates/overview/role_nodes_status.html deleted file mode 100644 index 688835a..0000000 --- a/tuskar_boxes/overview/templates/overview/role_nodes_status.html +++ /dev/null @@ -1,28 +0,0 @@ -{% load i18n %} -{% load url from future %} - -

{% trans "Deployment Roles" %}

-{% for role in roles %} -
-
- {% if role.deployed_node_count < role.planned_node_count %} - {{ role.deployed_node_count }}/{{ role.planned_node_count }} - {% else %} - {{ role.planned_node_count }} - {% endif %} -
- -
-{% endfor %} diff --git a/tuskar_boxes/overview/templates/overview/undeploy_confirmation.html b/tuskar_boxes/overview/templates/overview/undeploy_confirmation.html deleted file mode 100644 index b234ac9..0000000 --- a/tuskar_boxes/overview/templates/overview/undeploy_confirmation.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends 'infrastructure/base.html' %} -{% load i18n %} -{% block title %}{% trans "Undeploy overcloud" %}{% endblock %} - -{% block page_header %} - {% include "horizon/common/_page_header.html" with title=_("Undeploy overcloud") %} -{% endblock page_header %} - -{% block infrastructure_main %} - {% include "infrastructure/overview/_undeploy_confirmation.html" %} -{% endblock %} diff --git a/tuskar_boxes/overview/urls.py b/tuskar_boxes/overview/urls.py index 7cbac26..683c350 100644 --- a/tuskar_boxes/overview/urls.py +++ b/tuskar_boxes/overview/urls.py @@ -15,12 +15,14 @@ from django.conf import urls from tuskar_ui.infrastructure.overview import views -import tuskar_boxes.views +import tuskar_boxes.overview.views as boxes_views urlpatterns = urls.patterns( '', - urls.url(r'^$', tuskar_boxes.views.IndexView.as_view(), name='index'), + urls.url(r'^$', + boxes_views.IndexView.as_view(), + name='index'), urls.url(r'^deploy-confirmation$', views.DeployConfirmationView.as_view(), name='deploy_confirmation'), diff --git a/tuskar_boxes/overview/views.py b/tuskar_boxes/overview/views.py index 8dce6a9..7fcebac 100644 --- a/tuskar_boxes/overview/views.py +++ b/tuskar_boxes/overview/views.py @@ -12,7 +12,40 @@ # License for the specific language governing permissions and limitations # under the License. +from tuskar_ui import api from tuskar_ui.infrastructure.overview import views + +def flavor_nodes(request, flavor): + """Lists all nodes that match the given flavor exactly.""" + for node in api.node.Node.list(request): + if all([ + int(node.cpus) == int(flavor.vcpus), + int(node.memory_mb) == int(flavor.ram), + int(node.local_gb) == int(flavor.disk), + # TODO(rdopieralski) add architecture when available + ]): + yield node + class IndexView(views.IndexView): - pass + template_name = "tuskar_boxes/overview/index.html" + + 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)) + context['flavors'] = [] + for flavor in flavors: + nodes = [{ + 'role': '', + } for node in flavor_nodes(self.request, flavor)] + flavor = { + 'name': flavor.name, + 'vcpus': flavor.vcpus, + 'ram': flavor.ram, + 'disk': flavor.disk, + 'nodes': nodes, + } + if nodes: # Don't list empty flavors + context['flavors'].append(flavor) + return context diff --git a/tuskar_boxes/overview/templates/overview/index.html b/tuskar_boxes/templates/tuskar_boxes/overview/index.html similarity index 84% rename from tuskar_boxes/overview/templates/overview/index.html rename to tuskar_boxes/templates/tuskar_boxes/overview/index.html index 60ac0d4..b50171d 100644 --- a/tuskar_boxes/overview/templates/overview/index.html +++ b/tuskar_boxes/templates/tuskar_boxes/overview/index.html @@ -4,13 +4,6 @@ {% block title %}{% trans 'My OpenStack Deployment' %}{% endblock %} -{% block css %} - {% if stack.is_deploying %} - - {% endif %} - {{ block.super }} -{% endblock %} - {% block page_header %} {% include 'horizon/common/_domain_page_header.html' with title=_('My OpenStack Deployment') %} {% endblock page_header %} @@ -36,7 +29,7 @@ {% if stack %} {% include "infrastructure/overview/role_nodes_status.html" %} {% else %} - {% include "infrastructure/overview/role_nodes_edit.html" %} + {% include "tuskar_boxes/overview/role_nodes_edit.html" %} {% endif %} diff --git a/tuskar_boxes/templates/tuskar_boxes/overview/role_nodes_edit.html b/tuskar_boxes/templates/tuskar_boxes/overview/role_nodes_edit.html new file mode 100644 index 0000000..178c3ca --- /dev/null +++ b/tuskar_boxes/templates/tuskar_boxes/overview/role_nodes_edit.html @@ -0,0 +1,205 @@ +{% load i18n %} +{% load url from future %} +{% load form_helpers %} + +

{% trans "Available Deployment Roles" %}

+
+{% csrf_token %} +{% include 'horizon/common/_form_errors.html' with form=form %} + +
+{% for role in roles %}{% spaceless %} +
+ {{ role.field|add_bootstrap_class }} + {{ role.name|title }} +
+{% endspaceless %}{% endfor %} +
+ +

{% trans "Available Node Profiles" %}

+{% for flavor in flavors %} +
+

+ Node Profile: + {{ flavor.name }} + {{ flavor.vcpus }} CPU, + {{ flavor.ram }}MB RAM, + {{ flavor.disk }}GB Disk +

+
+
+
+
+
+ +
+
+
+ {% for node in flavor.nodes %}{% spaceless %} +
free
+ {% endspaceless %}{% endfor %} +
+
+
+{% endfor %} + + +
+ + + + + +