Esempio n. 1
0
def test_edit_email_password(valid_new_normal_user, valid_password):
    """
    Change user's password and email in My Settings and login with new password.
    """
    """
    :step:
      Log in and edit user's email and password in My Settings
    :result:
      User's email and password are changed
    """
    url = urlparse(CONF.config["usmqe"]["web_url"])
    app1 = Application(hostname=url.hostname,
                       scheme=url.scheme,
                       username=valid_new_normal_user["username"],
                       password=valid_new_normal_user["password"])
    ViaWebUI.navigate_to(app1.web_ui, "LoggedIn")
    new_data = {
        "email": "*****@*****.**",
        "password": valid_password,
        "confirm_password": valid_password
    }
    app1.collections.users.edit_logged_in_user(new_data)
    """
    :step:
      Log in using the new passord
    :result:
      User is able to log in with the new password
    """
    app1.web_ui.browser_manager.quit()
    app2 = Application(hostname=url.hostname,
                       scheme=url.scheme,
                       username=valid_new_normal_user["username"],
                       password=valid_password)
    ViaWebUI.navigate_to(app2.web_ui, "LoggedIn")
    app2.web_ui.browser_manager.quit()
Esempio n. 2
0
 def delete(self, cancel=False):
     """
     Delete the user by choosing 'Delete User' option of Actions kebab.
     """
     view = ViaWebUI.navigate_to(self.parent, "All")
     wait_for(lambda: view.is_displayed,
              timeout=5,
              message="Users page hasn't been displayed in time\n" +
              "Visible text: {}".format(view.browser.elements("*")[0].text))
     for row in view.users:
         if row["User ID"].text == self.user_id:
             row[6].widget.select("Delete User", close=False)
             view = self.application.web_ui.create_view(
                 DeleteConfirmationView)
             wait_for(
                 lambda: view.is_displayed,
                 timeout=5,
                 message=
                 "DeleteConfirmationView hasn't been displayed in time\n" +
                 "Visible text: {}".format(
                     view.browser.elements("*")[0].text))
             view.delete.click()
             # this is a UI bug
             view.browser.refresh()
             # view = ViaWebUI.navigate_to(self.parent, "All")
             break
Esempio n. 3
0
 def get_clusters(self):
     """
     Return the list of instantiated Cluster objects, their attributes read from Clusters page.
     If a cluster hasn't been imported, its volumes count, alerts count and profiling
     attributes are set to None.
     """
     view = ViaWebUI.navigate_to(self, "All")
     wait_for(lambda: view.is_displayed,
              timeout=30,
              message="ClustersView wasn't displayed in time\n" +
              "Visible text: {}".format(view.browser.elements("*")[0].text))
     clusters_list = []
     for cluster_id in view.all_ids:
         if view.clusters(cluster_id).managed.text == "No":
             cluster = self.instantiate(
                 cluster_id, cluster_id,
                 view.clusters(cluster_id).health,
                 view.clusters(cluster_id).cluster_version.text,
                 view.clusters(cluster_id).managed.text,
                 view.clusters(cluster_id).hosts.text,
                 view.clusters(cluster_id).status.text, None, None, None)
             clusters_list.append(cluster)
         else:
             cluster = self.instantiate(
                 cluster_id, cluster_id,
                 view.clusters(cluster_id).health,
                 view.clusters(cluster_id).cluster_version.text,
                 view.clusters(cluster_id).managed.text,
                 view.clusters(cluster_id).hosts.text,
                 view.clusters(cluster_id).status.text,
                 view.clusters(cluster_id).volumes.text,
                 view.clusters(cluster_id).alerts.text,
                 view.clusters(cluster_id).profiling.text)
             clusters_list.append(cluster)
     return clusters_list
