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:
panneer.smn 2018-06-14 15:02:59 -05:00 committed by Ivan Kolodyazhny
parent 77ff5151c8
commit 15574cad5c
61 changed files with 464 additions and 348 deletions

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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"

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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):

View File

@ -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"

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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):

View File

@ -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)

View File

@ -49,7 +49,7 @@ class GroupsPage(basepage.BaseNavigationPage):
@property
def table_name_column(self):
return "name"
return "Name"
@property
def groups_table(self):

View File

@ -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)

View File

@ -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'

View File

@ -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 \

View File

@ -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)

View File

@ -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):

View File

@ -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

View File

@ -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)

View File

@ -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,

View File

@ -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'

View File

@ -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(

View File

@ -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

View File

@ -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'

View File

@ -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>' +

View File

@ -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"]')

View File

@ -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(

View File

@ -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(

View File

@ -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):

View File

@ -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

View File

@ -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:

View File

@ -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):

View File

@ -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)

View File

@ -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(

View 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)

View File

@ -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)

View File

@ -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))

View File

@ -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,

View File

@ -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)

View File

@ -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()

View File

@ -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)

View File

@ -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)

View File

@ -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(

View File

@ -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

View File

@ -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))

View File

@ -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(

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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))

View File

@ -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()

View File

@ -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'