diff options
-rw-r--r-- | setup.py | 2 | ||||
-rw-r--r-- | test-requirements.txt | 2 | ||||
-rw-r--r-- | tuskar_ui/api/heat.py | 14 | ||||
-rw-r--r-- | tuskar_ui/api/node.py | 6 | ||||
-rw-r--r-- | tuskar_ui/infrastructure/overview/urls.py | 3 | ||||
-rw-r--r-- | tuskar_ui/infrastructure/overview/views.py | 44 | ||||
-rw-r--r-- | tuskar_ui/infrastructure/parameters/forms.py | 6 | ||||
-rw-r--r-- | tuskar_ui/infrastructure/static/infrastructure/js/tuskar.deployment_live.js | 17 | ||||
-rw-r--r-- | tuskar_ui/infrastructure/templates/infrastructure/_scripts.html | 1 | ||||
-rw-r--r-- | tuskar_ui/infrastructure/templates/infrastructure/overview/deployment_base.html | 2 | ||||
-rw-r--r-- | tuskar_ui/infrastructure/templates/infrastructure/overview/deployment_live.html | 55 | ||||
-rw-r--r-- | tuskar_ui/infrastructure/templates/infrastructure/overview/overcloudrc.sh.template | 9 | ||||
-rw-r--r-- | tuskar_ui/infrastructure/templatetags/context_selection.py | 41 |
13 files changed, 152 insertions, 50 deletions
@@ -25,5 +25,5 @@ except ImportError: pass setuptools.setup( - setup_requires=['pbr'], + setup_requires=['pbr>=1.3'], pbr=True) diff --git a/test-requirements.txt b/test-requirements.txt index c2dedb5a..bc873bfc 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -20,7 +20,7 @@ http://tarballs.openstack.org/python-tuskarclient/python-tuskarclient-master.tar coverage>=3.6 django-nose>=1.2 -mock>=1.0 +mock>=1.2 mox>=0.5.3 mox3>=0.7.0 nodeenv>=0.9.4 # BSD License diff --git a/tuskar_ui/api/heat.py b/tuskar_ui/api/heat.py index 9852ca00..923565ec 100644 --- a/tuskar_ui/api/heat.py +++ b/tuskar_ui/api/heat.py @@ -429,12 +429,14 @@ class Stack(base.APIResourceWrapper): if not client: return [] - services = client.services.list() - - for service in services: - if service.name == 'horizon': - break - else: + try: + services = client.services.list() + for service in services: + if service.name == 'horizon': + break + else: + return [] + except Exception: return [] admin_urls = [endpoint.adminurl for endpoint diff --git a/tuskar_ui/api/node.py b/tuskar_ui/api/node.py index 2f67ae78..2ad65195 100644 --- a/tuskar_ui/api/node.py +++ b/tuskar_ui/api/node.py @@ -11,6 +11,7 @@ # under the License. import logging +import time from django.conf import settings from django.utils.translation import ugettext_lazy as _ @@ -266,6 +267,11 @@ class Node(base.APIResourceWrapper): for uuid in uuids: discoverd_client.introspect(uuid, IRONIC_DISCOVERD_URL, request.user.token.id) + # NOTE(dtantsur): PXE firmware on virtual machines misbehaves when + # a lot of nodes start DHCPing simultaneously: it ignores NACK from + # DHCP server, tries to get the same address, then times out. Work + # around it by using sleep, anyway introspection takes much longer. + time.sleep(5) @classmethod def set_maintenance(cls, request, uuid, maintenance): diff --git a/tuskar_ui/infrastructure/overview/urls.py b/tuskar_ui/infrastructure/overview/urls.py index 6e409a6b..35410d5d 100644 --- a/tuskar_ui/infrastructure/overview/urls.py +++ b/tuskar_ui/infrastructure/overview/urls.py @@ -32,4 +32,7 @@ urlpatterns = urls.patterns( urls.url(r'^scale-out$', views.ScaleOutView.as_view(), name='scale_out'), + urls.url(r'^download-overcloudrc$', + views.download_overcloudrc_file, + name='download_overcloudrc'), ) diff --git a/tuskar_ui/infrastructure/overview/views.py b/tuskar_ui/infrastructure/overview/views.py index 970725c8..90f9fa37 100644 --- a/tuskar_ui/infrastructure/overview/views.py +++ b/tuskar_ui/infrastructure/overview/views.py @@ -13,14 +13,18 @@ # under the License. import json +import logging +import urlparse from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse_lazy from django import http +from django import shortcuts import django.utils.text from django.utils.translation import ugettext_lazy as _ import heatclient import horizon.forms +from horizon import messages from tuskar_ui import api from tuskar_ui.infrastructure.overview import forms @@ -29,6 +33,8 @@ from tuskar_ui.infrastructure import views INDEX_URL = 'horizon:infrastructure:overview:index' +LOG = logging.getLogger(__name__) + def _steps_message(messages): total_steps = len(messages) @@ -218,6 +224,10 @@ class IndexView(horizon.forms.ModalFormView, views.StackMixin): controller_role.parameter_prefix + 'AdminPassword') context['dashboard_urls'] = stack.dashboard_urls + no_proxy = [urlparse.urlparse(url).hostname + for url in stack.dashboard_urls] + context['no_proxy'] = ",".join(no_proxy) + context['auth_url'] = stack.keystone_auth_url else: messages = forms.validate_plan(request, plan) context['plan_messages'] = messages @@ -344,3 +354,37 @@ class ScaleOutView(horizon.forms.ModalFormView, views.StackMixin): 'plan': plan, }) return context + + +def _get_openrc_credentials(request): + plan = api.tuskar.Plan.get_the_plan(request) + stack = api.heat.Stack.get_by_plan(request, plan) + no_proxy = [urlparse.urlparse(url).hostname + for url in stack.dashboard_urls] + controller_role = plan.get_role_by_name("Controller") + credentials = dict(tenant_name='admin', + auth_url=stack.keystone_auth_url, + admin_password=plan.parameter_value( + controller_role.parameter_prefix + 'AdminPassword'), + no_proxy=",".join(no_proxy)) + return credentials + + +def download_overcloudrc_file(request): + template = 'infrastructure/overview/overcloudrc.sh.template' + try: + context = _get_openrc_credentials(request) + + response = shortcuts.render(request, + template, + context, + content_type="text/plain") + response['Content-Disposition'] = ('attachment; ' + 'filename="overcloudrc"') + response['Content-Length'] = str(len(response.content)) + return response + + except Exception as e: + LOG.exception("Exception in DownloadOvercloudrcForm.") + messages.error(request, _('Error Downloading RC File: %s') % e) + return shortcuts.redirect(request.build_absolute_uri()) diff --git a/tuskar_ui/infrastructure/parameters/forms.py b/tuskar_ui/infrastructure/parameters/forms.py index cc31df57..e0c0609d 100644 --- a/tuskar_ui/infrastructure/parameters/forms.py +++ b/tuskar_ui/infrastructure/parameters/forms.py @@ -136,7 +136,11 @@ class AdvancedEditServiceConfig(ServiceConfig): def handle(self, request, data): plan = api.tuskar.Plan.get_the_plan(self.request) - data = self._sync_common_params_across_roles(plan, data) + + # TODO(bcrochet): Commenting this out. + # For advanced config, we should have a whitelist of which params + # must be synced across roles. + # data = self._sync_common_params_across_roles(plan, data) try: plan.patch(request, plan.uuid, data) diff --git a/tuskar_ui/infrastructure/static/infrastructure/js/tuskar.deployment_live.js b/tuskar_ui/infrastructure/static/infrastructure/js/tuskar.deployment_live.js new file mode 100644 index 00000000..22e4f2f5 --- /dev/null +++ b/tuskar_ui/infrastructure/static/infrastructure/js/tuskar.deployment_live.js @@ -0,0 +1,17 @@ +tuskar.deployment_live = (function () { + 'use strict'; + + var module = {}; + + module.init = function () { + $("#overcloudrc").on("hide.bs.collapse", function(){ + $("span.overcloudrc").html('Show <i class="fa fa-angle-down"></i>'); + }); + $("#overcloudrc").on("show.bs.collapse", function(){ + $("span.overcloudrc").html('Hide <i class="fa fa-angle-up"></i>'); + }); + }; + + horizon.addInitFunction(module.init); + return module; +} ()); diff --git a/tuskar_ui/infrastructure/templates/infrastructure/_scripts.html b/tuskar_ui/infrastructure/templates/infrastructure/_scripts.html index 61d91811..ff190f01 100644 --- a/tuskar_ui/infrastructure/templates/infrastructure/_scripts.html +++ b/tuskar_ui/infrastructure/templates/infrastructure/_scripts.html @@ -10,6 +10,7 @@ <script src='{{ STATIC_URL }}infrastructure/js/tuskar.edit_plan.js' type='text/javascript' charset='utf-8'></script> <script src='{{ STATIC_URL }}infrastructure/js/tuskar.deployment_progress.js' type='text/javascript' charset='utf-8'></script> <script src='{{ STATIC_URL }}infrastructure/js/tuskar.performance.js' type='text/javascript' charset='utf-8'></script> + <script src='{{ STATIC_URL }}infrastructure/js/tuskar.deployment_live.js' type='text/javascript' charset='utf-8'></script> {% endblock %} {% comment %} Tuskar-UI Client-side Templates (These should *not* be inside the "compress" tag.) {% endcomment %} diff --git a/tuskar_ui/infrastructure/templates/infrastructure/overview/deployment_base.html b/tuskar_ui/infrastructure/templates/infrastructure/overview/deployment_base.html index b8065a6d..04bf8eef 100644 --- a/tuskar_ui/infrastructure/templates/infrastructure/overview/deployment_base.html +++ b/tuskar_ui/infrastructure/templates/infrastructure/overview/deployment_base.html @@ -22,4 +22,6 @@ </div> </div> +{% block deployment-overcloudrc %}{% endblock %} + {% block templates %}{% endblock %} diff --git a/tuskar_ui/infrastructure/templates/infrastructure/overview/deployment_live.html b/tuskar_ui/infrastructure/templates/infrastructure/overview/deployment_live.html index 9d371641..af6dfa81 100644 --- a/tuskar_ui/infrastructure/templates/infrastructure/overview/deployment_live.html +++ b/tuskar_ui/infrastructure/templates/infrastructure/overview/deployment_live.html @@ -56,3 +56,58 @@ </a> {% endblock %} + +{% block deployment-overcloudrc %} + <div class="clear"></div> + <div class="deployment-icon"> + <i class="fa fa-key fa-3x fa-fw"></i> + </div> + <div class="deployment-box clearfix"> + <h4>{% trans "Overcloudrc Information" %}</h4><a data-toggle="collapse" href="#overcloudrc" aria-expanded="false" aria-controls="overcloudrc" id="collapse-rc"><span class='overcloudrc'>{% trans "Show" %}<i class="fa fa-angle-down"></i></span></a> + <div class="collapse" id="overcloudrc"> + <div class="row"> + <div class="col-xs-4">NOVA_VERSION:</div> + <div class="col-xs-8">1.1</div> + </div> + <div class="row"> + <div class="col-xs-4">OS_USERNAME:</div> + <div class="col-xs-8">admin</div> + </div> + <div class="row"> + <div class="col-xs-4">OS_PASSWORD:</div> + <div class="col-xs-8">{{ admin_password }}</div> + </div> + <div class="row"> + <div class="col-xs-4">OS_AUTH_URL:</div> + <div class="col-xs-8">{{ auth_url }}</div> + </div> + <div class="row"> + <div class="col-xs-4">OS_TENANT_NAME:</div> + <div class="col-xs-8">admin</div> + </div> + <div class="row"> + <div class="col-xs-4">COMPUTE_API_VERSION:</div> + <div class="col-xs-8">1.1</div> + </div> + <div class="row"> + <div class="col-xs-4">OS_NO_CACHE:</div> + <div class="col-xs-8">True</div> + </div> + <div class="row"> + <div class="col-xs-4">no_proxy:</div> + <div class="col-xs-8">{{ no_proxy }}</div> + </div> + <div class="row"> + <div class="col-xs-4">{% trans "Download" %}</div> + <div class="col-xs-8"> + <a + href="{% url 'horizon:infrastructure:overview:download_overcloudrc' %}" + class="btn btn-default" + > + <i class="fa fa-lg fa-download"></i> {% trans "Download" %} + </a> + </div> + </div> + </div> + </div> +{% endblock %} diff --git a/tuskar_ui/infrastructure/templates/infrastructure/overview/overcloudrc.sh.template b/tuskar_ui/infrastructure/templates/infrastructure/overview/overcloudrc.sh.template new file mode 100644 index 00000000..5977bb37 --- /dev/null +++ b/tuskar_ui/infrastructure/templates/infrastructure/overview/overcloudrc.sh.template @@ -0,0 +1,9 @@ +#!/bin/bash +export NOVA_VERSION=1.1 +export OS_AUTH_URL={{ auth_url }} +export OS_TENANT_NAME="admin" +export OS_USERNAME="admin" +export OS_PASSWORD={{ admin_password }} +export COMPUTE_API_VERSION=1.1 +export OS_NO_CACHE=True +export no_proxy={{ no_proxy }} diff --git a/tuskar_ui/infrastructure/templatetags/context_selection.py b/tuskar_ui/infrastructure/templatetags/context_selection.py deleted file mode 100644 index 8b29d805..00000000 --- a/tuskar_ui/infrastructure/templatetags/context_selection.py +++ /dev/null @@ -1,41 +0,0 @@ -# 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 __future__ import absolute_import - -from django import template - - -register = template.Library() - -# Overwrite the selector code from OpenStack Dashboard, so that the -# selector doesn't appear. - - -@register.simple_tag() -def show_overview(*args, **kwargs): - return '<span class="context-overview"></span>' - - -@register.simple_tag() -def show_domain_list(*args, **kwargs): - return '' - - -@register.simple_tag() -def show_project_list(*args, **kwargs): - return '' - - -@register.simple_tag() -def show_region_list(*args, **kwargs): - return '' |