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:
parent
a68778f64d
commit
5cd93645e6
|
@ -2,4 +2,4 @@
|
|||
host=review.opendev.org
|
||||
port=29418
|
||||
project=starlingx/test.git
|
||||
defaultbranch=r/stx.4.0
|
||||
defaultbranch=devel
|
||||
|
|
|
@ -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)
|
|
@ -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")
|
|
@ -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)
|
|
@ -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
|
|
@ -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
|
|
@ -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()
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
Loading…
Reference in New Issue