# TO DO - remove sleep when BZ 1496233 is fixed
import time
from navmazing import NavigateToAttribute, NavigateToSibling
from widgetastic.widget import Text, Select
from widgetastic_patternfly import Input, Button
from cfme.base.ssui import SSUIBaseLoggedInPage
from cfme.utils.appliance import MiqImplementationContext
from cfme.utils.appliance.implementations.ssui import (
navigator, SSUINavigateStep, navigate_to, ViaSSUI
)
from cfme.utils.wait import wait_for
from widgetastic_manageiq import (SSUIlist, SSUIDropdown, Notification, SSUIAppendToBodyDropdown)
from . import MyService
[docs]class MyServicesView(SSUIBaseLoggedInPage):
title = Text(locator='//li[@class="active"]')
service = SSUIlist()
notification = Notification()
@property
def in_myservices(self):
return (
self.logged_in_as_current_user and
self.navigation.currently_selected == ["", "My Services"])
@property
def is_displayed(self):
return self.in_myservices and self.title.text == "My Services"
[docs]class PowerIcon(Text):
@property
def power_status(self):
return self.browser.get_attribute('uib-tooltip', self).split(': ')[1]
[docs]class DetailsMyServiceView(MyServicesView):
title = Text(locator='//li[@class="active"]')
@property
def is_displayed(self):
return (self.in_myservices and
self.title.text in {self.context['object'].name, 'Service Details'})
notification = Notification()
policy = SSUIDropdown('Policy')
power_operations = SSUIDropdown('Power Operations')
access_dropdown = SSUIAppendToBodyDropdown('Access')
remove_service = Button("Remove Service")
configuration = SSUIDropdown('Configuration')
lifecycle = SSUIDropdown('Lifecycle')
console_button = Button(tooltip="HTML5 console", classes=['open-console-button'])
resource_power_status = PowerIcon("//i[@class='pficon fa fa-power-off' or "
"@class='pficon pficon-ok']")
[docs]class EditMyServiceView(ServiceEditForm):
title = Text(locator='//h4[@id="myModalLabel"]')
save_button = Button('Save')
reset_button = Button('Reset')
cancel_button = Button('Cancel')
@property
def is_displayed(self):
return (
self.name.is_displayed and
self.title.text == "Edit Service"
)
[docs]class SetOwnershipView(SetOwnershipForm):
title = Text(locator='//*[@id="myModalLabel"]')
save_button = Button('Save')
@property
def is_displayed(self):
return (
self.select_owner.is_displayed and
self.title.text == 'Set Service Ownership')
[docs]class TagPageView(TagForm):
title = Text(locator='//h4[@id="myModalLabel"]')
@property
def is_displayed(self):
return (
self.title.text == 'Edit Tags' and
self.tag_category.is_displayed and
self.tag_name.is_displayed)
[docs]class RemoveServiceView(MyServicesView):
title = Text(locator='//h4[@id="myModalLabel"]')
remove = Button('Yes, Remove Service')
cancel = Button('Cancel')
@property
def is_displayed(self):
return (
self.remove.is_displayed and
self.title.text == 'Remove Service')
[docs]class RetireServiceView(MyServicesView):
title = Text(locator='//h4[@id="myModalLabel"]')
retire = Button('Yes, Retire Service Now')
cancel = Button('Cancel')
@property
def is_displayed(self):
return (
self.retire.is_displayed and
self.title.text == 'Retire Service Now')
@MiqImplementationContext.external_for(MyService.update, ViaSSUI)
[docs]def update(self, updates):
view = navigate_to(self, 'Edit', wait_for_view=True)
view.fill_with(updates, on_change=view.save_button, no_change=view.cancel_button)
view.flash.assert_no_error()
view = self.create_view(DetailsMyServiceView, override=updates)
# TODO - remove sleep when BZ 1518954 is fixed
time.sleep(10)
assert view.notification.assert_message(
"{} was edited.".format(self.name))
@MiqImplementationContext.external_for(MyService.set_ownership, ViaSSUI)
[docs]def set_ownership(self, owner, group):
view = navigate_to(self, 'SetOwnership', wait_for_view=True)
view.fill({'select_owner': owner,
'select_group': group})
view.save_button.click()
view = self.create_view(DetailsMyServiceView)
assert view.is_displayed
# TODO - remove sleep when BZ 1518954 is fixed
time.sleep(10)
if self.appliance.version >= "5.8":
assert view.notification.assert_message("Setting ownership.")
else:
assert view.notification.assert_message("{} ownership was saved."
.format(self.name))
view.browser.refresh() # WA until ManageIQ/integration_tests:7157 is solved
@MiqImplementationContext.external_for(MyService.edit_tags, ViaSSUI)
@MiqImplementationContext.external_for(MyService.delete, ViaSSUI)
[docs]def delete(self):
view = navigate_to(self, 'Details')
if self.appliance.version >= "5.8":
view.configuration.item_select('Remove')
else:
view.remove_service.click()
view = self.create_view(RemoveServiceView)
view.remove.click()
view = self.create_view(MyServicesView)
wait_for(
lambda: view.is_displayed, delay=15, num_sec=300,
message="waiting for view to be displayed"
)
assert view.is_displayed
# TODO - remove sleep when BZ 1518954 is fixed
time.sleep(10)
assert view.notification.assert_message("{} was removed.".format(self.name))
@MiqImplementationContext.external_for(MyService.launch_vm_console, ViaSSUI)
[docs]def launch_vm_console(self, catalog_item):
navigate_to(self, 'VM Console')
# TODO need to remove 0001 from the line below and find correct place/way to put it in code
collection = catalog_item.provider.appliance.provider_based_collection(catalog_item.provider)
vm_obj = collection.instantiate(
'{}{}'.format(catalog_item.prov_data['catalog']['vm_name'], '0001'),
catalog_item.provider,
template_name=catalog_item.name
)
wait_for(
func=lambda: vm_obj.vm_console, num_sec=30, delay=2, handle_exception=True,
message="waiting for VM Console window to open"
)
return vm_obj
@MiqImplementationContext.external_for(MyService.retire, ViaSSUI)
[docs]def retire(self):
view = navigate_to(self, 'Retire', wait_for_view=True)
view.retire.click()
view = self.create_view(MyServicesView)
assert wait_for(
lambda: view.is_displayed, delay=3, num_sec=300,
message="waiting for view to be displayed"
)
# TODO - remove sleep when BZ 1518954 is fixed
time.sleep(10)
assert view.notification.assert_message("{} was retired.".format(self.name))
@MiqImplementationContext.external_for(MyService.service_power, ViaSSUI)
[docs]def service_power(self, power=None):
view = navigate_to(self, 'Details', wait_for_view=True)
view.power_operations.item_select(power)
view = self.create_view(DetailsMyServiceView)
wait_for(
lambda: view.is_displayed, delay=3, num_sec=300,
message="waiting for view to be displayed"
)
# TODO - remove sleep when BZ 1518954 is fixed
time.sleep(10)
# TODO - assert vm state through rest api
@navigator.register(MyService, 'All')
[docs]class MyServiceAll(SSUINavigateStep):
VIEW = MyServicesView
prerequisite = NavigateToAttribute('appliance.server', 'LoggedIn')
[docs] def step(self, *args, **kwargs):
self.prerequisite_view.navigation.select('My Services')
@navigator.register(MyService, 'Details')
[docs]class Details(SSUINavigateStep):
VIEW = DetailsMyServiceView
prerequisite = NavigateToSibling('All')
[docs] def step(self, *args, **kwargs):
wait_for(
lambda: self.prerequisite_view.service.is_displayed(self.obj.name),
delay=5, num_sec=300,
message="waiting for view to be displayed"
)
self.prerequisite_view.service.click_at(self.obj.name)
@navigator.register(MyService, 'Edit')
[docs]class MyServiceEdit(SSUINavigateStep):
VIEW = EditMyServiceView
prerequisite = NavigateToSibling('Details')
[docs] def step(self):
self.prerequisite_view.configuration.item_select('Edit')
@navigator.register(MyService, 'VM Console')
[docs]class LaunchVMConsole(SSUINavigateStep):
VIEW = EditMyServiceView
[docs] def prerequisite(self):
return navigate_to(self.obj, 'Details', wait_for_view=True)
[docs] def step(self):
if self.appliance.version < "5.8":
self.prerequisite_view.console_button.click()
else:
self.prerequisite_view.access_dropdown.item_select('VM Console')
@navigator.register(MyService, 'SetOwnership')
[docs]class MyServiceSetOwnership(SSUINavigateStep):
VIEW = SetOwnershipView
prerequisite = NavigateToSibling('Details')
[docs] def step(self):
# this is mandatory otherwise the locator is not found .
wait_for(
lambda: self.prerequisite_view.configuration.is_displayed, delay=5, num_sec=300,
message="waiting for view to be displayed"
)
self.prerequisite_view.configuration.item_select('Set Ownership')
@navigator.register(MyService, 'EditTagsFromDetails')
@navigator.register(MyService, 'Retire')
[docs]class MyServiceRetire(SSUINavigateStep):
VIEW = RetireServiceView
prerequisite = NavigateToSibling('Details')
[docs] def step(self):
if self.appliance.version >= "5.8":
self.prerequisite_view.lifecycle.item_select('Retire')
else:
self.prerequisite_view.lifecycle.item_select('Retire Now')