
This change implements a UI to launch, manage and delete Heat stacks. The launch screens are implemented with a set of chained forms where the second form is dynamically built from the template in the first step. A significant portion of this change was derived from the work Dan Radez <dradez@redhat.com> did on thermal: https://github.com/steveb/heat-horizon UX flow revisions and basic test cases by Gabriel Hurley. Implements blueprint: heat-ui Change-Id: I294e93bed6da9dd3553e8b4a6a1c09b7c165a555
101 lines
3.1 KiB
Python
101 lines
3.1 KiB
Python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
|
|
# 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
|
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from horizon import messages
|
|
from horizon import tabs
|
|
from openstack_dashboard import api
|
|
|
|
from .tables import EventsTable
|
|
from .tables import ResourcesTable
|
|
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
class StackOverviewTab(tabs.Tab):
|
|
name = _("Overview")
|
|
slug = "overview"
|
|
template_name = "project/stacks/_detail_overview.html"
|
|
|
|
def get_context_data(self, request):
|
|
return {"stack": self.tab_group.kwargs['stack']}
|
|
|
|
|
|
class ResourceOverviewTab(tabs.Tab):
|
|
name = _("Overview")
|
|
slug = "resource_overview"
|
|
template_name = "project/stacks/_resource_overview.html"
|
|
|
|
def get_context_data(self, request):
|
|
return {
|
|
"resource": self.tab_group.kwargs['resource'],
|
|
"metadata": self.tab_group.kwargs['metadata']}
|
|
|
|
|
|
class StackEventsTab(tabs.Tab):
|
|
name = _("Events")
|
|
slug = "events"
|
|
template_name = "project/stacks/_detail_events.html"
|
|
preload = False
|
|
|
|
def get_context_data(self, request):
|
|
stack = self.tab_group.kwargs['stack']
|
|
try:
|
|
stack_identifier = '%s/%s' % (stack.stack_name, stack.id)
|
|
events = api.heat.events_list(self.request, stack_identifier)
|
|
LOG.debug('got events %s' % events)
|
|
except:
|
|
events = []
|
|
messages.error(request, _(
|
|
'Unable to get events for stack "%s".') % stack.stack_name)
|
|
return {"stack": stack,
|
|
"table": EventsTable(request, data=events), }
|
|
|
|
|
|
class StackResourcesTab(tabs.Tab):
|
|
name = _("Resources")
|
|
slug = "resources"
|
|
template_name = "project/stacks/_detail_resources.html"
|
|
preload = False
|
|
|
|
def get_context_data(self, request):
|
|
stack = self.tab_group.kwargs['stack']
|
|
try:
|
|
stack_identifier = '%s/%s' % (stack.stack_name, stack.id)
|
|
resources = api.heat.resources_list(self.request, stack_identifier)
|
|
LOG.debug('got resources %s' % resources)
|
|
except:
|
|
resources = []
|
|
messages.error(request, _(
|
|
'Unable to get resources for stack "%s".') % stack.stack_name)
|
|
return {"stack": stack,
|
|
"table": ResourcesTable(
|
|
request, data=resources, stack=stack), }
|
|
|
|
|
|
class StackDetailTabs(tabs.TabGroup):
|
|
slug = "stack_details"
|
|
tabs = (StackOverviewTab, StackResourcesTab, StackEventsTab)
|
|
sticky = True
|
|
|
|
|
|
class ResourceDetailTabs(tabs.TabGroup):
|
|
slug = "resource_details"
|
|
tabs = (ResourceOverviewTab,)
|
|
sticky = True
|