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) # http accessible image (string value)
panel_type=angular panel_type=angular
http_image=http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-uec.tar.gz 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, images_list=cirros-0.3.5-x86_64-disk
cirros-0.3.4-x86_64-uec-kernel,
cirros-0.3.4-x86_64-uec-ramdisk
[identity] [identity]
# Username to use for non-admin API requests. (string value) # Username to use for non-admin API requests. (string value)
@ -86,7 +84,7 @@ ssh_user=cirros
#available zone to launch instances #available zone to launch instances
available_zone=nova available_zone=nova
#image_name to launch instances #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 to launch instances
flavor=m1.tiny flavor=m1.tiny

View File

@ -68,11 +68,11 @@ class FlavorsTable(tables.TableRegion):
class FlavorsPage(basepage.BaseNavigationPage): class FlavorsPage(basepage.BaseNavigationPage):
DEFAULT_ID = "auto" DEFAULT_ID = "auto"
FLAVORS_TABLE_NAME_COLUMN = 'name' FLAVORS_TABLE_NAME_COLUMN = 'Flavor Name'
FLAVORS_TABLE_VCPUS_COLUMN = 'vcpus' FLAVORS_TABLE_VCPUS_COLUMN = 'VCPUs'
FLAVORS_TABLE_RAM_COLUMN = 'ram' FLAVORS_TABLE_RAM_COLUMN = 'RAM'
FLAVORS_TABLE_DISK_COLUMN = 'disk' FLAVORS_TABLE_DISK_COLUMN = 'Root Disk'
FLAVORS_TABLE_PUBLIC_COLUMN = 'public' FLAVORS_TABLE_PUBLIC_COLUMN = 'Public'
def __init__(self, driver, conf): def __init__(self, driver, conf):
super(FlavorsPage, self).__init__(driver, conf) super(FlavorsPage, self).__init__(driver, conf)

View File

@ -46,7 +46,7 @@ class HostAggregatesTable(tables.TableRegion):
class HostaggregatesPage(basepage.BaseNavigationPage): class HostaggregatesPage(basepage.BaseNavigationPage):
HOST_AGGREGATES_TABLE_NAME_COLUMN = 'name' HOST_AGGREGATES_TABLE_NAME_COLUMN = 'Name'
def __init__(self, driver, conf): def __init__(self, driver, conf):
super(HostaggregatesPage, self).__init__(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 # License for the specific language governing permissions and limitations
# under the License. # under the License.
from openstack_dashboard.test.integration_tests.pages.project.compute.volumes\ from openstack_dashboard.test.integration_tests.pages.project.compute \
import volumespage import imagespage
class VolumesPage(volumespage.VolumesPage): class ImagesPage(imagespage.ImagesPage):
pass pass

View File

@ -10,9 +10,9 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from openstack_dashboard.test.integration_tests.pages.project.compute.volumes\ from openstack_dashboard.test.integration_tests.pages.project.network \
import volumesnapshotspage import floatingipspage
class VolumesnapshotsPage(volumesnapshotspage.VolumesnapshotsPage): class FloatingipsPage(floatingipspage.FloatingipsPage):
pass 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): 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') @tables.bind_row_action('update')
def edit_router(self, edit_button, row): 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): class OverviewPage(basepage.BaseNavigationPage):
def __init__(self, driver, conf): def __init__(self, driver, conf):
super(OverviewPage, self).__init__(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): class DefaultQuotasTable(tables.TableRegion):
name = "quotas" name = "compute_quotas"
UPDATE_DEFAULTS_FORM_FIELDS = ( UPDATE_DEFAULTS_FORM_FIELDS = (
"injected_file_content_bytes", "injected_file_content_bytes",
@ -27,12 +27,11 @@ class DefaultQuotasTable(tables.TableRegion):
"instances", "instances",
"injected_files", "injected_files",
"cores", "cores",
"gigabytes", "server_groups",
"snapshots", "server_group_members"
"volumes"
) )
@tables.bind_table_action('update_defaults') @tables.bind_table_action('update_compute_defaults')
def update(self, update_button): def update(self, update_button):
update_button.click() update_button.click()
return forms.FormRegion( return forms.FormRegion(
@ -45,20 +44,19 @@ class DefaultQuotasTable(tables.TableRegion):
class DefaultsPage(basepage.BaseNavigationPage): class DefaultsPage(basepage.BaseNavigationPage):
QUOTAS_TABLE_NAME_COLUMN = 'name' QUOTAS_TABLE_NAME_COLUMN = 'Quota Name'
QUOTAS_TABLE_LIMIT_COLUMN = 'limit' QUOTAS_TABLE_LIMIT_COLUMN = 'Limit'
DEFAULT_QUOTA_NAMES = [ DEFAULT_QUOTA_NAMES = [
'Injected File Content Bytes', 'Injected File Content Bytes',
'Metadata Items', 'Metadata Items',
'Server Group Members',
'Server Groups',
'RAM (MB)', 'RAM (MB)',
'Key Pairs', 'Key Pairs',
'Length of Injected File Path', 'Length of Injected File Path',
'Instances', 'Instances',
'Injected Files', 'Injected Files',
'VCPUs', 'VCPUs'
'Total Size of Volumes and Snapshots (GiB)',
'Volume Snapshots',
'Volumes'
] ]
def __init__(self, driver, conf): def __init__(self, driver, conf):
@ -91,6 +89,12 @@ class DefaultsPage(basepage.BaseNavigationPage):
update_form.metadata_items.value = \ update_form.metadata_items.value = \
int(update_form.metadata_items.value) + add_up 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.ram.value = int(update_form.ram.value) + add_up
update_form.key_pairs.value = int(update_form.key_pairs.value) + add_up update_form.key_pairs.value = int(update_form.key_pairs.value) + add_up
update_form.injected_file_path_bytes.value = \ 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 = int(
update_form.injected_files.value) + add_up update_form.injected_files.value) + add_up
update_form.cores.value = int(update_form.cores.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() 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): class VolumetypesPage(basepage.BaseNavigationPage):
QOS_SPECS_TABLE_NAME_COLUMN = 'name' QOS_SPECS_TABLE_NAME_COLUMN = 'Name'
VOLUME_TYPES_TABLE_NAME_COLUMN = 'name' VOLUME_TYPES_TABLE_NAME_COLUMN = 'Name'
QOS_SPECS_TABLE_CONSUMER_COLUMN = 'consumer' QOS_SPECS_TABLE_CONSUMER_COLUMN = 'Consumer'
CINDER_CONSUMER = 'back-end' CINDER_CONSUMER = 'back-end'
def __init__(self, driver, conf): def __init__(self, driver, conf):
super(VolumetypesPage, self).__init__(driver, conf) super(VolumetypesPage, self).__init__(driver, conf)
self._page_title = "Volumes" self._page_title = "Volume Types"
@property @property
def qos_specs_table(self): def qos_specs_table(self):

View File

@ -23,6 +23,7 @@ class BasePage(pageobject.PageObject):
"""Base class for all dashboard page objects.""" """Base class for all dashboard page objects."""
_heading_locator = (by.By.CSS_SELECTOR, 'div.page-header > h2') _heading_locator = (by.By.CSS_SELECTOR, 'div.page-header > h2')
_help_page_brand = (by.By.CSS_SELECTOR, '.navbar-brand')
@property @property
def heading(self): def heading(self):
@ -52,6 +53,9 @@ class BasePage(pageobject.PageObject):
def go_to_help_page(self): def go_to_help_page(self):
self.topbar.user_dropdown_menu.click_on_help() 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): def choose_theme(self, theme_name):
self.topbar.user_dropdown_menu.choose_theme(theme_name) self.topbar.user_dropdown_menu.choose_theme(theme_name)

View File

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

View File

