
Until now we have used implicit timeout for message checking. It is enough for the majority of the cases. But in cases of overloaded deployment and more consuming actions (like manage volume attachments) this timeout is enough for all the actions except for messages so individual message timeout (adjustable through horizon.conf) seems to be the best solution. Change-Id: I6e43cdfa9fc02c1346b5a8228caacaf154e20ba3 Signed-off-by: Jan Jasek <jjasek@redhat.com>
683 lines
30 KiB
Python
683 lines
30 KiB
Python
# 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.
|
|
|
|
import time
|
|
|
|
import pytest
|
|
from selenium.common import exceptions
|
|
from selenium.webdriver.common.action_chains import ActionChains as AC
|
|
from selenium.webdriver.support import expected_conditions as EC
|
|
from selenium.webdriver.support.wait import WebDriverWait
|
|
|
|
from oslo_utils import uuidutils
|
|
|
|
from openstack_dashboard.test.selenium import widgets
|
|
|
|
|
|
@pytest.fixture(params=[(1, False)])
|
|
def new_instance_admin(complete_default_test_network, request, instance_name,
|
|
openstack_admin, config):
|
|
|
|
count = request.param[0]
|
|
auto_ip_param = request.param[1]
|
|
instance = openstack_admin.create_server(
|
|
instance_name,
|
|
image=config.image.images_list[0],
|
|
flavor=config.launch_instances.flavor,
|
|
availability_zone=config.launch_instances.available_zone,
|
|
network=complete_default_test_network.name,
|
|
auto_ip=auto_ip_param,
|
|
wait=True,
|
|
max_count=count,
|
|
)
|
|
yield instance
|
|
if count > 1:
|
|
for instance in range(0, count):
|
|
openstack_admin.delete_server(f"{instance_name}-{instance + 1}")
|
|
else:
|
|
openstack_admin.delete_server(instance_name)
|
|
|
|
|
|
@pytest.fixture
|
|
def clear_instance_admin(instance_name, openstack_admin):
|
|
yield None
|
|
openstack_admin.delete_server(
|
|
instance_name,
|
|
wait=True,
|
|
)
|
|
|
|
|
|
def wait_for_angular_readiness_instance_source(driver, config):
|
|
driver.set_script_timeout(config.selenium.page_timeout)
|
|
driver.execute_async_script("""
|
|
var callback = arguments[arguments.length - 1];
|
|
var element = document.querySelector(\
|
|
'div[ng-if="model.newInstanceSpec.vol_create == true"] .btn-group');
|
|
if (!window.angular) {
|
|
callback(false)
|
|
}
|
|
if (angular.getTestability) {
|
|
angular.getTestability(element).whenStable(function(){callback(true)});
|
|
} else {
|
|
if (!angular.element(element).injector()) {
|
|
callback(false)
|
|
}
|
|
var browser = angular.element(element).injector().get('$browser');
|
|
browser.notifyWhenNoOutstandingRequests(function(){callback(true)});
|
|
};""")
|
|
|
|
|
|
def create_new_volume_during_create_instance(driver, required_state):
|
|
create_new_volume_btn = widgets.find_already_visible_element_by_xpath(
|
|
f".//*[@id='vol-create'][text()='{required_state}']", driver
|
|
)
|
|
create_new_volume_btn.click()
|
|
|
|
|
|
def delete_volume_on_instance_delete(driver, required_state):
|
|
delete_volume_btn = widgets.find_already_visible_element_by_xpath(
|
|
f".//label[contains(@ng-model, 'vol_delete_on_instance_delete')]"
|
|
f"[text()='{required_state}']", driver)
|
|
delete_volume_btn.click()
|
|
|
|
|
|
def apply_instance_name_filter(driver, config, name_pattern):
|
|
# the text in filter field is rewritten after fully loaded page
|
|
# repeated check
|
|
for attempt in range(3):
|
|
filter_field = driver.find_element_by_css_selector(
|
|
"input[name='instances__filter__q']")
|
|
filter_field.clear()
|
|
filter_field.send_keys(name_pattern)
|
|
driver.find_element_by_id("instances__action_filter").click()
|
|
WebDriverWait(driver, config.selenium.page_timeout).until(
|
|
EC.invisibility_of_element_located(filter_field))
|
|
try:
|
|
driver.find_element_by_css_selector(
|
|
f".table_search input[value='{name_pattern}']")
|
|
break
|
|
except (exceptions.NoSuchElementException):
|
|
time.sleep(3)
|
|
|
|
|
|
def wait_for_instance_is_deleted(openstack, instance_name):
|
|
for attempt in range(10):
|
|
if openstack.compute.find_server(instance_name) is None:
|
|
break
|
|
else:
|
|
time.sleep(3)
|
|
|
|
|
|
def wait_for_steady_state_of_instance(openstack, instance_name):
|
|
for attempt in range(120):
|
|
if (openstack.compute.find_server(instance_name).status in
|
|
["ACTIVE", "ERROR"]):
|
|
break
|
|
else:
|
|
time.sleep(3)
|
|
|
|
|
|
def test_create_instance_demo(complete_default_test_network, login, driver,
|
|
instance_name, openstack_demo,
|
|
clear_instance_demo, config):
|
|
image = config.image.images_list[0]
|
|
network = complete_default_test_network.name
|
|
flavor = config.launch_instances.flavor
|
|
|
|
login('user')
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'project',
|
|
'instances',
|
|
))
|
|
driver.get(url)
|
|
launch_instance_btn = driver.find_element_by_link_text(
|
|
"Launch Instance")
|
|
launch_instance_btn.click()
|
|
wizard = driver.find_element_by_css_selector("wizard")
|
|
navigation = wizard.find_element_by_css_selector("div.wizard-nav")
|
|
widgets.find_already_visible_element_by_xpath(
|
|
".//*[@id='name']", wizard).send_keys(instance_name)
|
|
navigation.find_element_by_link_text("Networks").click()
|
|
network_table = wizard.find_element_by_css_selector(
|
|
"ng-include[ng-form=launchInstanceNetworkForm]"
|
|
)
|
|
widgets.select_from_transfer_table(network_table, network)
|
|
navigation.find_element_by_link_text("Flavor").click()
|
|
flavor_table = wizard.find_element_by_css_selector(
|
|
"ng-include[ng-form=launchInstanceFlavorForm]"
|
|
)
|
|
widgets.select_from_transfer_table(flavor_table, flavor)
|
|
navigation.find_element_by_link_text("Source").click()
|
|
wait_for_angular_readiness_instance_source(driver, config)
|
|
source_table = wizard.find_element_by_css_selector(
|
|
"ng-include[ng-form=launchInstanceSourceForm]"
|
|
)
|
|
# create_new_volume_during_create_instance(source_table, "No")
|
|
delete_volume_on_instance_delete(source_table, "Yes")
|
|
widgets.select_from_transfer_table(source_table, image)
|
|
wizard.find_element_by_css_selector(
|
|
"button.btn-primary.finish").click()
|
|
|
|
# For create instance - message appears earlier than the page is refreshed.
|
|
# We are unable to ensure that the message will be captured.
|
|
# Checking of message is skipped, we wait for refresh page
|
|
# and then result is checked.
|
|
# JJ
|
|
|
|
WebDriverWait(driver, config.selenium.page_timeout).until(
|
|
EC.invisibility_of_element_located(launch_instance_btn))
|
|
assert openstack_demo.compute.find_server(instance_name) is not None
|
|
|
|
|
|
def test_create_instance_from_volume_demo(complete_default_test_network, login,
|
|
driver, volume_name,
|
|
clear_instance_demo_before_volume,
|
|
config, openstack_demo,
|
|
instance_name):
|
|
network = complete_default_test_network.name
|
|
flavor = config.launch_instances.flavor
|
|
volume_name = volume_name[0]
|
|
|
|
login('user')
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'project',
|
|
'instances',
|
|
))
|
|
driver.get(url)
|
|
launch_instance_btn = driver.find_element_by_link_text(
|
|
"Launch Instance")
|
|
launch_instance_btn.click()
|
|
wizard = driver.find_element_by_css_selector("wizard")
|
|
navigation = wizard.find_element_by_css_selector("div.wizard-nav")
|
|
widgets.find_already_visible_element_by_xpath(
|
|
".//*[@id='name']", wizard).send_keys(instance_name)
|
|
navigation.find_element_by_link_text("Networks").click()
|
|
network_table = wizard.find_element_by_css_selector(
|
|
"ng-include[ng-form=launchInstanceNetworkForm]"
|
|
)
|
|
widgets.select_from_transfer_table(network_table, network)
|
|
navigation.find_element_by_link_text("Flavor").click()
|
|
flavor_table = wizard.find_element_by_css_selector(
|
|
"ng-include[ng-form=launchInstanceFlavorForm]"
|
|
)
|
|
widgets.select_from_transfer_table(flavor_table, flavor)
|
|
navigation.find_element_by_link_text("Source").click()
|
|
wait_for_angular_readiness_instance_source(driver, config)
|
|
source_table = wizard.find_element_by_css_selector(
|
|
"ng-include[ng-form=launchInstanceSourceForm]"
|
|
)
|
|
select_boot_sources_type_tab = source_table.find_element_by_id(
|
|
"boot-source-type")
|
|
select_boot_sources_type_tab.click()
|
|
select_boot_sources_type_tab.find_element_by_css_selector(
|
|
"option[value='volume']").click()
|
|
delete_volume_on_instance_delete(source_table, "Yes")
|
|
widgets.select_from_transfer_table(source_table, volume_name)
|
|
wizard.find_element_by_css_selector("button.btn-primary.finish").click()
|
|
WebDriverWait(driver, config.selenium.page_timeout).until(
|
|
EC.invisibility_of_element_located(launch_instance_btn))
|
|
assert openstack_demo.compute.find_server(instance_name) is not None
|
|
|
|
|
|
def test_delete_instance_demo(login, driver, instance_name, openstack_demo,
|
|
new_instance_demo, config):
|
|
login('user')
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'project',
|
|
'instances',
|
|
))
|
|
driver.get(url)
|
|
rows = driver.find_elements_by_css_selector(
|
|
f"table#instances tr[data-display='{instance_name}']"
|
|
)
|
|
assert len(rows) == 1
|
|
actions_column = rows[0].find_element_by_css_selector("td.actions_column")
|
|
widgets.select_from_dropdown(actions_column, "Delete Instance")
|
|
widgets.confirm_modal(driver)
|
|
messages = widgets.get_and_dismiss_messages(driver, config)
|
|
assert f"Info: Scheduled deletion of Instance: {instance_name}" in messages
|
|
wait_for_instance_is_deleted(openstack_demo, instance_name)
|
|
assert openstack_demo.compute.find_server(instance_name) is None
|
|
|
|
|
|
@pytest.mark.parametrize('new_instance_demo', [(2, False)],
|
|
indirect=True)
|
|
def test_instance_pagination_demo(login, driver, instance_name,
|
|
new_instance_demo, change_page_size_demo,
|
|
config):
|
|
"""This test checks instance pagination for demo user
|
|
|
|
Steps:
|
|
1) Login to Horizon Dashboard as demo user
|
|
2) Create 2 instances
|
|
3) Navigate to user settings page
|
|
4) Change 'Items Per Page' value to 1
|
|
5) Go to Instances page
|
|
6) Check that only 'Next' link is available, only one instance is
|
|
available (and it has correct name) on the first page
|
|
7) Click 'Next' and check that on the second page only one instance is
|
|
available (and it has correct name), there is no 'Next' link on page
|
|
8) Click 'Prev' and check result (should be the same as for step6)
|
|
9) Go to user settings page and restore 'Items Per Page' to default
|
|
10) Delete created instances
|
|
"""
|
|
items_per_page = 1
|
|
instance_count = 2
|
|
instance_list = [f"{instance_name}-{item}"
|
|
for item in range(1, instance_count + 1)]
|
|
first_page_definition = widgets.TableDefinition(next=True, prev=False,
|
|
count=items_per_page,
|
|
names=[instance_list[1]])
|
|
second_page_definition = widgets.TableDefinition(next=False, prev=True,
|
|
count=items_per_page,
|
|
names=[instance_list[0]])
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'project',
|
|
'instances'
|
|
))
|
|
driver.get(url)
|
|
current_table_status = widgets.get_table_status(driver, "instances",
|
|
instance_list[1],
|
|
sorting=True)
|
|
assert first_page_definition == current_table_status
|
|
# Turning to next page
|
|
driver.find_element_by_link_text("Next »").click()
|
|
current_table_status = widgets.get_table_status(driver, "instances",
|
|
instance_list[0],
|
|
sorting=True)
|
|
assert second_page_definition == current_table_status
|
|
# Turning back to previous page
|
|
driver.find_element_by_link_text("« Prev").click()
|
|
current_table_status = widgets.get_table_status(driver, "instances",
|
|
instance_list[1],
|
|
sorting=True)
|
|
assert first_page_definition == current_table_status
|
|
|
|
|
|
@pytest.mark.parametrize('new_instance_demo', [(2, False)],
|
|
indirect=True)
|
|
def test_instances_pagination_and_filtration_demo(login, driver, instance_name,
|
|
new_instance_demo,
|
|
change_page_size_demo,
|
|
config):
|
|
"""This test checks instance pagination and filtration
|
|
|
|
Steps:
|
|
1) Login to Horizon Dashboard as demo user
|
|
2) Create 2 instances
|
|
3) Go to user settings page
|
|
4) Change 'Items Per Page' value to 1
|
|
5) Go to Instances page
|
|
6) Check filter by Name of the first and the second instance in order
|
|
to have one instance in the list (and it should have correct name)
|
|
and no 'Next' link is available
|
|
7) Check filter by common part of Name of in order to have one instance
|
|
in the list (and it should have correct name) and 'Next' link is
|
|
available on the first page and is not available on the second page
|
|
9) Go to user settings page and restore 'Items Per Page'
|
|
10) Delete created instances
|
|
|
|
"""
|
|
items_per_page = 1
|
|
instance_count = 2
|
|
instance_list = [f"{instance_name}-{item}"
|
|
for item in range(1, instance_count + 1)]
|
|
filter_instance1_def = widgets.TableDefinition(next=False, prev=False,
|
|
count=items_per_page,
|
|
names=[instance_list[1]])
|
|
filter_instance2_def = widgets.TableDefinition(next=False, prev=False,
|
|
count=items_per_page,
|
|
names=[instance_list[0]])
|
|
common_filter_page1_def = widgets.TableDefinition(next=True, prev=False,
|
|
count=items_per_page,
|
|
names=[instance_list[1]])
|
|
common_filter_page2_def = widgets.TableDefinition(next=False, prev=True,
|
|
count=items_per_page,
|
|
names=[instance_list[0]])
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'project',
|
|
'instances'
|
|
))
|
|
driver.get(url)
|
|
h1 = driver.find_element_by_css_selector("h1")
|
|
AC(driver).move_to_element(h1).perform()
|
|
driver.find_element_by_css_selector(
|
|
"button[class='btn btn-default dropdown-toggle']").click()
|
|
# set filter by instance_name
|
|
driver.find_element_by_css_selector(
|
|
"a[data-select-value='name']").click()
|
|
apply_instance_name_filter(driver, config, instance_list[1])
|
|
current_table_status = widgets.get_table_status(driver, "instances",
|
|
instance_list[1],
|
|
sorting=True)
|
|
assert filter_instance1_def == current_table_status
|
|
apply_instance_name_filter(driver, config, instance_list[0])
|
|
current_table_status = widgets.get_table_status(driver, "instances",
|
|
instance_list[0],
|
|
sorting=True)
|
|
assert filter_instance2_def == current_table_status
|
|
apply_instance_name_filter(driver, config, instance_name)
|
|
current_table_status = widgets.get_table_status(driver, "instances",
|
|
instance_list[1],
|
|
sorting=True)
|
|
assert common_filter_page1_def == current_table_status
|
|
# Turning to next page
|
|
driver.find_element_by_link_text("Next »").click()
|
|
current_table_status = widgets.get_table_status(driver, "instances",
|
|
instance_list[0],
|
|
sorting=True)
|
|
assert common_filter_page2_def == current_table_status
|
|
|
|
|
|
@pytest.mark.parametrize('new_instance_demo', [(2, False)],
|
|
indirect=True)
|
|
def test_filter_instances_demo(login, driver, instance_name,
|
|
new_instance_demo, config):
|
|
"""This test checks filtering of instances by Instance Name
|
|
|
|
Steps:
|
|
1) Login to Horizon dashboard as regular user
|
|
2) Create 2 instances
|
|
3) Go to Instances Page
|
|
5) Use filter by Instance Name
|
|
6) Check that filtered table has one instance only (which name is equal
|
|
to filter value) and no other instances in the table
|
|
7) Set nonexistent instance name. Check that 0 rows are displayed
|
|
8) Delete both instances
|
|
"""
|
|
instance_count = 2
|
|
instance_list = [f"{instance_name}-{item}"
|
|
for item in range(1, instance_count + 1)]
|
|
login('user')
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'project',
|
|
'instances'
|
|
))
|
|
driver.get(url)
|
|
h1 = driver.find_element_by_css_selector("h1")
|
|
AC(driver).move_to_element(h1).perform()
|
|
driver.find_element_by_css_selector(
|
|
"button[class='btn btn-default dropdown-toggle']").click()
|
|
# set filter by instance_name
|
|
driver.find_element_by_css_selector(
|
|
"a[data-select-value='name']").click()
|
|
apply_instance_name_filter(driver, config, instance_list[1])
|
|
current_table_status = widgets.get_table_status(driver, "instances",
|
|
instance_list[1],
|
|
sorting=True)
|
|
assert (vars(current_table_status)['names'][0] == instance_list[1] and
|
|
vars(current_table_status)['count'] == 1)
|
|
# Generate random non existent image name
|
|
random_instance_name = 'horizon_instance_%s' % \
|
|
uuidutils.generate_uuid(dashed=False)
|
|
apply_instance_name_filter(driver, config, random_instance_name)
|
|
no_items_present = driver.find_element_by_xpath(
|
|
"//td[text()='No items to display.']")
|
|
assert no_items_present
|
|
|
|
|
|
# Admin tests
|
|
|
|
|
|
def test_create_instance_admin(complete_default_test_network, login, driver,
|
|
instance_name, openstack_admin,
|
|
clear_instance_admin, config):
|
|
image = config.image.images_list[0]
|
|
network = complete_default_test_network.name
|
|
flavor = config.launch_instances.flavor
|
|
|
|
login('admin')
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'project',
|
|
'instances',
|
|
))
|
|
driver.get(url)
|
|
launch_instance_btn = driver.find_element_by_link_text(
|
|
"Launch Instance")
|
|
launch_instance_btn.click()
|
|
wizard = driver.find_element_by_css_selector("wizard")
|
|
navigation = wizard.find_element_by_css_selector("div.wizard-nav")
|
|
widgets.find_already_visible_element_by_xpath(
|
|
".//*[@id='name']", wizard).send_keys(instance_name)
|
|
navigation.find_element_by_link_text("Networks").click()
|
|
network_table = wizard.find_element_by_css_selector(
|
|
"ng-include[ng-form=launchInstanceNetworkForm]"
|
|
)
|
|
widgets.select_from_transfer_table(network_table, network)
|
|
navigation.find_element_by_link_text("Flavor").click()
|
|
flavor_table = wizard.find_element_by_css_selector(
|
|
"ng-include[ng-form=launchInstanceFlavorForm]"
|
|
)
|
|
widgets.select_from_transfer_table(flavor_table, flavor)
|
|
navigation.find_element_by_link_text("Source").click()
|
|
wait_for_angular_readiness_instance_source(driver, config)
|
|
source_table = wizard.find_element_by_css_selector(
|
|
"ng-include[ng-form=launchInstanceSourceForm]"
|
|
)
|
|
# create_new_volume_during_create_instance(source_table, "No")
|
|
delete_volume_on_instance_delete(source_table, "Yes")
|
|
widgets.select_from_transfer_table(source_table, image)
|
|
wizard.find_element_by_css_selector(
|
|
"button.btn-primary.finish").click()
|
|
WebDriverWait(driver, config.selenium.page_timeout).until(
|
|
EC.invisibility_of_element_located(launch_instance_btn))
|
|
assert openstack_admin.compute.find_server(instance_name) is not None
|
|
|
|
|
|
def test_delete_instance_admin(login, driver, instance_name, openstack_admin,
|
|
new_instance_admin, config):
|
|
login('admin')
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'project',
|
|
'instances',
|
|
))
|
|
driver.get(url)
|
|
rows = driver.find_elements_by_css_selector(
|
|
f"table#instances tr[data-display='{instance_name}']"
|
|
)
|
|
assert len(rows) == 1
|
|
actions_column = rows[0].find_element_by_css_selector("td.actions_column")
|
|
widgets.select_from_dropdown(actions_column, "Delete Instance")
|
|
widgets.confirm_modal(driver)
|
|
messages = widgets.get_and_dismiss_messages(driver, config)
|
|
assert f"Info: Scheduled deletion of Instance: {instance_name}" in messages
|
|
wait_for_instance_is_deleted(openstack_admin, instance_name)
|
|
assert openstack_admin.compute.find_server(instance_name) is None
|
|
|
|
|
|
@pytest.mark.parametrize('new_instance_admin', [(2, False)],
|
|
indirect=True)
|
|
def test_instance_pagination_admin(login, driver, instance_name,
|
|
new_instance_admin, change_page_size_admin,
|
|
config):
|
|
"""This test checks instance pagination for admin user
|
|
|
|
Steps:
|
|
1) Login to Horizon Dashboard as admin user
|
|
2) Create 2 instances
|
|
3) Navigate to user settings page
|
|
4) Change 'Items Per Page' value to 1
|
|
5) Go to Instances page
|
|
6) Check that only 'Next' link is available, only one instance is
|
|
available (and it has correct name) on the first page
|
|
7) Click 'Next' and check that on the second page only one instance is
|
|
available (and it has correct name), there is no 'Next' link on page
|
|
8) Click 'Prev' and check result (should be the same as for step6)
|
|
9) Go to user settings page and restore 'Items Per Page' to default
|
|
10) Delete created instances
|
|
"""
|
|
items_per_page = 1
|
|
instance_count = 2
|
|
instance_list = [f"{instance_name}-{item}"
|
|
for item in range(1, instance_count + 1)]
|
|
first_page_definition = widgets.TableDefinition(next=True, prev=False,
|
|
count=items_per_page,
|
|
names=[instance_list[1]])
|
|
second_page_definition = widgets.TableDefinition(next=False, prev=True,
|
|
count=items_per_page,
|
|
names=[instance_list[0]])
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'project',
|
|
'instances'
|
|
))
|
|
driver.get(url)
|
|
current_table_status = widgets.get_table_status(driver, "instances",
|
|
instance_list[1],
|
|
sorting=True)
|
|
assert first_page_definition == current_table_status
|
|
# Turning to next page
|
|
driver.find_element_by_link_text("Next »").click()
|
|
current_table_status = widgets.get_table_status(driver, "instances",
|
|
instance_list[0],
|
|
sorting=True)
|
|
assert second_page_definition == current_table_status
|
|
# Turning back to previous page
|
|
driver.find_element_by_link_text("« Prev").click()
|
|
current_table_status = widgets.get_table_status(driver, "instances",
|
|
instance_list[1],
|
|
sorting=True)
|
|
assert first_page_definition == current_table_status
|
|
|
|
|
|
@pytest.mark.parametrize('new_instance_admin', [(2, False)],
|
|
indirect=True)
|
|
def test_instances_pagination_and_filtration_admin(login, driver, instance_name,
|
|
new_instance_admin,
|
|
change_page_size_admin,
|
|
config):
|
|
"""This test checks instance pagination and filtration
|
|
|
|
Steps:
|
|
1) Login to Horizon Dashboard as admin user
|
|
2) Create 2 instances
|
|
3) Go to user settings page
|
|
4) Change 'Items Per Page' value to 1
|
|
5) Go to Instances page
|
|
6) Check filter by Name of the first and the second instance in order
|
|
to have one instance in the list (and it should have correct name)
|
|
and no 'Next' link is available
|
|
7) Check filter by common part of Name of in order to have one instance
|
|
in the list (and it should have correct name) and 'Next' link is
|
|
available on the first page and is not available on the second page
|
|
9) Go to user settings page and restore 'Items Per Page'
|
|
10) Delete created instances
|
|
|
|
"""
|
|
items_per_page = 1
|
|
instance_count = 2
|
|
instance_list = [f"{instance_name}-{item}"
|
|
for item in range(1, instance_count + 1)]
|
|
filter_instance1_def = widgets.TableDefinition(next=False, prev=False,
|
|
count=items_per_page,
|
|
names=[instance_list[1]])
|
|
filter_instance2_def = widgets.TableDefinition(next=False, prev=False,
|
|
count=items_per_page,
|
|
names=[instance_list[0]])
|
|
common_filter_page1_def = widgets.TableDefinition(next=True, prev=False,
|
|
count=items_per_page,
|
|
names=[instance_list[1]])
|
|
common_filter_page2_def = widgets.TableDefinition(next=False, prev=True,
|
|
count=items_per_page,
|
|
names=[instance_list[0]])
|
|
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'project',
|
|
'instances'
|
|
))
|
|
driver.get(url)
|
|
h1 = driver.find_element_by_css_selector("h1")
|
|
AC(driver).move_to_element(h1).perform()
|
|
driver.find_element_by_css_selector(
|
|
"button[class='btn btn-default dropdown-toggle']").click()
|
|
# set filter by instance_name
|
|
driver.find_element_by_css_selector(
|
|
"a[data-select-value='name']").click()
|
|
apply_instance_name_filter(driver, config, instance_list[1])
|
|
current_table_status = widgets.get_table_status(driver, "instances",
|
|
instance_list[1],
|
|
sorting=True)
|
|
assert filter_instance1_def == current_table_status
|
|
apply_instance_name_filter(driver, config, instance_list[0])
|
|
current_table_status = widgets.get_table_status(driver, "instances",
|
|
instance_list[0],
|
|
sorting=True)
|
|
assert filter_instance2_def == current_table_status
|
|
apply_instance_name_filter(driver, config, instance_name)
|
|
current_table_status = widgets.get_table_status(driver, "instances",
|
|
instance_list[1],
|
|
sorting=True)
|
|
assert common_filter_page1_def == current_table_status
|
|
# Turning to next page
|
|
driver.find_element_by_link_text("Next »").click()
|
|
current_table_status = widgets.get_table_status(driver, "instances",
|
|
instance_list[0],
|
|
sorting=True)
|
|
assert common_filter_page2_def == current_table_status
|
|
|
|
|
|
@pytest.mark.parametrize('new_instance_admin', [(2, False)],
|
|
indirect=True)
|
|
def test_filter_instances_admin(login, driver, instance_name,
|
|
new_instance_admin, config):
|
|
"""This test checks filtering of instances by Instance Name
|
|
|
|
Steps:
|
|
1) Login to Horizon dashboard as admin user
|
|
2) Create 2 instances
|
|
3) Go to Instances Page
|
|
5) Use filter by Instance Name
|
|
6) Check that filtered table has one instance only (which name is equal
|
|
to filter value) and no other instances in the table
|
|
7) Set nonexistent instance name. Check that 0 rows are displayed
|
|
8) Delete both instances
|
|
"""
|
|
instance_count = 2
|
|
instance_list = [f"{instance_name}-{item}"
|
|
for item in range(1, instance_count + 1)]
|
|
login('admin')
|
|
url = '/'.join((
|
|
config.dashboard.dashboard_url,
|
|
'project',
|
|
'instances'
|
|
))
|
|
driver.get(url)
|
|
h1 = driver.find_element_by_css_selector("h1")
|
|
AC(driver).move_to_element(h1).perform()
|
|
driver.find_element_by_css_selector(
|
|
"button[class='btn btn-default dropdown-toggle']").click()
|
|
# set filter by instance_name
|
|
driver.find_element_by_css_selector(
|
|
"a[data-select-value='name']").click()
|
|
apply_instance_name_filter(driver, config, instance_list[1])
|
|
current_table_status = widgets.get_table_status(driver, "instances",
|
|
instance_list[1],
|
|
sorting=True)
|
|
assert (vars(current_table_status)['names'][0] == instance_list[1] and
|
|
vars(current_table_status)['count'] == 1)
|
|
# Generate random non existent image name
|
|
random_instance_name = 'horizon_instance_%s' % \
|
|
uuidutils.generate_uuid(dashed=False)
|
|
apply_instance_name_filter(driver, config, random_instance_name)
|
|
no_items_present = driver.find_element_by_xpath(
|
|
"//td[text()='No items to display.']")
|
|
assert no_items_present
|