Integration test fixes
* fixed 37 tests in total * restructured and renamed test modules as per horizon * fixed page navigation & updated method calls * fixed css selector and xpaths as per horizon * Removed decorators.skip for working tests * included decorators.skip for non - working tests * updated description for tests as per horizon navigation * removed *update flavor info* and *update flavor access* test, as feature unavailable on horizon * updated table column name references in page modules * updated bind table action names as per horizon * included help page navigation checkpoint * fixed rc file download drop down selection * updated page titles in test modules * included calls as required for spinner disappearance * updated form fields as per test needs * updated default ipv4 and subnet for router interfaces * included string conversion as required for comparisons * updated cirros image name in horizon.conf Change-Id: I9fdc810b37443b616bbb82956d1c90a0fa5ebd6b
This commit is contained in:
parent
77ff5151c8
commit
15574cad5c
@ -40,9 +40,7 @@ panel_type=legacy
|
|||||||
# http accessible image (string value)
|
# 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
|
||||||
|
|
||||||
|
@ -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)
|
@ -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)
|
@ -0,0 +1,20 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from openstack_dashboard.test.integration_tests.pages import basepage
|
||||||
|
|
||||||
|
|
||||||
|
class HypervisorsPage(basepage.BaseNavigationPage):
|
||||||
|
|
||||||
|
def __init__(self, driver, conf):
|
||||||
|
super(HypervisorsPage, self).__init__(driver, conf)
|
||||||
|
self._page_title = "All Hypervisors"
|
@ -10,9 +10,9 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# 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
|
@ -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
|
@ -0,0 +1,18 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from openstack_dashboard.test.integration_tests.pages.project.network \
|
||||||
|
import networkspage
|
||||||
|
|
||||||
|
|
||||||
|
class NetworksPage(networkspage.NetworksPage):
|
||||||
|
pass
|
@ -17,7 +17,7 @@ from openstack_dashboard.test.integration_tests.regions import tables
|
|||||||
|
|
||||||
|
|
||||||
class RoutersTable(routerspage.RoutersTable):
|
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):
|
@ -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"
|
@ -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()
|
||||||
|
|
||||||
|
@ -0,0 +1,18 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from openstack_dashboard.test.integration_tests.pages.project.\
|
||||||
|
volumes import snapshotspage
|
||||||
|
|
||||||
|
|
||||||
|
class SnapshotsPage(snapshotspage.SnapshotsPage):
|
||||||
|
pass
|
@ -0,0 +1,18 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from openstack_dashboard.test.integration_tests.pages.project.\
|
||||||
|
volumes import volumespage
|
||||||
|
|
||||||
|
|
||||||
|
class VolumesPage(volumespage.VolumesPage):
|
||||||
|
pass
|
@ -60,14 +60,14 @@ class VolumeTypesTable(tables.TableRegion):
|
|||||||
|
|
||||||
|
|
||||||
class VolumetypesPage(basepage.BaseNavigationPage):
|
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):
|
@ -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)
|
||||||
|
|
||||||
|
@ -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):
|
||||||
|
@ -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)
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from openstack_dashboard.test.integration_tests.pages import basepage
|
||||||
|
|
||||||
|
|
||||||
|
class RolesPage(basepage.BaseNavigationPage):
|
||||||
|
|
||||||
|
def __init__(self, driver, conf):
|
||||||
|
super(RolesPage, self).__init__(driver, conf)
|
||||||
|
self._page_title = 'Roles'
|
@ -13,7 +13,7 @@
|
|||||||
from selenium.webdriver.common import by
|
from selenium.webdriver.common import 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 \
|
||||||
|
@ -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)
|
||||||
|
@ -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):
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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,
|
@ -0,0 +1,20 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from openstack_dashboard.test.integration_tests.pages import basepage
|
||||||
|
|
||||||
|
|
||||||
|
class ServergroupsPage(basepage.BaseNavigationPage):
|
||||||
|
|
||||||
|
def __init__(self, driver, conf):
|
||||||
|
super(ServergroupsPage, self).__init__(driver, conf)
|
||||||
|
self._page_title = 'Server Groups'
|
@ -30,6 +30,7 @@ class FloatingIPTable(tables.TableRegion):
|
|||||||
@tables.bind_table_action('allocate')
|
@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(
|
@ -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
|
||||||
|
|
||||||
|
@ -0,0 +1,20 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from openstack_dashboard.test.integration_tests.pages import basepage
|
||||||
|
|
||||||
|
|
||||||
|
class NetworktopologyPage(basepage.BaseNavigationPage):
|
||||||
|
|
||||||
|
def __init__(self, driver, conf):
|
||||||
|
super(NetworktopologyPage, self).__init__(driver, conf)
|
||||||
|
self._page_title = 'Network Topology'
|
@ -44,10 +44,10 @@ class InterfacesTable(tables.TableRegion):
|
|||||||
|
|
||||||
class RouterInterfacesPage(basepage.BaseNavigationPage):
|
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>' +
|
||||||
|
@ -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"]')
|
||||||
|
@ -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(
|
@ -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(
|
@ -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):
|
@ -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
|
@ -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:
|
||||||
|
@ -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):
|
||||||
|
@ -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)
|
||||||
|
@ -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(
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
|
||||||
|
@ -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))
|
||||||
|
@ -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,
|
||||||
|
@ -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)
|
||||||
|
@ -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()
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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(
|
||||||
|
@ -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
|
||||||
|
@ -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))
|
||||||
|
|
||||||
|
@ -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(
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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))
|
||||||
|
@ -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()
|
||||||
|
@ -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'
|
||||||
|
Loading…
Reference in New Issue
Block a user