@ -47,8 +47,8 @@ class ProjectsTable(tables.TableRegion):
class ProjectsPage(basepage.BaseNavigationPage): class ProjectsPage(basepage.BaseNavigationPage):
DEFAULT_ENABLED = True DEFAULT_ENABLED = True
PROJECTS_TABLE_NAME_COLUMN = 'name' PROJECTS_TABLE_NAME_COLUMN = 'Name'
PROJECT_ID_TABLE_NAME_COLUMN = 'id' PROJECT_ID_TABLE_NAME_COLUMN = 'Project ID'
def __init__(self, driver, conf): def __init__(self, driver, conf):
super(ProjectsPage, self).__init__(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 by
from selenium.webdriver.common import keys 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 overviewpage as system_overviewpage
from openstack_dashboard.test.integration_tests.pages import pageobject from openstack_dashboard.test.integration_tests.pages import pageobject
from openstack_dashboard.test.integration_tests.pages.project.compute import \ from openstack_dashboard.test.integration_tests.pages.project.compute import \

View File

@ -65,29 +65,26 @@ class Navigation(object):
{ {
"Compute": "Compute":
{ {
"Access & Security":
{
ITEMS: ITEMS:
( (
"Security Groups", "Overview",
"Instances",
"Images",
"Key Pairs", "Key Pairs",
"Floating IPs", "Server Groups",
"API Access" )
),
}, },
"Volumes": "Volumes":
{ {
ITEMS: ITEMS:
( (
"Volumes", "Volumes",
"Volume Snapshots" "Backups",
) "Snapshots",
}, "Consistency Groups",
ITEMS: "Consistency Group Snapshots",
(
"Overview",
"Instances",
"Images",
) )
}, },
"Network": "Network":
@ -96,73 +93,64 @@ class Navigation(object):
( (
"Network Topology", "Network Topology",
"Networks", "Networks",
"Routers" "Routers",
"Security Groups",
"Floating IPs",
) )
}, },
"Object Store":
{
ITEMS: ITEMS:
( (
"Containers", "API Access",
) )
}, },
},
"Admin": "Admin":
{ {
"System": "Compute":
{
"Resource Usage":
{ {
ITEMS: 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", "Hypervisors",
"Host Aggregates", "Host Aggregates",
"Instances", "Instances",
"Flavors", "Flavors",
"Images", "Images",
)
},
"Volume":
{
ITEMS:
(
"Volumes",
"Snapshots",
"Volume Types",
)
},
"Network":
{
ITEMS:
(
"Networks", "Networks",
"Routers", "Routers",
"Floating IPs",
)
},
"System":
{
ITEMS:
(
"Defaults", "Defaults",
"Metadata Definitions", "Metadata Definitions",
"System Information" "System Information"
) )
}, },
},
"Settings":
{
ITEMS: ITEMS:
( (
"User Settings", "Overview",
"Change Password"
) )
}, },
"Identity": "Identity":
{ {
ITEMS: ITEMS:
@ -170,10 +158,18 @@ class Navigation(object):
"Projects", "Projects",
"Users", "Users",
"Groups", "Groups",
"Domains", "Roles",
"Roles" "Application Credentials",
) )
} },
"Settings":
{
ITEMS:
(
"User Settings",
"Change Password",
)
},
} }
_main_content_locator = (by.By.ID, 'content_body') _main_content_locator = (by.By.ID, 'content_body')
@ -281,11 +277,10 @@ class Navigation(object):
* consist of 'go_to_subsubmenu_menuitem_page' * consist of 'go_to_subsubmenu_menuitem_page'
""" """
if len(self.path) < 4: if len(self.path) < 3:
path_2_name = list(self.path[-2:]) path_2_name = list(self.path[-2:])
else: else:
path_2_name = list(self.path[-3:]) path_2_name = list(self.path[-3:])
name = self.METHOD_NAME_DELIMITER.join(path_2_name) name = self.METHOD_NAME_DELIMITER.join(path_2_name)
name = self.METHOD_NAME_PREFIX + name + self.METHOD_NAME_SUFFIX name = self.METHOD_NAME_PREFIX + name + self.METHOD_NAME_SUFFIX
name = Navigation.unify_page_path(name, preserve_spaces=False) 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): class ApiAccessTable(tables.TableRegion):
name = "endpoints" 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') @tables.bind_table_action('download_openrc_v2')
def download_openstack_rc_v2(self, download_button): def download_openstack_rc_v2(self, download_button):
self.download_rcfile_dropdown()
download_button.click() download_button.click()
@tables.bind_table_action('download_openrc') @tables.bind_table_action('download_openrc')
def download_openstack_rc_v3(self, download_button): def download_openstack_rc_v3(self, download_button):
self.download_rcfile_dropdown()
download_button.click() download_button.click()
@ -35,7 +42,7 @@ class ApiaccessPage(basepage.BaseNavigationPage):
def __init__(self, driver, conf): def __init__(self, driver, conf):
super(ApiaccessPage, self).__init__(driver, conf) super(ApiaccessPage, self).__init__(driver, conf)
self._page_title = "Access & Security" self._page_title = "API Access"
@property @property
def apiaccess_table(self): 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.\ from openstack_dashboard.test.integration_tests.pages.project.compute.\
instancespage import InstancesPage instancespage import InstancesPage
from openstack_dashboard.test.integration_tests.pages.project.compute.\ from openstack_dashboard.test.integration_tests.pages.project.volumes.\
volumes.volumespage import VolumesPage volumespage import VolumesPage
# TODO(bpokorny): Set the default source back to 'url' once Glance removes # 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): class InstancesTable(tables.TableRegion):
name = "instances" name = "instances"
@tables.bind_table_action('launch') @tables.bind_table_action('launch-ng')
def launch_instance(self, launch_button): def launch_instance(self, launch_button):
launch_button.click() launch_button.click()
return LaunchInstanceForm(self.driver, self.conf) return LaunchInstanceForm(self.driver, self.conf)
@ -57,10 +57,10 @@ class InstancesPage(basepage.BaseNavigationPage):
DEFAULT_VOL_DELETE_ON_INSTANCE_DELETE = False DEFAULT_VOL_DELETE_ON_INSTANCE_DELETE = False
DEFAULT_SECURITY_GROUP = True DEFAULT_SECURITY_GROUP = True
INSTANCES_TABLE_NAME_COLUMN = 'name' INSTANCES_TABLE_NAME_COLUMN = 'Instance Name'
INSTANCES_TABLE_STATUS_COLUMN = 'status' INSTANCES_TABLE_STATUS_COLUMN = 'Status'
INSTANCES_TABLE_IP_COLUMN = 'ip' INSTANCES_TABLE_IP_COLUMN = 'IP Address'
INSTANCES_TABLE_IMAGE_NAME_COLUMN = 'image_name' INSTANCES_TABLE_IMAGE_NAME_COLUMN = 'Image Name'
def __init__(self, driver, conf): def __init__(self, driver, conf):
super(InstancesPage, self).__init__(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_ACTIONS = ("create", "import", "delete")
KEY_PAIRS_TABLE_ROW_ACTION = "delete" KEY_PAIRS_TABLE_ROW_ACTION = "delete"
KEY_PAIRS_TABLE_NAME_COLUMN = 'name' KEY_PAIRS_TABLE_NAME_COLUMN = 'Name'
def __init__(self, driver, conf): def __init__(self, driver, conf):
super(KeypairsPage, self).__init__(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): def _get_row_with_keypair_name(self, name):
return self.keypairs_table.get_row(self.KEY_PAIRS_TABLE_NAME_COLUMN, 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') @tables.bind_table_action('allocate')
def allocate_ip(self, allocate_button): def allocate_ip(self, allocate_button):
allocate_button.click() allocate_button.click()
self.wait_till_spinner_disappears()
return forms.BaseFormRegion(self.driver, self.conf) return forms.BaseFormRegion(self.driver, self.conf)
@tables.bind_table_action('release') @tables.bind_table_action('release')
@ -50,15 +51,15 @@ class FloatingIPTable(tables.TableRegion):
class FloatingipsPage(basepage.BaseNavigationPage): class FloatingipsPage(basepage.BaseNavigationPage):
FLOATING_IPS_TABLE_IP_COLUMN = 'ip' FLOATING_IPS_TABLE_IP_COLUMN = 'IP Address'
FLOATING_IPS_TABLE_FIXED_IP_COLUMN = 'fixed_ip' FLOATING_IPS_TABLE_FIXED_IP_COLUMN = 'Mapped Fixed IP Address'
_floatingips_fadein_popup_locator = ( _floatingips_fadein_popup_locator = (
by.By.CSS_SELECTOR, '.alert.alert-success.alert-dismissable.fade.in>p') by.By.CSS_SELECTOR, '.alert.alert-success.alert-dismissable.fade.in>p')
def __init__(self, driver, conf): def __init__(self, driver, conf):
super(FloatingipsPage, self).__init__(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): def _get_row_with_floatingip(self, floatingip):
return self.floatingips_table.get_row( 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): class NetworksTable(tables.TableRegion):
name = "networks" name = "networks"
CREATE_NETWORK_FORM_FIELDS = (("net_name", "admin_state", "shared", CREATE_NETWORK_FORM_FIELDS = (("net_name", "admin_state",
"with_subnet"), "with_subnet", "az_hints"),
("subnet_name", "cidr", "ip_version", ("subnet_name", "cidr", "ip_version",
"gateway_ip", "no_gateway"), "gateway_ip", "no_gateway"),
("enable_dhcp", "allocation_pools", ("enable_dhcp", "allocation_pools",
@ -42,8 +42,8 @@ class NetworksPage(basepage.BaseNavigationPage):
DEFAULT_IP_VERSION = '4' DEFAULT_IP_VERSION = '4'
DEFAULT_DISABLE_GATEWAY = False DEFAULT_DISABLE_GATEWAY = False
DEFAULT_ENABLE_DHCP = True DEFAULT_ENABLE_DHCP = True
NETWORKS_TABLE_NAME_COLUMN = 'name' NETWORKS_TABLE_NAME_COLUMN = 'Name'
NETWORKS_TABLE_STATUS_COLUMN = 'status' NETWORKS_TABLE_STATUS_COLUMN = 'Status'
SUBNET_TAB_INDEX = 1 SUBNET_TAB_INDEX = 1
DETAILS_TAB_INDEX = 2 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): class RouterInterfacesPage(basepage.BaseNavigationPage):
INTERFACES_TABLE_STATUS_COLUMN = 'status' INTERFACES_TABLE_STATUS_COLUMN = 'Status'
INTERFACES_TABLE_NAME_COLUMN = 'name' INTERFACES_TABLE_NAME_COLUMN = 'Name'
DEFAULT_IPv4_ADDRESS = '10.1.0.10' DEFAULT_IPv4_ADDRESS = '10.0.0.10'
DEFAULT_SUBNET = 'private: 10.1.0.0/20 (private-subnet)' DEFAULT_SUBNET = 'private: 10.0.0.0/26 (private-subnet)'
_breadcrumb_routers_locator = (by.By.CSS_SELECTOR, _breadcrumb_routers_locator = (by.By.CSS_SELECTOR,
'ol.breadcrumb>li>' + 'ol.breadcrumb>li>' +

View File

@ -28,8 +28,7 @@ class RoutersTable(tables.TableRegion):
name = "routers" name = "routers"
CREATE_ROUTER_FORM_FIELDS = ("name", "admin_state_up", CREATE_ROUTER_FORM_FIELDS = ("name", "admin_state_up",
"external_network") "external_network")
SET_GATEWAY_FORM_FIELDS = ("network_id", "router_name", SET_GATEWAY_FORM_FIELDS = ("network_id",)
"router_id")
@tables.bind_table_action('create') @tables.bind_table_action('create')
def create_router(self, create_button): def create_router(self, create_button):
@ -58,9 +57,9 @@ class RoutersPage(basepage.BaseNavigationPage):
DEFAULT_ADMIN_STATE_UP = 'True' DEFAULT_ADMIN_STATE_UP = 'True'
DEFAULT_EXTERNAL_NETWORK = 'public' DEFAULT_EXTERNAL_NETWORK = 'public'
ROUTERS_TABLE_NAME_COLUMN = 'name' ROUTERS_TABLE_NAME_COLUMN = 'Name'
ROUTERS_TABLE_STATUS_COLUMN = 'status' ROUTERS_TABLE_STATUS_COLUMN = 'Status'
ROUTERS_TABLE_NETWORK_COLUMN = 'ext_net' ROUTERS_TABLE_NETWORK_COLUMN = 'External Network'
_interfaces_tab_locator = (by.By.CSS_SELECTOR, _interfaces_tab_locator = (by.By.CSS_SELECTOR,
'a[href*="tab=router_details__interfaces"]') '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): class RulesTable(tables.TableRegion):
name = 'rules' name = 'rules'
ADD_RULE_FORM_FIELDS = ("rule_menu", "direction", "port_or_range", "port", ADD_RULE_FORM_FIELDS = ("rule_menu", "description", "direction",
"remote", "cidr") "port_or_range", "port", "remote", "cidr")
@tables.bind_table_action('add_rule') @tables.bind_table_action('add_rule')
def create_rule(self, create_button): def create_rule(self, create_button):
@ -40,11 +40,11 @@ class RulesTable(tables.TableRegion):
class ManageRulesPage(basepage.BaseNavigationPage): class ManageRulesPage(basepage.BaseNavigationPage):
RULES_TABLE_PORT_RANGE_COLUMN = 'port_range' RULES_TABLE_PORT_RANGE_COLUMN = 'Port Range'
def __init__(self, driver, conf): def __init__(self, driver, conf):
super(ManageRulesPage, self).__init__(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): def _get_row_with_port_range(self, port):
return self.rules_table.get_row( 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.pages import basepage
from openstack_dashboard.test.integration_tests.regions import forms from openstack_dashboard.test.integration_tests.regions import forms
from openstack_dashboard.test.integration_tests.regions import tables from openstack_dashboard.test.integration_tests.regions import tables
from openstack_dashboard.test.integration_tests.pages.project.compute.\ from openstack_dashboard.test.integration_tests.pages.project.network.\
access_and_security.managerulespage import ManageRulesPage security_groups.managerulespage import ManageRulesPage
class SecurityGroupsTable(tables.TableRegion): class SecurityGroupsTable(tables.TableRegion):
@ -41,11 +41,11 @@ class SecurityGroupsTable(tables.TableRegion):
class SecuritygroupsPage(basepage.BaseNavigationPage): class SecuritygroupsPage(basepage.BaseNavigationPage):
SECURITYGROUPS_TABLE_NAME_COLUMN = 'name' SECURITYGROUPS_TABLE_NAME_COLUMN = 'Name'
def __init__(self, driver, conf): def __init__(self, driver, conf):
super(SecuritygroupsPage, self).__init__(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): def _get_row_with_securitygroup_name(self, name):
return self.securitygroups_table.get_row( return self.securitygroups_table.get_row(

View File

@ -13,7 +13,7 @@
from selenium.webdriver.common import by from selenium.webdriver.common import by
from openstack_dashboard.test.integration_tests.pages import basepage 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 volumespage import VolumesPage
from openstack_dashboard.test.integration_tests.regions import forms from openstack_dashboard.test.integration_tests.regions import forms
from openstack_dashboard.test.integration_tests.regions import tables from openstack_dashboard.test.integration_tests.regions import tables
@ -54,17 +54,17 @@ class VolumesnapshotsTable(tables.TableRegion):
field_mappings=self.CREATE_VOLUME_FORM_FIELDS) field_mappings=self.CREATE_VOLUME_FORM_FIELDS)
class VolumesnapshotsPage(basepage.BaseNavigationPage): class SnapshotsPage(basepage.BaseNavigationPage):
SNAPSHOT_TABLE_NAME_COLUMN = 'name' SNAPSHOT_TABLE_NAME_COLUMN = 'Name'
SNAPSHOT_TABLE_STATUS_COLUMN = 'status' SNAPSHOT_TABLE_STATUS_COLUMN = 'Status'
SNAPSHOT_TABLE_VOLUME_NAME_COLUMN = 'volume_name' SNAPSHOT_TABLE_VOLUME_NAME_COLUMN = 'Volume Name'
_volumes_tab_locator = ( _volumes_tab_locator = (
by.By.CSS_SELECTOR, by.By.CSS_SELECTOR,
'a[href*="tab=volumes_and_snapshots__volumes_tab"]') 'a[href*="tab=volumes_and_snapshots__volumes_tab"]')
def __init__(self, driver, conf): def __init__(self, driver, conf):
super(VolumesnapshotsPage, self).__init__(driver, conf) super(SnapshotsPage, self).__init__(driver, conf)
self._page_title = "Volumes" self._page_title = "Volume Snapshots"
@property @property
def volumesnapshots_table(self): def volumesnapshots_table(self):

View File

@ -71,9 +71,9 @@ class VolumesTable(tables.TableRegion):
return forms.FormRegion(self.driver, self.conf, return forms.FormRegion(self.driver, self.conf,
field_mappings=self.EXTEND_VOLUME_FORM_FIELDS) field_mappings=self.EXTEND_VOLUME_FORM_FIELDS)
@tables.bind_row_action('launch_volume') @tables.bind_row_action('launch_volume_ng')
def launch_volume_as_instance(self, launch_volume_button, row): def launch_as_instance(self, launch_button, row):
launch_volume_button.click() launch_button.click()
return instancespage.LaunchInstanceForm(self.driver, self.conf) return instancespage.LaunchInstanceForm(self.driver, self.conf)
@tables.bind_row_action('upload_to_image') @tables.bind_row_action('upload_to_image')
@ -90,11 +90,11 @@ class VolumesTable(tables.TableRegion):
class VolumesPage(basepage.BaseNavigationPage): class VolumesPage(basepage.BaseNavigationPage):
VOLUMES_TABLE_NAME_COLUMN = 'name' VOLUMES_TABLE_NAME_COLUMN = 'Name'
VOLUMES_TABLE_STATUS_COLUMN = 'status' VOLUMES_TABLE_STATUS_COLUMN = 'Status'
VOLUMES_TABLE_TYPE_COLUMN = 'volume_type' VOLUMES_TABLE_TYPE_COLUMN = 'Type'
VOLUMES_TABLE_SIZE_COLUMN = 'size' VOLUMES_TABLE_SIZE_COLUMN = 'Size'
VOLUMES_TABLE_ATTACHED_COLUMN = 'attachments' VOLUMES_TABLE_ATTACHED_COLUMN = 'Attached To'
def __init__(self, driver, conf): def __init__(self, driver, conf):
super(VolumesPage, self).__init__(driver, conf) super(VolumesPage, self).__init__(driver, conf)
@ -140,12 +140,14 @@ class VolumesPage(basepage.BaseNavigationPage):
row.mark() row.mark()
confirm_delete_volumes_form = self.volumes_table.delete_volume() confirm_delete_volumes_form = self.volumes_table.delete_volume()
confirm_delete_volumes_form.submit() confirm_delete_volumes_form.submit()
self.wait_till_spinner_disappears()
def delete_volumes(self, volumes_names): def delete_volumes(self, volumes_names):
for volume_name in volumes_names: for volume_name in volumes_names:
self._get_row_with_volume_name(volume_name).mark() self._get_row_with_volume_name(volume_name).mark()
confirm_delete_volumes_form = self.volumes_table.delete_volume() confirm_delete_volumes_form = self.volumes_table.delete_volume()
confirm_delete_volumes_form.submit() confirm_delete_volumes_form.submit()
self.wait_till_spinner_disappears()
def edit_volume(self, name, new_name=None, description=None): def edit_volume(self, name, new_name=None, description=None):
row = self._get_row_with_volume_name(name) row = self._get_row_with_volume_name(name)
@ -182,15 +184,15 @@ class VolumesPage(basepage.BaseNavigationPage):
return volume_form.volume_id, volume_source return volume_form.volume_id, volume_source
def create_volume_snapshot(self, volume, snapshot, description='test'): def create_volume_snapshot(self, volume, snapshot, description='test'):
from openstack_dashboard.test.integration_tests.pages.project.compute.\ from openstack_dashboard.test.integration_tests.pages.project.\
volumes.volumesnapshotspage import VolumesnapshotsPage volumes.snapshotspage import SnapshotsPage
row = self._get_row_with_volume_name(volume) row = self._get_row_with_volume_name(volume)
snapshot_form = self.volumes_table.create_snapshot(row) snapshot_form = self.volumes_table.create_snapshot(row)
snapshot_form.name.text = snapshot snapshot_form.name.text = snapshot
if description is not None: if description is not None:
snapshot_form.description.text = description snapshot_form.description.text = description
snapshot_form.submit() snapshot_form.submit()
return VolumesnapshotsPage(self.driver, self.conf) return SnapshotsPage(self.driver, self.conf)
def extend_volume(self, name, new_size): def extend_volume(self, name, new_size):
row = self._get_row_with_volume_name(name) 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): def launch_instance(self, name, instance_name, available_zone=None):
row = self._get_row_with_volume_name(name) 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: if available_zone is None:
available_zone = self.conf.launch_instances.available_zone available_zone = self.conf.launch_instances.available_zone
instance_form.availability_zone.value = available_zone instance_form.availability_zone.value = available_zone

View File

@ -258,7 +258,7 @@ class ThemableSelectFormFieldRegion(BaseFormFieldRegion):
self.src_elem.click() self.src_elem.click()
for option in self.options: for option in self.options:
if self.strict_options_match: if self.strict_options_match:
match = text == option.text.strip() match = text == str(option.text.strip())
else: else:
match = option.text.startswith(text) match = option.text.startswith(text)
if match: if match:

View File

@ -9,6 +9,8 @@
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import time
from selenium.common import exceptions from selenium.common import exceptions
from selenium.webdriver.common import by from selenium.webdriver.common import by
@ -32,23 +34,23 @@ class NavigationAccordionRegion(baseregion.BaseRegion):
return self._get_element(*self._project_bar_locator) return self._get_element(*self._project_bar_locator)
_first_level_item_selected_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 = ( _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 = ( _first_level_item_xpath_template = (
"//li[contains(concat('', @class, ''), 'openstack-dashboard') " "//li[contains(concat('', @class, ''), 'panel openstack-dashboard') "
"and contains(., '%s')]/a") "and contains(., '%s')]/a")
_second_level_item_xpath_template = ( _second_level_item_xpath_template = (
"//li[contains(concat('', @class, ''), 'openstack-panel-group') " "//ul[contains(@class, 'in')]//li[contains(@class, "
"and contains(., '%s')]/a") "'panel openstack-panel-group') and contains(., '%s')]/a")
_third_level_item_xpath_template = ( _third_level_item_xpath_template = (
".//li[contains(concat('', @class, ''), 'openstack-panel') and " "//ul[contains(@class, 'in')]//a[contains(concat('', @class, ''),"
"contains(., '%s')]/a") "'list-group-item openstack-panel') and contains(., '%s')]")
_parent_item_locator = (by.By.XPATH, '..') _parent_item_locator = (by.By.XPATH, '..')
_menu_list_locator = (by.By.CSS_SELECTOR, 'ul') _menu_list_locator = (by.By.CSS_SELECTOR, 'a')
_expanded_menu_class = 'in' _expanded_menu_class = ""
_transitioning_menu_class = 'collapsing' _transitioning_menu_class = 'collapsing'
def _get_first_level_item_locator(self, text): 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 _wait_until_transition_ends(self, item, to_be_expanded=False):
def predicate(d): def predicate(d):
classes = item.get_attribute('class').split() classes = item.get_attribute('class')
if to_be_expanded: if to_be_expanded:
status = self._expanded_menu_class in classes status = self._expanded_menu_class == classes
else: 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 return status and self._transitioning_menu_class not in classes
self._wait_until(predicate) self._wait_until(predicate)
@ -129,6 +131,7 @@ class NavigationAccordionRegion(baseregion.BaseRegion):
# it. Otherwise selenium will complain with # it. Otherwise selenium will complain with
# MoveTargetOutOfBoundsException # MoveTargetOutOfBoundsException
selected_item.click() selected_item.click()
time.sleep(1)
self._wait_until_transition_ends( self._wait_until_transition_ends(
self._get_menu_list_next_to_menu_title(selected_item)) self._get_menu_list_next_to_menu_title(selected_item))
else: else:
@ -270,8 +273,8 @@ class UserDropDownMenuRegion(DropDownMenuRegion):
class TabbedMenuRegion(baseregion.BaseRegion): class TabbedMenuRegion(baseregion.BaseRegion):
_tab_locator = (by.By.CSS_SELECTOR, 'a') _tab_locator = (by.By.CSS_SELECTOR, 'li > a')
_default_src_locator = (by.By.CSS_SELECTOR, '.selenium-nav-region') _default_src_locator = (by.By.CSS_SELECTOR, 'div > .nav.nav-pills')
def switch_to(self, index=0): def switch_to(self, index=0):
self._get_elements(*self._tab_locator)[index].click() self._get_elements(*self._tab_locator)[index].click()
@ -355,7 +358,7 @@ class MembershipMenuRegion(baseregion.BaseRegion):
@staticmethod @staticmethod
def _is_role_selected(role): def _is_role_selected(role):
return 'selected' in role.get_attribute('class').split() return 'selected' == role.get_attribute('class')
@staticmethod @staticmethod
def _get_hidden_text(role): 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): for element in self._get_elements(*self._columns_names_locator):
classes = element.get_attribute('class').split() classes = element.get_attribute('class').split()
if NORMAL_COLUMN_CLASS in classes: if NORMAL_COLUMN_CLASS in classes:
names.append(element.get_attribute('data-selenium')) names.append(element.text)
return names return names
@property @property
@ -215,7 +215,7 @@ class TableRegion(baseregion.BaseRegion):
:param sorting: boolean arg specifying whether to sort actual names :param sorting: boolean arg specifying whether to sort actual names
:return: :return:
""" """
names = [row.cells['name'].text for row in self.rows] names = [row.cells['Name'].text for row in self.rows]
if sorting: if sorting:
names.sort() names.sort()
actual_table = {'Next': self.is_next_link_available(), 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 is safe to use action `name` attribute from the dashboard tables.py
code. code.
""" """
_actions_locator = (by.By.CSS_SELECTOR, 'div.table_actions > button,' _actions_locator = (by.By.CSS_SELECTOR, 'div.table_actions > button, a')
' div.table_actions > a')
def decorator(method): def decorator(method):
@functools.wraps(method) @functools.wraps(method)

View File

@ -15,7 +15,6 @@ from os.path import join
from os import remove from os import remove
from horizon.test import firefox_binary from horizon.test import firefox_binary
from openstack_dashboard.test.integration_tests import decorators
from openstack_dashboard.test.integration_tests import helpers from openstack_dashboard.test.integration_tests import helpers
@ -46,34 +45,35 @@ class TestDownloadRCFile(helpers.AdminTestCase):
Steps: Steps:
1) Login to Horizon Dashboard as admin user 1) Login to Horizon Dashboard as admin user
2) Navigate to Project > Compute > Access & Security > API Access tab 2) Navigate to Project > API Access tab
3) Click on "Download OpenStack RC File v2.0" button 3) Click on "Download OpenStack RC File" dropdown button
4) File named by template "<tenant_name>-openrc.sh" must be downloaded 4) Click on "OpenStack RC File (Identity API v2.0" button
5) Check that username, tenant name and tenant id correspond to current 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 username, tenant name and tenant id
""" """
api_access_page = self.home_pg.\ api_access_page = self.home_pg.\
go_to_compute_accessandsecurity_apiaccesspage() go_to_project_apiaccesspage()
api_access_page.download_openstack_rc_file( api_access_page.download_openstack_rc_file(
2, self._directory, self._openrc_template) 2, self._directory, self._openrc_template)
cred_dict = api_access_page.get_credentials_from_file( cred_dict = api_access_page.get_credentials_from_file(
2, self._directory, self._openrc_template) 2, self._directory, self._openrc_template)
self.assertEqual(cred_dict, self.actual_dict) self.assertEqual(cred_dict, self.actual_dict)
@decorators.skip_because(bugs=['1584057'])
def test_download_rc_v3_file(self): def test_download_rc_v3_file(self):
"""This is a basic scenario test: """This is a basic scenario test:
Steps: Steps:
1) Login to Horizon Dashboard as admin user 1) Login to Horizon Dashboard as admin user
2) Navigate to Project > Compute > Access & Security > API Access tab 2) Navigate to Project > API Access tab
3) Click on "Download OpenStack RC File v3" button 3) Click on "Download OpenStack RC File" dropdown button
4) File named by template "<tenant_name>-openrc.sh" must be downloaded 4) Click on "OpenStack RC File (Identity API v3" button
5) Check that username, project name and project id correspond to 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 current username, tenant name and tenant id
""" """
api_access_page = self.home_pg. \ api_access_page = self.home_pg. \
go_to_compute_accessandsecurity_apiaccesspage() go_to_project_apiaccesspage()
api_access_page.download_openstack_rc_file( api_access_page.download_openstack_rc_file(
3, self._directory, self._openrc_template) 3, self._directory, self._openrc_template)
cred_dict = api_access_page.get_credentials_from_file( cred_dict = api_access_page.get_credentials_from_file(

View File

@ -20,16 +20,17 @@ class TestDefaults(helpers.AdminTestCase):
def setUp(self): def setUp(self):
super(TestDefaults, self).setUp() 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) self.add_up = random.randint(1, 10)
def test_update_defaults(self): def test_update_compute_defaults(self):
"""Tests the Update Default Quotas functionality: """Tests the Update Default Compute Quotas functionality:
1) Login as Admin and go to Admin > System > Defaults 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 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 default_quota_values = self.defaults_page.quota_values
self.defaults_page.update_defaults(self.add_up) self.defaults_page.update_defaults(self.add_up)