Esempio n. 4
0
 def get_bricks(self):
     """
     Navigate to Volume's Brick list by clicking on volume name.
     Return the list of initiated Brick objects.
     """
     view = ViaWebUI.navigate_to(self.parent.parent.parent, "Bricks")
     wait_for(lambda: view.is_displayed,
              timeout=10,
              delay=3,
              message="Volume's Brick Details weren't displayed in time\n" +
              "Visible text: {}".format(view.browser.elements("*")[0].text))
     if not self.parent.is_expanded:
         self.parent.expand()
     bricks = view.volume_parts(self.parent.part_id).bricks
     brick_list = []
     for row in bricks:
         brick = self.instantiate(
             row[1].text,
             row[0].text,
             view.volume_name.text,
             row[2].text,
             row[3].text,
             row[4].text,
             view.cluster_name.text,
             self.parent.part_id)
         brick_list.append(brick)
     return brick_list
Esempio n. 5
0
 def edit_logged_in_user(self, new_values_dict):
     view = ViaWebUI.navigate_to(self, "MySettings")
     wait_for(lambda: view.is_displayed,
              timeout=5,
              message="MySettingsView hasn't been displayed in time\n" +
              "Visible text: {}".format(view.browser.elements("*")[0].text))
     view.fill(new_values_dict)
     view.save_button.click()
Esempio n. 6
0
 def exists(self):
     view = ViaWebUI.navigate_to(self.parent, "All")
     return bool(
         list(
             view.users.rows(
                 user_id=self.user_id,
                 name=self.name,
                 email=self.email,
                 # can't use role=self.role
                 # it's 'Read-Only' instead of 'Limited' in the table
             )))
Esempio n. 7
0
 def get_values_from_dashboard(self):
     """
     Click Dashboard button, read the selected data from Grafana dashboard,
     close the window with Grafana dashboard and return to main UI
     """
     view = ViaWebUI.navigate_to(self, "Dashboard")
     dashboard_values = {
         "cluster_name": view.cluster_name.text,
         "host_name": view.host_name.text,
         "brick_count": view.bricks_total.text.split(" ")[-1],
         "host_health": view.host_health.text.lower()
     }
     tools.close_extra_windows(view.browser)
     return dashboard_values
Esempio n. 8
0
def test_edit_email_only(valid_new_normal_user):
    """
    Change user's email in My Settings and login again.
    Fails due to https://bugzilla.redhat.com/show_bug.cgi?id=1654623
    """
    """
    :step:
      Log in and edit user's email in My Settings
    :result:
      User's email is changed
    """
    url = urlparse(CONF.config["usmqe"]["web_url"])
    app1 = Application(hostname=url.hostname,
                       scheme=url.scheme,
                       username=valid_new_normal_user["username"],
                       password=valid_new_normal_user["password"])
    ViaWebUI.navigate_to(app1.web_ui, "LoggedIn")
    new_data = {"email": "*****@*****.**"}
    app1.collections.users.edit_logged_in_user(new_data)
    app1.web_ui.browser_manager.quit()
    """
    :step:
      Log in using the old password
    :result:
      User is able to log in with the old password.
      Fails due to https://bugzilla.redhat.com/show_bug.cgi?id=1654623
    """
    app2 = Application(hostname=url.hostname,
                       scheme=url.scheme,
                       username=valid_new_normal_user["username"],
                       password=valid_new_normal_user["password"])
    try:
        ViaWebUI.navigate_to(app2.web_ui, "LoggedIn")
        app2.web_ui.browser_manager.quit()
    except TimedOutError:
        pytest.check(
            False, issue='https://bugzilla.redhat.com/show_bug.cgi?id=1654623')
Esempio n. 9
0
 def __init__(self,
              hostname=None,
              path="",
              scheme="https",
              username=None,
              password=None):
     self.application = self
     self.hostname = hostname
     self.path = path
     self.scheme = scheme
     self.username = username
     self.password = password
     self.web_ui = ViaWebUI(owner=self)
     self.context = TendrlImplementationContext.from_instances(
         [self.web_ui])
     self.collections = EntityCollections.for_application(self)
