From 15574cad5c265256a2c8664516537c01ed2233da Mon Sep 17 00:00:00 2001 From: "panneer.smn" Date: Thu, 14 Jun 2018 15:02:59 -0500 Subject: [PATCH] Integration test fixes * fixed 37 tests in total * restructured and renamed test modules as per horizon * fixed page navigation & updated method calls * fixed css selector and xpaths as per horizon * Removed decorators.skip for working tests * included decorators.skip for non - working tests * updated description for tests as per horizon navigation * removed *update flavor info* and *update flavor access* test, as feature unavailable on horizon * updated table column name references in page modules * updated bind table action names as per horizon * included help page navigation checkpoint * fixed rc file download drop down selection * updated page titles in test modules * included calls as required for spinner disappearance * updated form fields as per test needs * updated default ipv4 and subnet for router interfaces * included string conversion as required for comparisons * updated cirros image name in horizon.conf Change-Id: I9fdc810b37443b616bbb82956d1c90a0fa5ebd6b --- .../test/integration_tests/horizon.conf | 6 +- .../{system/volumes => compute}/__init__.py | 0 .../admin/{system => compute}/flavorspage.py | 10 +- .../{system => compute}/hostaggregatespage.py | 2 +- .../pages/admin/compute/hypervisorspage.py | 20 +++ .../volumespage.py => compute/imagespage.py} | 6 +- .../{system => compute}/instancespage.py | 0 .../network}/__init__.py | 0 .../floatingipspage.py} | 6 +- .../pages/admin/network/networkspage.py | 18 +++ .../admin/{system => network}/routerspage.py | 2 +- .../pages/admin/{system => }/overviewpage.py | 2 +- .../pages/admin/system/defaultspage.py | 29 ++-- .../volumes => admin/volume}/__init__.py | 0 .../pages/admin/volume/snapshotspage.py | 18 +++ .../pages/admin/volume/volumespage.py | 18 +++ .../volumes => volume}/volumetypespage.py | 8 +- .../test/integration_tests/pages/basepage.py | 4 + .../pages/identity/groupspage.py | 2 +- .../pages/identity/projectspage.py | 4 +- .../pages/identity/rolespage.py | 20 +++ .../test/integration_tests/pages/loginpage.py | 2 +- .../integration_tests/pages/navigation.py | 127 +++++++++--------- .../access_and_security => }/apiaccesspage.py | 9 +- .../pages/project/compute/imagespage.py | 4 +- .../pages/project/compute/instancespage.py | 10 +- .../{access_and_security => }/keypairspage.py | 4 +- .../pages/project/compute/servergroupspage.py | 20 +++ .../floatingipspage.py | 7 +- .../pages/project/network/networkspage.py | 8 +- .../project/network/networktopologypage.py | 20 +++ .../project/network/routerinterfacespage.py | 8 +- .../pages/project/network/routerspage.py | 9 +- .../network/security_groups/__init__.py | 0 .../security_groups}/managerulespage.py | 8 +- .../securitygroupspage.py | 8 +- .../pages/project/volumes/__init__.py | 0 .../snapshotspage.py} | 14 +- .../{compute => }/volumes/volumespage.py | 26 ++-- .../test/integration_tests/regions/forms.py | 2 +- .../test/integration_tests/regions/menus.py | 33 ++--- .../test/integration_tests/regions/tables.py | 7 +- .../tests/test_credentials.py | 26 ++-- .../integration_tests/tests/test_defaults.py | 11 +- .../integration_tests/tests/test_flavors.py | 56 +------- .../tests/test_floatingips.py | 10 +- .../tests/test_host_aggregates.py | 3 +- .../integration_tests/tests/test_images.py | 10 +- .../integration_tests/tests/test_instances.py | 19 +-- .../integration_tests/tests/test_keypairs.py | 6 +- .../tests/test_metadata_definitions.py | 5 +- .../integration_tests/tests/test_networks.py | 2 +- .../integration_tests/tests/test_projects.py | 5 + .../integration_tests/tests/test_router.py | 7 +- .../tests/test_router_gateway.py | 2 +- .../tests/test_security_groups.py | 2 +- .../tests/test_user_settings.py | 10 +- .../integration_tests/tests/test_users.py | 2 + .../tests/test_volume_snapshots.py | 44 +++--- .../integration_tests/tests/test_volumes.py | 83 ++++++------ .../tests/test_volumetypes.py | 8 +- 61 files changed, 464 insertions(+), 348 deletions(-) rename openstack_dashboard/test/integration_tests/pages/admin/{system/volumes => compute}/__init__.py (100%) rename openstack_dashboard/test/integration_tests/pages/admin/{system => compute}/flavorspage.py (96%) rename openstack_dashboard/test/integration_tests/pages/admin/{system => compute}/hostaggregatespage.py (98%) create mode 100644 openstack_dashboard/test/integration_tests/pages/admin/compute/hypervisorspage.py rename openstack_dashboard/test/integration_tests/pages/admin/{system/volumes/volumespage.py => compute/imagespage.py} (88%) rename openstack_dashboard/test/integration_tests/pages/admin/{system => compute}/instancespage.py (100%) rename openstack_dashboard/test/integration_tests/pages/{project/compute/access_and_security => admin/network}/__init__.py (100%) rename openstack_dashboard/test/integration_tests/pages/admin/{system/volumes/volumesnapshotspage.py => network/floatingipspage.py} (76%) create mode 100644 openstack_dashboard/test/integration_tests/pages/admin/network/networkspage.py rename openstack_dashboard/test/integration_tests/pages/admin/{system => network}/routerspage.py (95%) rename openstack_dashboard/test/integration_tests/pages/admin/{system => }/overviewpage.py (94%) rename openstack_dashboard/test/integration_tests/pages/{project/compute/volumes => admin/volume}/__init__.py (100%) create mode 100644 openstack_dashboard/test/integration_tests/pages/admin/volume/snapshotspage.py create mode 100644 openstack_dashboard/test/integration_tests/pages/admin/volume/volumespage.py rename openstack_dashboard/test/integration_tests/pages/admin/{system/volumes => volume}/volumetypespage.py (96%) create mode 100644 openstack_dashboard/test/integration_tests/pages/identity/rolespage.py rename openstack_dashboard/test/integration_tests/pages/project/{compute/access_and_security => }/apiaccesspage.py (90%) rename openstack_dashboard/test/integration_tests/pages/project/compute/{access_and_security => }/keypairspage.py (97%) create mode 100644 openstack_dashboard/test/integration_tests/pages/project/compute/servergroupspage.py rename openstack_dashboard/test/integration_tests/pages/project/{compute/access_and_security => network}/floatingipspage.py (95%) create mode 100644 openstack_dashboard/test/integration_tests/pages/project/network/networktopologypage.py create mode 100644 openstack_dashboard/test/integration_tests/pages/project/network/security_groups/__init__.py rename openstack_dashboard/test/integration_tests/pages/project/{compute/access_and_security => network/security_groups}/managerulespage.py (90%) rename openstack_dashboard/test/integration_tests/pages/project/{compute/access_and_security => network}/securitygroupspage.py (92%) create mode 100644 openstack_dashboard/test/integration_tests/pages/project/volumes/__init__.py rename openstack_dashboard/test/integration_tests/pages/project/{compute/volumes/volumesnapshotspage.py => volumes/snapshotspage.py} (93%) rename openstack_dashboard/test/integration_tests/pages/project/{compute => }/volumes/volumespage.py (94%) diff --git a/openstack_dashboard/test/integration_tests/horizon.conf b/openstack_dashboard/test/integration_tests/horizon.conf index 635f982fd6..c55a17a669 100644 --- a/openstack_dashboard/test/integration_tests/horizon.conf +++ b/openstack_dashboard/test/integration_tests/horizon.conf @@ -40,9 +40,7 @@ panel_type=legacy # http accessible image (string value) panel_type=angular http_image=http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-uec.tar.gz -images_list=cirros-0.3.4-x86_64-uec, - cirros-0.3.4-x86_64-uec-kernel, - cirros-0.3.4-x86_64-uec-ramdisk +images_list=cirros-0.3.5-x86_64-disk [identity] # Username to use for non-admin API requests. (string value) @@ -86,7 +84,7 @@ ssh_user=cirros #available zone to launch instances available_zone=nova #image_name to launch instances -image_name=cirros-0.3.4-x86_64-uec (24.0 MB) +image_name=cirros-0.3.5-x86_64-disk (12.7 MB) #flavor to launch instances flavor=m1.tiny diff --git a/openstack_dashboard/test/integration_tests/pages/admin/system/volumes/__init__.py b/openstack_dashboard/test/integration_tests/pages/admin/compute/__init__.py similarity index 100% rename from openstack_dashboard/test/integration_tests/pages/admin/system/volumes/__init__.py rename to openstack_dashboard/test/integration_tests/pages/admin/compute/__init__.py diff --git a/openstack_dashboard/test/integration_tests/pages/admin/system/flavorspage.py b/openstack_dashboard/test/integration_tests/pages/admin/compute/flavorspage.py similarity index 96% rename from openstack_dashboard/test/integration_tests/pages/admin/system/flavorspage.py rename to openstack_dashboard/test/integration_tests/pages/admin/compute/flavorspage.py index 18cea535c4..a0166df3d5 100644 --- a/openstack_dashboard/test/integration_tests/pages/admin/system/flavorspage.py +++ b/openstack_dashboard/test/integration_tests/pages/admin/compute/flavorspage.py @@ -68,11 +68,11 @@ class FlavorsTable(tables.TableRegion): class FlavorsPage(basepage.BaseNavigationPage): DEFAULT_ID = "auto" - FLAVORS_TABLE_NAME_COLUMN = 'name' - FLAVORS_TABLE_VCPUS_COLUMN = 'vcpus' - FLAVORS_TABLE_RAM_COLUMN = 'ram' - FLAVORS_TABLE_DISK_COLUMN = 'disk' - FLAVORS_TABLE_PUBLIC_COLUMN = 'public' + FLAVORS_TABLE_NAME_COLUMN = 'Flavor Name' + FLAVORS_TABLE_VCPUS_COLUMN = 'VCPUs' + FLAVORS_TABLE_RAM_COLUMN = 'RAM' + FLAVORS_TABLE_DISK_COLUMN = 'Root Disk' + FLAVORS_TABLE_PUBLIC_COLUMN = 'Public' def __init__(self, driver, conf): super(FlavorsPage, self).__init__(driver, conf) diff --git a/openstack_dashboard/test/integration_tests/pages/admin/system/hostaggregatespage.py b/openstack_dashboard/test/integration_tests/pages/admin/compute/hostaggregatespage.py similarity index 98% rename from openstack_dashboard/test/integration_tests/pages/admin/system/hostaggregatespage.py rename to openstack_dashboard/test/integration_tests/pages/admin/compute/hostaggregatespage.py index e66b4b9d77..4004b31f17 100644 --- a/openstack_dashboard/test/integration_tests/pages/admin/system/hostaggregatespage.py +++ b/openstack_dashboard/test/integration_tests/pages/admin/compute/hostaggregatespage.py @@ -46,7 +46,7 @@ class HostAggregatesTable(tables.TableRegion): class HostaggregatesPage(basepage.BaseNavigationPage): - HOST_AGGREGATES_TABLE_NAME_COLUMN = 'name' + HOST_AGGREGATES_TABLE_NAME_COLUMN = 'Name' def __init__(self, driver, conf): super(HostaggregatesPage, self).__init__(driver, conf) diff --git a/openstack_dashboard/test/integration_tests/pages/admin/compute/hypervisorspage.py b/openstack_dashboard/test/integration_tests/pages/admin/compute/hypervisorspage.py new file mode 100644 index 0000000000..17da1f3b96 --- /dev/null +++ b/openstack_dashboard/test/integration_tests/pages/admin/compute/hypervisorspage.py @@ -0,0 +1,20 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from openstack_dashboard.test.integration_tests.pages import basepage + + +class HypervisorsPage(basepage.BaseNavigationPage): + + def __init__(self, driver, conf): + super(HypervisorsPage, self).__init__(driver, conf) + self._page_title = "All Hypervisors" diff --git a/openstack_dashboard/test/integration_tests/pages/admin/system/volumes/volumespage.py b/openstack_dashboard/test/integration_tests/pages/admin/compute/imagespage.py similarity index 88% rename from openstack_dashboard/test/integration_tests/pages/admin/system/volumes/volumespage.py rename to openstack_dashboard/test/integration_tests/pages/admin/compute/imagespage.py index ddcffaf4a7..adbf16908f 100644 --- a/openstack_dashboard/test/integration_tests/pages/admin/system/volumes/volumespage.py +++ b/openstack_dashboard/test/integration_tests/pages/admin/compute/imagespage.py @@ -10,9 +10,9 @@ # License for the specific language governing permissions and limitations # under the License. -from openstack_dashboard.test.integration_tests.pages.project.compute.volumes\ - import volumespage +from openstack_dashboard.test.integration_tests.pages.project.compute \ + import imagespage -class VolumesPage(volumespage.VolumesPage): +class ImagesPage(imagespage.ImagesPage): pass diff --git a/openstack_dashboard/test/integration_tests/pages/admin/system/instancespage.py b/openstack_dashboard/test/integration_tests/pages/admin/compute/instancespage.py similarity index 100% rename from openstack_dashboard/test/integration_tests/pages/admin/system/instancespage.py rename to openstack_dashboard/test/integration_tests/pages/admin/compute/instancespage.py diff --git a/openstack_dashboard/test/integration_tests/pages/project/compute/access_and_security/__init__.py b/openstack_dashboard/test/integration_tests/pages/admin/network/__init__.py similarity index 100% rename from openstack_dashboard/test/integration_tests/pages/project/compute/access_and_security/__init__.py rename to openstack_dashboard/test/integration_tests/pages/admin/network/__init__.py diff --git a/openstack_dashboard/test/integration_tests/pages/admin/system/volumes/volumesnapshotspage.py b/openstack_dashboard/test/integration_tests/pages/admin/network/floatingipspage.py similarity index 76% rename from openstack_dashboard/test/integration_tests/pages/admin/system/volumes/volumesnapshotspage.py rename to openstack_dashboard/test/integration_tests/pages/admin/network/floatingipspage.py index aa02f2db65..97c4c9dcda 100644 --- a/openstack_dashboard/test/integration_tests/pages/admin/system/volumes/volumesnapshotspage.py +++ b/openstack_dashboard/test/integration_tests/pages/admin/network/floatingipspage.py @@ -10,9 +10,9 @@ # License for the specific language governing permissions and limitations # under the License. -from openstack_dashboard.test.integration_tests.pages.project.compute.volumes\ - import volumesnapshotspage +from openstack_dashboard.test.integration_tests.pages.project.network \ + import floatingipspage -class VolumesnapshotsPage(volumesnapshotspage.VolumesnapshotsPage): +class FloatingipsPage(floatingipspage.FloatingipsPage): pass diff --git a/openstack_dashboard/test/integration_tests/pages/admin/network/networkspage.py b/openstack_dashboard/test/integration_tests/pages/admin/network/networkspage.py new file mode 100644 index 0000000000..738eb2ea44 --- /dev/null +++ b/openstack_dashboard/test/integration_tests/pages/admin/network/networkspage.py @@ -0,0 +1,18 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from openstack_dashboard.test.integration_tests.pages.project.network \ + import networkspage + + +class NetworksPage(networkspage.NetworksPage): + pass diff --git a/openstack_dashboard/test/integration_tests/pages/admin/system/routerspage.py b/openstack_dashboard/test/integration_tests/pages/admin/network/routerspage.py similarity index 95% rename from openstack_dashboard/test/integration_tests/pages/admin/system/routerspage.py rename to openstack_dashboard/test/integration_tests/pages/admin/network/routerspage.py index 00f22e7c47..6ec30ba464 100644 --- a/openstack_dashboard/test/integration_tests/pages/admin/system/routerspage.py +++ b/openstack_dashboard/test/integration_tests/pages/admin/network/routerspage.py @@ -17,7 +17,7 @@ from openstack_dashboard.test.integration_tests.regions import tables class RoutersTable(routerspage.RoutersTable): - EDIT_ROUTER_FORM_FIELDS = ("name", "admin_state", "router_id") + EDIT_ROUTER_FORM_FIELDS = ("name", "admin_state") @tables.bind_row_action('update') def edit_router(self, edit_button, row): diff --git a/openstack_dashboard/test/integration_tests/pages/admin/system/overviewpage.py b/openstack_dashboard/test/integration_tests/pages/admin/overviewpage.py similarity index 94% rename from openstack_dashboard/test/integration_tests/pages/admin/system/overviewpage.py rename to openstack_dashboard/test/integration_tests/pages/admin/overviewpage.py index be9c717bc8..af36d5ce3e 100644 --- a/openstack_dashboard/test/integration_tests/pages/admin/system/overviewpage.py +++ b/openstack_dashboard/test/integration_tests/pages/admin/overviewpage.py @@ -16,4 +16,4 @@ from openstack_dashboard.test.integration_tests.pages import basepage class OverviewPage(basepage.BaseNavigationPage): def __init__(self, driver, conf): super(OverviewPage, self).__init__(driver, conf) - self._page_title = "Usage Overview" + self._page_title = "Overview" diff --git a/openstack_dashboard/test/integration_tests/pages/admin/system/defaultspage.py b/openstack_dashboard/test/integration_tests/pages/admin/system/defaultspage.py index 85b4482a04..5ea0abb5b5 100644 --- a/openstack_dashboard/test/integration_tests/pages/admin/system/defaultspage.py +++ b/openstack_dashboard/test/integration_tests/pages/admin/system/defaultspage.py @@ -16,7 +16,7 @@ from openstack_dashboard.test.integration_tests.regions import tables class DefaultQuotasTable(tables.TableRegion): - name = "quotas" + name = "compute_quotas" UPDATE_DEFAULTS_FORM_FIELDS = ( "injected_file_content_bytes", @@ -27,12 +27,11 @@ class DefaultQuotasTable(tables.TableRegion): "instances", "injected_files", "cores", - "gigabytes", - "snapshots", - "volumes" + "server_groups", + "server_group_members" ) - @tables.bind_table_action('update_defaults') + @tables.bind_table_action('update_compute_defaults') def update(self, update_button): update_button.click() return forms.FormRegion( @@ -45,20 +44,19 @@ class DefaultQuotasTable(tables.TableRegion): class DefaultsPage(basepage.BaseNavigationPage): - QUOTAS_TABLE_NAME_COLUMN = 'name' - QUOTAS_TABLE_LIMIT_COLUMN = 'limit' + QUOTAS_TABLE_NAME_COLUMN = 'Quota Name' + QUOTAS_TABLE_LIMIT_COLUMN = 'Limit' DEFAULT_QUOTA_NAMES = [ 'Injected File Content Bytes', 'Metadata Items', + 'Server Group Members', + 'Server Groups', 'RAM (MB)', 'Key Pairs', 'Length of Injected File Path', 'Instances', 'Injected Files', - 'VCPUs', - 'Total Size of Volumes and Snapshots (GiB)', - 'Volume Snapshots', - 'Volumes' + 'VCPUs' ] def __init__(self, driver, conf): @@ -91,6 +89,12 @@ class DefaultsPage(basepage.BaseNavigationPage): update_form.metadata_items.value = \ int(update_form.metadata_items.value) + add_up + update_form.server_group_members.value = \ + int(update_form.server_group_members.value) + add_up + + update_form.server_groups.value = \ + int(update_form.server_groups.value) + add_up + update_form.ram.value = int(update_form.ram.value) + add_up update_form.key_pairs.value = int(update_form.key_pairs.value) + add_up update_form.injected_file_path_bytes.value = \ @@ -99,9 +103,6 @@ class DefaultsPage(basepage.BaseNavigationPage): update_form.injected_files.value = int( update_form.injected_files.value) + add_up update_form.cores.value = int(update_form.cores.value) + add_up - update_form.gigabytes.value = int(update_form.gigabytes.value) + add_up - update_form.snapshots.value = int(update_form.snapshots.value) + add_up - update_form.volumes.value = int(update_form.volumes.value) + add_up update_form.submit() diff --git a/openstack_dashboard/test/integration_tests/pages/project/compute/volumes/__init__.py b/openstack_dashboard/test/integration_tests/pages/admin/volume/__init__.py similarity index 100% rename from openstack_dashboard/test/integration_tests/pages/project/compute/volumes/__init__.py rename to openstack_dashboard/test/integration_tests/pages/admin/volume/__init__.py diff --git a/openstack_dashboard/test/integration_tests/pages/admin/volume/snapshotspage.py b/openstack_dashboard/test/integration_tests/pages/admin/volume/snapshotspage.py new file mode 100644 index 0000000000..8be6ac5e5a --- /dev/null +++ b/openstack_dashboard/test/integration_tests/pages/admin/volume/snapshotspage.py @@ -0,0 +1,18 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from openstack_dashboard.test.integration_tests.pages.project.\ + volumes import snapshotspage + + +class SnapshotsPage(snapshotspage.SnapshotsPage): + pass diff --git a/openstack_dashboard/test/integration_tests/pages/admin/volume/volumespage.py b/openstack_dashboard/test/integration_tests/pages/admin/volume/volumespage.py new file mode 100644 index 0000000000..af25856672 --- /dev/null +++ b/openstack_dashboard/test/integration_tests/pages/admin/volume/volumespage.py @@ -0,0 +1,18 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from openstack_dashboard.test.integration_tests.pages.project.\ + volumes import volumespage + + +class VolumesPage(volumespage.VolumesPage): + pass diff --git a/openstack_dashboard/test/integration_tests/pages/admin/system/volumes/volumetypespage.py b/openstack_dashboard/test/integration_tests/pages/admin/volume/volumetypespage.py similarity index 96% rename from openstack_dashboard/test/integration_tests/pages/admin/system/volumes/volumetypespage.py rename to openstack_dashboard/test/integration_tests/pages/admin/volume/volumetypespage.py index fb3d693a08..39f21efa4d 100644 --- a/openstack_dashboard/test/integration_tests/pages/admin/system/volumes/volumetypespage.py +++ b/openstack_dashboard/test/integration_tests/pages/admin/volume/volumetypespage.py @@ -60,14 +60,14 @@ class VolumeTypesTable(tables.TableRegion): class VolumetypesPage(basepage.BaseNavigationPage): - QOS_SPECS_TABLE_NAME_COLUMN = 'name' - VOLUME_TYPES_TABLE_NAME_COLUMN = 'name' - QOS_SPECS_TABLE_CONSUMER_COLUMN = 'consumer' + QOS_SPECS_TABLE_NAME_COLUMN = 'Name' + VOLUME_TYPES_TABLE_NAME_COLUMN = 'Name' + QOS_SPECS_TABLE_CONSUMER_COLUMN = 'Consumer' CINDER_CONSUMER = 'back-end' def __init__(self, driver, conf): super(VolumetypesPage, self).__init__(driver, conf) - self._page_title = "Volumes" + self._page_title = "Volume Types" @property def qos_specs_table(self): diff --git a/openstack_dashboard/test/integration_tests/pages/basepage.py b/openstack_dashboard/test/integration_tests/pages/basepage.py index 0ea067db6c..b3fdaae4fc 100644 --- a/openstack_dashboard/test/integration_tests/pages/basepage.py +++ b/openstack_dashboard/test/integration_tests/pages/basepage.py @@ -23,6 +23,7 @@ class BasePage(pageobject.PageObject): """Base class for all dashboard page objects.""" _heading_locator = (by.By.CSS_SELECTOR, 'div.page-header > h2') + _help_page_brand = (by.By.CSS_SELECTOR, '.navbar-brand') @property def heading(self): @@ -52,6 +53,9 @@ class BasePage(pageobject.PageObject): def go_to_help_page(self): self.topbar.user_dropdown_menu.click_on_help() + def is_help_page(self): + self._wait_till_element_visible(self._help_page_brand) + def choose_theme(self, theme_name): self.topbar.user_dropdown_menu.choose_theme(theme_name) diff --git a/openstack_dashboard/test/integration_tests/pages/identity/groupspage.py b/openstack_dashboard/test/integration_tests/pages/identity/groupspage.py index 4863733db9..445483a73b 100644 --- a/openstack_dashboard/test/integration_tests/pages/identity/groupspage.py +++ b/openstack_dashboard/test/integration_tests/pages/identity/groupspage.py @@ -49,7 +49,7 @@ class GroupsPage(basepage.BaseNavigationPage): @property def table_name_column(self): - return "name" + return "Name" @property def groups_table(self): diff --git a/openstack_dashboard/test/integration_tests/pages/identity/projectspage.py b/openstack_dashboard/test/integration_tests/pages/identity/projectspage.py index e377dc56cf..73dbdc6c6e 100644 --- a/openstack_dashboard/test/integration_tests/pages/identity/projectspage.py +++ b/openstack_dashboard/test/integration_tests/pages/identity/projectspage.py @@ -47,8 +47,8 @@ class ProjectsTable(tables.TableRegion): class ProjectsPage(basepage.BaseNavigationPage): DEFAULT_ENABLED = True - PROJECTS_TABLE_NAME_COLUMN = 'name' - PROJECT_ID_TABLE_NAME_COLUMN = 'id' + PROJECTS_TABLE_NAME_COLUMN = 'Name' + PROJECT_ID_TABLE_NAME_COLUMN = 'Project ID' def __init__(self, driver, conf): super(ProjectsPage, self).__init__(driver, conf) diff --git a/openstack_dashboard/test/integration_tests/pages/identity/rolespage.py b/openstack_dashboard/test/integration_tests/pages/identity/rolespage.py new file mode 100644 index 0000000000..8604a25346 --- /dev/null +++ b/openstack_dashboard/test/integration_tests/pages/identity/rolespage.py @@ -0,0 +1,20 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from openstack_dashboard.test.integration_tests.pages import basepage + + +class RolesPage(basepage.BaseNavigationPage): + + def __init__(self, driver, conf): + super(RolesPage, self).__init__(driver, conf) + self._page_title = 'Roles' diff --git a/openstack_dashboard/test/integration_tests/pages/loginpage.py b/openstack_dashboard/test/integration_tests/pages/loginpage.py index 8d65878167..8358d35383 100644 --- a/openstack_dashboard/test/integration_tests/pages/loginpage.py +++ b/openstack_dashboard/test/integration_tests/pages/loginpage.py @@ -13,7 +13,7 @@ from selenium.webdriver.common import by from selenium.webdriver.common import keys -from openstack_dashboard.test.integration_tests.pages.admin.system import \ +from openstack_dashboard.test.integration_tests.pages.admin import \ overviewpage as system_overviewpage from openstack_dashboard.test.integration_tests.pages import pageobject from openstack_dashboard.test.integration_tests.pages.project.compute import \ diff --git a/openstack_dashboard/test/integration_tests/pages/navigation.py b/openstack_dashboard/test/integration_tests/pages/navigation.py index 9791782bda..34af077282 100644 --- a/openstack_dashboard/test/integration_tests/pages/navigation.py +++ b/openstack_dashboard/test/integration_tests/pages/navigation.py @@ -65,29 +65,26 @@ class Navigation(object): { "Compute": { - "Access & Security": - { - ITEMS: - ( - "Security Groups", - "Key Pairs", - "Floating IPs", - "API Access" - ), - }, - "Volumes": - { - ITEMS: - ( - "Volumes", - "Volume Snapshots" - ) - }, + ITEMS: ( "Overview", "Instances", "Images", + "Key Pairs", + "Server Groups", + ) + }, + "Volumes": + { + ITEMS: + ( + "Volumes", + "Backups", + "Snapshots", + "Consistency Groups", + "Consistency Group Snapshots", + ) }, "Network": @@ -96,73 +93,64 @@ class Navigation(object): ( "Network Topology", "Networks", - "Routers" - ) - }, - "Object Store": - { - ITEMS: - ( - "Containers", + "Routers", + "Security Groups", + "Floating IPs", ) }, + ITEMS: + ( + "API Access", + ) }, "Admin": { - "System": + "Compute": { - "Resource Usage": - { - ITEMS: - ( - "Daily Report", - "Stats" - ) - }, - "System info": - { - ITEMS: - ( - "Services", - "Compute Services", - "Block Storage Services", - "Network Agents", - "Default Quotas" - ) - }, - "Volumes": - { - ITEMS: - ( - "Volumes", - "Volume Types", - "Volume Snapshots" - ) - }, + ITEMS: ( - "Overview", "Hypervisors", "Host Aggregates", "Instances", "Flavors", "Images", + ) + }, + "Volume": + { + ITEMS: + ( + "Volumes", + "Snapshots", + "Volume Types", + + ) + }, + "Network": + { + ITEMS: + ( "Networks", "Routers", + "Floating IPs", + ) + }, + "System": + { + ITEMS: + ( "Defaults", "Metadata Definitions", "System Information" ) }, - }, - "Settings": - { ITEMS: ( - "User Settings", - "Change Password" + "Overview", ) }, + "Identity": { ITEMS: @@ -170,10 +158,18 @@ class Navigation(object): "Projects", "Users", "Groups", - "Domains", - "Roles" + "Roles", + "Application Credentials", ) - } + }, + "Settings": + { + ITEMS: + ( + "User Settings", + "Change Password", + ) + }, } _main_content_locator = (by.By.ID, 'content_body') @@ -281,11 +277,10 @@ class Navigation(object): * consist of 'go_to_subsubmenu_menuitem_page' """ - if len(self.path) < 4: + if len(self.path) < 3: path_2_name = list(self.path[-2:]) else: path_2_name = list(self.path[-3:]) - name = self.METHOD_NAME_DELIMITER.join(path_2_name) name = self.METHOD_NAME_PREFIX + name + self.METHOD_NAME_SUFFIX name = Navigation.unify_page_path(name, preserve_spaces=False) diff --git a/openstack_dashboard/test/integration_tests/pages/project/compute/access_and_security/apiaccesspage.py b/openstack_dashboard/test/integration_tests/pages/project/apiaccesspage.py similarity index 90% rename from openstack_dashboard/test/integration_tests/pages/project/compute/access_and_security/apiaccesspage.py rename to openstack_dashboard/test/integration_tests/pages/project/apiaccesspage.py index 95b6de4aa4..daf276117e 100644 --- a/openstack_dashboard/test/integration_tests/pages/project/compute/access_and_security/apiaccesspage.py +++ b/openstack_dashboard/test/integration_tests/pages/project/apiaccesspage.py @@ -21,13 +21,20 @@ from openstack_dashboard.test.integration_tests.regions import tables class ApiAccessTable(tables.TableRegion): name = "endpoints" + dropdown = 'Download OpenStack' + + def download_rcfile_dropdown(self): + self.driver.find_element_by_partial_link_text( + self.dropdown).click() @tables.bind_table_action('download_openrc_v2') def download_openstack_rc_v2(self, download_button): + self.download_rcfile_dropdown() download_button.click() @tables.bind_table_action('download_openrc') def download_openstack_rc_v3(self, download_button): + self.download_rcfile_dropdown() download_button.click() @@ -35,7 +42,7 @@ class ApiaccessPage(basepage.BaseNavigationPage): def __init__(self, driver, conf): super(ApiaccessPage, self).__init__(driver, conf) - self._page_title = "Access & Security" + self._page_title = "API Access" @property def apiaccess_table(self): diff --git a/openstack_dashboard/test/integration_tests/pages/project/compute/imagespage.py b/openstack_dashboard/test/integration_tests/pages/project/compute/imagespage.py index 8364a14cf2..586a387066 100644 --- a/openstack_dashboard/test/integration_tests/pages/project/compute/imagespage.py +++ b/openstack_dashboard/test/integration_tests/pages/project/compute/imagespage.py @@ -17,8 +17,8 @@ from openstack_dashboard.test.integration_tests.regions import tables from openstack_dashboard.test.integration_tests.pages.project.compute.\ instancespage import InstancesPage -from openstack_dashboard.test.integration_tests.pages.project.compute.\ - volumes.volumespage import VolumesPage +from openstack_dashboard.test.integration_tests.pages.project.volumes.\ + volumespage import VolumesPage # TODO(bpokorny): Set the default source back to 'url' once Glance removes diff --git a/openstack_dashboard/test/integration_tests/pages/project/compute/instancespage.py b/openstack_dashboard/test/integration_tests/pages/project/compute/instancespage.py index 5a1ccfbe0b..a4227b23fa 100644 --- a/openstack_dashboard/test/integration_tests/pages/project/compute/instancespage.py +++ b/openstack_dashboard/test/integration_tests/pages/project/compute/instancespage.py @@ -35,7 +35,7 @@ class LaunchInstanceForm(forms.TabbedFormRegion): class InstancesTable(tables.TableRegion): name = "instances" - @tables.bind_table_action('launch') + @tables.bind_table_action('launch-ng') def launch_instance(self, launch_button): launch_button.click() return LaunchInstanceForm(self.driver, self.conf) @@ -57,10 +57,10 @@ class InstancesPage(basepage.BaseNavigationPage): DEFAULT_VOL_DELETE_ON_INSTANCE_DELETE = False DEFAULT_SECURITY_GROUP = True - INSTANCES_TABLE_NAME_COLUMN = 'name' - INSTANCES_TABLE_STATUS_COLUMN = 'status' - INSTANCES_TABLE_IP_COLUMN = 'ip' - INSTANCES_TABLE_IMAGE_NAME_COLUMN = 'image_name' + INSTANCES_TABLE_NAME_COLUMN = 'Instance Name' + INSTANCES_TABLE_STATUS_COLUMN = 'Status' + INSTANCES_TABLE_IP_COLUMN = 'IP Address' + INSTANCES_TABLE_IMAGE_NAME_COLUMN = 'Image Name' def __init__(self, driver, conf): super(InstancesPage, self).__init__(driver, conf) diff --git a/openstack_dashboard/test/integration_tests/pages/project/compute/access_and_security/keypairspage.py b/openstack_dashboard/test/integration_tests/pages/project/compute/keypairspage.py similarity index 97% rename from openstack_dashboard/test/integration_tests/pages/project/compute/access_and_security/keypairspage.py rename to openstack_dashboard/test/integration_tests/pages/project/compute/keypairspage.py index 2c3a93e8c0..a8b7b1c4ef 100644 --- a/openstack_dashboard/test/integration_tests/pages/project/compute/access_and_security/keypairspage.py +++ b/openstack_dashboard/test/integration_tests/pages/project/compute/keypairspage.py @@ -44,11 +44,11 @@ class KeypairsPage(basepage.BaseNavigationPage): KEY_PAIRS_TABLE_ACTIONS = ("create", "import", "delete") KEY_PAIRS_TABLE_ROW_ACTION = "delete" - KEY_PAIRS_TABLE_NAME_COLUMN = 'name' + KEY_PAIRS_TABLE_NAME_COLUMN = 'Name' def __init__(self, driver, conf): super(KeypairsPage, self).__init__(driver, conf) - self._page_title = "Access & Security" + self._page_title = "Key Pairs" def _get_row_with_keypair_name(self, name): return self.keypairs_table.get_row(self.KEY_PAIRS_TABLE_NAME_COLUMN, diff --git a/openstack_dashboard/test/integration_tests/pages/project/compute/servergroupspage.py b/openstack_dashboard/test/integration_tests/pages/project/compute/servergroupspage.py new file mode 100644 index 0000000000..40db1da2c3 --- /dev/null +++ b/openstack_dashboard/test/integration_tests/pages/project/compute/servergroupspage.py @@ -0,0 +1,20 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from openstack_dashboard.test.integration_tests.pages import basepage + + +class ServergroupsPage(basepage.BaseNavigationPage): + + def __init__(self, driver, conf): + super(ServergroupsPage, self).__init__(driver, conf) + self._page_title = 'Server Groups' diff --git a/openstack_dashboard/test/integration_tests/pages/project/compute/access_and_security/floatingipspage.py b/openstack_dashboard/test/integration_tests/pages/project/network/floatingipspage.py similarity index 95% rename from openstack_dashboard/test/integration_tests/pages/project/compute/access_and_security/floatingipspage.py rename to openstack_dashboard/test/integration_tests/pages/project/network/floatingipspage.py index 9de2514732..270ce2c1a8 100644 --- a/openstack_dashboard/test/integration_tests/pages/project/compute/access_and_security/floatingipspage.py +++ b/openstack_dashboard/test/integration_tests/pages/project/network/floatingipspage.py @@ -30,6 +30,7 @@ class FloatingIPTable(tables.TableRegion): @tables.bind_table_action('allocate') def allocate_ip(self, allocate_button): allocate_button.click() + self.wait_till_spinner_disappears() return forms.BaseFormRegion(self.driver, self.conf) @tables.bind_table_action('release') @@ -50,15 +51,15 @@ class FloatingIPTable(tables.TableRegion): class FloatingipsPage(basepage.BaseNavigationPage): - FLOATING_IPS_TABLE_IP_COLUMN = 'ip' - FLOATING_IPS_TABLE_FIXED_IP_COLUMN = 'fixed_ip' + FLOATING_IPS_TABLE_IP_COLUMN = 'IP Address' + FLOATING_IPS_TABLE_FIXED_IP_COLUMN = 'Mapped Fixed IP Address' _floatingips_fadein_popup_locator = ( by.By.CSS_SELECTOR, '.alert.alert-success.alert-dismissable.fade.in>p') def __init__(self, driver, conf): super(FloatingipsPage, self).__init__(driver, conf) - self._page_title = "Access & Security" + self._page_title = "Floating IPs" def _get_row_with_floatingip(self, floatingip): return self.floatingips_table.get_row( diff --git a/openstack_dashboard/test/integration_tests/pages/project/network/networkspage.py b/openstack_dashboard/test/integration_tests/pages/project/network/networkspage.py index 0471bd4ea3..d8ff5f3d86 100644 --- a/openstack_dashboard/test/integration_tests/pages/project/network/networkspage.py +++ b/openstack_dashboard/test/integration_tests/pages/project/network/networkspage.py @@ -17,8 +17,8 @@ from openstack_dashboard.test.integration_tests.regions import tables class NetworksTable(tables.TableRegion): name = "networks" - CREATE_NETWORK_FORM_FIELDS = (("net_name", "admin_state", "shared", - "with_subnet"), + CREATE_NETWORK_FORM_FIELDS = (("net_name", "admin_state", + "with_subnet", "az_hints"), ("subnet_name", "cidr", "ip_version", "gateway_ip", "no_gateway"), ("enable_dhcp", "allocation_pools", @@ -42,8 +42,8 @@ class NetworksPage(basepage.BaseNavigationPage): DEFAULT_IP_VERSION = '4' DEFAULT_DISABLE_GATEWAY = False DEFAULT_ENABLE_DHCP = True - NETWORKS_TABLE_NAME_COLUMN = 'name' - NETWORKS_TABLE_STATUS_COLUMN = 'status' + NETWORKS_TABLE_NAME_COLUMN = 'Name' + NETWORKS_TABLE_STATUS_COLUMN = 'Status' SUBNET_TAB_INDEX = 1 DETAILS_TAB_INDEX = 2 diff --git a/openstack_dashboard/test/integration_tests/pages/project/network/networktopologypage.py b/openstack_dashboard/test/integration_tests/pages/project/network/networktopologypage.py new file mode 100644 index 0000000000..2f873b125b --- /dev/null +++ b/openstack_dashboard/test/integration_tests/pages/project/network/networktopologypage.py @@ -0,0 +1,20 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from openstack_dashboard.test.integration_tests.pages import basepage + + +class NetworktopologyPage(basepage.BaseNavigationPage): + + def __init__(self, driver, conf): + super(NetworktopologyPage, self).__init__(driver, conf) + self._page_title = 'Network Topology' diff --git a/openstack_dashboard/test/integration_tests/pages/project/network/routerinterfacespage.py b/openstack_dashboard/test/integration_tests/pages/project/network/routerinterfacespage.py index fe213b9653..2f2f2f68f8 100644 --- a/openstack_dashboard/test/integration_tests/pages/project/network/routerinterfacespage.py +++ b/openstack_dashboard/test/integration_tests/pages/project/network/routerinterfacespage.py @@ -44,10 +44,10 @@ class InterfacesTable(tables.TableRegion): class RouterInterfacesPage(basepage.BaseNavigationPage): - INTERFACES_TABLE_STATUS_COLUMN = 'status' - INTERFACES_TABLE_NAME_COLUMN = 'name' - DEFAULT_IPv4_ADDRESS = '10.1.0.10' - DEFAULT_SUBNET = 'private: 10.1.0.0/20 (private-subnet)' + INTERFACES_TABLE_STATUS_COLUMN = 'Status' + INTERFACES_TABLE_NAME_COLUMN = 'Name' + DEFAULT_IPv4_ADDRESS = '10.0.0.10' + DEFAULT_SUBNET = 'private: 10.0.0.0/26 (private-subnet)' _breadcrumb_routers_locator = (by.By.CSS_SELECTOR, 'ol.breadcrumb>li>' + diff --git a/openstack_dashboard/test/integration_tests/pages/project/network/routerspage.py b/openstack_dashboard/test/integration_tests/pages/project/network/routerspage.py index 386d43b982..fb08f699d0 100644 --- a/openstack_dashboard/test/integration_tests/pages/project/network/routerspage.py +++ b/openstack_dashboard/test/integration_tests/pages/project/network/routerspage.py @@ -28,8 +28,7 @@ class RoutersTable(tables.TableRegion): name = "routers" CREATE_ROUTER_FORM_FIELDS = ("name", "admin_state_up", "external_network") - SET_GATEWAY_FORM_FIELDS = ("network_id", "router_name", - "router_id") + SET_GATEWAY_FORM_FIELDS = ("network_id",) @tables.bind_table_action('create') def create_router(self, create_button): @@ -58,9 +57,9 @@ class RoutersPage(basepage.BaseNavigationPage): DEFAULT_ADMIN_STATE_UP = 'True' DEFAULT_EXTERNAL_NETWORK = 'public' - ROUTERS_TABLE_NAME_COLUMN = 'name' - ROUTERS_TABLE_STATUS_COLUMN = 'status' - ROUTERS_TABLE_NETWORK_COLUMN = 'ext_net' + ROUTERS_TABLE_NAME_COLUMN = 'Name' + ROUTERS_TABLE_STATUS_COLUMN = 'Status' + ROUTERS_TABLE_NETWORK_COLUMN = 'External Network' _interfaces_tab_locator = (by.By.CSS_SELECTOR, 'a[href*="tab=router_details__interfaces"]') diff --git a/openstack_dashboard/test/integration_tests/pages/project/network/security_groups/__init__.py b/openstack_dashboard/test/integration_tests/pages/project/network/security_groups/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openstack_dashboard/test/integration_tests/pages/project/compute/access_and_security/managerulespage.py b/openstack_dashboard/test/integration_tests/pages/project/network/security_groups/managerulespage.py similarity index 90% rename from openstack_dashboard/test/integration_tests/pages/project/compute/access_and_security/managerulespage.py rename to openstack_dashboard/test/integration_tests/pages/project/network/security_groups/managerulespage.py index d493a11316..48c6438920 100644 --- a/openstack_dashboard/test/integration_tests/pages/project/compute/access_and_security/managerulespage.py +++ b/openstack_dashboard/test/integration_tests/pages/project/network/security_groups/managerulespage.py @@ -17,8 +17,8 @@ from openstack_dashboard.test.integration_tests.regions import tables class RulesTable(tables.TableRegion): name = 'rules' - ADD_RULE_FORM_FIELDS = ("rule_menu", "direction", "port_or_range", "port", - "remote", "cidr") + ADD_RULE_FORM_FIELDS = ("rule_menu", "description", "direction", + "port_or_range", "port", "remote", "cidr") @tables.bind_table_action('add_rule') def create_rule(self, create_button): @@ -40,11 +40,11 @@ class RulesTable(tables.TableRegion): class ManageRulesPage(basepage.BaseNavigationPage): - RULES_TABLE_PORT_RANGE_COLUMN = 'port_range' + RULES_TABLE_PORT_RANGE_COLUMN = 'Port Range' def __init__(self, driver, conf): super(ManageRulesPage, self).__init__(driver, conf) - self._page_title = "Manage Security Group Rules - OpenStack Dashboard" + self._page_title = "Manage Security Group Rules" def _get_row_with_port_range(self, port): return self.rules_table.get_row( diff --git a/openstack_dashboard/test/integration_tests/pages/project/compute/access_and_security/securitygroupspage.py b/openstack_dashboard/test/integration_tests/pages/project/network/securitygroupspage.py similarity index 92% rename from openstack_dashboard/test/integration_tests/pages/project/compute/access_and_security/securitygroupspage.py rename to openstack_dashboard/test/integration_tests/pages/project/network/securitygroupspage.py index 3f31ee770c..85ce358814 100644 --- a/openstack_dashboard/test/integration_tests/pages/project/compute/access_and_security/securitygroupspage.py +++ b/openstack_dashboard/test/integration_tests/pages/project/network/securitygroupspage.py @@ -13,8 +13,8 @@ from openstack_dashboard.test.integration_tests.pages import basepage from openstack_dashboard.test.integration_tests.regions import forms from openstack_dashboard.test.integration_tests.regions import tables -from openstack_dashboard.test.integration_tests.pages.project.compute.\ - access_and_security.managerulespage import ManageRulesPage +from openstack_dashboard.test.integration_tests.pages.project.network.\ + security_groups.managerulespage import ManageRulesPage class SecurityGroupsTable(tables.TableRegion): @@ -41,11 +41,11 @@ class SecurityGroupsTable(tables.TableRegion): class SecuritygroupsPage(basepage.BaseNavigationPage): - SECURITYGROUPS_TABLE_NAME_COLUMN = 'name' + SECURITYGROUPS_TABLE_NAME_COLUMN = 'Name' def __init__(self, driver, conf): super(SecuritygroupsPage, self).__init__(driver, conf) - self._page_title = "Access & Security" + self._page_title = "Security Groups" def _get_row_with_securitygroup_name(self, name): return self.securitygroups_table.get_row( diff --git a/openstack_dashboard/test/integration_tests/pages/project/volumes/__init__.py b/openstack_dashboard/test/integration_tests/pages/project/volumes/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/openstack_dashboard/test/integration_tests/pages/project/compute/volumes/volumesnapshotspage.py b/openstack_dashboard/test/integration_tests/pages/project/volumes/snapshotspage.py similarity index 93% rename from openstack_dashboard/test/integration_tests/pages/project/compute/volumes/volumesnapshotspage.py rename to openstack_dashboard/test/integration_tests/pages/project/volumes/snapshotspage.py index b3d2412b67..a628a79042 100644 --- a/openstack_dashboard/test/integration_tests/pages/project/compute/volumes/volumesnapshotspage.py +++ b/openstack_dashboard/test/integration_tests/pages/project/volumes/snapshotspage.py @@ -13,7 +13,7 @@ from selenium.webdriver.common import by from openstack_dashboard.test.integration_tests.pages import basepage -from openstack_dashboard.test.integration_tests.pages.project.compute.volumes.\ +from openstack_dashboard.test.integration_tests.pages.project.volumes.\ volumespage import VolumesPage from openstack_dashboard.test.integration_tests.regions import forms from openstack_dashboard.test.integration_tests.regions import tables @@ -54,17 +54,17 @@ class VolumesnapshotsTable(tables.TableRegion): field_mappings=self.CREATE_VOLUME_FORM_FIELDS) -class VolumesnapshotsPage(basepage.BaseNavigationPage): - SNAPSHOT_TABLE_NAME_COLUMN = 'name' - SNAPSHOT_TABLE_STATUS_COLUMN = 'status' - SNAPSHOT_TABLE_VOLUME_NAME_COLUMN = 'volume_name' +class SnapshotsPage(basepage.BaseNavigationPage): + SNAPSHOT_TABLE_NAME_COLUMN = 'Name' + SNAPSHOT_TABLE_STATUS_COLUMN = 'Status' + SNAPSHOT_TABLE_VOLUME_NAME_COLUMN = 'Volume Name' _volumes_tab_locator = ( by.By.CSS_SELECTOR, 'a[href*="tab=volumes_and_snapshots__volumes_tab"]') def __init__(self, driver, conf): - super(VolumesnapshotsPage, self).__init__(driver, conf) - self._page_title = "Volumes" + super(SnapshotsPage, self).__init__(driver, conf) + self._page_title = "Volume Snapshots" @property def volumesnapshots_table(self): diff --git a/openstack_dashboard/test/integration_tests/pages/project/compute/volumes/volumespage.py b/openstack_dashboard/test/integration_tests/pages/project/volumes/volumespage.py similarity index 94% rename from openstack_dashboard/test/integration_tests/pages/project/compute/volumes/volumespage.py rename to openstack_dashboard/test/integration_tests/pages/project/volumes/volumespage.py index 610be6723a..41ace3a445 100644 --- a/openstack_dashboard/test/integration_tests/pages/project/compute/volumes/volumespage.py +++ b/openstack_dashboard/test/integration_tests/pages/project/volumes/volumespage.py @@ -71,9 +71,9 @@ class VolumesTable(tables.TableRegion): return forms.FormRegion(self.driver, self.conf, field_mappings=self.EXTEND_VOLUME_FORM_FIELDS) - @tables.bind_row_action('launch_volume') - def launch_volume_as_instance(self, launch_volume_button, row): - launch_volume_button.click() + @tables.bind_row_action('launch_volume_ng') + def launch_as_instance(self, launch_button, row): + launch_button.click() return instancespage.LaunchInstanceForm(self.driver, self.conf) @tables.bind_row_action('upload_to_image') @@ -90,11 +90,11 @@ class VolumesTable(tables.TableRegion): class VolumesPage(basepage.BaseNavigationPage): - VOLUMES_TABLE_NAME_COLUMN = 'name' - VOLUMES_TABLE_STATUS_COLUMN = 'status' - VOLUMES_TABLE_TYPE_COLUMN = 'volume_type' - VOLUMES_TABLE_SIZE_COLUMN = 'size' - VOLUMES_TABLE_ATTACHED_COLUMN = 'attachments' + VOLUMES_TABLE_NAME_COLUMN = 'Name' + VOLUMES_TABLE_STATUS_COLUMN = 'Status' + VOLUMES_TABLE_TYPE_COLUMN = 'Type' + VOLUMES_TABLE_SIZE_COLUMN = 'Size' + VOLUMES_TABLE_ATTACHED_COLUMN = 'Attached To' def __init__(self, driver, conf): super(VolumesPage, self).__init__(driver, conf) @@ -140,12 +140,14 @@ class VolumesPage(basepage.BaseNavigationPage): row.mark() confirm_delete_volumes_form = self.volumes_table.delete_volume() confirm_delete_volumes_form.submit() + self.wait_till_spinner_disappears() def delete_volumes(self, volumes_names): for volume_name in volumes_names: self._get_row_with_volume_name(volume_name).mark() confirm_delete_volumes_form = self.volumes_table.delete_volume() confirm_delete_volumes_form.submit() + self.wait_till_spinner_disappears() def edit_volume(self, name, new_name=None, description=None): row = self._get_row_with_volume_name(name) @@ -182,15 +184,15 @@ class VolumesPage(basepage.BaseNavigationPage): return volume_form.volume_id, volume_source def create_volume_snapshot(self, volume, snapshot, description='test'): - from openstack_dashboard.test.integration_tests.pages.project.compute.\ - volumes.volumesnapshotspage import VolumesnapshotsPage + from openstack_dashboard.test.integration_tests.pages.project.\ + volumes.snapshotspage import SnapshotsPage row = self._get_row_with_volume_name(volume) snapshot_form = self.volumes_table.create_snapshot(row) snapshot_form.name.text = snapshot if description is not None: snapshot_form.description.text = description snapshot_form.submit() - return VolumesnapshotsPage(self.driver, self.conf) + return SnapshotsPage(self.driver, self.conf) def extend_volume(self, name, new_size): row = self._get_row_with_volume_name(name) @@ -212,7 +214,7 @@ class VolumesPage(basepage.BaseNavigationPage): def launch_instance(self, name, instance_name, available_zone=None): row = self._get_row_with_volume_name(name) - instance_form = self.volumes_table.launch_volume_as_instance(row) + instance_form = self.volumes_table.launch_as_instance(row) if available_zone is None: available_zone = self.conf.launch_instances.available_zone instance_form.availability_zone.value = available_zone diff --git a/openstack_dashboard/test/integration_tests/regions/forms.py b/openstack_dashboard/test/integration_tests/regions/forms.py index dad1b41550..35a0dd5211 100644 --- a/openstack_dashboard/test/integration_tests/regions/forms.py +++ b/openstack_dashboard/test/integration_tests/regions/forms.py @@ -258,7 +258,7 @@ class ThemableSelectFormFieldRegion(BaseFormFieldRegion): self.src_elem.click() for option in self.options: if self.strict_options_match: - match = text == option.text.strip() + match = text == str(option.text.strip()) else: match = option.text.startswith(text) if match: diff --git a/openstack_dashboard/test/integration_tests/regions/menus.py b/openstack_dashboard/test/integration_tests/regions/menus.py index e7de046b6f..69d2ea39fe 100644 --- a/openstack_dashboard/test/integration_tests/regions/menus.py +++ b/openstack_dashboard/test/integration_tests/regions/menus.py @@ -9,6 +9,8 @@ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. +import time + from selenium.common import exceptions from selenium.webdriver.common import by @@ -32,23 +34,23 @@ class NavigationAccordionRegion(baseregion.BaseRegion): return self._get_element(*self._project_bar_locator) _first_level_item_selected_locator = ( - by.By.CSS_SELECTOR, '.openstack-dashboard-active.selenium-active > a') + by.By.CSS_SELECTOR, '.panel.openstack-dashboard > a:not(.collapsed)') _second_level_item_selected_locator = ( - by.By.CSS_SELECTOR, 'li.openstack-panel-group.selenium-active > a') + by.By.CSS_SELECTOR, '.panel.openstack-panel-group > a:not(.collapsed)') _first_level_item_xpath_template = ( - "//li[contains(concat('', @class, ''), 'openstack-dashboard') " + "//li[contains(concat('', @class, ''), 'panel openstack-dashboard') " "and contains(., '%s')]/a") _second_level_item_xpath_template = ( - "//li[contains(concat('', @class, ''), 'openstack-panel-group') " - "and contains(., '%s')]/a") + "//ul[contains(@class, 'in')]//li[contains(@class, " + "'panel openstack-panel-group') and contains(., '%s')]/a") _third_level_item_xpath_template = ( - ".//li[contains(concat('', @class, ''), 'openstack-panel') and " - "contains(., '%s')]/a") + "//ul[contains(@class, 'in')]//a[contains(concat('', @class, '')," + "'list-group-item openstack-panel') and contains(., '%s')]") _parent_item_locator = (by.By.XPATH, '..') - _menu_list_locator = (by.By.CSS_SELECTOR, 'ul') - _expanded_menu_class = 'in' + _menu_list_locator = (by.By.CSS_SELECTOR, 'a') + _expanded_menu_class = "" _transitioning_menu_class = 'collapsing' def _get_first_level_item_locator(self, text): @@ -89,11 +91,11 @@ class NavigationAccordionRegion(baseregion.BaseRegion): def _wait_until_transition_ends(self, item, to_be_expanded=False): def predicate(d): - classes = item.get_attribute('class').split() + classes = item.get_attribute('class') if to_be_expanded: - status = self._expanded_menu_class in classes + status = self._expanded_menu_class == classes else: - status = self._expanded_menu_class not in classes + status = self._expanded_menu_class is not classes return status and self._transitioning_menu_class not in classes self._wait_until(predicate) @@ -129,6 +131,7 @@ class NavigationAccordionRegion(baseregion.BaseRegion): # it. Otherwise selenium will complain with # MoveTargetOutOfBoundsException selected_item.click() + time.sleep(1) self._wait_until_transition_ends( self._get_menu_list_next_to_menu_title(selected_item)) else: @@ -270,8 +273,8 @@ class UserDropDownMenuRegion(DropDownMenuRegion): class TabbedMenuRegion(baseregion.BaseRegion): - _tab_locator = (by.By.CSS_SELECTOR, 'a') - _default_src_locator = (by.By.CSS_SELECTOR, '.selenium-nav-region') + _tab_locator = (by.By.CSS_SELECTOR, 'li > a') + _default_src_locator = (by.By.CSS_SELECTOR, 'div > .nav.nav-pills') def switch_to(self, index=0): self._get_elements(*self._tab_locator)[index].click() @@ -355,7 +358,7 @@ class MembershipMenuRegion(baseregion.BaseRegion): @staticmethod def _is_role_selected(role): - return 'selected' in role.get_attribute('class').split() + return 'selected' == role.get_attribute('class') @staticmethod def _get_hidden_text(role): diff --git a/openstack_dashboard/test/integration_tests/regions/tables.py b/openstack_dashboard/test/integration_tests/regions/tables.py index 9742e2a9f1..289a9f63a3 100644 --- a/openstack_dashboard/test/integration_tests/regions/tables.py +++ b/openstack_dashboard/test/integration_tests/regions/tables.py @@ -97,7 +97,7 @@ class TableRegion(baseregion.BaseRegion): for element in self._get_elements(*self._columns_names_locator): classes = element.get_attribute('class').split() if NORMAL_COLUMN_CLASS in classes: - names.append(element.get_attribute('data-selenium')) + names.append(element.text) return names @property @@ -215,7 +215,7 @@ class TableRegion(baseregion.BaseRegion): :param sorting: boolean arg specifying whether to sort actual names :return: """ - names = [row.cells['name'].text for row in self.rows] + names = [row.cells['Name'].text for row in self.rows] if sorting: names.sort() actual_table = {'Next': self.is_next_link_available(), @@ -241,8 +241,7 @@ def bind_table_action(action_name): is safe to use action `name` attribute from the dashboard tables.py code. """ - _actions_locator = (by.By.CSS_SELECTOR, 'div.table_actions > button,' - ' div.table_actions > a') + _actions_locator = (by.By.CSS_SELECTOR, 'div.table_actions > button, a') def decorator(method): @functools.wraps(method) diff --git a/openstack_dashboard/test/integration_tests/tests/test_credentials.py b/openstack_dashboard/test/integration_tests/tests/test_credentials.py index 110a080b76..8b52159960 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_credentials.py +++ b/openstack_dashboard/test/integration_tests/tests/test_credentials.py @@ -15,7 +15,6 @@ from os.path import join from os import remove from horizon.test import firefox_binary -from openstack_dashboard.test.integration_tests import decorators from openstack_dashboard.test.integration_tests import helpers @@ -46,34 +45,35 @@ class TestDownloadRCFile(helpers.AdminTestCase): Steps: 1) Login to Horizon Dashboard as admin user - 2) Navigate to Project > Compute > Access & Security > API Access tab - 3) Click on "Download OpenStack RC File v2.0" button - 4) File named by template "-openrc.sh" must be downloaded - 5) Check that username, tenant name and tenant id correspond to current + 2) Navigate to Project > API Access tab + 3) Click on "Download OpenStack RC File" dropdown button + 4) Click on "OpenStack RC File (Identity API v2.0" button + 5) File named by template "-openrc.sh" must be downloaded + 6) Check that username, tenant name and tenant id correspond to current username, tenant name and tenant id """ api_access_page = self.home_pg.\ - go_to_compute_accessandsecurity_apiaccesspage() + go_to_project_apiaccesspage() api_access_page.download_openstack_rc_file( 2, self._directory, self._openrc_template) cred_dict = api_access_page.get_credentials_from_file( 2, self._directory, self._openrc_template) self.assertEqual(cred_dict, self.actual_dict) - @decorators.skip_because(bugs=['1584057']) def test_download_rc_v3_file(self): """This is a basic scenario test: Steps: 1) Login to Horizon Dashboard as admin user - 2) Navigate to Project > Compute > Access & Security > API Access tab - 3) Click on "Download OpenStack RC File v3" button - 4) File named by template "-openrc.sh" must be downloaded - 5) Check that username, project name and project id correspond to + 2) Navigate to Project > API Access tab + 3) Click on "Download OpenStack RC File" dropdown button + 4) Click on "OpenStack RC File (Identity API v3" button + 5) File named by template "-openrc.sh" must be downloaded + 6) Check that username, project name and project id correspond to current username, tenant name and tenant id """ - api_access_page = self.home_pg.\ - go_to_compute_accessandsecurity_apiaccesspage() + api_access_page = self.home_pg. \ + go_to_project_apiaccesspage() api_access_page.download_openstack_rc_file( 3, self._directory, self._openrc_template) cred_dict = api_access_page.get_credentials_from_file( diff --git a/openstack_dashboard/test/integration_tests/tests/test_defaults.py b/openstack_dashboard/test/integration_tests/tests/test_defaults.py index d11a2c9e6c..ad09eaf09e 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_defaults.py +++ b/openstack_dashboard/test/integration_tests/tests/test_defaults.py @@ -20,16 +20,17 @@ class TestDefaults(helpers.AdminTestCase): def setUp(self): super(TestDefaults, self).setUp() - self.defaults_page = self.home_pg.go_to_system_defaultspage() + self.defaults_page = self.home_pg.go_to_admin_system_defaultspage() self.add_up = random.randint(1, 10) - def test_update_defaults(self): - """Tests the Update Default Quotas functionality: + def test_update_compute_defaults(self): + """Tests the Update Default Compute Quotas functionality: 1) Login as Admin and go to Admin > System > Defaults - 2) Updates default Quotas by adding a random number between 1 and 10 + 2) Updates default compute Quotas by adding a random + number between 1 and 10 3) Verifies that the updated values are present in the - Quota Defaults table + Compute Quota Defaults table """ default_quota_values = self.defaults_page.quota_values self.defaults_page.update_defaults(self.add_up) diff --git a/openstack_dashboard/test/integration_tests/tests/test_flavors.py b/openstack_dashboard/test/integration_tests/tests/test_flavors.py index 8705d8d5d1..7de48a7ef4 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_flavors.py +++ b/openstack_dashboard/test/integration_tests/tests/test_flavors.py @@ -10,8 +10,6 @@ # License for the specific language governing permissions and limitations # under the License. -import random - from openstack_dashboard.test.integration_tests import decorators from openstack_dashboard.test.integration_tests import helpers from openstack_dashboard.test.integration_tests.regions import messages @@ -23,8 +21,8 @@ class TestFlavorAngular(helpers.AdminTestCase): @property def flavors_page(self): from openstack_dashboard.test.integration_tests.pages.admin.\ - system.flavorspage import FlavorsPageNG - self.home_pg.go_to_system_flavorspage() + compute.flavorspage import FlavorsPageNG + self.home_pg.go_to_admin_compute_flavorspage() return FlavorsPageNG(self.driver, self.CONFIG) def test_basic_flavors_browse(self): @@ -39,7 +37,7 @@ class TestFlavors(helpers.AdminTestCase): def setUp(self): super(TestFlavors, self).setUp() - self.flavors_page = self.home_pg.go_to_system_flavorspage() + self.flavors_page = self.home_pg.go_to_admin_compute_flavorspage() def _create_flavor(self, flavor_name): self.flavors_page.create_flavor( @@ -88,51 +86,3 @@ class TestFlavors(helpers.AdminTestCase): """ self._create_flavor(self.FLAVOR_NAME) self._delete_flavor(self.FLAVOR_NAME) - - def test_flavor_update_info(self): - """Tests the flavor Edit row action functionality""" - - self._create_flavor(self.FLAVOR_NAME) - - add_up = random.randint(1, 10) - old_vcpus = self.flavors_page.get_flavor_vcpus(self.FLAVOR_NAME) - old_ram = self.flavors_page.get_flavor_ram(self.FLAVOR_NAME) - old_disk = self.flavors_page.get_flavor_disk(self.FLAVOR_NAME) - - self.flavors_page.update_flavor_info(self.FLAVOR_NAME, add_up) - - self.assertTrue( - self.flavors_page.find_message_and_dismiss(messages.SUCCESS)) - self.assertFalse( - self.flavors_page.find_message_and_dismiss(messages.ERROR)) - self.assertTrue( - self.flavors_page.is_flavor_present("edited-" + self.FLAVOR_NAME)) - - new_vcpus = self.flavors_page.get_flavor_vcpus( - "edited-" + self.FLAVOR_NAME) - new_ram = self.flavors_page.get_flavor_ram( - "edited-" + self.FLAVOR_NAME) - new_disk = self.flavors_page.get_flavor_disk( - "edited-" + self.FLAVOR_NAME) - - self.assertIsNot(old_disk, new_disk) - self.assertIsNot(old_ram, new_ram) - self.assertIsNot(old_vcpus, new_vcpus) - - self._delete_flavor("edited-" + self.FLAVOR_NAME) - - def test_flavor_update_access(self): - self._create_flavor(self.FLAVOR_NAME) - - self.flavors_page.update_flavor_access(self.FLAVOR_NAME, - self.HOME_PROJECT) - - self.assertFalse(self.flavors_page.is_flavor_public(self.FLAVOR_NAME)) - - self.flavors_page.update_flavor_access(self.FLAVOR_NAME, - self.HOME_PROJECT, - allocate=False) - - self.assertTrue(self.flavors_page.is_flavor_public(self.FLAVOR_NAME)) - - self._delete_flavor(self.FLAVOR_NAME) diff --git a/openstack_dashboard/test/integration_tests/tests/test_floatingips.py b/openstack_dashboard/test/integration_tests/tests/test_floatingips.py index e13a5caead..3dcfd38e46 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_floatingips.py +++ b/openstack_dashboard/test/integration_tests/tests/test_floatingips.py @@ -13,6 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. +from openstack_dashboard.test.integration_tests import decorators from openstack_dashboard.test.integration_tests import helpers from openstack_dashboard.test.integration_tests.regions import messages @@ -22,7 +23,7 @@ class TestFloatingip(helpers.TestCase): def test_floatingip(self): floatingip_page = \ - self.home_pg.go_to_compute_accessandsecurity_floatingipspage() + self.home_pg.go_to_project_network_floatingipspage() floating_ip = floatingip_page.allocate_floatingip() self.assertTrue( floatingip_page.find_message_and_dismiss(messages.SUCCESS)) @@ -41,10 +42,11 @@ class TestFloatingip(helpers.TestCase): class TestFloatingipAssociateDisassociate(helpers.TestCase): """Checks that the user is able to Associate/Disassociate floatingip.""" + @decorators.skip_because(bugs=['1774697']) def test_floatingip_associate_disassociate(self): instance_name = helpers.gen_random_resource_name('instance', timestamp=False) - instances_page = self.home_pg.go_to_compute_instancespage() + instances_page = self.home_pg.go_to_project_compute_instancespage() instances_page.create_instance(instance_name) self.assertTrue( instances_page.find_message_and_dismiss(messages.SUCCESS)) @@ -55,7 +57,7 @@ class TestFloatingipAssociateDisassociate(helpers.TestCase): instance_info = "{} {}".format(instance_name, instance_ipv4) floatingip_page = \ - self.home_pg.go_to_compute_accessandsecurity_floatingipspage() + self.home_pg.go_to_project_network_floatingipspage() floating_ip = floatingip_page.allocate_floatingip() self.assertTrue( floatingip_page.find_message_and_dismiss(messages.SUCCESS)) @@ -87,7 +89,7 @@ class TestFloatingipAssociateDisassociate(helpers.TestCase): floatingip_page.find_message_and_dismiss(messages.ERROR)) self.assertFalse(floatingip_page.is_floatingip_present(floating_ip)) - instances_page = self.home_pg.go_to_compute_instancespage() + instances_page = self.home_pg.go_to_project_compute_instancespage() instances_page.delete_instance(instance_name) self.assertTrue( instances_page.find_message_and_dismiss(messages.SUCCESS)) diff --git a/openstack_dashboard/test/integration_tests/tests/test_host_aggregates.py b/openstack_dashboard/test/integration_tests/tests/test_host_aggregates.py index 3e0b410f6d..f6f373dd01 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_host_aggregates.py +++ b/openstack_dashboard/test/integration_tests/tests/test_host_aggregates.py @@ -28,7 +28,8 @@ class TestHostAggregates(helpers.AdminTestCase): * after deletion """ - hostaggregates_page = self.home_pg.go_to_system_hostaggregatespage() + hostaggregates_page = \ + self.home_pg.go_to_admin_compute_hostaggregatespage() hostaggregates_page.create_host_aggregate( name=self.HOST_AGGREGATE_NAME, diff --git a/openstack_dashboard/test/integration_tests/tests/test_images.py b/openstack_dashboard/test/integration_tests/tests/test_images.py index fbc2950830..9ec2e2cb8a 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_images.py +++ b/openstack_dashboard/test/integration_tests/tests/test_images.py @@ -24,7 +24,7 @@ class TestImagesLegacy(helpers.TestCase): @property def images_page(self): - return self.home_pg.go_to_compute_imagespage() + return self.home_pg.go_to_project_compute_imagespage() @decorators.config_option_required('image.panel_type', 'angular', @@ -40,7 +40,7 @@ class TestImagesAngular(helpers.TestCase): # (or rewrite Navigation module completely). from openstack_dashboard.test.integration_tests.pages.project.\ compute.imagespage import ImagesPageNG - self.home_pg.go_to_compute_imagespage() + self.home_pg.go_to_project_compute_imagespage() return ImagesPageNG(self.driver, self.CONFIG) def test_basic_image_browse(self): @@ -331,9 +331,9 @@ class TestImagesAdmin(helpers.AdminTestCase, TestImagesLegacy): """Login as admin user""" @property def images_page(self): - return self.home_pg.go_to_system_imagespage() + return self.home_pg.go_to_admin_compute_imagespage() - @decorators.skip_because(bugs=['1584057']) + @decorators.skip_because(bugs=['1774697']) def test_image_create_delete(self): super(TestImagesAdmin, self).test_image_create_delete() @@ -342,7 +342,7 @@ class TestImagesAdmin(helpers.AdminTestCase, TestImagesLegacy): Steps: 1) Login to Horizon dashboard as admin user - 2) Go to Admin -> System -> Images + 2) Go to Admin -> Compute -> Images 3) Use filter by Image Name 4) Check that filtered table has one image only (which name is equal to filter value) diff --git a/openstack_dashboard/test/integration_tests/tests/test_instances.py b/openstack_dashboard/test/integration_tests/tests/test_instances.py index 3363236b41..ec8521782c 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_instances.py +++ b/openstack_dashboard/test/integration_tests/tests/test_instances.py @@ -20,8 +20,9 @@ class TestInstances(helpers.TestCase): @property def instances_page(self): - return self.home_pg.go_to_compute_instancespage() + return self.home_pg.go_to_project_compute_instancespage() + @decorators.skip_because(bugs=['1774697']) def test_create_delete_instance(self): """tests the instance creation and deletion functionality: @@ -30,7 +31,7 @@ class TestInstances(helpers.TestCase): * deletes the newly created instance via proper page (depends on user) * verifies the instance does not appear in the table after deletion """ - instances_page = self.home_pg.go_to_compute_instancespage() + instances_page = self.home_pg.go_to_project_compute_instancespage() instances_page.create_instance(self.INSTANCE_NAME) self.assertTrue( @@ -47,7 +48,7 @@ class TestInstances(helpers.TestCase): instances_page.find_message_and_dismiss(messages.ERROR)) self.assertTrue(instances_page.is_instance_deleted(self.INSTANCE_NAME)) - @decorators.skip_because(bugs=['1584057']) + @decorators.skip_because(bugs=['1774697']) def test_instances_pagination(self): """This test checks instance pagination @@ -80,7 +81,7 @@ class TestInstances(helpers.TestCase): self.assertTrue( settings_page.find_message_and_dismiss(messages.SUCCESS)) - instances_page = self.home_pg.go_to_compute_instancespage() + instances_page = self.home_pg.go_to_project_compute_instancespage() instances_page.create_instance(self.INSTANCE_NAME, instance_count=instance_count) self.assertTrue( @@ -110,6 +111,7 @@ class TestInstances(helpers.TestCase): instances_page.find_message_and_dismiss(messages.SUCCESS)) self.assertTrue(instances_page.are_instances_deleted(instance_list)) + @decorators.skip_because(bugs=['1774697']) def test_instances_pagination_and_filtration(self): """This test checks instance pagination and filtration @@ -149,7 +151,7 @@ class TestInstances(helpers.TestCase): self.assertTrue( settings_page.find_message_and_dismiss(messages.SUCCESS)) - instances_page = self.home_pg.go_to_compute_instancespage() + instances_page = self.home_pg.go_to_project_compute_instancespage() instances_page.create_instance(self.INSTANCE_NAME, instance_count=instance_count) self.assertTrue( @@ -182,6 +184,7 @@ class TestInstances(helpers.TestCase): instances_page.find_message_and_dismiss(messages.SUCCESS)) self.assertTrue(instances_page.are_instances_deleted(instance_list)) + @decorators.skip_because(bugs=['1774697']) def test_filter_instances(self): """This test checks filtering of instances by Instance Name @@ -202,7 +205,7 @@ class TestInstances(helpers.TestCase): instance_list = ["{0}-{1}".format(self.INSTANCE_NAME, item) for item in range(1, instance_count + 1)] - instances_page = self.home_pg.go_to_compute_instancespage() + instances_page = self.home_pg.go_to_project_compute_instancespage() instances_page.create_instance(self.INSTANCE_NAME, instance_count=instance_count) self.assertTrue( @@ -238,9 +241,9 @@ class TestAdminInstances(helpers.AdminTestCase, TestInstances): @property def instances_page(self): - return self.home_pg.go_to_system_instancespage() + return self.home_pg.go_to_admin_compute_instancespage() - @decorators.skip_because(bugs=['1584057']) + @decorators.skip_because(bugs=['1774697']) def test_instances_pagination_and_filtration(self): super(TestAdminInstances, self).\ test_instances_pagination_and_filtration() diff --git a/openstack_dashboard/test/integration_tests/tests/test_keypairs.py b/openstack_dashboard/test/integration_tests/tests/test_keypairs.py index 868cecbfae..6ace04c0e3 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_keypairs.py +++ b/openstack_dashboard/test/integration_tests/tests/test_keypairs.py @@ -13,6 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. +from openstack_dashboard.test.integration_tests import decorators from openstack_dashboard.test.integration_tests import helpers from openstack_dashboard.test.integration_tests.regions import messages @@ -21,14 +22,15 @@ class TestKeypair(helpers.TestCase): """Checks that the user is able to create/delete keypair.""" KEYPAIR_NAME = helpers.gen_random_resource_name("keypair") + @decorators.skip_because(bugs=['1774697']) def test_keypair(self): keypair_page = self.home_pg.\ - go_to_compute_accessandsecurity_keypairspage() + go_to_project_compute_keypairspage() keypair_page.create_keypair(self.KEYPAIR_NAME) self.assertFalse(keypair_page.find_message_and_dismiss(messages.ERROR)) keypair_page = self.home_pg.\ - go_to_compute_accessandsecurity_keypairspage() + go_to_project_compute_keypairspage() self.assertTrue(keypair_page.is_keypair_present(self.KEYPAIR_NAME)) keypair_page.delete_keypair(self.KEYPAIR_NAME) diff --git a/openstack_dashboard/test/integration_tests/tests/test_metadata_definitions.py b/openstack_dashboard/test/integration_tests/tests/test_metadata_definitions.py index a72e367ec1..d7afc6a529 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_metadata_definitions.py +++ b/openstack_dashboard/test/integration_tests/tests/test_metadata_definitions.py @@ -12,6 +12,7 @@ import os +from openstack_dashboard.test.integration_tests import decorators from openstack_dashboard.test.integration_tests import helpers from openstack_dashboard.test.integration_tests.regions import messages @@ -83,6 +84,7 @@ class TestMetadataDefinitions(helpers.AdminTestCase): self.assertFalse(page.find_message_and_dismiss(messages.ERROR)) self.assertFalse(page.is_namespace_present(namespace_name)) + @decorators.skip_because(bugs=['1774697']) def test_namespace_create_delete(self): """Tests the NameSpace creation and deletion functionality: @@ -109,7 +111,8 @@ class TestMetadataDefinitions(helpers.AdminTestCase): * 11) Check that new Namespace was successfully deleted. * 12) Check that new Namespace is not present in the table. """ - namespaces_page = self.home_pg.go_to_system_metadatadefinitionspage() + namespaces_page = \ + self.home_pg.go_to_admin_system_metadatadefinitionspage() template_json_container = namespaces_page.json_load_template( namespace_template_name=self.NAMESPACE_TEMPLATE_PATH) diff --git a/openstack_dashboard/test/integration_tests/tests/test_networks.py b/openstack_dashboard/test/integration_tests/tests/test_networks.py index d5394ae620..ed60bd976b 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_networks.py +++ b/openstack_dashboard/test/integration_tests/tests/test_networks.py @@ -30,7 +30,7 @@ class TestNetworks(helpers.TestCase): * verifies the network does not appear in the table after deletion """ - networks_page = self.home_pg.go_to_network_networkspage() + networks_page = self.home_pg.go_to_project_network_networkspage() networks_page.create_network(self.NETWORK_NAME, self.SUBNET_NAME) self.assertTrue( diff --git a/openstack_dashboard/test/integration_tests/tests/test_projects.py b/openstack_dashboard/test/integration_tests/tests/test_projects.py index 32d00f3050..d5bb5cab53 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_projects.py +++ b/openstack_dashboard/test/integration_tests/tests/test_projects.py @@ -10,6 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. +from openstack_dashboard.test.integration_tests import decorators from openstack_dashboard.test.integration_tests import helpers from openstack_dashboard.test.integration_tests.regions import messages @@ -17,12 +18,14 @@ from openstack_dashboard.test.integration_tests.regions import messages PROJECT_NAME = helpers.gen_random_resource_name("project") +@decorators.skip_because(bugs=['1777359']) class TestCreateDeleteProject(helpers.AdminTestCase): def setUp(self): super(TestCreateDeleteProject, self).setUp() self.projects_page = self.home_pg.go_to_identity_projectspage() + @decorators.skip_because(bugs=['1777359']) def test_create_delete_project(self): self.projects_page.create_project(PROJECT_NAME) self.assertTrue( @@ -39,6 +42,7 @@ class TestCreateDeleteProject(helpers.AdminTestCase): self.assertFalse(self.projects_page.is_project_present(PROJECT_NAME)) +@decorators.skip_because(bugs=['1777359']) class TestModifyProject(helpers.AdminTestCase): def setUp(self): @@ -55,6 +59,7 @@ class TestModifyProject(helpers.AdminTestCase): self.addCleanup(cleanup) + @decorators.skip_because(bugs=['1774697']) def test_add_member(self): admin_name = self.CONFIG.identity.admin_username regular_role_name = self.CONFIG.identity.default_keystone_role diff --git a/openstack_dashboard/test/integration_tests/tests/test_router.py b/openstack_dashboard/test/integration_tests/tests/test_router.py index 733f695094..6f508126a9 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_router.py +++ b/openstack_dashboard/test/integration_tests/tests/test_router.py @@ -22,7 +22,7 @@ class TestRouters(helpers.TestCase): @property def routers_page(self): - return self.home_pg.go_to_network_routerspage() + return self.home_pg.go_to_project_network_routerspage() def _create_router(self): routers_page = self.routers_page @@ -170,7 +170,7 @@ class TestAdminRouters(helpers.AdminTestCase): * deletes the newly created router * verifies the router does not appear in the table after deletion """ - routers_page = self.home_pg.go_to_network_routerspage() + routers_page = self.home_pg.go_to_project_network_routerspage() routers_page.create_router(self.ROUTER_NAME) self.assertTrue( @@ -179,7 +179,8 @@ class TestAdminRouters(helpers.AdminTestCase): self.assertTrue(routers_page.is_router_present(self.ROUTER_NAME)) self.assertTrue(routers_page.is_router_active(self.ROUTER_NAME)) - admin_routers_page = self.home_pg.go_to_system_routerspage() + self.home_pg.go_to_admin_overviewpage() + admin_routers_page = self.home_pg.go_to_admin_network_routerspage() self.assertTrue(routers_page.is_router_present(self.ROUTER_NAME)) self.assertTrue(routers_page.is_router_active(self.ROUTER_NAME)) diff --git a/openstack_dashboard/test/integration_tests/tests/test_router_gateway.py b/openstack_dashboard/test/integration_tests/tests/test_router_gateway.py index 676fff6c05..8f10c75891 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_router_gateway.py +++ b/openstack_dashboard/test/integration_tests/tests/test_router_gateway.py @@ -42,7 +42,7 @@ class TestRouters(helpers.TestCase): 14. Check that no Error messages present """ - routers_page = self.home_pg.go_to_network_routerspage() + routers_page = self.home_pg.go_to_project_network_routerspage() routers_page.create_router(self.ROUTER_NAME) self.assertTrue( diff --git a/openstack_dashboard/test/integration_tests/tests/test_security_groups.py b/openstack_dashboard/test/integration_tests/tests/test_security_groups.py index abd100f444..903646a3e8 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_security_groups.py +++ b/openstack_dashboard/test/integration_tests/tests/test_security_groups.py @@ -23,7 +23,7 @@ class TestSecuritygroup(helpers.TestCase): @property def securitygroup_page(self): return self.home_pg.\ - go_to_compute_accessandsecurity_securitygroupspage() + go_to_project_network_securitygroupspage() def _create_securitygroup(self): page = self.securitygroup_page diff --git a/openstack_dashboard/test/integration_tests/tests/test_user_settings.py b/openstack_dashboard/test/integration_tests/tests/test_user_settings.py index 088ac6a4d7..6aa0305199 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_user_settings.py +++ b/openstack_dashboard/test/integration_tests/tests/test_user_settings.py @@ -10,6 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. +from openstack_dashboard.test.integration_tests import decorators from openstack_dashboard.test.integration_tests import helpers from openstack_dashboard.test.integration_tests.regions import messages @@ -22,10 +23,11 @@ class TestDashboardHelp(helpers.TestCase): self.home_pg._wait_until( lambda _: self.home_pg.is_nth_window_opened(2)) self.home_pg.switch_window() + self.home_pg.is_help_page() - self.assertEqual(self.CONFIG.dashboard.help_url, - self.home_pg.get_url_current_page(), - "help link did not redirect to the right URL") + self.assertIn(self.CONFIG.dashboard.help_url, + self.home_pg.get_url_current_page(), + "help link did not redirect to the right URL") self.home_pg.close_window() self.home_pg.switch_window() @@ -55,6 +57,7 @@ class TestPasswordChange(helpers.TestCase): self.assertTrue(self.home_pg.is_logged_in, "Failed to login with default password") + @decorators.skip_because(bugs=['1776678']) def test_password_change(self): # Changes the password, verifies it was indeed changed and # resets to default password. @@ -72,6 +75,7 @@ class TestPasswordChange(helpers.TestCase): self._reset_password() self._login() + @decorators.skip_because(bugs=['1776678']) def test_show_message_after_logout(self): # Ensure an informational message is shown on the login page # after the user is logged out. diff --git a/openstack_dashboard/test/integration_tests/tests/test_users.py b/openstack_dashboard/test/integration_tests/tests/test_users.py index ee2de6e1f4..55267e6ba8 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_users.py +++ b/openstack_dashboard/test/integration_tests/tests/test_users.py @@ -10,6 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. +from openstack_dashboard.test.integration_tests import decorators from openstack_dashboard.test.integration_tests import helpers from openstack_dashboard.test.integration_tests.regions import messages @@ -18,6 +19,7 @@ class TestUser(helpers.AdminTestCase): USER_NAME = helpers.gen_random_resource_name("user") + @decorators.skip_because(bugs=['1774697']) def test_create_delete_user(self): users_page = self.home_pg.go_to_identity_userspage() password = self.TEST_PASSWORD diff --git a/openstack_dashboard/test/integration_tests/tests/test_volume_snapshots.py b/openstack_dashboard/test/integration_tests/tests/test_volume_snapshots.py index 7dea444040..105ea9d01d 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_volume_snapshots.py +++ b/openstack_dashboard/test/integration_tests/tests/test_volume_snapshots.py @@ -10,7 +10,6 @@ # License for the specific language governing permissions and limitations # under the License. -from openstack_dashboard.test.integration_tests import decorators from openstack_dashboard.test.integration_tests import helpers from openstack_dashboard.test.integration_tests.regions import messages @@ -22,21 +21,19 @@ class TestVolumeSnapshotsBasic(helpers.TestCase): @property def volumes_snapshot_page(self): - return self.home_pg.go_to_compute_volumes_volumesnapshotspage() + return self.home_pg.go_to_project_volumes_snapshotspage() def setUp(self): """Setup: create volume""" super(TestVolumeSnapshotsBasic, self).setUp() - volumes_page = self.home_pg.go_to_compute_volumes_volumespage() + volumes_page = self.home_pg.go_to_project_volumes_volumespage() volumes_page.create_volume(self.VOLUME_NAME) volumes_page.find_message_and_dismiss(messages.INFO) self.assertTrue(volumes_page.is_volume_status(self.VOLUME_NAME, 'Available')) def cleanup(): - volumes_snapshot_page = \ - self.home_pg.go_to_compute_volumes_volumesnapshotspage() - volumes_page = volumes_snapshot_page.switch_to_volumes_tab() + volumes_page = self.home_pg.go_to_project_volumes_volumespage() volumes_page.delete_volume(self.VOLUME_NAME) volumes_page.find_message_and_dismiss(messages.SUCCESS) self.assertTrue(volumes_page.is_volume_deleted(self.VOLUME_NAME)) @@ -48,7 +45,7 @@ class TestVolumeSnapshotsBasic(helpers.TestCase): Steps: 1. Login to Horizon Dashboard - 2. Navigate to Project -> Compute -> Volumes page + 2. Navigate to Project -> Volumes -> Volumes page 3. Create snapshot for existed volume 4. Check that no ERROR appears 5. Check that snapshot is in the list @@ -57,7 +54,7 @@ class TestVolumeSnapshotsBasic(helpers.TestCase): 8. Delete volume snapshot from proper page 9. Check that volume snapshot not in the list """ - volumes_page = self.home_pg.go_to_compute_volumes_volumespage() + volumes_page = self.home_pg.go_to_project_volumes_volumespage() volumes_snapshot_page = volumes_page.create_volume_snapshot( self.VOLUME_NAME, self.VOLUME_SNAPSHOT_NAME) self.assertTrue(volumes_page.find_message_and_dismiss(messages.INFO)) @@ -70,7 +67,7 @@ class TestVolumeSnapshotsBasic(helpers.TestCase): new_name = "new_" + self.VOLUME_SNAPSHOT_NAME volumes_snapshot_page = \ - self.home_pg.go_to_compute_volumes_volumesnapshotspage() + self.home_pg.go_to_project_volumes_snapshotspage() volumes_snapshot_page.edit_snapshot(self.VOLUME_SNAPSHOT_NAME, new_name, "description") self.assertTrue( @@ -80,7 +77,6 @@ class TestVolumeSnapshotsBasic(helpers.TestCase): self.assertTrue(volumes_snapshot_page. is_volume_snapshot_available(new_name)) - volumes_snapshot_page = self.volumes_snapshot_page volumes_snapshot_page.delete_volume_snapshot(new_name) self.assertTrue( volumes_snapshot_page.find_message_and_dismiss(messages.SUCCESS)) @@ -94,12 +90,12 @@ class TestVolumeSnapshotsBasic(helpers.TestCase): Steps: 1) Login to Horizon Dashboard - 2) Go to Project -> Compute -> Volumes -> Volumes tab, create + 2) Go to Project -> Volumes -> Volumes tab, create volumes and 3 snapshots 3) Navigate to user settings page 4) Change 'Items Per Page' value to 1 - 5) Go to Project -> Compute -> Volumes -> Volumes Snapshot tab - or Admin -> System -> Volumes -> Volumes Snapshot tab + 5) Go to Project -> Volumes -> Snapshots tab + or Admin -> Volume -> Snapshots tab (depends on user) 6) Check that only 'Next' link is available, only one snapshot is available (and it has correct name) @@ -112,7 +108,7 @@ class TestVolumeSnapshotsBasic(helpers.TestCase): 11) Go to user settings page and restore 'Items Per Page' 12) Delete created snapshots and volumes """ - volumes_page = self.home_pg.go_to_compute_volumes_volumespage() + volumes_page = self.home_pg.go_to_project_volumes_volumespage() count = 3 items_per_page = 1 snapshot_names = ["{0}_{1}".format(self.VOLUME_SNAPSHOT_NAME, i) for i @@ -124,7 +120,7 @@ class TestVolumeSnapshotsBasic(helpers.TestCase): self.assertTrue( volumes_snapshot_page.is_volume_snapshot_available(name)) if i < count - 1: - volumes_snapshot_page.switch_to_volumes_tab() + self.home_pg.go_to_project_volumes_volumespage() first_page_definition = {'Next': True, 'Prev': False, 'Count': items_per_page, @@ -179,14 +175,12 @@ class TestVolumeSnapshotsAdmin(helpers.AdminTestCase, @property def volumes_snapshot_page(self): - return self.home_pg.go_to_system_volumes_volumesnapshotspage() + return self.home_pg.go_to_project_volumes_snapshotspage() - @decorators.skip_because(bugs=['1584057']) def test_create_edit_delete_volume_snapshot(self): super(TestVolumeSnapshotsAdmin, self).\ test_create_edit_delete_volume_snapshot() - @decorators.skip_because(bugs=['1584057']) def test_volume_snapshots_pagination(self): super(TestVolumeSnapshotsAdmin, self).\ test_volume_snapshots_pagination() @@ -199,21 +193,19 @@ class TestVolumeSnapshotsAdvanced(helpers.TestCase): @property def volumes_snapshot_page(self): - return self.home_pg.go_to_compute_volumes_volumesnapshotspage() + return self.home_pg.go_to_project_volumes_snapshotspage() def setUp(self): """Setup: create volume""" super(TestVolumeSnapshotsAdvanced, self).setUp() - volumes_page = self.home_pg.go_to_compute_volumes_volumespage() + volumes_page = self.home_pg.go_to_project_volumes_volumespage() volumes_page.create_volume(self.VOLUME_NAME) volumes_page.find_message_and_dismiss(messages.INFO) self.assertTrue(volumes_page.is_volume_status(self.VOLUME_NAME, 'Available')) def cleanup(): - volumes_snapshot_page = \ - self.home_pg.go_to_compute_volumes_volumesnapshotspage() - volumes_page = volumes_snapshot_page.switch_to_volumes_tab() + volumes_page = self.home_pg.go_to_project_volumes_volumespage() volumes_page.delete_volume(self.VOLUME_NAME) self.assertTrue( volumes_page.find_message_and_dismiss(messages.SUCCESS)) @@ -228,14 +220,14 @@ class TestVolumeSnapshotsAdvanced(helpers.TestCase): Steps: 1. Login to Horizon Dashboard as regular user - 2. Navigate to Project -> Compute -> Volumes page + 2. Navigate to Project -> Volumes -> Volumes page 3. Create snapshot for existed volume 4. Create new volume from snapshot 5. Check the volume is created and has 'Available' status 6. Delete volume snapshot 7. Delete volume """ - volumes_page = self.home_pg.go_to_compute_volumes_volumespage() + volumes_page = self.home_pg.go_to_project_volumes_volumespage() volumes_snapshot_page = volumes_page.create_volume_snapshot( self.VOLUME_NAME, self.VOLUME_SNAPSHOT_NAME) self.assertTrue(volumes_page.find_message_and_dismiss(messages.INFO)) @@ -258,7 +250,7 @@ class TestVolumeSnapshotsAdvanced(helpers.TestCase): self.assertTrue(volumes_snapshot_page.is_volume_snapshot_deleted( self.VOLUME_SNAPSHOT_NAME)) - volumes_page = volumes_snapshot_page.switch_to_volumes_tab() + volumes_page = self.home_pg.go_to_project_volumes_volumespage() volumes_page.delete_volume(new_volume) self.assertTrue( volumes_page.find_message_and_dismiss(messages.SUCCESS)) diff --git a/openstack_dashboard/test/integration_tests/tests/test_volumes.py b/openstack_dashboard/test/integration_tests/tests/test_volumes.py index 39c06305eb..58e5625856 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_volumes.py +++ b/openstack_dashboard/test/integration_tests/tests/test_volumes.py @@ -23,7 +23,7 @@ class TestVolumesBasic(helpers.TestCase): @property def volumes_page(self): - return self.home_pg.go_to_compute_volumes_volumespage() + return self.home_pg.go_to_project_volumes_volumespage() def test_volume_create_edit_delete(self): """This test case checks create, edit, delete volume functionality: @@ -41,7 +41,7 @@ class TestVolumesBasic(helpers.TestCase): 10. Check that the volume is absent in the list 11. Check that no Error messages present """ - volumes_page = self.home_pg.go_to_compute_volumes_volumespage() + volumes_page = self.home_pg.go_to_project_volumes_volumespage() volumes_page.create_volume(self.VOLUME_NAME) self.assertTrue( volumes_page.find_message_and_dismiss(messages.INFO)) @@ -82,12 +82,12 @@ class TestVolumesBasic(helpers.TestCase): Steps: 1) Login to Horizon Dashboard - 2) Go to Project -> Compute -> Volumes -> Volumes tab and create + 2) Go to Project -> Volumes -> Volumes tab and create three volumes 3) Navigate to user settings page 4) Change 'Items Per Page' value to 1 - 5) Go to Project -> Compute -> Volumes -> Volumes tab or - Admin -> System -> Volumes -> Volumes tab (depends on user) + 5) Go to Project -> Volumes -> Volumes tab or + Admin -> Volume -> Volumes tab (depends on user) 6) Check that only 'Next' link is available, only one volume is available (and it has correct name) 7) Click 'Next' and check that both 'Prev' and 'Next' links are @@ -99,7 +99,7 @@ class TestVolumesBasic(helpers.TestCase): 11) Go to user settings page and restore 'Items Per Page' 12) Delete created volumes """ - volumes_page = self.home_pg.go_to_compute_volumes_volumespage() + volumes_page = self.home_pg.go_to_project_volumes_volumespage() count = 3 items_per_page = 1 volumes_names = ["{0}_{1}".format(self.VOLUME_NAME, i) for i in @@ -154,7 +154,7 @@ class TestAdminVolumes(helpers.AdminTestCase, TestVolumesBasic): @property def volumes_page(self): - return self.home_pg.go_to_system_volumes_volumespage() + return self.home_pg.go_to_project_volumes_volumespage() class TestVolumesAdvanced(helpers.TestCase): @@ -164,16 +164,16 @@ class TestVolumesAdvanced(helpers.TestCase): @property def volumes_page(self): - return self.home_pg.go_to_compute_volumes_volumespage() + return self.home_pg.go_to_project_volumes_volumespage() - @decorators.skip_because(bugs=['1584057']) + @decorators.skip_because(bugs=['1774697']) def test_manage_volume_attachments(self): """This test case checks attach/detach actions for volume Steps: 1. Login to Horizon Dashboard as horizon user 2. Navigate to Project -> Compute -> Instances, create instance - 3. Navigate to Project -> Compute -> Volumes, create volume + 3. Navigate to Project -> Volumes -> Volumes, create volume 4. Attach volume to instance from step2 5. Check that volume status and link to instance 6. Detach volume from instance @@ -181,7 +181,7 @@ class TestVolumesAdvanced(helpers.TestCase): 8. Delete volume and instance """ instance_name = helpers.gen_random_resource_name('instance') - instances_page = self.home_pg.go_to_compute_instancespage() + instances_page = self.home_pg.go_to_project_compute_instancespage() instances_page.create_instance(instance_name) instances_page.find_message_and_dismiss(messages.SUCCESS) self.assertFalse( @@ -216,7 +216,7 @@ class TestVolumesAdvanced(helpers.TestCase): self.assertFalse(volumes_page.find_message_and_dismiss(messages.ERROR)) self.assertTrue(volumes_page.is_volume_deleted(self.VOLUME_NAME)) - instances_page = self.home_pg.go_to_compute_instancespage() + instances_page = self.home_pg.go_to_project_compute_instancespage() instances_page.delete_instance(instance_name) instances_page.find_message_and_dismiss(messages.SUCCESS) self.assertFalse( @@ -229,26 +229,31 @@ class TestVolumesActions(helpers.TestCase): IMAGE_NAME = helpers.gen_random_resource_name("image") INSTANCE_NAME = helpers.gen_random_resource_name("instance") + @property + def volumes_page(self): + return self.home_pg.go_to_project_volumes_volumespage() + def setUp(self): super(TestVolumesActions, self).setUp() - self.volumes_page = self.home_pg.go_to_compute_volumes_volumespage() - self.volumes_page.create_volume(self.VOLUME_NAME) + volumes_page = self.volumes_page + volumes_page.create_volume(self.VOLUME_NAME) self.assertTrue( - self.volumes_page.find_message_and_dismiss(messages.INFO)) + volumes_page.find_message_and_dismiss(messages.INFO)) self.assertFalse( - self.volumes_page.find_message_and_dismiss(messages.ERROR)) - self.assertTrue(self.volumes_page.is_volume_present(self.VOLUME_NAME)) - self.assertTrue(self.volumes_page.is_volume_status(self.VOLUME_NAME, - 'Available')) + volumes_page.find_message_and_dismiss(messages.ERROR)) + self.assertTrue(volumes_page.is_volume_present(self.VOLUME_NAME)) + self.assertTrue( + volumes_page.is_volume_status(self.VOLUME_NAME, 'Available')) def cleanup(): - self.volumes_page.delete_volume(self.VOLUME_NAME) + volumes_page = self.volumes_page + volumes_page.delete_volume(self.VOLUME_NAME) self.assertTrue( - self.volumes_page.find_message_and_dismiss(messages.SUCCESS)) + volumes_page.find_message_and_dismiss(messages.SUCCESS)) self.assertFalse( - self.volumes_page.find_message_and_dismiss(messages.ERROR)) + volumes_page.find_message_and_dismiss(messages.ERROR)) self.assertTrue( - self.volumes_page.is_volume_deleted(self.VOLUME_NAME)) + volumes_page.is_volume_deleted(self.VOLUME_NAME)) self.addCleanup(cleanup) @@ -262,18 +267,19 @@ class TestVolumesActions(helpers.TestCase): 4. Check that the volume is still in the list 5. Check that the volume size is changed """ - orig_size = self.volumes_page.get_size(self.VOLUME_NAME) - self.volumes_page.extend_volume(self.VOLUME_NAME, orig_size + 1) + volumes_page = self.volumes_page + orig_size = volumes_page.get_size(self.VOLUME_NAME) + volumes_page.extend_volume(self.VOLUME_NAME, orig_size + 1) self.assertTrue( - self.volumes_page.find_message_and_dismiss(messages.INFO)) + volumes_page.find_message_and_dismiss(messages.INFO)) self.assertFalse( - self.volumes_page.find_message_and_dismiss(messages.ERROR)) - self.assertTrue(self.volumes_page.is_volume_status(self.VOLUME_NAME, - 'Available')) - new_size = self.volumes_page.get_size(self.VOLUME_NAME) + volumes_page.find_message_and_dismiss(messages.ERROR)) + self.assertTrue( + volumes_page.is_volume_status(self.VOLUME_NAME, 'Available')) + new_size = volumes_page.get_size(self.VOLUME_NAME) self.assertLess(orig_size, new_size) - @decorators.skip_because(bugs=['1584057']) + @decorators.skip_because(bugs=['1774697']) def test_volume_upload_to_image(self): """This test case checks upload volume to image functionality: @@ -284,7 +290,7 @@ class TestVolumesActions(helpers.TestCase): 4. Delete the image 5. Repeat actions for all disk formats """ - self.volumes_page = self.home_pg.go_to_compute_volumes_volumespage() + self.volumes_page = self.home_pg.go_to_project_volumes_volumespage() all_formats = {"qcow2": u'QCOW2', "raw": u'Raw', "vdi": u'VDI', "vmdk": u'VMDK'} for disk_format in all_formats: @@ -295,7 +301,7 @@ class TestVolumesActions(helpers.TestCase): self.volumes_page.find_message_and_dismiss(messages.ERROR)) self.assertTrue(self.volumes_page.is_volume_status( self.VOLUME_NAME, 'Available')) - images_page = self.home_pg.go_to_compute_imagespage() + images_page = self.home_pg.go_to_project_compute_imagespage() self.assertTrue(images_page.is_image_present(self.IMAGE_NAME)) self.assertTrue(images_page.is_image_active(self.IMAGE_NAME)) self.assertEqual(images_page.get_image_format(self.IMAGE_NAME), @@ -307,8 +313,9 @@ class TestVolumesActions(helpers.TestCase): messages.ERROR)) self.assertFalse(images_page.is_image_present(self.IMAGE_NAME)) self.volumes_page = \ - self.home_pg.go_to_compute_volumes_volumespage() + self.home_pg.go_to_project_volumes_volumespage() + @decorators.skip_because(bugs=['1774697']) def test_volume_launch_as_instance(self): """This test case checks launch volume as instance functionality: @@ -325,18 +332,18 @@ class TestVolumesActions(helpers.TestCase): self.volumes_page.find_message_and_dismiss(messages.SUCCESS)) self.assertFalse( self.volumes_page.find_message_and_dismiss(messages.ERROR)) - instances_page = self.home_pg.go_to_compute_instancespage() + instances_page = self.home_pg.go_to_project_compute_instancespage() self.assertTrue(instances_page.is_instance_active(self.INSTANCE_NAME)) - self.volumes_page = self.home_pg.go_to_compute_volumes_volumespage() + self.volumes_page = self.home_pg.go_to_project_volumes_volumespage() self.assertTrue(self.volumes_page.is_volume_status(self.VOLUME_NAME, 'In-use')) self.assertIn(self.INSTANCE_NAME, self.volumes_page.get_attach_instance(self.VOLUME_NAME)) - instances_page = self.home_pg.go_to_compute_instancespage() + instances_page = self.home_pg.go_to_project_compute_instancespage() instances_page.delete_instance(self.INSTANCE_NAME) self.assertTrue( instances_page.find_message_and_dismiss(messages.SUCCESS)) self.assertFalse( instances_page.find_message_and_dismiss(messages.ERROR)) self.assertTrue(instances_page.is_instance_deleted(self.INSTANCE_NAME)) - self.volumes_page = self.home_pg.go_to_compute_volumes_volumespage() + self.volumes_page = self.home_pg.go_to_project_volumes_volumespage() diff --git a/openstack_dashboard/test/integration_tests/tests/test_volumetypes.py b/openstack_dashboard/test/integration_tests/tests/test_volumetypes.py index 7e03b2a3e0..8c3cc3e7c3 100644 --- a/openstack_dashboard/test/integration_tests/tests/test_volumetypes.py +++ b/openstack_dashboard/test/integration_tests/tests/test_volumetypes.py @@ -22,7 +22,7 @@ class TestAdminVolumeTypes(helpers.AdminTestCase): Steps: 1. Login to Horizon Dashboard as admin user - 2. Navigate to Admin -> System -> Volumes -> Volume Types page + 2. Navigate to Admin -> Volume -> Volume Types page 3. Create new volume type 4. Check that the volume type is in the list 5. Check that no Error messages present @@ -30,7 +30,7 @@ class TestAdminVolumeTypes(helpers.AdminTestCase): 7. Check that the volume type is absent in the list 8. Check that no Error messages present """ - volume_types_page = self.home_pg.go_to_system_volumes_volumetypespage() + volume_types_page = self.home_pg.go_to_admin_volume_volumetypespage() volume_types_page.create_volume_type(self.VOLUME_TYPE_NAME) @@ -62,7 +62,7 @@ class TestQoSSpec(helpers.AdminTestCase): * deletes the newly created QoS Spec * verifies the QoS Spec does not appear in the table after deletion """ - qos_spec_page = self.home_pg.go_to_system_volumes_volumetypespage() + qos_spec_page = self.home_pg.go_to_admin_volume_volumetypespage() qos_spec_page.create_qos_spec(self.QOS_SPEC_NAME) self.assertTrue( @@ -90,7 +90,7 @@ class TestQoSSpec(helpers.AdminTestCase): * verifies the QoS Spec does not appear in the table after deletion """ qos_spec_name = helpers.gen_random_resource_name("qos_spec") - qos_spec_page = self.home_pg.go_to_system_volumes_volumetypespage() + qos_spec_page = self.home_pg.go_to_admin_volume_volumetypespage() nova_compute_consumer = 'front-end' both_consumers = 'both' cinder_consumer = 'back-end'