View File

@ -10,8 +10,6 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import random
from openstack_dashboard.test.integration_tests import decorators from openstack_dashboard.test.integration_tests import decorators
from openstack_dashboard.test.integration_tests import helpers from openstack_dashboard.test.integration_tests import helpers
from openstack_dashboard.test.integration_tests.regions import messages from openstack_dashboard.test.integration_tests.regions import messages
@ -23,8 +21,8 @@ class TestFlavorAngular(helpers.AdminTestCase):
@property @property
def flavors_page(self): def flavors_page(self):
from openstack_dashboard.test.integration_tests.pages.admin.\ from openstack_dashboard.test.integration_tests.pages.admin.\
system.flavorspage import FlavorsPageNG compute.flavorspage import FlavorsPageNG
self.home_pg.go_to_system_flavorspage() self.home_pg.go_to_admin_compute_flavorspage()
return FlavorsPageNG(self.driver, self.CONFIG) return FlavorsPageNG(self.driver, self.CONFIG)
def test_basic_flavors_browse(self): def test_basic_flavors_browse(self):
@ -39,7 +37,7 @@ class TestFlavors(helpers.AdminTestCase):
def setUp(self): def setUp(self):
super(TestFlavors, self).setUp() 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): def _create_flavor(self, flavor_name):
self.flavors_page.create_flavor( self.flavors_page.create_flavor(
@ -88,51 +86,3 @@ class TestFlavors(helpers.AdminTestCase):
""" """
self._create_flavor(self.FLAVOR_NAME) self._create_flavor(self.FLAVOR_NAME)
self._delete_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 # License for the specific language governing permissions and limitations
# under the License. # 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 import helpers
from openstack_dashboard.test.integration_tests.regions import messages from openstack_dashboard.test.integration_tests.regions import messages
@ -22,7 +23,7 @@ class TestFloatingip(helpers.TestCase):
def test_floatingip(self): def test_floatingip(self):
floatingip_page = \ floatingip_page = \
self.home_pg.go_to_compute_accessandsecurity_floatingipspage() self.home_pg.go_to_project_network_floatingipspage()
floating_ip = floatingip_page.allocate_floatingip() floating_ip = floatingip_page.allocate_floatingip()
self.assertTrue( self.assertTrue(
floatingip_page.find_message_and_dismiss(messages.SUCCESS)) floatingip_page.find_message_and_dismiss(messages.SUCCESS))
@ -41,10 +42,11 @@ class TestFloatingip(helpers.TestCase):
class TestFloatingipAssociateDisassociate(helpers.TestCase): class TestFloatingipAssociateDisassociate(helpers.TestCase):
"""Checks that the user is able to Associate/Disassociate floatingip.""" """Checks that the user is able to Associate/Disassociate floatingip."""
@decorators.skip_because(bugs=['1774697'])
def test_floatingip_associate_disassociate(self): def test_floatingip_associate_disassociate(self):
instance_name = helpers.gen_random_resource_name('instance', instance_name = helpers.gen_random_resource_name('instance',
timestamp=False) 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) instances_page.create_instance(instance_name)
self.assertTrue( self.assertTrue(
instances_page.find_message_and_dismiss(messages.SUCCESS)) instances_page.find_message_and_dismiss(messages.SUCCESS))
@ -55,7 +57,7 @@ class TestFloatingipAssociateDisassociate(helpers.TestCase):
instance_info = "{} {}".format(instance_name, instance_ipv4) instance_info = "{} {}".format(instance_name, instance_ipv4)
floatingip_page = \ floatingip_page = \
self.home_pg.go_to_compute_accessandsecurity_floatingipspage() self.home_pg.go_to_project_network_floatingipspage()
floating_ip = floatingip_page.allocate_floatingip() floating_ip = floatingip_page.allocate_floatingip()
self.assertTrue( self.assertTrue(
floatingip_page.find_message_and_dismiss(messages.SUCCESS)) floatingip_page.find_message_and_dismiss(messages.SUCCESS))
@ -87,7 +89,7 @@ class TestFloatingipAssociateDisassociate(helpers.TestCase):
floatingip_page.find_message_and_dismiss(messages.ERROR)) floatingip_page.find_message_and_dismiss(messages.ERROR))
self.assertFalse(floatingip_page.is_floatingip_present(floating_ip)) 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) instances_page.delete_instance(instance_name)
self.assertTrue( self.assertTrue(
instances_page.find_message_and_dismiss(messages.SUCCESS)) instances_page.find_message_and_dismiss(messages.SUCCESS))