Esempio n. 10
0
 def create(self, user_id, name, email, notifications_on, password, role):
     view = ViaWebUI.navigate_to(self, "Add")
     wait_for(lambda: view.is_displayed,
              timeout=5,
              message="AddUserView hasn't been displayed in time\n" +
              "Visible text: {}".format(view.browser.elements("*")[0].text))
     view.fill({
         "user_id": user_id,
         "name": name,
         "email": email,
         "notifications_on": notifications_on,
         "password": password,
         "confirm_password": password,
         "role": role
     })
     view.save_button.click()
     return self.instantiate(user_id, name, email, notifications_on,
                             password, role)
Esempio n. 11
0
 def get_events(self):
     """
     Return the list of instantiated Event objects, their attributes read from Events page.
     """
     view = ViaWebUI.navigate_to(self.parent, "Events")
     wait_for(lambda: view.is_displayed,
              timeout=10,
              delay=2,
              message="Events page hasn't been displayed in time\n" +
              "Visible text: {}".format(view.browser.elements("*")[0].text))
     event_list = []
     for event_id in view.all_event_ids:
         event = self.instantiate(event_id,
                                  view.events(event_id).description.text,
                                  view.events(event_id).date.text,
                                  view.cluster_name.text)
         event_list.append(event)
     return event_list
Esempio n. 12
0
 def get_values_from_dashboard(self):
     """
     Click Dashboard button, read the selected data from Grafana dashboard,
     close the window with Grafana dashboard and return to main UI
     """
     view = ViaWebUI.navigate_to(self, "Dashboard")
     wait_for(lambda: view.is_displayed,
              timeout=10,
              delay=3,
              message="BrickDashboard wasn't dispayed in time\n" +
              "Visible text: {}".format(view.browser.elements("*")[0].text))
     dashboard_values = {
         "cluster_name": view.cluster_name.text,
         "host_name": view.host_name.text,
         "brick_path": view.path.text,
         "brick_status": view.status.text}
     tools.close_extra_windows(view)
     return dashboard_values
Esempio n. 13
0
 def get_volumes(self):
     """
     Return the list of instantiated Volume objects, their attributes read from Volumes page.
     """
     view = ViaWebUI.navigate_to(self.parent, "Volumes")
     volumes_list = []
     LOGGER.debug("Volume names are: {}".format(view.all_volnames))
     for volname in view.all_volnames:
         volume = self.instantiate(volname,
                                   view.volumes(volname).health,
                                   view.volumes(volname).volume_type.text,
                                   view.volumes(volname).bricks.text,
                                   view.volumes(volname).running.text,
                                   view.volumes(volname).rebalance.text,
                                   view.volumes(volname).profiling.text,
                                   view.volumes(volname).alerts.text,
                                   view.cluster_name.text)
         volumes_list.append(volume)
     return volumes_list
Esempio n. 14
0
 def get_tasks(self):
     """
     Return the list of instantiated Task objects, their attributes read from Tasks page.
     """
     view = ViaWebUI.navigate_to(self.parent, "Tasks")
     wait_for(lambda: view.is_displayed,
              timeout=10,
              delay=2,
              message="Tasks page hasn't been displayed in time\n" +
              "Visible text: {}".format(view.browser.elements("*")[0].text))
     task_list = []
     for task_id in view.all_task_ids:
         task = self.instantiate(task_id,
                                 view.tasks(task_id).task_name.text,
                                 view.tasks(task_id).submitted_date.text,
                                 view.tasks(task_id).status.text,
                                 view.tasks(task_id).changed_date.text,
                                 view.cluster_name.text)
         task_list.append(task)
     return task_list
Esempio n. 15
0
 def get_parts(self):
     """
     Return the list of all Volume Part objects, their attributes read from the Volume's
     Brick details page.
     """
     view = ViaWebUI.navigate_to(self.parent, "Bricks")
     wait_for(lambda: view.is_displayed,
              timeout=10,
              delay=2,
              message="Brick details view wasn't displayed in time\n" +
              "Visible text: {}".format(view.browser.elements("*")[0].text))
     part_list = []
     assert view.all_part_ids != []
     for part_id in view.all_part_ids:
         part = self.instantiate(
             part_id,
             view.volume_parts(part_id).part_name.text, view.volume_name,
             view.volume_parts(part_id).utilization.text)
         part_list.append(part)
     return part_list
