from navmazing import NavigateToAttribute, NavigateToSibling
from widgetastic.utils import Parameter, VersionPick, Version
from widgetastic.widget import ParametrizedView, Table, Text, View
from widgetastic_patternfly import Input, BootstrapSelect, Dropdown, Button, CandidateNotFound, Tab
from cfme.base.login import BaseLoggedInPage
from cfme.common import TagPageView
from cfme.common.vm_views import VMDetailsEntities
from cfme.services.myservice import MyService
from cfme.services.requests import RequestsView
from cfme.utils.appliance import MiqImplementationContext
from cfme.utils.appliance.implementations.ui import navigator, CFMENavigateStep, navigate_to, ViaUI
from cfme.utils.wait import wait_for
from widgetastic_manageiq import (Accordion, ManageIQTree, Calendar, SummaryTable,
BaseNonInteractiveEntitiesView, ItemsToolBarViewSelector,
BaseEntitiesView)
[docs]class MyServicesView(BaseLoggedInPage):
toolbar = View.nested(MyServiceToolbar)
[docs] def in_myservices(self):
return (
self.logged_in_as_current_user and
self.navigation.currently_selected == ['Services', 'MyServices'])
@property
def is_displayed(self):
return (
self.in_myservices and
self.toolbar.configuration.is_displayed and not
self.myservice.is_dimmed)
@View.nested
class myservice(Accordion): # noqa
ACCORDION_NAME = 'Services'
tree = ManageIQTree()
[docs]class MyServiceDetailView(MyServicesView):
title = Text('#explorer_title_text')
toolbar = View.nested(MyServiceDetailsToolbar)
entities = View.nested(BaseNonInteractiveEntitiesView)
@View.nested
class details(Tab): # noqa
properties = SummaryTable(title='Properties')
lifecycle = SummaryTable(title='Lifecycle')
relationships = SummaryTable(title='Relationships')
vm = SummaryTable(title='Totals for Service VMs ')
smart_mgmt = SummaryTable(title='Smart Management')
generic_objects = SummaryTable(title='Generic Objects')
@View.nested
class provisioning(Tab): # noqa
results = SummaryTable(title='Results')
plays = Table('.//table[./thead/tr/th[contains(@align, "left") and '
'normalize-space(.)="Plays"]]')
details = SummaryTable(title='Details')
credentials = SummaryTable(title='Credentials')
standart_output = Text('.//div[@id="provisioning"]//pre')
@View.nested
class retirement(Tab): # noqa
results = SummaryTable(title='Results')
plays = Table('.//table[./thead/tr/th[contains(@align, "left") and '
'normalize-space(.)="Plays"]]')
details = SummaryTable(title='Details')
credentials = SummaryTable(title='Credentials')
standart_output = Text('.//div[@id="retirement"]//pre')
@property
def is_displayed(self):
return (
self.in_myservices and
self.myservice.is_opened and
self.title.text == 'Service "{}"'.format(self.context['object'].name))
[docs]class EditMyServiceView(ServiceEditForm):
title = Text('#explorer_title_text')
save_button = Button('Save')
reset_button = Button('Reset')
cancel_button = Button('Cancel')
@property
def is_displayed(self):
return (
self.in_myservices and
self.myservice.is_opened and
self.title.text == 'Editing Service "{}"'.format(self.context['object'].name)
)
[docs]class SetOwnershipView(SetOwnershipForm):
title = Text('#explorer_title_text')
save_button = Button('Save')
@property
def is_displayed(self):
return (
self.in_myservices and
self.myservice.is_opened and
self.title.text == 'Set Ownership of Service "{}"'.format(self.context['object'].name))
[docs]class ServiceRetirementView(ServiceRetirementForm):
title = Text('#explorer_title_text')
save_button = Button('Save')
@property
def is_displayed(self):
return (
self.in_myservices and
self.myservice.is_opened and
self.myservice.tree.currently_selected == self.context['object'].name and
self.title.text == 'Set/Remove retirement date for Service')
[docs]class ServiceVMDetailsView(VMDetailsEntities):
@property
def is_displayed(self):
return (
self.in_myservices and self.myservice.is_opened and
self.title.text == 'VM and Instance "{}"'.format(self.context['object'].name)
)
[docs]class AllGenericObjectInstanceView(BaseLoggedInPage):
@View.nested
class toolbar(View): # noqa
reload = Button(title=VersionPick({Version.lowest(): 'Reload current display',
'5.9': 'Refresh this page'}))
policy = Dropdown(text='Policy')
download = Dropdown(text='Download')
view_selector = View.nested(ItemsToolBarViewSelector)
title = Text('.//div[@id="main-content"]//h1')
including_entities = View.include(BaseEntitiesView, use_parent=True)
@property
def is_displayed(self):
return self.title.text == '{} (All Generic Objects)'.format(self.context['object'].name)
@MiqImplementationContext.external_for(MyService.retire, ViaUI)
[docs]def retire(self):
view = navigate_to(self, 'Details')
view.toolbar.lifecycle.item_select('Retire this Service', handle_alert=True)
view.flash.assert_no_error()
if self.appliance.version < '5.8':
view.flash.assert_success_message(
'Retirement initiated for 1 Service from the {} Database'.format(
self.appliance.product_name))
# wait for service to retire
wait_for(
lambda: view.details.lifecycle.get_text_of('Retirement State') == 'Retired',
fail_func=view.toolbar.reload.click,
num_sec=10 * 60, delay=3,
message='Service Retirement wait')
@MiqImplementationContext.external_for(MyService.retire_on_date, ViaUI)
[docs]def retire_on_date(self, retirement_date):
view = navigate_to(self, 'SetRetirement')
view.retirement_date.fill(retirement_date)
view.save_button.click()
view = navigate_to(self, 'Details')
wait_for(
lambda: view.details.lifecycle.get_text_of('Retirement State') == 'Retired',
fail_func=view.toolbar.reload.click,
num_sec=10 * 60, delay=3,
message='Service Retirement wait')
@MiqImplementationContext.external_for(MyService.update, ViaUI)
[docs]def update(self, updates):
view = navigate_to(self, 'Edit')
changed = view.fill_with(updates, on_change=view.save_button, no_change=view.cancel_button)
view.flash.assert_no_error()
if changed:
view.flash.assert_success_message(
'Service "{}" was saved'.format(updates.get('name', self.name)))
else:
view.flash.assert_success_message(
'Edit of Service "{}" was cancelled by the user'.format(
updates.get('description', self.description)))
view = self.create_view(MyServiceDetailView, override=updates)
assert view.is_displayed
@MiqImplementationContext.external_for(MyService.exists.getter, ViaUI)
[docs]def exists(self):
try:
navigate_to(self, 'Details')
return True
except CandidateNotFound:
return False
@MiqImplementationContext.external_for(MyService.delete, ViaUI)
[docs]def delete(self):
view = navigate_to(self, 'Details')
if self.appliance.version < '5.9':
remove_str = 'Remove Service'
else:
remove_str = 'Remove Service from Inventory'
view.toolbar.configuration.item_select(remove_str, handle_alert=True)
view = self.create_view(MyServicesView)
view.flash.assert_no_error()
assert view.is_displayed
view.flash.assert_success_message(
'Service "{}": Delete successful'.format(self.name))
@MiqImplementationContext.external_for(MyService.set_ownership, ViaUI)
[docs]def set_ownership(self, owner, group):
view = navigate_to(self, 'SetOwnership')
view.fill({'select_owner': owner,
'select_group': group})
view.save_button.click()
view = self.create_view(MyServiceDetailView)
assert view.is_displayed
view.flash.assert_no_error()
view.flash.assert_success_message('Ownership saved for selected Service')
@MiqImplementationContext.external_for(MyService.edit_tags, ViaUI)
@MiqImplementationContext.external_for(MyService.check_vm_add, ViaUI)
[docs]def check_vm_add(self, add_vm_name):
view = navigate_to(self, 'Details')
view.entities.get_entity(name=add_vm_name).click()
view.flash.assert_no_error()
@MiqImplementationContext.external_for(MyService.download_file, ViaUI)
[docs]def download_file(self, extension):
view = navigate_to(self, 'All', wait_for_view=True)
view.toolbar.download.item_select('Download as {}'.format(extension))
view.flash.assert_no_error()
@MiqImplementationContext.external_for(MyService.reconfigure_service, ViaUI)
@navigator.register(MyService, 'All')
[docs]class MyServiceAll(CFMENavigateStep):
VIEW = MyServicesView
prerequisite = NavigateToAttribute('appliance.server', 'LoggedIn')
[docs] def step(self, *args, **kwargs):
self.prerequisite_view.navigation.select('Services', 'My Services')
@navigator.register(MyService, 'Details')
[docs]class MyServiceDetails(CFMENavigateStep):
VIEW = MyServiceDetailView
prerequisite = NavigateToSibling('All')
[docs] def step(self):
path_start = 'Active Services' if self.appliance.version > '5.8' else 'All Services'
self.prerequisite_view.myservice.tree.click_path(path_start, self.obj.name)
@navigator.register(MyService, 'Edit')
[docs]class MyServiceEdit(CFMENavigateStep):
VIEW = EditMyServiceView
prerequisite = NavigateToSibling('Details')
[docs] def step(self):
self.prerequisite_view.toolbar.configuration.item_select('Edit this Service')
@navigator.register(MyService, 'SetOwnership')
[docs]class MyServiceSetOwnership(CFMENavigateStep):
VIEW = SetOwnershipView
prerequisite = NavigateToSibling('Details')
[docs] def step(self):
self.prerequisite_view.toolbar.configuration.item_select('Set Ownership')
@navigator.register(MyService, 'EditTagsFromDetails')
@navigator.register(MyService, 'SetRetirement')
[docs]class MyServiceSetRetirement(CFMENavigateStep):
VIEW = ServiceRetirementView
prerequisite = NavigateToSibling('Details')
[docs] def step(self):
if self.appliance.version < '5.8':
self.prerequisite_view.toolbar.lifecycle.item_select('Set Retirement Date')
else:
self.prerequisite_view.toolbar.lifecycle.item_select(
'Set Retirement Dates for this Service')
@navigator.register(MyService, 'Reconfigure')
@navigator.register(MyService, 'VMDetails')
[docs]class MyServiceVMDetails(CFMENavigateStep):
VIEW = ServiceVMDetailsView
prerequisite = NavigateToSibling('Details')
[docs] def step(self):
self.prerequisite_view.entities.get_entity(name=self.obj.vm_name).click()
@navigator.register(MyService, 'GenericObjectInstance')
[docs]class AllGenericObjectInstance(CFMENavigateStep):
VIEW = AllGenericObjectInstanceView
prerequisite = NavigateToSibling('Details')
[docs] def step(self):
self.prerequisite_view.details.generic_objects.click_at('Instances')