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
This commit is contained in:
parent
77ff5151c8
commit
15574cad5c
@ -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
|
||||
|
||||
|
@ -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)
|
@ -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)
|
@ -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"
|
@ -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
|
@ -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
|
@ -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
|
@ -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):
|
@ -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"
|
@ -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()
|
||||
|
||||
|
@ -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
|
@ -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
|
@ -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):
|
@ -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)
|
||||
|
||||
|
@ -49,7 +49,7 @@ class GroupsPage(basepage.BaseNavigationPage):
|
||||
|
||||
@property
|
||||
def table_name_column(self):
|
||||
return "name"
|
||||
return "Name"
|
||||
|
||||
@property
|
||||
def groups_table(self):
|
||||
|
@ -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)
|
||||
|
@ -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'
|
@ -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 \
|
||||
|
@ -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)
|
||||
|
@ -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):
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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,
|
@ -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'
|
@ -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(
|
@ -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
|
||||
|
||||
|
@ -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'
|
@ -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>' +
|
||||
|
@ -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"]')
|
||||
|
@ -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(
|
@ -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(
|
@ -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):
|
@ -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
|
@ -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:
|
||||
|
@ -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):
|
||||
|
@ -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)
|
||||
|
@ -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 "<tenant_name>-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 "<tenant_name>-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 "<tenant_name>-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 "<tenant_name>-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(
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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))
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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(
|
||||
|
@ -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
|
||||
|
@ -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))
|
||||
|
||||
|
@ -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(
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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))
|
||||
|
@ -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()
|
||||
|
@ -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'
|
||||
|
Loading…
Reference in New Issue
Block a user