Esempio n. 16
0
 def get_alerts(self):
     """
     Return the list of instantiated Alert objects.
     """
     view = ViaWebUI.navigate_to(self, "All")
     wait_for(lambda: view.is_displayed,
              timeout=10,
              delay=2,
              message="AlertsView wasn't displayed in time\n" +
              "Visible text: {}".format(view.browser.elements("*")[0].text))
     alert_list = []
     for alert_id in view.alerts.all_alert_ids:
         alert = self.instantiate(
             alert_id,
             view.alerts.alerts(alert_id).description.text,
             view.alerts.alerts(alert_id).date.text,
             view.alerts.alerts(alert_id).severity,
         )
         alert_list.append(alert)
     view.navbar.alerts.click()
     return alert_list
Esempio n. 17
0
def test_modal(application):
    """
    Test admin's About modal
    """
    """
    :step:
      Log in as admin and check the modal contents
    :result:
      About modal shows valid information described in
      https://bugzilla.redhat.com/show_bug.cgi?id=1627988
    """
    view = ViaWebUI.navigate_to(application.web_ui, "LoggedIn")
    modal_info = {"Version": str(CONF.config["usmqe"]["tendrl_version"]),
                  "User": "******",
                  "User Role": "admin",
                  "Browser": "chrome",
                  "Browser OS": "linux"}
    for key in modal_info:
        real_value = view.get_detail(key).lower()
        pytest.check(real_value == modal_info[key],
                     "Modal info: {}. Should be {}".format(real_value, modal_info[key]))
Esempio n. 18
0
 def get_hosts(self):
     """
     Return the list of instantiated Host objects, their attributes read from Hosts page.
     """
     view = ViaWebUI.navigate_to(self.parent, "Hosts")
     wait_for(lambda: view.is_displayed,
              timeout=10,
              delay=3,
              message="HostsView wasn't displayed\n" +
              "Visible text: {}".format(view.browser.elements("*")[0].text))
     hosts_list = []
     for hostname in view.all_hostnames:
         host = self.instantiate(hostname,
                                 view.hosts(hostname).health,
                                 view.hosts(hostname).gluster_version.text,
                                 view.hosts(hostname).managed.text,
                                 view.hosts(hostname).role.text,
                                 view.hosts(hostname).bricks.text,
                                 view.hosts(hostname).alerts.text,
                                 view.cluster_name.text)
         hosts_list.append(host)
     return hosts_list
Esempio n. 19
0
 def get_values_from_dashboard(self):
     """
     Click Dashboard button, read the selected data from Grafana dashboard,
     close the window with Grafana dashboard and return to main UI
     """
     view = ViaWebUI.navigate_to(self, "Dashboard")
     wait_for(lambda: view.is_displayed,
              timeout=300,
              delay=2,
              message="Cluster Dashboard wasn't displayed in time\n" +
              "Visible text: {}".format(view.browser.elements("*")[0].text))
     dashboard_values = {
         "cluster_name": view.cluster_name.text,
         "host_count": view.hosts_total.text.split(" ")[-1],
         "volume_count": view.volumes_total.text.split(" ")[-1],
         "cluster_health": view.cluster_health.text
     }
     while len(view.browser.selenium.window_handles) > 1:
         view.browser.selenium.close()
         view.browser.selenium.switch_to.window(
             view.browser.selenium.window_handles[-1])
     return dashboard_values
