Pytest: Add horizon test cases

Convert the following robot test cases to pytest test cases
1. 11-StarlingX-Title-Checkout.robot
2. 124-Edit-Image-Snapshot-Horizon-Add-Instance-Auto-Recovery.robot
3. 136-Edit-Image-For-Volume-In-Horizon.robot
4. 152-Horizon-Login-Time.robot
5. 392-Horizon-Responsive.robot

Signed-off-by: Dongqi Chen <chen.dq@neusoft.com>
Change-Id: Ie86867d06bd5007c06b3c64b8b4fbd6911b90db4
This commit is contained in:
Dongqi Chen 2021-07-07 18:12:55 +08:00
parent a68778f64d
commit 5cd93645e6
8 changed files with 285 additions and 1 deletions

View File

@ -2,4 +2,4 @@
host=review.opendev.org
port=29418
project=starlingx/test.git
defaultbranch=r/stx.4.0
defaultbranch=devel

View File

@ -0,0 +1,70 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Edit Image for volume in Horizon and add Instance Auto
# Recovery, verify metadata updated.
#
# Author(s): Dongqi.Chen <dongqix.chen@intel.com>
#
###
import os
import time
from pytest import mark, fixture
from consts.stx import GuestImages, FlavorSpec
from keywords import nova_helper, network_helper, glance_helper, vm_helper, cinder_helper
from utils.horizon.pages.project.compute import imagespage, instancespage
@fixture(scope="module")
def launch_instance():
network_helper.create_network(name='network', cleanup="module")
network_helper.create_subnet(name='subnet', network='network',
subnet_range='192.168.1.0/24', dhcp=True,
ip_version=4, cleanup="module")
nova_helper.create_flavor(name='flavor', vcpus=1, ram=512, root_disk=1,
is_public=True, add_default_specs=False, cleanup="module")
img_id = glance_helper.create_image(name="cirros", source_image_file=os.path.join(
GuestImages.DEFAULT["image_dir"], "cirros-0.4.0-x86_64-disk.img"), disk_format="qcow2",
cleanup="module")[1]
return img_id
@mark.horizon
def test_edit_image_for_volume_in_horizon(launch_instance, tenant_home_pg_container):
"""
136-Edit-Image-For-Volume-In-Horizon.robot
Args:
launch_instance:
tenant_home_pg_container:
Returns:
"""
img_id = launch_instance
images_pg = imagespage.ImagesPage(
tenant_home_pg_container.driver, port=tenant_home_pg_container.port)
images_pg.go_to_target_page()
img_name = glance_helper.get_image_values(img_id, fields='name')[0]
volumes_pg = images_pg.create_volume_from_image(img_name, 'cirros')
vol_id = cinder_helper.get_volumes(full_name='cirros')[0]
cinder_helper.wait_for_volume_status(vol_id, status='available')
volumes_pg.go_to_target_page()
volumes_pg.launch_as_instance('cirros', 'vm-auto-recovery', boot_source_type="Volume",
source_name="cirros", flavor_name='flavor', network_names="network")
time.sleep(60)
vm_id = vm_helper.get_vm_id_from_name("vm-auto-recovery")
vm_helper.wait_for_vm_status(vm_id)
instances_pg = instancespage.InstancesPage(
tenant_home_pg_container.driver, port=tenant_home_pg_container.port)
instances_pg.go_to_target_page()
instances_pg.update_metadata('vm-auto-recovery', {FlavorSpec.AUTO_RECOVERY: 'true'})
assert 'true' == vm_helper.get_vm_values(vm_id, fields='properties')[0]['sw:wrs:auto_recovery']
vm_helper.delete_vms(vm_id)
cinder_helper.delete_volumes(vol_id)

View File

