From 9bd8e07fff01def2c0923f12c504e0d24cecabeb Mon Sep 17 00:00:00 2001 From: Sunil Kondkar Date: Fri, 28 Jul 2017 20:44:22 +0530 Subject: [PATCH 01/15] Added refresh status for MIQ eap operations. --- views/servers.py | 77 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 70 insertions(+), 7 deletions(-) diff --git a/views/servers.py b/views/servers.py index 357885e..6c4a031 100644 --- a/views/servers.py +++ b/views/servers.py @@ -18,6 +18,7 @@ class servers(): ui_utils = None hawkular_api = None db = None + MIQ_BASE_VERSION = "master" power_stop = {'action':'Stop Server', 'wait_for':'Stop initiated for selected server', 'start_state':'running', 'end_state':None} power_restart = {'action': 'Restart Server', 'wait_for': 'Restart initiated for selected server', 'start_state': 'running', 'end_state': 'running'} @@ -47,6 +48,7 @@ def __init__(self, web_session): self.web_driver = web_session.web_driver self.ui_utils = ui_utils(self.web_session) self.hawkular_api = hawkular_api(self.web_session) + self.appliance_version = self.web_session.appliance_version try: self.db = db(self.web_session) @@ -212,6 +214,11 @@ def eap_power_restart(self): # assert orig_pid != new_pid, "Orig Pid: {} New Pid: {}".format(orig_pid, new_pid) + # Validate eap server state on Summary Page in MIQ UI + + if self.appliance_version == self.MIQ_BASE_VERSION: + self.verify_eap_status_in_ui(eap_hawk, "Running") + return True def eap_power_stop(self): @@ -237,7 +244,14 @@ def eap_power_stop(self): if ssh_.get_pid('standalone.sh') == None: break + # Validate eap server state on Summary Page in MIQ UI + + if self.appliance_version == self.MIQ_BASE_VERSION: + self.web_session.logger.info("Verify IN UI") + self.verify_eap_status_in_ui(eap_hawk, "Down") + # Start EAP Standalone server, as to leave the EAP server in the starting state + assert self.start_eap_standalone_server(eap_hawk) with timeout(15, error_message="Timeout waiting for EAP Standalone server to Start on host: {}".format(eap_hostname)): @@ -245,6 +259,11 @@ def eap_power_stop(self): if ssh_.get_pid('standalone.sh') != None: break + # Validate eap server state on Summary Page in MIQ UI + + if self.appliance_version == self.MIQ_BASE_VERSION: + self.verify_eap_status_in_ui(eap_hawk, "Running") + return True def eap_power_reload(self): @@ -312,6 +331,10 @@ def eap_power_graceful_shutdown(self): # TO-DO - Validate + # Validate eap server state on Summary Page in MIQ UI + if self.appliance_version == self.MIQ_BASE_VERSION: + self.verify_eap_status_in_ui(eap_hawk, "Down") + return True def eap_power_action(self, power, eap_hawk, alert_button_name = None): @@ -349,11 +372,17 @@ def deploy_application_archive(self, app_to_deploy = APPLICATION_WAR): self.add_server_deployment(self.APPLICATION_WAR) self.navigate_and_refresh_provider() + self.web_session.logger.info("Waiting for the archive to appear") # Validate UI self.web_session.web_driver.get("{}/middleware_deployment/show_list".format(self.web_session.MIQ_URL)) assert self.ui_utils.refresh_until_text_appears(self.APPLICATION_WAR, 300) - self.navigate_and_refresh_provider() + + if not self.appliance_version == self.MIQ_BASE_VERSION: + self.navigate_and_refresh_provider() + else: + self.web_session.logger.info("Waiting for the archive to be enabled") + self.web_session.web_driver.get("{}/middleware_deployment/show_list".format(self.web_session.MIQ_URL)) assert self.ui_utils.refresh_until_text_appears('Enabled', 300) @@ -405,7 +434,11 @@ def restart_application_archive(self, app_to_redeploy=APPLICATION_WAR): # Redeploy self.restart_server_deployment(app_to_redeploy) - self.navigate_and_refresh_provider() + + if not self.appliance_version == self.MIQ_BASE_VERSION: + self.navigate_and_refresh_provider() + else: + self.web_session.logger.info("Waiting for the archive to be enabled") # Validate that application status is enabled: # ( Existing issues: https://github.com/ManageIQ/manageiq/issues/9876, Issue#10138 ) @@ -424,7 +457,11 @@ def disable_application_archive(self, app_to_stop=APPLICATION_WAR): # Stop the application archive self.disable_server_deployment(app_to_stop) - self.navigate_and_refresh_provider() + + if not self.appliance_version == self.MIQ_BASE_VERSION: + self.navigate_and_refresh_provider() + else: + self.web_session.logger.info("Waiting for the archive to be disabled") # Validate that application status is Disabled: # ( Existing issues: https://github.com/ManageIQ/manageiq/issues/10138 ) @@ -443,7 +480,11 @@ def enable_application_archive(self, app_to_start=APPLICATION_WAR): # Start the application archive self.enable_server_deployment(app_to_start) - self.navigate_and_refresh_provider() + + if not self.appliance_version == self.MIQ_BASE_VERSION: + self.navigate_and_refresh_provider() + else: + self.web_session.logger.info("Waiting for the archive to be enabled") # Validate that application status is Enabled: # ( Existing issues: https://github.com/ManageIQ/manageiq/issues/10138 ) @@ -771,11 +812,16 @@ def add_deployment_disable(self, app_to_deploy=APPLICATION_JAR): self.add_server_deployment(self.APPLICATION_JAR, enable_deploy=False) self.navigate_and_refresh_provider() + self.web_session.logger.info("Waiting for the archive to appear") # Validate UI self.web_session.web_driver.get("{}/middleware_deployment/show_list".format(self.web_session.MIQ_URL)) assert self.ui_utils.refresh_until_text_appears(self.APPLICATION_JAR, 300) - self.navigate_and_refresh_provider() + + if not self.appliance_version == self.MIQ_BASE_VERSION: + self.navigate_and_refresh_provider() + else: + self.web_session.logger.info("Waiting for the archive to be disabled") self.web_session.web_driver.get("{}/middleware_deployment/show_list".format(self.web_session.MIQ_URL)) assert self.ui_utils.refresh_until_text_appears('Disabled', 300) @@ -792,7 +838,11 @@ def add_deployment_overwrite(self, app_to_deploy=APPLICATION_JAR): self.navigate_and_refresh_provider() self.web_session.web_driver.get("{}/middleware_deployment/show_list".format(self.web_session.MIQ_URL)) assert self.ui_utils.refresh_until_text_appears(self.APPLICATION_JAR, 300) - self.navigate_and_refresh_provider() + + if not self.appliance_version == self.MIQ_BASE_VERSION: + self.navigate_and_refresh_provider() + else: + self.web_session.logger.info("Waiting for the archive to be enabled") self.web_session.web_driver.get("{}/middleware_deployment/show_list".format(self.web_session.MIQ_URL)) assert self.ui_utils.refresh_until_text_appears('Enabled', 300) @@ -813,7 +863,12 @@ def add_deployment_runtime_name(self, app_to_deploy=APPLICATION_JAR): self.navigate_and_refresh_provider() self.web_session.web_driver.get("{}/middleware_deployment/show_list".format(self.web_session.MIQ_URL)) assert self.ui_utils.refresh_until_text_appears(self.runtime_name, 300) - self.navigate_and_refresh_provider() + + if not self.appliance_version == self.MIQ_BASE_VERSION: + self.navigate_and_refresh_provider() + else: + self.web_session.logger.info("Waiting for the archive to be enabled") + self.web_session.web_driver.get("{}/middleware_deployment/show_list".format(self.web_session.MIQ_URL)) assert self.ui_utils.refresh_until_text_appears('Enabled', 300) self.undeploy_application_archive(self.runtime_name) @@ -866,3 +921,11 @@ def navigate_to_non_container_eap(self): assert self.ui_utils.waitForTextOnPage('Version', 15) return True + + def verify_eap_status_in_ui(self, eap_hawk, expected_status): + + self.web_session.web_driver.get("{}//middleware_server/show_list".format(self.web_session.MIQ_URL)) + self.ui_utils.click_on_row_containing_text(eap_hawk.get('Feed')) + assert self.ui_utils.waitForTextOnPage("Properties", 15) + assert self.ui_utils.refresh_until_text_appears(expected_status, 300) + From d46e80fc8afb12503da368f27dd26e9169397963 Mon Sep 17 00:00:00 2001 From: Sunil Kondkar Date: Mon, 31 Jul 2017 20:11:30 +0530 Subject: [PATCH 02/15] Some modifications to verify UI status. --- views/servers.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/views/servers.py b/views/servers.py index 6c4a031..9f3a09c 100644 --- a/views/servers.py +++ b/views/servers.py @@ -924,8 +924,13 @@ def navigate_to_non_container_eap(self): def verify_eap_status_in_ui(self, eap_hawk, expected_status): + feed = eap_hawk.get('Feed') + + self.web_session.logger.info("Beginning UI verification") + self.web_session.web_driver.get("{}//middleware_server/show_list".format(self.web_session.MIQ_URL)) - self.ui_utils.click_on_row_containing_text(eap_hawk.get('Feed')) + assert self.ui_utils.waitForTextOnPage(feed, 15) + self.ui_utils.click_on_row_containing_text(feed) assert self.ui_utils.waitForTextOnPage("Properties", 15) assert self.ui_utils.refresh_until_text_appears(expected_status, 300) - + self.web_session.logger.info("EAP is in {} status".format(expected_status)) From e6bf243bdb02a7196ef1deb3a135afea25c8392e Mon Sep 17 00:00:00 2001 From: mattmahoneyrh Date: Mon, 31 Jul 2017 14:24:16 -0400 Subject: [PATCH 03/15] Moved vars into inventory files --- scripts/automation/docker/deploy-eap.yaml | 41 +++++++++++-------- .../automation/docker/deploy-hawkular.yaml | 33 ++++++++++----- scripts/automation/docker/inventory-eap | 14 +++++++ scripts/automation/docker/inventory-hawkular | 9 ++++ 4 files changed, 68 insertions(+), 29 deletions(-) create mode 100644 scripts/automation/docker/inventory-eap create mode 100644 scripts/automation/docker/inventory-hawkular diff --git a/scripts/automation/docker/deploy-eap.yaml b/scripts/automation/docker/deploy-eap.yaml index 96af4e6..956b8ce 100644 --- a/scripts/automation/docker/deploy-eap.yaml +++ b/scripts/automation/docker/deploy-eap.yaml @@ -3,24 +3,23 @@ remote_user: root vars: - OS_URL: - - OS_USERNAME: - OS_PASSWORD: - OS_PROJECT: - # Set to "yes" to delete project or leave undefined to not delete project - OS_DELETE_PROJECT: - OC: "/usr/bin/oc" - - EAP_APP: EAP_IMAGE: "jboss-eap-7/eap70-openshift" - HAWKULAR_REST_URL: - HAWKULAR_REST_USER: "jdoe" - HAWKULAR_REST_PASSWORD: "password" - tasks: + - block: + - name: Set Facts + set_fact: + OS_URL: "{{os_url}}" + OS_USERNAME: "{{os_username}}" + OS_PASSWORD: "{{os_password}}" + OS_PROJECT: "{{os_project}}" + OS_DELETE_PROJECT: "{{os_delete_proeject}}" + EAP_APP: "{{eap_app}}" + HAWKULAR_REST_URL: "{{hawkular_rest_url}}" + HAWKULAR_REST_USERNAME: "{{hawkular_rest_username}}" + HAWKULAR_REST_PASSWORD: "{{hawkular_rest_password}}" + - block: - name: Check OS_URL shell: "echo {{OS_URL}}" @@ -39,6 +38,12 @@ shell: "echo {{HAWKULAR_REST_URL}}" failed_when: (echo.stdout|length == 0) + - block: + - name: Check 'oc' version is v3.5 + shell: "{{OC}} version" + register: version + failed_when: "('v3.5' not in version.stdout)" + - block: - name: Login to "{{OS_URL}}" shell: "{{OC}} login {{OS_URL}} -u={{OS_USERNAME}} -p={{OS_PASSWORD}} --insecure-skip-tls-verify" @@ -49,14 +54,14 @@ - name: Detete Project "{{OS_PROJECT}}" shell: "{{OC}} delete project {{OS_PROJECT}}" register: delete_project - when: OS_DELETE_PROJECT != 'yes' + when: OS_DELETE_PROJECT == 'yes' failed_when: "('Now using project' not in delete_project.stdout) and ('not found' in delete_project.stdout)" - block: - name: Wait for Project "{{OS_PROJECT}}" to be deleted shell: "{{OC}} get project {{OS_PROJECT}}" register: get_project - when: OS_DELETE_PROJECT != 'yes' + when: OS_DELETE_PROJECT == 'yes' failed_when: (get_project.stderr.find("Error from server") == -1) and (get_project.stdout.find("Terminating") == -1) until: ("Error from server" in get_project.stderr) retries: 100 @@ -72,11 +77,11 @@ - name: Oc Project "{{OS_PROJECT}}" shell: "{{OC}} project {{OS_PROJECT}}" register: oc_project - failed_when: "('Now using project' not in oc_project.stdout) or ('does not exist on' in oc_project.stdout)" + failed_when: "('Already on project' not in oc_project.stdout) and ('Now using project' not in oc_project.stdout)" - block: - name: Deploy App {{EAP_APP}} - shell: '{{OC}} process -f {{EAP_APP}} -v "AB_HAWKULAR_REST_URL={{HAWKULAR_REST_URL}},AB_HAWKULAR_REST_USER={{HAWKULAR_REST_USER}},AB_HAWKULAR_REST_PASSWORD={{HAWKULAR_REST_PASSWORD}},IMAGE={{EAP_IMAGE}}" | {{OC}} create -f -' + shell: '{{OC}} process -f {{EAP_APP}} -p AB_HAWKULAR_REST_URL={{HAWKULAR_REST_URL}} -p AB_HAWKULAR_REST_USER={{HAWKULAR_REST_USERNAME}} -p AB_HAWKULAR_REST_PASSWORD={{HAWKULAR_REST_PASSWORD}} -p IMAGE={{EAP_IMAGE}} | {{OC}} create -f -' - block: - name: Wait for deploy complete diff --git a/scripts/automation/docker/deploy-hawkular.yaml b/scripts/automation/docker/deploy-hawkular.yaml index 81dd0c1..1305c01 100644 --- a/scripts/automation/docker/deploy-hawkular.yaml +++ b/scripts/automation/docker/deploy-hawkular.yaml @@ -1,23 +1,27 @@ ---- -- hosts: [OpenShiftServers] +--- +- + hosts: + - OpenShiftServers remote_user: root vars: - OS_URL: - OS_USERNAME: - OS_PASSWORD: - OS_PROJECT: - OC: "/usr/bin/oc" HAWKULAR_APP: "https://raw.githubusercontent.com/hawkular/hawkular-services/master/openshift/hawkular-services-ephemeral.yaml" - HAWKULAR_IMAGE: 'jboss-mm-7-tech-preview/middleware-manager' + HAWKULAR_IMAGE: "jboss-mm-7-tech-preview/middleware-manager" HAWKULAR_USERNAME: "jdoe" HAWKULAR_PASSWORD: "password" - HAWKULAR_TEST_MODE: "true" HAWKULAR_ROUTE_FILE: "./hawkular-route.txt" tasks: + - block: + - name: Set Facts + set_fact: + OS_URL: "{{os_url}}" + OS_USERNAME: "{{os_username}}" + OS_PASSWORD: "{{os_password}}" + OS_PROJECT: "{{os_project}}" + - block: - name: Check OS_URL shell: "echo {{OS_URL}}" @@ -33,6 +37,12 @@ shell: "echo {{OS_PROJECT}}" failed_when: (echo.stdout|length == 0) + - block: + - name: Check 'oc' version is v3.5 + shell: "{{OC}} version" + register: version + failed_when: "('v3.5' not in version.stdout)" + - block: - name: Login to "{{OS_URL}}" shell: "{{OC}} login {{OS_URL}} -u={{OS_USERNAME}} -p={{OS_PASSWORD}} --insecure-skip-tls-verify" @@ -58,11 +68,11 @@ - name: Create New Project "{{OS_PROJECT}}" shell: "{{OC}} new-project {{OS_PROJECT}}" register: new_project - failed_when: (new_project.stdout.find("Now using project") == -1) + failed_when: (new_project.stdout.find("Now using project") == -1) and (new_project.stdout.find("Already on project") == -1) - block: - name: Deploy App "{{HAWKULAR_APP}}" - shell: '{{OC}} process -f {{HAWKULAR_APP}} -v "HAWKULAR_SERVICES_IMAGE={{HAWKULAR_IMAGE}},HAWKULAR_USER={{HAWKULAR_USERNAME}},HAWKULAR_PASSWORD={{HAWKULAR_PASSWORD}},TEST_MODE={{HAWKULAR_TEST_MODE}}" | {{OC}} create -f -' + shell: '{{OC}} process -f {{HAWKULAR_APP}} -p HAWKULAR_SERVICES_IMAGE={{HAWKULAR_IMAGE}} -p HAWKULAR_USER={{HAWKULAR_USERNAME}} -p HAWKULAR_PASSWORD={{HAWKULAR_PASSWORD}} | {{OC}} create -f -' - block: - name: Wait for deploy complete @@ -84,3 +94,4 @@ - name: Writing Route "{{get_route.stdout}}" to file "{{HAWKULAR_ROUTE_FILE}}" copy: content="{{get_route.stdout}}" dest={{HAWKULAR_ROUTE_FILE}} + diff --git a/scripts/automation/docker/inventory-eap b/scripts/automation/docker/inventory-eap new file mode 100644 index 0000000..7a5ba13 --- /dev/null +++ b/scripts/automation/docker/inventory-eap @@ -0,0 +1,14 @@ +[OpenShiftServers] + + +[OpenShiftServers:vars] +os_url="https://openshift.com:8443" +os_username="username" +os_password="password" +os_project="openshift-project" +os_delete_proeject='no' +eap_app="openshift-eap-8-hawkular-agent-template.yaml" +hawkular_rest_url="http://hawkular-services.com" +hawkular_rest_username="jdoe" +hawkular_rest_password="password" + diff --git a/scripts/automation/docker/inventory-hawkular b/scripts/automation/docker/inventory-hawkular new file mode 100644 index 0000000..af87735 --- /dev/null +++ b/scripts/automation/docker/inventory-hawkular @@ -0,0 +1,9 @@ +[OpenShiftServers] + + +[OpenShiftServers:vars] +os_url="https://openshift.com:8443" +os_username="username" +os_password="password" +os_project="openshift-project" + From 5ce3532fc6357211e3f79f2352d715828d00c9d7 Mon Sep 17 00:00:00 2001 From: mattmahoneyrh Date: Mon, 31 Jul 2017 14:25:26 -0400 Subject: [PATCH 04/15] Remove hosts --- scripts/automation/docker/hosts | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 scripts/automation/docker/hosts diff --git a/scripts/automation/docker/hosts b/scripts/automation/docker/hosts deleted file mode 100644 index d268e13..0000000 --- a/scripts/automation/docker/hosts +++ /dev/null @@ -1,2 +0,0 @@ -[OpenShiftServers] - From 1cfcb60ddc3ff75e518838fb401e3844298403ca Mon Sep 17 00:00:00 2001 From: Prachi Yadav Date: Tue, 1 Aug 2017 23:35:47 +0530 Subject: [PATCH 05/15] crosslink test added --- tests/test_openshift_provider.py | 10 +++++++++ views/eap_crosslink.py | 35 ++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 views/eap_crosslink.py diff --git a/tests/test_openshift_provider.py b/tests/test_openshift_provider.py index 023d655..7b38179 100644 --- a/tests/test_openshift_provider.py +++ b/tests/test_openshift_provider.py @@ -1,6 +1,8 @@ import pytest from common.session import session from views.mm_openshift_provider import mm_openshift_providers +from views.providers import providers +from views.eap_crosslink import eap_crosslink @pytest.fixture (scope='session') @@ -13,3 +15,11 @@ def web_session(request): def test_cfui_add_provider(web_session): provs = mm_openshift_providers(web_session) provs.add_mm_openshift_provider() + +def test_add_middleware_provider(web_session): + provs = providers(web_session) + provs.add_provider() + +def test_eap_crosslink(web_session): + provs = eap_crosslink(web_session) + provs.crosslink_eap() diff --git a/views/eap_crosslink.py b/views/eap_crosslink.py new file mode 100644 index 0000000..745de17 --- /dev/null +++ b/views/eap_crosslink.py @@ -0,0 +1,35 @@ +from common.ui_utils import ui_utils +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions as EC +from hawkular.hawkular_api import hawkular_api +from common.view import view +from common.db import db +from common.openshift_utils import openshift_utils +import time +from common.timeout import timeout + +class eap_crosslink(): + web_session = None + MIQ_BASE_VERSION = "master" + ui_utils = None + + def __init__(self, web_session): + self.web_session = web_session + self.web_driver = web_session.web_driver + self.hawkular_api = hawkular_api(self.web_session) + + def crosslink_eap(self): + self.web_session.web_driver.get("{}/middleware_server/show_list".format(self.web_session.MIQ_URL)) + ui_utils(self.web_session).sleep(10) + assert ui_utils(self.web_session).waitForTextOnPage("Middleware Servers", 40) + self.web_driver.find_element_by_xpath("//span[contains(.,'Local')]").click() + assert ui_utils(self.web_session).waitForTextOnPage("Local (Summary)", 15) + self.web_driver.find_element_by_xpath("//td[contains(.,'Underlying Container')]").click() + assert ui_utils(self.web_session).waitForTextOnPage("hawkular-services (Summary)", 15) + self.web_driver.find_element_by_xpath("//td[contains(.,'Containers Provider')]").click() + assert ui_utils(self.web_session).waitForTextOnPage("Aggregated Node Utilization", 15) + + return True + + From 5b3373ba5fbb5f0deb9f4ab9a3c0f816507bd647 Mon Sep 17 00:00:00 2001 From: mattmahoneyrh Date: Thu, 3 Aug 2017 13:25:47 -0400 Subject: [PATCH 06/15] URL name change --- scripts/automation/docker/inventory-hawkular | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/automation/docker/inventory-hawkular b/scripts/automation/docker/inventory-hawkular index af87735..770e171 100644 --- a/scripts/automation/docker/inventory-hawkular +++ b/scripts/automation/docker/inventory-hawkular @@ -2,7 +2,7 @@ [OpenShiftServers:vars] -os_url="https://openshift.com:8443" +os_url="https://changeme.openshift.ui.com:8443" os_username="username" os_password="password" os_project="openshift-project" From ff7b99180f47d04f053cc7cb4db88925510593f7 Mon Sep 17 00:00:00 2001 From: mattmahoneyrh Date: Thu, 3 Aug 2017 13:26:10 -0400 Subject: [PATCH 07/15] URL name change --- scripts/automation/docker/inventory-eap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/automation/docker/inventory-eap b/scripts/automation/docker/inventory-eap index 7a5ba13..6d7677f 100644 --- a/scripts/automation/docker/inventory-eap +++ b/scripts/automation/docker/inventory-eap @@ -2,7 +2,7 @@ [OpenShiftServers:vars] -os_url="https://openshift.com:8443" +os_url="https://changeme.openshift.ui.com:8443" os_username="username" os_password="password" os_project="openshift-project" From f49c69670c55c14917481ea7f5e42b6e680858b1 Mon Sep 17 00:00:00 2001 From: mattmahoneyrh Date: Thu, 3 Aug 2017 13:27:52 -0400 Subject: [PATCH 08/15] Image --- scripts/automation/docker/inventory-eap | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/automation/docker/inventory-eap b/scripts/automation/docker/inventory-eap index 6d7677f..51b7948 100644 --- a/scripts/automation/docker/inventory-eap +++ b/scripts/automation/docker/inventory-eap @@ -7,7 +7,7 @@ os_username="username" os_password="password" os_project="openshift-project" os_delete_proeject='no' -eap_app="openshift-eap-8-hawkular-agent-template.yaml" +eap_app="openshift-eap-7-hawkular-agent-template.yaml" hawkular_rest_url="http://hawkular-services.com" hawkular_rest_username="jdoe" hawkular_rest_password="password" From 4c011870bc8289e546f3acc4426b6194f10505bd Mon Sep 17 00:00:00 2001 From: mattmahoneyrh Date: Mon, 7 Aug 2017 14:54:18 -0400 Subject: [PATCH 09/15] Page load waits --- views/monitoring.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/views/monitoring.py b/views/monitoring.py index c584bec..0ddffae 100644 --- a/views/monitoring.py +++ b/views/monitoring.py @@ -14,7 +14,7 @@ def __init__(self, web_session): def validate_provider_monitoring_timelines(self): self.web_session.web_driver.get("{}/ems_middleware/show_list".format(self.web_session.MIQ_URL)) view(self.web_session).list_View() - + assert self.ui_utils.waitForTextOnPage(self.web_session.HAWKULAR_PROVIDER_NAME, 10) self.ui_utils.click_on_row_containing_text(self.web_session.HAWKULAR_PROVIDER_NAME) assert self.ui_utils.waitForTextOnPage("Summary", 10) @@ -29,7 +29,7 @@ def validate_provider_monitoring_timelines(self): def validate_eap_servers_monitoring_utilization(self): self.web_session.web_driver.get("{}/middleware_server/show_list".format(self.web_session.MIQ_URL)) - + assert self.ui_utils.waitForTextOnPage(self.web_session.HAWKULAR_PROVIDER_NAME, 10) servers(self.web_session).navigate_to_non_container_eap() self.web_driver.find_element_by_xpath("//*[@title='Monitoring']").click() @@ -79,13 +79,14 @@ def validate_messagings_monitoring_utilization_jms_queues(self): def validate_messagings_monitoring_utilization_jms_topics(self): self.web_session.web_driver.get("{}/middleware_messaging/show_list".format(self.web_session.MIQ_URL)) - + assert self.ui_utils.waitForTextOnPage("Messaging Type", 10) self.ui_utils.click_on_row_containing_text('JMS Topic') assert self.ui_utils.waitForTextOnPage("Summary", 10) self.web_driver.find_element_by_xpath("//*[@title='Monitoring']").click() self.ui_utils.waitForElementOnPage(By.ID, 'middleware_messaging_monitoring_choice__middleware_messaging_perf', 5) self.web_driver.find_element_by_id('middleware_messaging_monitoring_choice__middleware_messaging_perf').click() + assert self.ui_utils.waitForTextOnPage('Options', 30) # Validate that graphs are present From a8a0c295eff41b0d135f2f18ce9729d158deab60 Mon Sep 17 00:00:00 2001 From: mattmahoneyrh Date: Mon, 7 Aug 2017 15:06:58 -0400 Subject: [PATCH 10/15] Update README.md --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b5c4e7a..d6bb378 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,9 @@ Edit the following property values in the conf/properties.properties file so tha MIQ_HOSTNAME= HAWKULAR_HOSTNAME= HAWKULAR_PORT= - + OPENSHIFT_HOSTNAME= + OPENSHIFT_USERNAME= + OPENSHIFT_PASSWORD= ``` ### Using Chrome web driver Chrome driver is by default installed into .cf-ui directory and it is necessary to set PATH to it so Python Interpreter would know where to find the driver. From b04b1a2ee379ed535569913d45cd3bc793504c60 Mon Sep 17 00:00:00 2001 From: mattmahoneyrh Date: Mon, 7 Aug 2017 15:07:57 -0400 Subject: [PATCH 11/15] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d6bb378..6111c08 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ git clone https://github.com/Hawkular-QE/cf-ui.git cd cf-ui ./setup.sh +alias activate='source .cf-ui/bin/activate' ``` ## Configuration ```shell From b3a6e4896b839d47274709d0c71df906649199e2 Mon Sep 17 00:00:00 2001 From: mattmahoneyrh Date: Mon, 7 Aug 2017 15:08:21 -0400 Subject: [PATCH 12/15] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6111c08..72e0c5b 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ git clone https://github.com/Hawkular-QE/cf-ui.git cd cf-ui ./setup.sh -alias activate='source .cf-ui/bin/activate' +source .cf-ui/bin/activate ``` ## Configuration ```shell From de9e4d6bc02ca2a3c3c0e1fd4ab4b466f38dc03b Mon Sep 17 00:00:00 2001 From: mattmahoneyrh Date: Tue, 8 Aug 2017 15:08:59 -0400 Subject: [PATCH 13/15] Topology - Containers --- tests/test_topology.py | 8 +++++++- views/topology.py | 36 +++++++++++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/tests/test_topology.py b/tests/test_topology.py index 09be879..694afc1 100644 --- a/tests/test_topology.py +++ b/tests/test_topology.py @@ -1,7 +1,7 @@ import pytest from common.session import session from views.topology import topology - +from common.db import db @pytest.fixture (scope='session') def web_session(request): @@ -37,3 +37,9 @@ def test_cfui_domains_entities(web_session): def test_cfui_messaging_entities(web_session): assert topology(web_session).validate_middleware_messaging_entities() + +def test_cfui_container_entities(web_session): + if not db(web_session).is_container_provider_present(web_session.OPENSHIFT_PROVIDER_NAME): + pytest.skip("Skip test - No Container Provider found.") + assert topology(web_session).validate_middleware_container_entities() + diff --git a/views/topology.py b/views/topology.py index a6503de..f3338e0 100644 --- a/views/topology.py +++ b/views/topology.py @@ -12,9 +12,9 @@ class topology(): LEGENDS = '//kubernetes-topology-icon' - entities = {'servers':'Middleware Servers','deployments':'Middleware Deployments', - 'datasources':'Middleware Datasources','server_groups':'Middleware Server Groups', - 'domains':'Middleware Domains','messagings':'Middleware Messaging'} + entities = {'servers': 'Servers', 'deployments': 'Deployments', + 'datasources': 'Datasources', 'server_groups': 'Server Groups', + 'domains': 'Domains', 'messagings': 'Messaging', 'containers': 'Containers'} def __init__(self, web_session): self.web_session = web_session @@ -222,6 +222,36 @@ def validate_middleware_messaging_entities(self): return True + def validate_middleware_container_entities(self): + self.web_session.logger.info("Validate that Topology View expected Containers") + self.__navigate_to_topology__() + + self.__display_names__(select=True) + + entity_name = self.entities.get('containers') + assert self.ui_utils.isTextOnPage(entity_name), "{} not found".format(self.entities.get('containers')) + + # Select "Containers Entities" + self.__select_entities_view__(entity_name, 'hawkular-services') + + ## Compair DB and UI until there is a way to determine Container list via Hawkular-API + + containers_db = db(self.web_session).get_container_servers() + containers_el = self.web_driver.find_elements_by_class_name('Container') + + assert len(containers_db) == len(containers_el) + for el in containers_el: + name = el.text.split()[1] + foundIt = False + for container in containers_db: + if name in container.get('feed'): + foundIt = True + break + + assert foundIt, "Container {} not found in DB Container list.".format(name) + + return True + def __get_actual_name__(self, text): # Filter all but the actual Name. Ex: 'Deployment [hawkular-command-gateway-war.war]' return re.match(r"[^[]*\[([^]]*)\]", text).groups()[0] From 3db7600ed52d0aade6e284bb8bbf854e50fc66d0 Mon Sep 17 00:00:00 2001 From: mattmahoneyrh Date: Thu, 10 Aug 2017 15:34:29 -0400 Subject: [PATCH 14/15] Remove unused method --- common/db.py | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/common/db.py b/common/db.py index 9c9c587..a7e4d5a 100644 --- a/common/db.py +++ b/common/db.py @@ -22,6 +22,7 @@ class db(): sql_domains = 'select * from middleware_domains' sql_server_groups = 'select * from middleware_server_groups' sql_messagings = 'select * from middleware_messagings' + sql_containers = "select * from middleware_servers where lives_on_type LIKE '%Container%'" def __init__(self, web_session, miq_ip = None, username = None, password = None, db_port = None): @@ -85,29 +86,15 @@ def get_messagings(self): return self.execute(self.sql_messagings) # Container Provider - def get_container_providers(self): - providers = [] - rows = self.execute(self.sql_providers) - - for row in rows: - if 'ContainerManager' in row.get('type'): - providers.append(row) - return providers - - def is_container_provider_present(self): + def is_container_provider_present(self, name): rows = self.execute(self.sql_providers) - if len(rows) == 0: - self.get_container_module() - for row in rows: - if (self.web_session.OPENSHIFT_HOSTNAME in row.get('name')) \ - or (self.web_session.OPENSHIFT_PROVIDER_NAME in row.get('name')): + if name in row.get('name'): return True return False - def get_container_nodes(self): - return self.execute(self.sql_container_nodes) - + def get_container_servers(self): + return self.execute(self.sql_containers) \ No newline at end of file From 54f5c2c8ed4ff7bb43573afc68012bf81d161585 Mon Sep 17 00:00:00 2001 From: Prachi Yadav Date: Mon, 16 Oct 2017 18:44:27 +0530 Subject: [PATCH 15/15] refactored test case --- tests/test_openshift_provider.py | 13 +++- views/eap_crosslink.py | 35 ++++++++++ views/mm_openshift_provider.py | 106 ++++++++----------------------- views/topology_crosslink.py | 33 ++++++++++ 4 files changed, 108 insertions(+), 79 deletions(-) create mode 100644 views/eap_crosslink.py create mode 100644 views/topology_crosslink.py diff --git a/tests/test_openshift_provider.py b/tests/test_openshift_provider.py index 023d655..674ba7e 100644 --- a/tests/test_openshift_provider.py +++ b/tests/test_openshift_provider.py @@ -1,11 +1,13 @@ import pytest from common.session import session from views.mm_openshift_provider import mm_openshift_providers +from views.eap_crosslink import eap_crosslink +from views.topology_crosslink import topology_crosslink @pytest.fixture (scope='session') def web_session(request): - web_session = session(add_provider=False) + web_session = session(add_provider=True) return web_session @@ -13,3 +15,12 @@ def web_session(request): def test_cfui_add_provider(web_session): provs = mm_openshift_providers(web_session) provs.add_mm_openshift_provider() + +def test_cfui_eap_crosslink(web_session): + provs = eap_crosslink(web_session) + provs.crosslink_eap() + +def test_cfui_topology_crosslink(web_session): + provs= topology_crosslink(web_session) + provs.crosslink_topology() + diff --git a/views/eap_crosslink.py b/views/eap_crosslink.py new file mode 100644 index 0000000..745de17 --- /dev/null +++ b/views/eap_crosslink.py @@ -0,0 +1,35 @@ +from common.ui_utils import ui_utils +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions as EC +from hawkular.hawkular_api import hawkular_api +from common.view import view +from common.db import db +from common.openshift_utils import openshift_utils +import time +from common.timeout import timeout + +class eap_crosslink(): + web_session = None + MIQ_BASE_VERSION = "master" + ui_utils = None + + def __init__(self, web_session): + self.web_session = web_session + self.web_driver = web_session.web_driver + self.hawkular_api = hawkular_api(self.web_session) + + def crosslink_eap(self): + self.web_session.web_driver.get("{}/middleware_server/show_list".format(self.web_session.MIQ_URL)) + ui_utils(self.web_session).sleep(10) + assert ui_utils(self.web_session).waitForTextOnPage("Middleware Servers", 40) + self.web_driver.find_element_by_xpath("//span[contains(.,'Local')]").click() + assert ui_utils(self.web_session).waitForTextOnPage("Local (Summary)", 15) + self.web_driver.find_element_by_xpath("//td[contains(.,'Underlying Container')]").click() + assert ui_utils(self.web_session).waitForTextOnPage("hawkular-services (Summary)", 15) + self.web_driver.find_element_by_xpath("//td[contains(.,'Containers Provider')]").click() + assert ui_utils(self.web_session).waitForTextOnPage("Aggregated Node Utilization", 15) + + return True + + diff --git a/views/mm_openshift_provider.py b/views/mm_openshift_provider.py index 56eb0b7..4e574bd 100644 --- a/views/mm_openshift_provider.py +++ b/views/mm_openshift_provider.py @@ -31,29 +31,26 @@ def add_mm_openshift_provider(self, delete_if_provider_present=True, port=None, # Check if any provider already exist. If exist, first delete all the providers and then add a provider. if self.does_provider_exist(): - self.web_session.logger.info("Middleware Provider already exist.") - if delete_if_provider_present: - self.delete_provider(delete_all_providers=True) - else: - return + self.web_session.logger.info("Openshift Provider already exist.") + return else: - self.web_session.logger.info("Adding openshift Middleware Provider to ManageIQ instance") + self.web_session.logger.info("Adding openshift Provider to ManageIQ instance") - self.web_session.web_driver.get("{}//ems_container/show_list".format(self.web_session.MIQ_URL)) - assert ui_utils(self.web_session).waitForTextOnPage("Containers Providers", 15) - - self.web_driver.find_element_by_xpath("//button[@title='Configuration']").click() - self.ui_utils.waitForElementOnPage(By.XPATH,"//a[@title='Add a new Containers Provider']", 5) - elem_add_new_provider = self.web_driver.find_element_by_xpath("//a[@title='Add a new Containers Provider']") - elem_add_new_provider.click() - self.web_driver.implicitly_wait(15) - assert ui_utils(self.web_session).waitForTextOnPage("Add New Containers Provider", 50) - ui_utils(self.web_session).sleep(2) + self.web_session.web_driver.get("{}//ems_container/show_list".format(self.web_session.MIQ_URL)) + assert ui_utils(self.web_session).waitForTextOnPage("Containers Providers", 15) + + self.web_driver.find_element_by_xpath("//button[@title='Configuration']").click() + self.ui_utils.waitForElementOnPage(By.XPATH,"//a[@title='Add a new Containers Provider']", 5) + elem_add_new_provider = self.web_driver.find_element_by_xpath("//a[@title='Add a new Containers Provider']") + elem_add_new_provider.click() + self.web_driver.implicitly_wait(15) + assert ui_utils(self.web_session).waitForTextOnPage("Add New Containers Provider", 50) + ui_utils(self.web_session).sleep(2) - self.web_session.logger.info("The appliance version in use is: {} ".format(self.web_session.appliance_version)) + self.web_session.logger.info("The appliance version in use is: {} ".format(self.web_session.appliance_version)) - self.submit_provider_form_cfme(validate_provider) - self.verify_add_provider_success() + self.submit_provider_form_cfme(validate_provider) + self.verify_add_provider_success() def submit_provider_form_cfme(self, validate_provider=True): @@ -83,58 +80,24 @@ def does_provider_exist(self): self.web_session.logger.info("Checking if provider exists") # For performance reasons, check if the provider is present via DB - providers = db(self.web_session).get_providers() - provider = ui_utils(self.web_session).find_row_in_list(providers, 'name', self.web_session.OPENSHIFT_PROVIDER_NAME) - if provider: - return True + if db(self.web_session).is_container_provider_present(self.provider_name): + self.web_session.logger.info("Container Provider already exist.") + return else: - return False - - - def verify_refresh_status_success(self): - refresh_value_success = "Success" + self.web_session.logger.info("Adding Container Provider to ManageIQ instance") - self.refresh_provider() - - # Refresh the page till till the table value for Last Refresh shows the value - Success - - assert self.wait_for_provider_refresh_status(refresh_value_success, 600) - provider_details = ui_utils(self.web_session).get_generic_table_as_dict() - - # Verify if the 'Last Refresh' value from table contains 'Success: - refresh_status = provider_details.get("Last Refresh") - - if str(refresh_status).__contains__(refresh_value_success): - self.web_session.logger.info("The Last refresh status is - " + refresh_status) - return True - else: - return False + def delete_provider(self, delete_all_providers=True): - - def refresh_provider(self): - self.web_driver.find_element_by_xpath("//button[@title='Configuration']").click() - el = self.web_driver.find_element_by_xpath("//a[@id='ems_container_vmdb_choice__ems_container_refresh']") - assert self.ui_utils.wait_until_element_displayed(el, 5) - el.click() - ui_utils(self.web_session).accept_alert(10) - ui_utils(self.web_session).waitForTextOnPage("Refresh Provider initiated", 15) - - def validate_providers_list(self): - - # Test to validate provider list page in UI and validate matching providers hostname, port number - - self.web_session.logger.info("Begin providers list test.") self.web_session.web_driver.get("{}//ems_container/show_list".format(self.web_session.MIQ_URL)) - providers_ui = self.ui_utils.get_list_table() - assert len(providers_ui) > 0, "Providers list is empty." - - for prov_ui in providers_ui: + assert ui_utils(self.web_session).waitForTextOnPage("Containers Providers", 30) + # self.ui_utils.sleep(15) - if prov_ui.get('Name') == self.web_session.OPENSHIFT_PROVIDER_NAME: - assert (prov_ui.get('Hostname') == self.web_session.OPENSHIFT_HOSTNAME), "Hostname mismatch" - assert (prov_ui.get('Port') == self.web_session.OPENSHIFT_PORT), "Port Number mismatch" + # Delete the provider + if delete_all_providers: + self.clear_all_providers() + else: + self.delete_hawkular_provider() - return True def verify_add_provider_success(self): @@ -178,16 +141,3 @@ def save_provider(self): time.sleep(1) - def add_provider_invalid_port(self): - if self.does_provider_exist(): - self.web_session.logger.info("Container Provider exist - Delete the provider.") - self.delete_provider(delete_all_providers=True) - - try: - self.add_provider(port="1234") - raise Exception('Add Provider Unexpectedly passed.') - except: - # Expected timeout waiting for form Add button to be clickable, since button should not be clickable. - pass - - return True; diff --git a/views/topology_crosslink.py b/views/topology_crosslink.py new file mode 100644 index 0000000..1e4ef26 --- /dev/null +++ b/views/topology_crosslink.py @@ -0,0 +1,33 @@ +from common.ui_utils import ui_utils +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.common.by import By +from selenium.webdriver.support import expected_conditions as EC +from hawkular.hawkular_api import hawkular_api +from common.view import view +from common.db import db +from common.openshift_utils import openshift_utils +import time +from common.timeout import timeout +from views.topology import topology + +class topology_crosslink(): + web_session = None + MIQ_BASE_VERSION = "master" + ui_utils = None + + def __init__(self, web_session): + self.web_session = web_session + self.web_driver = web_session.web_driver + self.hawkular_api = hawkular_api(self.web_session) + + def crosslink_topology(self): + self.web_session.web_driver.get("{}/middleware_topology/show".format(self.web_session.MIQ_URL)) + ui_utils(self.web_session).sleep(10) + assert ui_utils(self.web_session).waitForTextOnPage("Servers", 40) + self.web_driver.find_element_by_xpath(".//*[@title='Name: hawkular-services Type: Container Status: Unknown").click().click() + #assert ui_utils(self.web_session).waitForTextOnPage("hawkular-services (Summary)", 15) + #top=topology() + #top.validate_middleware_container_entities() + #assert ui_utils(self.web_session).waitForTextOnPage("Aggregated Node Utilization", 15) + + return True