Esempio n. 20
0
def test_modal_username_role(application, role, valid_session_credentials):
    """
    Test normal and limited users' About modal
    """
    """
    :step:
      Create normal or limited user
    :result:
      Normal or limited user is created
    """
    user = application.collections.users.create(
        user_id="{}_user_auto".format(role),
        name="{} user".format(role),
        email="{}[email protected]".format(role),
        notifications_on=False,
        password="******",
        role=role)
    temp_app = Application(hostname=CONF.config["usmqe"]["web_url"].split('/')[-1],
                           scheme="http",
                           username=user.user_id,
                           password=user.password)
    """
    :step:
      Log in as normal or limited user and check the modal contents
    :result:
      About modal shows valid information described in
      https://bugzilla.redhat.com/show_bug.cgi?id=1627988
    """
    view = ViaWebUI.navigate_to(temp_app.web_ui, "LoggedIn")
    modal_info = {"Version": str(CONF.config["usmqe"]["tendrl_version"]),
                  "User": user.name,
                  "User Role": user.role,
                  "Browser": "chrome",
                  "Browser OS": "linux"}
    for key in modal_info:
        real_value = view.get_detail(key).lower()
        pytest.check(real_value == modal_info[key],
                     "Modal info: {}. Should be {}".format(real_value, modal_info[key]))
    user.delete()
Esempio n. 21
0
 def edit(self, new_values_dict, cancel=False):
     """
     Edit user.
     """
     view = ViaWebUI.navigate_to(self.parent, "All")
     wait_for(lambda: view.is_displayed,
              timeout=5,
              message="Users page hasn't been displayed in time\n" +
              "Visible text: {}".format(view.browser.elements("*")[0].text))
     for row in view.users:
         if row["User ID"].text == self.user_id:
             row[5].click()
             view = self.application.web_ui.create_view(EditUserView)
             wait_for(
                 lambda: view.is_displayed,
                 timeout=5,
                 message="EditUserView hasn't been displayed in time\n" +
                 "Visible text: {}".format(
                     view.browser.elements("*")[0].text))
             view.fill(new_values_dict)
             view.save_button.click()
             break
     for key, value in new_values_dict.items():
         setattr(self, key, value)
Esempio n. 22
0
 def cluster_import(self,
                    cluster_name=None,
                    profiling="enable",
                    view_progress=False):
     """
     Import the cluster and wait until it is listed as Ready to Use in the clusters list.
     Valid cluster name contains only alphanumeric and underscore characters.
     Possible profiling values are "enable", "disable" or "leaveAsIs".
     If import fails, save the screenshot of import log to ``screenshots`` directory.
     """
     view = ViaWebUI.navigate_to(self, "Import")
     wait_for(lambda: view.is_displayed,
              timeout=30,
              delay=2,
              message="ClusterImport view wasn't displayed in time.\n" +
              "Visible text: {}".format(view.browser.elements("*")[0].text))
     if cluster_name is not None:
         view.fill({"cluster_name": cluster_name, "profiling": profiling})
         self.name = cluster_name
     else:
         view.fill({"profiling": profiling})
     view.confirm_import.click()
     view = self.application.web_ui.create_view(ImportTaskSubmittedView)
     wait_for(
         lambda: view.is_displayed,
         timeout=30,
         delay=2,
         message="ImportTaskSubmittedView wasn't displayed in time.\n" +
         "Visible text: {}".format(view.browser.elements("*")[0].text))
     if view_progress:
         view.view_progress.click()
         view = self.application.web_ui.create_view(MainTaskEventsView)
         wait_for(
             lambda: view.is_displayed,
             timeout=100,
             message="MainTaskEventsView wasn't displayed in time.\n" +
             "Visible text: {}".format(view.browser.elements("*")[0].text))
         wait_for(
             lambda: view.import_status.text in {"Completed", "Failed"},
             timeout=700,
             message=
             "Cluster import couldn't reach Comleted or Failed state in 700 "
             + "seconds. Current status is {}".format(
                 view.import_status.text))
         if view.import_status.text == "Completed":
             LOGGER.debug("Import task was completed")
             view.cluster_details.click()
             view = self.application.web_ui.create_view(ClusterHostsView)
             wait_for(
                 lambda: view.is_displayed,
                 timeout=30,
                 delay=2,
                 message="ClusterHostsView wasn't displayed in time.\n" +
                 "Visible text: {}".format(
                     view.browser.elements("*")[0].text))
             view.navbar.clusters.select_by_visible_text("All Clusters")
             view = self.application.web_ui.create_view(ClustersView)
             wait_for(lambda: view.is_displayed,
                      timeout=30,
                      delay=2,
                      message="ClustersView wasn't displayed in time\n" +
                      "Visible text: {}".format(
                          view.browser.elements("*")[0].text))
         else:
             LOGGER.debug("Cluster import failed")
             tools.get_errors_from_log(self,
                                       view,
                                       "import",
                                       go_to_details=False)
             return False
     else:
         view.close_button.click()
     view = self.application.web_ui.create_view(ClustersView)
     wait_for(lambda: view.is_displayed,
              timeout=30,
              delay=2,
              message="ClustersView wasn't displayed in time\n" +
              "Visible text: {}".format(view.browser.elements("*")[0].text))
     wait_for(lambda: view.clusters(self.name).status.is_displayed,
              timeout=40,
              delay=2,
              message="Cluster's status wasn't displayed in time\n" +
              "Visible text: {}".format(view.browser.elements("*")[0].text))
     LOGGER.debug("Self.name: {}".format(self.name))
     wait_for(
         lambda: self.update()[
             3] in {"Ready to Use", "Import Failed. View Details"},
         timeout=600,
         delay=2,
         message=
         "Cluster import couldn't reach Comleted or Failed state in time\n"
         + "Visible text: {}".format(view.browser.elements("*")[0].text))
     if self.status == "Import Failed. View Details":
         LOGGER.debug("Cluster import failed")
         tools.get_errors_from_log(self, view, "import", go_to_details=True)
         return False
     wait_for(
         lambda: self.update()[1] == "Yes",
         timeout=200,
         delay=3,
         message=
         "Cluster's Managed attribute couldn't reach ``Yes`` in time\n" +
         "Visible text: {}".format(view.browser.elements("*")[0].text))
     LOGGER.debug("Cluster was updated")
     LOGGER.debug("Cluster status: {}".format(self.status))
     pytest.check(
         self.status == "Ready to Use",
         "Cluster status: {}. Should be ``Ready to use``".format(
             self.status))
     return True