@ -0,0 +1,80 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Test to validate that add instance auto recovery option
# can be selected for an image snapshot using Horizon.
#
# Author(s): Dongqi.Chen <dongqix.chen@intel.com>
#
###
import os
import time
from testfixtures.horizon import *
from pytest import fixture, mark
from consts.stx import GuestImages, FlavorSpec
from keywords import nova_helper, network_helper, glance_helper, vm_helper, cinder_helper
from testfixtures.fixture_resources import ResourceCleanup
from utils.horizon.pages.project.compute import instancespage
from utils.horizon.pages.project.volumes import volumespage
from utils.tis_log import LOG
@fixture(scope="module")
def launch_instance():
network_helper.create_network(name='network', cleanup="module")
network_helper.create_subnet(name='subnet', network='network',
subnet_range='192.168.1.0/24', dhcp=True,
ip_version=4, cleanup="module")
nova_helper.create_flavor(name='flavor', vcpus=1, ram=512, root_disk=1,
is_public=True, add_default_specs=False, cleanup="module")
glance_helper.create_image(name="cirros", source_image_file=os.path.join(
GuestImages.DEFAULT["image_dir"], "cirros-0.4.0-x86_64-disk.img"), disk_format="qcow2",
cleanup="module")
@mark.horizon
def test_edit_image_snapshot_horizon_add_instance_auto_recovery(
launch_instance, tenant_home_pg_container):
"""
124-Edit-Image-Snapshot-Horizon-Add-Instance-Auto-Recovery.robot
Args:
launch_instance:
tenant_home_pg_container:
Returns:
"""
volumes_pg = volumespage.VolumesPage(
tenant_home_pg_container.driver, port=tenant_home_pg_container.port)
volumes_pg.go_to_target_page()
volumes_pg.create_volume("volume_test", volume_source_type="Image", source_name="cirros")
volume_id = cinder_helper.get_volumes(full_name="volume_test")[0]
cinder_helper.wait_for_volume_status(volume=volume_id, status='available')
volumes_pg.create_volume_snapshot("volume_test", "snapshot_test")
snapshot_id = cinder_helper.get_volume_snapshot_values("snapshot_test", fields="ID")[0]
cinder_helper.wait_for_vol_snapshot_status(snapshot_id, status='available')
LOG.fixture_step('Go to Project > Compute > Instance')
instances_pg = instancespage.InstancesPage(
tenant_home_pg_container.driver, port=tenant_home_pg_container.port)
instances_pg.go_to_target_page()
LOG.fixture_step("Start create instance")
instances_pg.create_instance("cirros-snap-vm", boot_source_type="Volume Snapshot",
source_name="snapshot_test", flavor_name="flavor",
network_names="network")
time.sleep(60)
vm_id = vm_helper.get_vm_id_from_name("cirros-snap-vm")
vm_helper.wait_for_vm_status(vm_id)
instances_pg.update_metadata('cirros-snap-vm', {FlavorSpec.AUTO_RECOVERY: 'true'})
assert 'true' == vm_helper.get_vm_values(vm_id, fields='properties')[0]['sw:wrs:auto_recovery']
ResourceCleanup.add('vm', vm_id, scope="function", del_vm_vols=False)
ResourceCleanup.add('vol_snapshot', snapshot_id, scope="function")
ResourceCleanup.add('volume', volume_id, scope="function")

View File

