From eba58b38f59f62555ac065e1ee338826d1585e18 Mon Sep 17 00:00:00 2001 From: dgaikwad Date: Mon, 10 Aug 2020 19:19:26 +0530 Subject: [PATCH] Check STDOUT of provisioned service --- cfme/rest/abc.py | 0 .../catalogs/catalog_items/__init__.py | 36 +++++++++++ cfme/services/myservice/ui.py | 2 +- .../ansible/test_embedded_ansible_services.py | 4 +- cfme/tests/cli/test_appliance_console.py | 2 +- cfme/tests/configure/test_access_control.py | 64 +++++++++++++++++-- 6 files changed, 100 insertions(+), 8 deletions(-) create mode 100644 cfme/rest/abc.py diff --git a/cfme/rest/abc.py b/cfme/rest/abc.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cfme/services/catalogs/catalog_items/__init__.py b/cfme/services/catalogs/catalog_items/__init__.py index 4bb9d87864..647baa89c6 100644 --- a/cfme/services/catalogs/catalog_items/__init__.py +++ b/cfme/services/catalogs/catalog_items/__init__.py @@ -36,6 +36,7 @@ from widgetastic_manageiq import FileInput from widgetastic_manageiq import FonticonPicker from widgetastic_manageiq import ManageIQTree +from widgetastic_manageiq import ReactSelect from widgetastic_manageiq import SummaryForm from widgetastic_manageiq import SummaryFormItem from widgetastic_manageiq import SummaryTable @@ -520,6 +521,32 @@ def set_additional_tenants(view, tenants): else: return False + def set_ownership(self, owner, group): + view = navigate_to(self, "SetOwnership") + view.form.select_an_owner.fill(owner) + view.form.select_group.fill(group) + view.submit.click() + + +class SetOwnershipView(ServicesCatalogView): + submit = Button("Submit") + reset = Button("Reset") + cancel = Button("Cancel") + + @View.nested + class form(View): + select_an_owner = ReactSelect("user_name") + select_group = ReactSelect("group_name") + + @property + def is_displayed(self): + return ( + self.form.select_an_owner.is_displayed + and self.form.select_group.is_displayed + and self.submit.is_displayed + and self.cancel.is_enabled + ) + @attr.s class CloudInfraCatalogItem(BaseCatalogItem): @@ -826,3 +853,12 @@ class EditTags(CFMENavigateStep): def step(self, *args, **kwargs): self.prerequisite_view.policy.item_select('Edit Tags') + + +@navigator.register(BaseCatalogItem, "SetOwnership") +class CatalogItemSetOwnership(CFMENavigateStep): + VIEW = SetOwnershipView + prerequisite = NavigateToSibling("Details") + + def step(self, *args, **kwargs): + self.prerequisite_view.configuration.item_select("Set Ownership") diff --git a/cfme/services/myservice/ui.py b/cfme/services/myservice/ui.py index 38d3445a68..daf2238515 100644 --- a/cfme/services/myservice/ui.py +++ b/cfme/services/myservice/ui.py @@ -144,7 +144,7 @@ class provisioning(View): # noqa 'normalize-space(.)="Plays"]]') details = SummaryTable(title='Details') credentials = SummaryTable(title='Credentials') - standart_output = Text('.//div[@id="provisioning"]//pre') + standart_output = Text('.//div[@id="provisioning"]/ansible-raw-stdout') @View.nested class retirement(View): # noqa diff --git a/cfme/tests/ansible/test_embedded_ansible_services.py b/cfme/tests/ansible/test_embedded_ansible_services.py index a9807c655a..e44ac3760b 100644 --- a/cfme/tests/ansible/test_embedded_ansible_services.py +++ b/cfme/tests/ansible/test_embedded_ansible_services.py @@ -701,8 +701,10 @@ def test_ansible_group_id_in_payload( ansible_service_catalog.order() ansible_service_request.wait_for_request() view = navigate_to(ansible_service, "Details") + view.provisioning_tab.click() + assert view.provisioning.standart_output.is_displayed + wait_for(lambda: view.provisioning.standart_output.text != "Loading...", timeout=30) stdout = view.provisioning.standart_output - wait_for(lambda: stdout.is_displayed, timeout=10) pre = stdout.text json_str = pre.split("--------------------------------") # Standard output has several sections splitted by -------------------------------- diff --git a/cfme/tests/cli/test_appliance_console.py b/cfme/tests/cli/test_appliance_console.py index f8617fcb49..1c2fbf63ed 100644 --- a/cfme/tests/cli/test_appliance_console.py +++ b/cfme/tests/cli/test_appliance_console.py @@ -1746,8 +1746,8 @@ def test_appliance_overwrite_ssl_ipa(unconfigured_appliance, freeipa_provider): @pytest.mark.tier(0) -@pytest.mark.manual @pytest.mark.meta(coverage=[1720223]) +@pytest.mark.manual("manualonly") def test_appliance_console_logfile_config_reboot(): """ test to verify logfiles disk diff --git a/cfme/tests/configure/test_access_control.py b/cfme/tests/configure/test_access_control.py index 4dc220563b..105f5cb3ae 100644 --- a/cfme/tests/configure/test_access_control.py +++ b/cfme/tests/configure/test_access_control.py @@ -16,10 +16,13 @@ from cfme.markers.env_markers.provider import ONE from cfme.markers.env_markers.provider import ONE_PER_TYPE from cfme.markers.env_markers.provider import SECOND +from cfme.rest.gen_data import users as _users from cfme.roles import FEATURES_510 from cfme.roles import FEATURES_511 from cfme.services.myservice import MyService +from cfme.services.service_catalogs import ServiceCatalogs from cfme.tests.integration.test_cfme_auth import retrieve_group +from cfme.utils.appliance import ViaSSUI from cfme.utils.appliance.implementations.ui import navigate_to from cfme.utils.auth import auth_user_data from cfme.utils.blockers import BZ @@ -29,6 +32,7 @@ from cfme.utils.update import update from cfme.utils.version import LOWEST from cfme.utils.version import VersionPicker +from cfme.utils.wait import wait_for pytestmark = [ @@ -242,6 +246,25 @@ def tenant_custom_role(appliance, request, provider): tenant_role.delete_if_exists() +@pytest.fixture() +def user_catalog(appliance, request, ansible_catalog_item): + user, user_data = _users(request, appliance, group="EvmGroup-user_self_service") + + user_inst = appliance.collections.users.instantiate( + name=user[0].name, + credential=Credential(principal=user_data[0]["userid"], secret=user_data[0]["password"]), + ) + ansible_catalog_item.set_ownership("Administrator", "EvmGroup-user_self_service") + + ansible_catalog = appliance.collections.catalogs.create( + fauxfactory.gen_alphanumeric(), + description="my ansible catalog", + items=[ansible_catalog_item.name], + ) + + yield user_inst, ansible_catalog + ansible_catalog.delete_if_exists() + # User test cases @pytest.mark.sauce @pytest.mark.tier(2) @@ -2985,9 +3008,11 @@ def test_chargeback_report(): @pytest.mark.customer_scenario @pytest.mark.tier(2) -@pytest.mark.meta(coverage=[1836125]) -def test_ansible_playbook_stdout(): - """ Test standard output of ansible playbook of particular user +@pytest.mark.meta(automates=[1836125]) +def test_ansible_playbook_stdout( + appliance, ansible_catalog_item, ansible_service_request, user_catalog, request +): + """ Test standard output of ansible playbook service using particular user Bugzilla: 1836125 Polarion: @@ -3009,7 +3034,7 @@ def test_ansible_playbook_stdout(): 5. add service to shopping card 6. order service 7. log in main UI using newly created user - 8. navigate Services->My Servcies>Service> + 8. navigate Services->My Services>Service> 9. Under "Active catalog" click on ordered service 10. check stdout of service expectedResults: @@ -3024,4 +3049,33 @@ def test_ansible_playbook_stdout(): 9. 10. able to see standard output """ - pass + user, ansible_catalog = user_catalog + service_catalog = ServiceCatalogs(appliance, ansible_catalog, ansible_catalog_item.name) + ansible_service = MyService(appliance, ansible_catalog_item.name) + + @request.addfinalizer + def _finalize(): + if ansible_service_request.exists(): + ansible_service_request.remove_request() + if ansible_service.exists: + ansible_service.delete() + + with user: + with appliance.context.use(ViaSSUI): + appliance.server.login(user) + service_catalog.add_to_shopping_cart() + service_catalog.order() + + with user: + error_message = ( + "MIQ(Api::TasksController.api_error) Api::NotFoundError: Couldn't find MiqTask with" + ) + with LogValidator( + "/var/www/miq/vmdb/log/api.log", failure_patterns=[error_message], + ).waiting(timeout=120): + ansible_service_request.wait_for_request() + view = navigate_to(ansible_service, "Details") + view.provisioning_tab.click() + assert view.provisioning.standart_output.is_displayed + wait_for(lambda: view.provisioning.standart_output.text != "Loading...", timeout=30) + assert "Hello World" in view.provisioning.standart_output.text