Esempio n. 23
0
def test_user_crud(application, role, valid_session_credentials):
    """
    Create, edit and delete normal and limited user.
    """
    """
    :step:
      Create user
    :result:
      User is created
    """
    user = application.collections.users.create(
        user_id="{}_user_auto".format(role),
        name="{} user".format(role),
        email="{}[email protected]".format(role),
        notifications_on=False,
        password="******",
        role=role)
    pytest.check(user.exists,
                 "Check that new user can be found on UI Users page")
    test = tendrlapi_user.ApiUser(auth=valid_session_credentials)
    user_data = {
        "name": user.name,
        "username": user.user_id,
        "email": user.email,
        "role": user.role,
        "email_notifications": user.notifications_on
    }

    test.check_user(user_data)
    """
    :step:
      Edit user's email address and notification settings
    :result:
      User is edited
    """
    user.edit({
        "user_id": user.user_id,
        "name": user.name,
        "email": "edited_email_for_{}@example.com".format(role),
        "password": user.password,
        "confirm_password": user.password,
        "notifications_on": True
    })
    pytest.check(user.exists,
                 "Check that edited user can be found on UI Users page")
    pytest.check(user.email == "edited_email_for_{}@example.com".format(role),
                 "Check that user's e-mail has been edited")
    pytest.check(user.notifications_on,
                 "Check that user's notification settings have been edited")
    user_data["email"] = "edited_email_for_{}@example.com".format(role)
    user_data["email_notifications"] = True
    test.check_user(user_data)
    """
    :step:
      Log in as the edited user
    :result:
      User can log in
    """
    url = urlparse(CONF.config["usmqe"]["web_url"])
    app2 = Application(hostname=url.hostname,
                       scheme=url.scheme,
                       username=user.user_id,
                       password=user.password)
    ViaWebUI.navigate_to(app2.web_ui, "LoggedIn")
    app2.web_ui.browser_manager.quit()
    """
    :step:
      Delete user
    :result:
      User is deleted
    """
    user.delete()
    pytest.check(not user.exists,
                 "Check that user can't be found on UI Users page anymore.")