@ -0,0 +1,59 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Attempt to login on horizon using "admin", "tenant1", and "tenant2".
#
# Author(s): Dongqi.Chen <dongqix.chen@intel.com>
#
###
from pytest import mark
from consts.auth import Tenant, HostLinuxUser
from keywords import keystone_helper
from utils import cli
from utils.clients.ssh import ControllerClient
from utils.horizon.helper import HorizonDriver
from utils.horizon.pages import loginpage
@mark.horizon
def test_horizon_login_time():
"""
152-Horizon-Login-Time.robot
Args:
Returns:
"""
auth_info = Tenant.get('admin')
con_ssh = ControllerClient.get_active_controller()
password = HostLinuxUser.get_password()
code, output = cli.openstack('user create', '--password {} tenant1'.format(password),
ssh_client=con_ssh, fail_ok=False, auth_info=auth_info)
assert code == 0, output
keystone_helper.add_or_remove_role(add_=True, role='admin', user='tenant1',
auth_info=auth_info, project='admin')
code, output = cli.openstack('user create', '--password {} tenant2'.format(password),
ssh_client=con_ssh, fail_ok=False, auth_info=auth_info)
assert code == 0, output
keystone_helper.add_or_remove_role(add_=True, role='admin', user='tenant2',
auth_info=auth_info, project='admin')
driver = HorizonDriver.get_driver()
login_pg = loginpage.LoginPage(driver, port='31000')
login_pg.go_to_target_page()
home_pg = login_pg.login(user='admin', password=auth_info['password'])
home_pg.log_out()
home_pg = login_pg.login(user='tenant1', password=password)
home_pg.log_out()
home_pg = login_pg.login(user='tenant2', password=password)
home_pg.log_out()
keystone_helper.delete_users('tenant1', auth_info=auth_info)
keystone_helper.delete_users('tenant2', auth_info=auth_info)

View File

@ -0,0 +1,26 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Test to check both horizon ports work correctly.
# 392-Horizon-Responsive.robot
#
# Author(s): Dongqi.Chen <dongqix.chen@intel.com>
#
###
from pytest import mark
from testfixtures.horizon import *
@mark.horizon
def test_horizon_responsive(admin_home_pg_container):
assert admin_home_pg_container.port == 31000
@mark.horizon
def test_horizon_responsive_port(admin_home_pg):
assert admin_home_pg.port == 8080

View File

@ -0,0 +1,33 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Test to check correct display of title.
#
# Author(s): Dongqi.Chen <dongqix.chen@intel.com>
#
###
from pytest import mark
from utils.horizon.helper import HorizonDriver
from utils.horizon.pages import loginpage
from utils.tis_log import LOG
@mark.horizon
def test_starlingx_title_checkout():
"""
11-StarlingX-Title-Checkout.robot
Args:
Returns:
"""
driver = HorizonDriver.get_driver()
login_pg = loginpage.LoginPage(driver, port='8080')
login_pg.go_to_target_page()
LOG.info(login_pg.page_title)
assert 'Login - StarlingX' == login_pg.page_title

View File

@ -203,6 +203,11 @@ class InstancesTable(tables.TableRegion):
self.wait_till_spinner_disappears()
return forms.FormRegion(self.driver, field_mappings=self.REBUILD_INSTANCE_FORM_FIELDS)
@tables.bind_row_action('update_metadata')
def update_metadata(self, metadata_button, row):
metadata_button.click()
return forms.MetadataFormRegion(self.driver)
class InstancesPage(basepage.BasePage):
PARTIAL_URL = 'project/instances'
@ -404,3 +409,11 @@ class InstancesPage(basepage.BasePage):
if disk_partition is not None:
rebuild_instance_form.disk_config.text = disk_partition
rebuild_instance_form.submit()
def update_metadata(self, name, metadata):
row = self._get_row_with_instance_name(name)
update_metadata_form = self.instances_table.update_metadata(row)
for field_name, value in metadata.items():
update_metadata_form.add_custom_field(field_name, value)
update_metadata_form.submit()

View File

@ -84,6 +84,7 @@ class VolumesTable(tables.TableRegion):
def upload_to_image(self, upload_button, row):
upload_button.click()
self.wait_till_spinner_disappears()
return forms.FormRegion(self.driver,
field_mappings=self.UPLOAD_VOLUME_FORM_FIELDS)
@ -292,6 +293,8 @@ class VolumesPage(basepage.BasePage):
instance_form.switch_to(2)
instance_form.addelement('Name', flavor_name)
instance_form.switch_to(3)
if isinstance(network_names, str):
network_names = [network_names]
instance_form.addelements('Network', network_names)
instance_form.submit()