View File

@ -28,7 +28,8 @@ class TestHostAggregates(helpers.AdminTestCase):
* after deletion * 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( hostaggregates_page.create_host_aggregate(
name=self.HOST_AGGREGATE_NAME, name=self.HOST_AGGREGATE_NAME,

View File

@ -24,7 +24,7 @@ class TestImagesLegacy(helpers.TestCase):
@property @property
def images_page(self): 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', @decorators.config_option_required('image.panel_type', 'angular',
@ -40,7 +40,7 @@ class TestImagesAngular(helpers.TestCase):
# (or rewrite Navigation module completely). # (or rewrite Navigation module completely).
from openstack_dashboard.test.integration_tests.pages.project.\ from openstack_dashboard.test.integration_tests.pages.project.\
compute.imagespage import ImagesPageNG 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) return ImagesPageNG(self.driver, self.CONFIG)
def test_basic_image_browse(self): def test_basic_image_browse(self):
@ -331,9 +331,9 @@ class TestImagesAdmin(helpers.AdminTestCase, TestImagesLegacy):
"""Login as admin user""" """Login as admin user"""
@property @property
def images_page(self): 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): def test_image_create_delete(self):
super(TestImagesAdmin, self).test_image_create_delete() super(TestImagesAdmin, self).test_image_create_delete()
@ -342,7 +342,7 @@ class TestImagesAdmin(helpers.AdminTestCase, TestImagesLegacy):
Steps: Steps:
1) Login to Horizon dashboard as admin user 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 3) Use filter by Image Name
4) Check that filtered table has one image only (which name is 4) Check that filtered table has one image only (which name is
equal to filter value) equal to filter value)

