# -*- coding: utf-8 -*-
from widgetastic.widget import Text, Checkbox
from widgetastic_patternfly import BootstrapSelect, Button, Input
from widgetastic_manageiq import ScriptBox, Table, PaginationPane
from navmazing import NavigateToAttribute, NavigateToSibling
from cfme.common import WidgetasticTaggable
from cfme.utils.update import Updateable
from cfme.utils.pretty import Pretty
from cfme.utils.appliance import Navigatable
from cfme.utils.appliance.implementations.ui import navigator, CFMENavigateStep, navigate_to
from . import ServicesCatalogView
[docs]class OrchestrationTemplatesView(ServicesCatalogView):
title = Text("#explorer_title_text")
@property
def is_displayed(self):
return (
super(OrchestrationTemplatesView, self).is_displayed and
self.title.text == 'All Orchestration Templates' and
self.orchestration_templates.is_opened and
self.orchestration_templates.tree.currently_selected == ["All Orchestration Templates"])
[docs]class AddTemplateView(TemplateForm):
add_button = Button("Add")
@property
def is_displayed(self):
return (
self.title.text == "Adding a new Orchestration Template" and
self.orchestration_templates.is_opened
)
[docs]class EditTemplateView(TemplateForm):
save_button = Button('Save')
reset_button = Button('Reset')
@property
def is_displayed(self):
return (
self.title.text == "Editing {}".format(self.context['object'].name) and
self.orchestration_templates.is_opened
)
[docs]class CopyTemplateView(CopyTemplateForm):
title = Text('#explorer_title_text')
add_button = Button("Add")
@property
def is_displayed(self):
return (
self.is_displayed and
self.title.text == "Copying {}".format(self.context['object'].name) and
self.orchestration_templates.is_opened
)
[docs]class DetailsTemplateView(ServicesCatalogView):
title = Text('#explorer_title_text')
@property
def is_displayed(self):
""" Removing last 's' character from template_type.
For ex. 'CloudFormation Templates' -> 'CloudFormation Template'"""
return (
self.title.text == '{} "{}"'.format(self.context['object'].template_type[:-1],
self.context['object'].template_name) and
self.orchestration_templates.is_opened
)
[docs]class TemplateTypeView(ServicesCatalogView):
title = Text('#explorer_title_text')
templates = Table("//table[@class='table table-striped table-bordered "
"table-hover table-selectable]'")
paginator = PaginationPane()
@property
def is_displayed(self):
return (
self.title.text == 'All {}'.format(self.context['object'].template_type) and
self.orchestration_templates.is_opened
)
[docs]class AddDialogView(DialogForm):
add_button = Button("Save")
@property
def is_displayed(self):
return (
self.title.text == 'Adding a new Service Dialog from '
'Orchestration Template "{}"'.format(self.obj.name) and
self.orchestration_templates.is_opened
)
[docs]class OrchestrationTemplate(Updateable, Pretty, Navigatable, WidgetasticTaggable):
def __init__(self, template_type=None, template_name=None, description=None,
draft=None, content=None, appliance=None):
Navigatable.__init__(self, appliance)
self.template_type = template_type
self.template_name = template_name
self.description = description
self.draft = draft
self.content = content
[docs] def create(self, content):
view = navigate_to(self, "AddTemplate")
if self.template_type == "CloudFormation Templates":
temp_type = "Amazon CloudFormation"
elif self.template_type == "Heat Templates":
temp_type = "OpenStack Heat"
elif self.template_type == "Azure Templates":
temp_type = "Microsoft Azure"
else:
raise Exception("ERROR template_type needs to be one of the above")
view.fill({'name': self.template_name,
'description': self.description,
'template_type': temp_type,
'content': content})
view.add_button.click()
view = self.create_view(DetailsTemplateView)
view.flash.assert_success_message('Orchestration Template '
'"{}" was saved'.format(self.template_name))
[docs] def update(self, updates):
view = navigate_to(self, "Edit")
view.fill({'description': updates.get('description'),
'name': updates.get('template_name'),
'draft': updates.get('draft'),
'content': updates.get('content')})
view.save_button.click()
view.flash.assert_success_message('Orchestration Template "{}" was saved'.format(
self.template_name))
[docs] def delete(self):
view = navigate_to(self, "Details")
msg = "Remove this Orchestration Template"
if self.appliance.version >= '5.9':
msg = '{} from Inventory'.format(msg)
view.toolbar.configuration.item_select(msg, handle_alert=True)
view.flash.assert_success_message('Orchestration Template "{}" was deleted.'.format(
self.template_name))
[docs] def delete_all_templates(self):
view = navigate_to(self, "TemplateType")
view.paginator.check_all()
view.configuration.item_select("Remove selected Orchestration Templates", handle_alert=True)
[docs] def copy_template(self, template_name, content, draft=None, description=None):
view = navigate_to(self, "CopyTemplate")
view.fill({'name': template_name,
'content': content,
'draft': draft,
'description': description
})
view.add_button.click()
view.flash.assert_success_message('Orchestration Template "{}" was saved'.format(
template_name))
[docs] def create_service_dialog_from_template(self, dialog_name, template_name):
view = navigate_to(self, "AddDialog")
view.fill({'name': dialog_name})
view.add_button.click()
view.flash.assert_success_message('Service Dialog "{}" was successfully created'.format(
dialog_name))
return template_name
@navigator.register(OrchestrationTemplate, 'All')
[docs]class All(CFMENavigateStep):
prerequisite = NavigateToAttribute('appliance.server', 'LoggedIn')
VIEW = OrchestrationTemplatesView
[docs] def step(self):
self.prerequisite_view.navigation.select('Services', 'Catalogs')
self.view.orchestration_templates.tree.click_path("All Orchestration Templates")
[docs] def am_i_here(self, *args, **kwargs):
return self.view.is_displayed
@navigator.register(OrchestrationTemplate, 'Details')
[docs]class Details(CFMENavigateStep):
prerequisite = NavigateToSibling('All')
VIEW = DetailsTemplateView
[docs] def step(self):
self.view.orchestration_templates.tree.click_path("All Orchestration Templates",
self.obj.template_type, self.obj.template_name)
[docs] def am_i_here(self, *args, **kwargs):
return self.view.is_displayed
@navigator.register(OrchestrationTemplate, 'TemplateType')
[docs]class TemplateType(CFMENavigateStep):
prerequisite = NavigateToSibling('All')
VIEW = TemplateTypeView
[docs] def step(self):
self.view.orchestration_templates.tree.click_path("All Orchestration Templates",
self.obj.template_type)
@navigator.register(OrchestrationTemplate, 'AddDialog')
[docs]class AddDialog(CFMENavigateStep):
prerequisite = NavigateToSibling('Details')
VIEW = AddDialogView
[docs] def step(self):
item_name = 'Create Service Dialog from Orchestration Template'
self.view.toolbar.configuration.item_select(item_name)
@navigator.register(OrchestrationTemplate, 'Edit')
[docs]class EditTemplate(CFMENavigateStep):
prerequisite = NavigateToSibling('Details')
VIEW = EditTemplateView
[docs] def step(self):
self.view.toolbar.configuration.item_select("Edit this Orchestration Template")
@navigator.register(OrchestrationTemplate, 'AddTemplate')
[docs]class AddTemplate(CFMENavigateStep):
prerequisite = NavigateToSibling('TemplateType')
VIEW = AddTemplateView
[docs] def step(self):
self.view.toolbar.configuration.item_select("Create new Orchestration Template")
@navigator.register(OrchestrationTemplate, 'CopyTemplate')
[docs]class CopyTemplate(CFMENavigateStep):
prerequisite = NavigateToSibling('Details')
VIEW = CopyTemplateView
[docs] def step(self):
self.view.toolbar.configuration.item_select("Copy this Orchestration Template")