View File

@ -20,8 +20,9 @@ class TestInstances(helpers.TestCase):
@property @property
def instances_page(self): 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): def test_create_delete_instance(self):
"""tests the instance creation and deletion functionality: """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) * deletes the newly created instance via proper page (depends on user)
* verifies the instance does not appear in the table after deletion * 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) instances_page.create_instance(self.INSTANCE_NAME)
self.assertTrue( self.assertTrue(
@ -47,7 +48,7 @@ class TestInstances(helpers.TestCase):
instances_page.find_message_and_dismiss(messages.ERROR)) instances_page.find_message_and_dismiss(messages.ERROR))
self.assertTrue(instances_page.is_instance_deleted(self.INSTANCE_NAME)) 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): def test_instances_pagination(self):
"""This test checks instance pagination """This test checks instance pagination
@ -80,7 +81,7 @@ class TestInstances(helpers.TestCase):
self.assertTrue( self.assertTrue(
settings_page.find_message_and_dismiss(messages.SUCCESS)) 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, instances_page.create_instance(self.INSTANCE_NAME,
instance_count=instance_count) instance_count=instance_count)
self.assertTrue( self.assertTrue(
@ -110,6 +111,7 @@ class TestInstances(helpers.TestCase):
instances_page.find_message_and_dismiss(messages.SUCCESS)) instances_page.find_message_and_dismiss(messages.SUCCESS))
self.assertTrue(instances_page.are_instances_deleted(instance_list)) self.assertTrue(instances_page.are_instances_deleted(instance_list))
@decorators.skip_because(bugs=['1774697'])
def test_instances_pagination_and_filtration(self): def test_instances_pagination_and_filtration(self):
"""This test checks instance pagination and filtration """This test checks instance pagination and filtration
@ -149,7 +151,7 @@ class TestInstances(helpers.TestCase):
self.assertTrue( self.assertTrue(
settings_page.find_message_and_dismiss(messages.SUCCESS)) 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, instances_page.create_instance(self.INSTANCE_NAME,
instance_count=instance_count) instance_count=instance_count)
self.assertTrue( self.assertTrue(
@ -182,6 +184,7 @@ class TestInstances(helpers.TestCase):
instances_page.find_message_and_dismiss(messages.SUCCESS)) instances_page.find_message_and_dismiss(messages.SUCCESS))
self.assertTrue(instances_page.are_instances_deleted(instance_list)) self.assertTrue(instances_page.are_instances_deleted(instance_list))
@decorators.skip_because(bugs=['1774697'])
def test_filter_instances(self): def test_filter_instances(self):
"""This test checks filtering of instances by Instance Name """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) instance_list = ["{0}-{1}".format(self.INSTANCE_NAME, item)
for item in range(1, instance_count + 1)] 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, instances_page.create_instance(self.INSTANCE_NAME,
instance_count=instance_count) instance_count=instance_count)
self.assertTrue( self.assertTrue(
@ -238,9 +241,9 @@ class TestAdminInstances(helpers.AdminTestCase, TestInstances):
@property @property
def instances_page(self): 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): def test_instances_pagination_and_filtration(self):
super(TestAdminInstances, self).\ super(TestAdminInstances, self).\
test_instances_pagination_and_filtration() test_instances_pagination_and_filtration()

View File

@ -13,6 +13,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # 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 import helpers
from openstack_dashboard.test.integration_tests.regions import messages 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.""" """Checks that the user is able to create/delete keypair."""
KEYPAIR_NAME = helpers.gen_random_resource_name("keypair") KEYPAIR_NAME = helpers.gen_random_resource_name("keypair")
@decorators.skip_because(bugs=['1774697'])
def test_keypair(self): def test_keypair(self):
keypair_page = self.home_pg.\ keypair_page = self.home_pg.\
go_to_compute_accessandsecurity_keypairspage() go_to_project_compute_keypairspage()
keypair_page.create_keypair(self.KEYPAIR_NAME) keypair_page.create_keypair(self.KEYPAIR_NAME)
self.assertFalse(keypair_page.find_message_and_dismiss(messages.ERROR)) self.assertFalse(keypair_page.find_message_and_dismiss(messages.ERROR))
keypair_page = self.home_pg.\ 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)) self.assertTrue(keypair_page.is_keypair_present(self.KEYPAIR_NAME))
keypair_page.delete_keypair(self.KEYPAIR_NAME) keypair_page.delete_keypair(self.KEYPAIR_NAME)

View File

@ -12,6 +12,7 @@
import os import os
from openstack_dashboard.test.integration_tests import decorators
from openstack_dashboard.test.integration_tests import helpers from openstack_dashboard.test.integration_tests import helpers
from openstack_dashboard.test.integration_tests.regions import messages 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.find_message_and_dismiss(messages.ERROR))
self.assertFalse(page.is_namespace_present(namespace_name)) self.assertFalse(page.is_namespace_present(namespace_name))
@decorators.skip_because(bugs=['1774697'])
def test_namespace_create_delete(self): def test_namespace_create_delete(self):
"""Tests the NameSpace creation and deletion functionality: """Tests the NameSpace creation and deletion functionality:
@ -109,7 +111,8 @@ class TestMetadataDefinitions(helpers.AdminTestCase):
* 11) Check that new Namespace was successfully deleted. * 11) Check that new Namespace was successfully deleted.
* 12) Check that new Namespace is not present in the table. * 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( template_json_container = namespaces_page.json_load_template(
namespace_template_name=self.NAMESPACE_TEMPLATE_PATH) 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 * 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) networks_page.create_network(self.NETWORK_NAME, self.SUBNET_NAME)
self.assertTrue( self.assertTrue(

View File

@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # 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 import helpers
from openstack_dashboard.test.integration_tests.regions import messages 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") PROJECT_NAME = helpers.gen_random_resource_name("project")
@decorators.skip_because(bugs=['1777359'])
class TestCreateDeleteProject(helpers.AdminTestCase): class TestCreateDeleteProject(helpers.AdminTestCase):
def setUp(self): def setUp(self):
super(TestCreateDeleteProject, self).setUp() super(TestCreateDeleteProject, self).setUp()
self.projects_page = self.home_pg.go_to_identity_projectspage() self.projects_page = self.home_pg.go_to_identity_projectspage()
@decorators.skip_because(bugs=['1777359'])
def test_create_delete_project(self): def test_create_delete_project(self):
self.projects_page.create_project(PROJECT_NAME) self.projects_page.create_project(PROJECT_NAME)
self.assertTrue( self.assertTrue(
@ -39,6 +42,7 @@ class TestCreateDeleteProject(helpers.AdminTestCase):
self.assertFalse(self.projects_page.is_project_present(PROJECT_NAME)) self.assertFalse(self.projects_page.is_project_present(PROJECT_NAME))
@decorators.skip_because(bugs=['1777359'])
class TestModifyProject(helpers.AdminTestCase): class TestModifyProject(helpers.AdminTestCase):
def setUp(self): def setUp(self):
@ -55,6 +59,7 @@ class TestModifyProject(helpers.AdminTestCase):
self.addCleanup(cleanup) self.addCleanup(cleanup)
@decorators.skip_because(bugs=['1774697'])
def test_add_member(self): def test_add_member(self):
admin_name = self.CONFIG.identity.admin_username admin_name = self.CONFIG.identity.admin_username
regular_role_name = self.CONFIG.identity.default_keystone_role regular_role_name = self.CONFIG.identity.default_keystone_role

View File

@ -22,7 +22,7 @@ class TestRouters(helpers.TestCase):
@property @property
def routers_page(self): 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): def _create_router(self):
routers_page = self.routers_page routers_page = self.routers_page
@ -170,7 +170,7 @@ class TestAdminRouters(helpers.AdminTestCase):
* deletes the newly created router * deletes the newly created router
* verifies the router does not appear in the table after deletion * 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) routers_page.create_router(self.ROUTER_NAME)
self.assertTrue( 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_present(self.ROUTER_NAME))
self.assertTrue(routers_page.is_router_active(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_present(self.ROUTER_NAME))
self.assertTrue(routers_page.is_router_active(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 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) routers_page.create_router(self.ROUTER_NAME)
self.assertTrue( self.assertTrue(

View File

@ -23,7 +23,7 @@ class TestSecuritygroup(helpers.TestCase):
@property @property
def securitygroup_page(self): def securitygroup_page(self):
return self.home_pg.\ return self.home_pg.\
go_to_compute_accessandsecurity_securitygroupspage() go_to_project_network_securitygroupspage()
def _create_securitygroup(self): def _create_securitygroup(self):
page = self.securitygroup_page page = self.securitygroup_page

View File

@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # 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 import helpers
from openstack_dashboard.test.integration_tests.regions import messages from openstack_dashboard.test.integration_tests.regions import messages
@ -22,8 +23,9 @@ class TestDashboardHelp(helpers.TestCase):
self.home_pg._wait_until( self.home_pg._wait_until(
lambda _: self.home_pg.is_nth_window_opened(2)) lambda _: self.home_pg.is_nth_window_opened(2))
self.home_pg.switch_window() self.home_pg.switch_window()
self.home_pg.is_help_page()
self.assertEqual(self.CONFIG.dashboard.help_url, self.assertIn(self.CONFIG.dashboard.help_url,
self.home_pg.get_url_current_page(), self.home_pg.get_url_current_page(),
"help link did not redirect to the right URL") "help link did not redirect to the right URL")
@ -55,6 +57,7 @@ class TestPasswordChange(helpers.TestCase):
self.assertTrue(self.home_pg.is_logged_in, self.assertTrue(self.home_pg.is_logged_in,
"Failed to login with default password") "Failed to login with default password")
@decorators.skip_because(bugs=['1776678'])
def test_password_change(self): def test_password_change(self):
# Changes the password, verifies it was indeed changed and # Changes the password, verifies it was indeed changed and
# resets to default password. # resets to default password.
@ -72,6 +75,7 @@ class TestPasswordChange(helpers.TestCase):
self._reset_password() self._reset_password()
self._login() self._login()
@decorators.skip_because(bugs=['1776678'])
def test_show_message_after_logout(self): def test_show_message_after_logout(self):
# Ensure an informational message is shown on the login page # Ensure an informational message is shown on the login page
# after the user is logged out. # after the user is logged out.

View File

@ -10,6 +10,7 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # 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 import helpers
from openstack_dashboard.test.integration_tests.regions import messages 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") USER_NAME = helpers.gen_random_resource_name("user")
@decorators.skip_because(bugs=['1774697'])
def test_create_delete_user(self): def test_create_delete_user(self):
users_page = self.home_pg.go_to_identity_userspage() users_page = self.home_pg.go_to_identity_userspage()
password = self.TEST_PASSWORD password = self.TEST_PASSWORD

View File

@ -10,7 +10,6 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # 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 import helpers
from openstack_dashboard.test.integration_tests.regions import messages from openstack_dashboard.test.integration_tests.regions import messages
@ -22,21 +21,19 @@ class TestVolumeSnapshotsBasic(helpers.TestCase):
@property @property
def volumes_snapshot_page(self): 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): def setUp(self):
"""Setup: create volume""" """Setup: create volume"""
super(TestVolumeSnapshotsBasic, self).setUp() 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.create_volume(self.VOLUME_NAME)
volumes_page.find_message_and_dismiss(messages.INFO) volumes_page.find_message_and_dismiss(messages.INFO)
self.assertTrue(volumes_page.is_volume_status(self.VOLUME_NAME, self.assertTrue(volumes_page.is_volume_status(self.VOLUME_NAME,
'Available')) 'Available'))
def cleanup(): def cleanup():
volumes_snapshot_page = \ volumes_page = self.home_pg.go_to_project_volumes_volumespage()
self.home_pg.go_to_compute_volumes_volumesnapshotspage()
volumes_page = volumes_snapshot_page.switch_to_volumes_tab()
volumes_page.delete_volume(self.VOLUME_NAME) volumes_page.delete_volume(self.VOLUME_NAME)
volumes_page.find_message_and_dismiss(messages.SUCCESS) volumes_page.find_message_and_dismiss(messages.SUCCESS)
self.assertTrue(volumes_page.is_volume_deleted(self.VOLUME_NAME)) self.assertTrue(volumes_page.is_volume_deleted(self.VOLUME_NAME))
@ -48,7 +45,7 @@ class TestVolumeSnapshotsBasic(helpers.TestCase):
Steps: Steps:
1. Login to Horizon Dashboard 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 3. Create snapshot for existed volume
4. Check that no ERROR appears 4. Check that no ERROR appears
5. Check that snapshot is in the list 5. Check that snapshot is in the list
@ -57,7 +54,7 @@ class TestVolumeSnapshotsBasic(helpers.TestCase):
8. Delete volume snapshot from proper page 8. Delete volume snapshot from proper page
9. Check that volume snapshot not in the list 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( volumes_snapshot_page = volumes_page.create_volume_snapshot(
self.VOLUME_NAME, self.VOLUME_SNAPSHOT_NAME) self.VOLUME_NAME, self.VOLUME_SNAPSHOT_NAME)
self.assertTrue(volumes_page.find_message_and_dismiss(messages.INFO)) 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 new_name = "new_" + self.VOLUME_SNAPSHOT_NAME
volumes_snapshot_page = \ 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, volumes_snapshot_page.edit_snapshot(self.VOLUME_SNAPSHOT_NAME,
new_name, "description") new_name, "description")
self.assertTrue( self.assertTrue(
@ -80,7 +77,6 @@ class TestVolumeSnapshotsBasic(helpers.TestCase):
self.assertTrue(volumes_snapshot_page. self.assertTrue(volumes_snapshot_page.
is_volume_snapshot_available(new_name)) is_volume_snapshot_available(new_name))
volumes_snapshot_page = self.volumes_snapshot_page
volumes_snapshot_page.delete_volume_snapshot(new_name) volumes_snapshot_page.delete_volume_snapshot(new_name)
self.assertTrue( self.assertTrue(
volumes_snapshot_page.find_message_and_dismiss(messages.SUCCESS)) volumes_snapshot_page.find_message_and_dismiss(messages.SUCCESS))
@ -94,12 +90,12 @@ class TestVolumeSnapshotsBasic(helpers.TestCase):
Steps: Steps:
1) Login to Horizon Dashboard 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 volumes and 3 snapshots
3) Navigate to user settings page 3) Navigate to user settings page
4) Change 'Items Per Page' value to 1 4) Change 'Items Per Page' value to 1
5) Go to Project -> Compute -> Volumes -> Volumes Snapshot tab 5) Go to Project -> Volumes -> Snapshots tab
or Admin -> System -> Volumes -> Volumes Snapshot tab or Admin -> Volume -> Snapshots tab
(depends on user) (depends on user)
6) Check that only 'Next' link is available, only one snapshot is 6) Check that only 'Next' link is available, only one snapshot is
available (and it has correct name) 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' 11) Go to user settings page and restore 'Items Per Page'
12) Delete created snapshots and volumes 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 count = 3
items_per_page = 1 items_per_page = 1
snapshot_names = ["{0}_{1}".format(self.VOLUME_SNAPSHOT_NAME, i) for i snapshot_names = ["{0}_{1}".format(self.VOLUME_SNAPSHOT_NAME, i) for i
@ -124,7 +120,7 @@ class TestVolumeSnapshotsBasic(helpers.TestCase):
self.assertTrue( self.assertTrue(
volumes_snapshot_page.is_volume_snapshot_available(name)) volumes_snapshot_page.is_volume_snapshot_available(name))
if i < count - 1: 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, first_page_definition = {'Next': True, 'Prev': False,
'Count': items_per_page, 'Count': items_per_page,
@ -179,14 +175,12 @@ class TestVolumeSnapshotsAdmin(helpers.AdminTestCase,
@property @property
def volumes_snapshot_page(self): 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): def test_create_edit_delete_volume_snapshot(self):
super(TestVolumeSnapshotsAdmin, self).\ super(TestVolumeSnapshotsAdmin, self).\
test_create_edit_delete_volume_snapshot() test_create_edit_delete_volume_snapshot()
@decorators.skip_because(bugs=['1584057'])
def test_volume_snapshots_pagination(self): def test_volume_snapshots_pagination(self):
super(TestVolumeSnapshotsAdmin, self).\ super(TestVolumeSnapshotsAdmin, self).\
test_volume_snapshots_pagination() test_volume_snapshots_pagination()
@ -199,21 +193,19 @@ class TestVolumeSnapshotsAdvanced(helpers.TestCase):
@property @property
def volumes_snapshot_page(self): 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): def setUp(self):
"""Setup: create volume""" """Setup: create volume"""
super(TestVolumeSnapshotsAdvanced, self).setUp() 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.create_volume(self.VOLUME_NAME)
volumes_page.find_message_and_dismiss(messages.INFO) volumes_page.find_message_and_dismiss(messages.INFO)
self.assertTrue(volumes_page.is_volume_status(self.VOLUME_NAME, self.assertTrue(volumes_page.is_volume_status(self.VOLUME_NAME,
'Available')) 'Available'))
def cleanup(): def cleanup():
volumes_snapshot_page = \ volumes_page = self.home_pg.go_to_project_volumes_volumespage()
self.home_pg.go_to_compute_volumes_volumesnapshotspage()
volumes_page = volumes_snapshot_page.switch_to_volumes_tab()
volumes_page.delete_volume(self.VOLUME_NAME) volumes_page.delete_volume(self.VOLUME_NAME)
self.assertTrue( self.assertTrue(
volumes_page.find_message_and_dismiss(messages.SUCCESS)) volumes_page.find_message_and_dismiss(messages.SUCCESS))
@ -228,14 +220,14 @@ class TestVolumeSnapshotsAdvanced(helpers.TestCase):
Steps: Steps:
1. Login to Horizon Dashboard as regular user 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 3. Create snapshot for existed volume
4. Create new volume from snapshot 4. Create new volume from snapshot
5. Check the volume is created and has 'Available' status 5. Check the volume is created and has 'Available' status
6. Delete volume snapshot 6. Delete volume snapshot
7. Delete volume 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( volumes_snapshot_page = volumes_page.create_volume_snapshot(
self.VOLUME_NAME, self.VOLUME_SNAPSHOT_NAME) self.VOLUME_NAME, self.VOLUME_SNAPSHOT_NAME)
self.assertTrue(volumes_page.find_message_and_dismiss(messages.INFO)) 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.assertTrue(volumes_snapshot_page.is_volume_snapshot_deleted(
self.VOLUME_SNAPSHOT_NAME)) 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) volumes_page.delete_volume(new_volume)
self.assertTrue( self.assertTrue(
volumes_page.find_message_and_dismiss(messages.SUCCESS)) volumes_page.find_message_and_dismiss(messages.SUCCESS))

View File

@ -23,7 +23,7 @@ class TestVolumesBasic(helpers.TestCase):
@property @property
def volumes_page(self): 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): def test_volume_create_edit_delete(self):
"""This test case checks create, edit, delete volume functionality: """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 10. Check that the volume is absent in the list
11. Check that no Error messages present 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) volumes_page.create_volume(self.VOLUME_NAME)
self.assertTrue( self.assertTrue(
volumes_page.find_message_and_dismiss(messages.INFO)) volumes_page.find_message_and_dismiss(messages.INFO))
@ -82,12 +82,12 @@ class TestVolumesBasic(helpers.TestCase):
Steps: Steps:
1) Login to Horizon Dashboard 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 three volumes
3) Navigate to user settings page 3) Navigate to user settings page
4) Change 'Items Per Page' value to 1 4) Change 'Items Per Page' value to 1
5) Go to Project -> Compute -> Volumes -> Volumes tab or 5) Go to Project -> Volumes -> Volumes tab or
Admin -> System -> Volumes -> Volumes tab (depends on user) Admin -> Volume -> Volumes tab (depends on user)
6) Check that only 'Next' link is available, only one volume is 6) Check that only 'Next' link is available, only one volume is
available (and it has correct name) available (and it has correct name)
7) Click 'Next' and check that both 'Prev' and 'Next' links are 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' 11) Go to user settings page and restore 'Items Per Page'
12) Delete created volumes 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 count = 3
items_per_page = 1 items_per_page = 1
volumes_names = ["{0}_{1}".format(self.VOLUME_NAME, i) for i in volumes_names = ["{0}_{1}".format(self.VOLUME_NAME, i) for i in
@ -154,7 +154,7 @@ class TestAdminVolumes(helpers.AdminTestCase, TestVolumesBasic):
@property @property
def volumes_page(self): 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): class TestVolumesAdvanced(helpers.TestCase):
@ -164,16 +164,16 @@ class TestVolumesAdvanced(helpers.TestCase):
@property @property
def volumes_page(self): 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): def test_manage_volume_attachments(self):
"""This test case checks attach/detach actions for volume """This test case checks attach/detach actions for volume
Steps: Steps:
1. Login to Horizon Dashboard as horizon user 1. Login to Horizon Dashboard as horizon user
2. Navigate to Project -> Compute -> Instances, create instance 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 4. Attach volume to instance from step2
5. Check that volume status and link to instance 5. Check that volume status and link to instance
6. Detach volume from instance 6. Detach volume from instance
@ -181,7 +181,7 @@ class TestVolumesAdvanced(helpers.TestCase):
8. Delete volume and instance 8. Delete volume and instance
""" """
instance_name = helpers.gen_random_resource_name('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.create_instance(instance_name)
instances_page.find_message_and_dismiss(messages.SUCCESS) instances_page.find_message_and_dismiss(messages.SUCCESS)
self.assertFalse( self.assertFalse(
@ -216,7 +216,7 @@ class TestVolumesAdvanced(helpers.TestCase):
self.assertFalse(volumes_page.find_message_and_dismiss(messages.ERROR)) self.assertFalse(volumes_page.find_message_and_dismiss(messages.ERROR))
self.assertTrue(volumes_page.is_volume_deleted(self.VOLUME_NAME)) 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.delete_instance(instance_name)
instances_page.find_message_and_dismiss(messages.SUCCESS) instances_page.find_message_and_dismiss(messages.SUCCESS)
self.assertFalse( self.assertFalse(
@ -229,26 +229,31 @@ class TestVolumesActions(helpers.TestCase):
IMAGE_NAME = helpers.gen_random_resource_name("image") IMAGE_NAME = helpers.gen_random_resource_name("image")
INSTANCE_NAME = helpers.gen_random_resource_name("instance") 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): def setUp(self):
super(TestVolumesActions, self).setUp() super(TestVolumesActions, self).setUp()
self.volumes_page = self.home_pg.go_to_compute_volumes_volumespage() volumes_page = self.volumes_page
self.volumes_page.create_volume(self.VOLUME_NAME) volumes_page.create_volume(self.VOLUME_NAME)
self.assertTrue( self.assertTrue(
self.volumes_page.find_message_and_dismiss(messages.INFO)) volumes_page.find_message_and_dismiss(messages.INFO))
self.assertFalse( 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_present(self.VOLUME_NAME)) self.assertTrue(volumes_page.is_volume_present(self.VOLUME_NAME))
self.assertTrue(self.volumes_page.is_volume_status(self.VOLUME_NAME, self.assertTrue(
'Available')) volumes_page.is_volume_status(self.VOLUME_NAME, 'Available'))
def cleanup(): 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.assertTrue(
self.volumes_page.find_message_and_dismiss(messages.SUCCESS)) volumes_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse( self.assertFalse(
self.volumes_page.find_message_and_dismiss(messages.ERROR)) volumes_page.find_message_and_dismiss(messages.ERROR))
self.assertTrue( self.assertTrue(
self.volumes_page.is_volume_deleted(self.VOLUME_NAME)) volumes_page.is_volume_deleted(self.VOLUME_NAME))
self.addCleanup(cleanup) self.addCleanup(cleanup)
@ -262,18 +267,19 @@ class TestVolumesActions(helpers.TestCase):
4. Check that the volume is still in the list 4. Check that the volume is still in the list
5. Check that the volume size is changed 5. Check that the volume size is changed
""" """
orig_size = self.volumes_page.get_size(self.VOLUME_NAME) volumes_page = self.volumes_page
self.volumes_page.extend_volume(self.VOLUME_NAME, orig_size + 1) orig_size = volumes_page.get_size(self.VOLUME_NAME)
volumes_page.extend_volume(self.VOLUME_NAME, orig_size + 1)
self.assertTrue( self.assertTrue(
self.volumes_page.find_message_and_dismiss(messages.INFO)) volumes_page.find_message_and_dismiss(messages.INFO))
self.assertFalse( 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_status(self.VOLUME_NAME, self.assertTrue(
'Available')) volumes_page.is_volume_status(self.VOLUME_NAME, 'Available'))
new_size = self.volumes_page.get_size(self.VOLUME_NAME) new_size = volumes_page.get_size(self.VOLUME_NAME)
self.assertLess(orig_size, new_size) self.assertLess(orig_size, new_size)
@decorators.skip_because(bugs=['1584057']) @decorators.skip_because(bugs=['1774697'])
def test_volume_upload_to_image(self): def test_volume_upload_to_image(self):
"""This test case checks upload volume to image functionality: """This test case checks upload volume to image functionality:
@ -284,7 +290,7 @@ class TestVolumesActions(helpers.TestCase):
4. Delete the image 4. Delete the image
5. Repeat actions for all disk formats 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', all_formats = {"qcow2": u'QCOW2', "raw": u'Raw', "vdi": u'VDI',
"vmdk": u'VMDK'} "vmdk": u'VMDK'}
for disk_format in all_formats: for disk_format in all_formats:
@ -295,7 +301,7 @@ class TestVolumesActions(helpers.TestCase):
self.volumes_page.find_message_and_dismiss(messages.ERROR)) self.volumes_page.find_message_and_dismiss(messages.ERROR))
self.assertTrue(self.volumes_page.is_volume_status( self.assertTrue(self.volumes_page.is_volume_status(
self.VOLUME_NAME, 'Available')) 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_present(self.IMAGE_NAME))
self.assertTrue(images_page.is_image_active(self.IMAGE_NAME)) self.assertTrue(images_page.is_image_active(self.IMAGE_NAME))
self.assertEqual(images_page.get_image_format(self.IMAGE_NAME), self.assertEqual(images_page.get_image_format(self.IMAGE_NAME),
@ -307,8 +313,9 @@ class TestVolumesActions(helpers.TestCase):
messages.ERROR)) messages.ERROR))
self.assertFalse(images_page.is_image_present(self.IMAGE_NAME)) self.assertFalse(images_page.is_image_present(self.IMAGE_NAME))
self.volumes_page = \ 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): def test_volume_launch_as_instance(self):
"""This test case checks launch volume as instance functionality: """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.volumes_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse( self.assertFalse(
self.volumes_page.find_message_and_dismiss(messages.ERROR)) 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.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, self.assertTrue(self.volumes_page.is_volume_status(self.VOLUME_NAME,
'In-use')) 'In-use'))
self.assertIn(self.INSTANCE_NAME, self.assertIn(self.INSTANCE_NAME,
self.volumes_page.get_attach_instance(self.VOLUME_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) instances_page.delete_instance(self.INSTANCE_NAME)
self.assertTrue( self.assertTrue(
instances_page.find_message_and_dismiss(messages.SUCCESS)) instances_page.find_message_and_dismiss(messages.SUCCESS))
self.assertFalse( self.assertFalse(
instances_page.find_message_and_dismiss(messages.ERROR)) instances_page.find_message_and_dismiss(messages.ERROR))
self.assertTrue(instances_page.is_instance_deleted(self.INSTANCE_NAME)) 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: Steps:
1. Login to Horizon Dashboard as admin user 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 3. Create new volume type
4. Check that the volume type is in the list 4. Check that the volume type is in the list
5. Check that no Error messages present 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 7. Check that the volume type is absent in the list
8. Check that no Error messages present 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) volume_types_page.create_volume_type(self.VOLUME_TYPE_NAME)
@ -62,7 +62,7 @@ class TestQoSSpec(helpers.AdminTestCase):
* deletes the newly created QoS Spec * deletes the newly created QoS Spec
* verifies the QoS Spec does not appear in the table after deletion * 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) qos_spec_page.create_qos_spec(self.QOS_SPEC_NAME)
self.assertTrue( self.assertTrue(
@ -90,7 +90,7 @@ class TestQoSSpec(helpers.AdminTestCase):
* verifies the QoS Spec does not appear in the table after deletion * verifies the QoS Spec does not appear in the table after deletion
""" """
qos_spec_name = helpers.gen_random_resource_name("qos_spec") 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' nova_compute_consumer = 'front-end'
both_consumers = 'both' both_consumers = 'both'
cinder_consumer = 'back-end' cinder_consumer = 'back-end'