Pytest: Add nova tests

Added new tests to Nova suite
Convert the following robot test cases to pytest test cases

1.33-Flavor-Adding-Access-To-The-Flavor.robot
2.54-Create-Flavor-Remove-Access.robot
3.66-Flavor-Use-Cannot-Be-Modified.robot
4.67-Local-Storage-Delete-VolumeSnapshot-Instance-Launched.robot
5.68-Update-Aggregate-Add-Host.robot
6.72-SharedCPU.robot
7.73-Evacuate-Migrate-VM.robot
8.76-Nova-Error-Instance-Delete.robot
9.77-CLI-Set-CPU-Policy-Extra-Spec.robot
10.78-Verify-Values-For-Mem-Page-Size.robot
11.80-Verify-Values-For-Cpu-Policy.robot
12.82-SharedCPU-Flavor-Dedicated-Shared-VCPU.robot
13.89-Snapshot-Show-And-Delete-Image.robot
14.90-Check-Nova-Diagnostics.robot
15.103-Sensitive-Entries-For-Hwcpu.robot
16.108-Flavor-With-Extra-Migration-Spec.robot
17.118-Volume-Snapshot-Instance.robot
18.121-Check-Snapshot-Volume.robot
19.131-CPUScaling-Verify-Error-Attempt-Set-Minimum-CPU-Value-Below-Valid-Range.robot
20.134-CPUPolicy-From-CLI-Horizon-CPU-Policy-Extra-Spec.robot
21.137-CPUPolicy-Invalid-Or-Empty-Values.robot
22.150-Recovery-HeartBeat-To-Valid-Values.robot
23.173-Update-Metadata-Volume-Snapshot.robot
24.200-Volume-Snapshot-Instance-Horizon.robot
25.277-Boot-From-Glance.robot

Signed-off-by: Yong Fu <fuyong@neusoft.com>
Change-Id: I3547f6868e4237a6864ac3a5e90fe3c8a9ecb115
This commit is contained in:
Yong Fu 2021-06-23 16:03:16 +08:00
parent a68778f64d
commit a4e0d54572
23 changed files with 1255 additions and 14 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

@ -1,3 +1,27 @@
from pytest import fixture, skip
from testfixtures.resource_mgmt import *
from testfixtures.resource_create import *
from testfixtures.config_host import *
from keywords import system_helper, network_helper
from utils.tis_log import LOG
NETWORK_NAME = "network"
SUBNET_NAME = "subnet"
SUBNET_RANGE = "192.168.0.0/24"
IP_VERSION = 4
@fixture(scope='session')
def no_aio_system():
LOG.fixture_step("(Session) Skip if AIO system")
if system_helper.is_aio_system():
skip('skip if AIO system')
# Creating network
@fixture(scope="session")
def create_network():
net_id = network_helper.create_network(name=NETWORK_NAME, cleanup="session")[1]
subnet_id = network_helper.create_subnet(name=SUBNET_NAME, network=NETWORK_NAME,
subnet_range=SUBNET_RANGE, dhcp=True,
ip_version=IP_VERSION, cleanup="session")[1]
return net_id, subnet_id

View File

@ -0,0 +1,86 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Boot from glance (image bakcing), volume attach and try to lock hosts.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
import os
from pytest import fixture, mark
from consts.auth import Tenant
from consts.stx import GuestImages, VMStatus
from keywords import nova_helper, vm_helper, glance_helper
from utils import cli
from utils.clients import ssh
# Flavor, Image, Volume info
cirros_params = {
"flavor_name": "flavor.small",
"flavor_vcpus": 1,
"flavor_ram": 2048,
"flavor_disk": 4,
"image_name": "cirros",
"image_file": os.path.join(GuestImages.DEFAULT["image_dir"], "cirros-0.4.0-x86_64-disk.img"),
"disk_format": "qcow2",
}
# Creating Flavor For Image
@fixture(scope="module")
def create_flavor_and_image():
fl_id = nova_helper.create_flavor(name=cirros_params['flavor_name'],
vcpus=cirros_params['flavor_vcpus'],
ram=cirros_params['flavor_ram'],
root_disk=cirros_params['flavor_disk'],
is_public=True, add_default_specs=False,
cleanup="module")[1]
nova_helper.set_flavor(fl_id, **{"hw:cpu_policy": "dedicated"})
im_id = glance_helper.create_image(name=cirros_params['image_name'],
source_image_file=cirros_params['image_file'],
disk_format=cirros_params['disk_format'],
cleanup="module")[1]
return {
"flavor": fl_id,
"image": im_id
}
# Creating Instance
@fixture(scope='module')
def launch_instance(create_network, create_flavor_and_image):
net_id_list = [{"net-id": create_network[0]}]
return vm_helper.boot_vm(flavor=create_flavor_and_image["flavor"], nics=net_id_list,
source="image", source_id=create_flavor_and_image["image"],
cleanup="module")[1]
@mark.nova
def test_boot_from_glance(launch_instance, no_aio_system):
"""
277-Boot-From-Glance.robot
Args:
launch_instance:
no_aio_system:
Returns:
"""
con_ssh = ssh.ControllerClient.get_active_controller()
before_host = vm_helper.get_vm_host(launch_instance, con_ssh=con_ssh)
cli.openstack('server migrate --shared-migration ', launch_instance, ssh_client=con_ssh, fail_ok=False,
auth_info=Tenant.get('admin'), timeout=600)
vm_helper.wait_for_vm_status(vm_id=launch_instance, status=VMStatus.VERIFY_RESIZE, timeout=300,
fail_ok=False, con_ssh=con_ssh)
cli.openstack('server resize ', "{} --confirm".format(launch_instance), ssh_client=con_ssh,
fail_ok=False, auth_info=Tenant.get('admin'), timeout=600)
vm_helper.wait_for_vm_status(vm_id=launch_instance, status=VMStatus.ACTIVE, timeout=300,
fail_ok=False, con_ssh=con_ssh)
after_host = vm_helper.get_vm_host(launch_instance, con_ssh=con_ssh)
assert before_host != after_host, "server migrate failed"

View File

@ -0,0 +1,94 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Test to create an instance and perform actions on it,that will be logged in nova diagnostics.
# Then, instance is locked to confirm the previous output does not change.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
import os
from pytest import fixture, mark
from consts.auth import Tenant
from consts.stx import GuestImages, VMStatus
from keywords import nova_helper, vm_helper, glance_helper
from utils import cli
from utils.clients import ssh
# Flavor, Image, Volume info
cirros_params = {
"flavor_name": "diagnostics-flavor",
"flavor_vcpus": 1,
"flavor_ram": 2048,
"flavor_disk": 4,
"image_name": "diagnostics-image",
"image_file": os.path.join(GuestImages.DEFAULT["image_dir"], "cirros-0.4.0-x86_64-disk.img"),
"disk_format": "qcow2"
}
# Creating Flavor For Image
@fixture(scope="module")
def create_flavor_and_image():
fl_id = nova_helper.create_flavor(name=cirros_params['flavor_name'],
vcpus=cirros_params['flavor_vcpus'],
ram=cirros_params['flavor_ram'],
root_disk=cirros_params['flavor_disk'],
is_public=True, add_default_specs=False,
cleanup="module")[1]
im_id = glance_helper.create_image(name=cirros_params['image_name'],
source_image_file=cirros_params['image_file'],
disk_format=cirros_params['disk_format'],
cleanup="module")[1]
return {
"flavor": fl_id,
"image": im_id
}
# Creating Instance
@fixture(scope='module')
def launch_instance(create_network, create_flavor_and_image):
net_id_list = [{"net-id": create_network[0]}]
return vm_helper.boot_vm(flavor=create_flavor_and_image["flavor"], nics=net_id_list,
source="image", source_id=create_flavor_and_image["image"],
cleanup="module")[1]
@mark.nova
def test_check_nova_diagnostics(no_simplex, launch_instance):
"""
90-Check-Nova-Diagnostics.robot
Args:
no_simplex:
launch_instance:
Returns:
"""
disk = nova_helper.get_flavors(name="diagnostics-flavor", field="disk")[0]
vcpus = nova_helper.get_flavors(name="diagnostics-flavor", field="vcpus")[0]
con_ssh = ssh.ControllerClient.get_active_controller()
before_host = vm_helper.get_vm_host(launch_instance, con_ssh=con_ssh)
cli.openstack('server migrate ', launch_instance, ssh_client=con_ssh, fail_ok=False,
auth_info=Tenant.get('admin'), timeout=600)
vm_helper.wait_for_vm_status(vm_id=launch_instance, status=VMStatus.VERIFY_RESIZE, timeout=300,
fail_ok=False, con_ssh=con_ssh)
cli.openstack('server resize ', "{} --confirm".format(launch_instance), ssh_client=con_ssh,
fail_ok=False, auth_info=Tenant.get('admin'), timeout=600)
vm_helper.wait_for_vm_status(vm_id=launch_instance, status=VMStatus.ACTIVE, timeout=300,
fail_ok=False, con_ssh=con_ssh)
after_host = vm_helper.get_vm_host(launch_instance, con_ssh=con_ssh)
assert before_host != after_host, "server migrate failed"
cli.openstack(cmd='server lock', positional_args=launch_instance)
disk_1 = nova_helper.get_flavors(name="diagnostics-flavor", field="disk")[0]
vcpus_1 = nova_helper.get_flavors(name="diagnostics-flavor", field="vcpus")[0]
assert disk_1 == disk
assert vcpus_1 == vcpus
cli.openstack(cmd='server unlock', positional_args=launch_instance)

View File

@ -0,0 +1,67 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Test to check cpu policy changes correctly.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
import os
from pytest import mark
from consts.stx import GuestImages
from keywords import nova_helper, glance_helper, vm_helper
# Flavor, Image, Volume info
cirros_params = {
"flavor_name": "flavor.small",
"flavor_name_1": "flavor.small1",
"flavor_vcpus": 2,
"flavor_ram": 2048,
"flavor_disk": 4,
"image_name": "cirros",
"image_file": os.path.join(GuestImages.DEFAULT["image_dir"], "cirros-0.4.0-x86_64-disk.img"),
"disk_format": "qcow2"
}
@mark.nova
def test_cli_set_cpu_policy_extra_spec(create_network):
"""
77-CLI-Set-CPU-Policy-Extra-Spec.robot
Args:
create_network:
Returns:
"""
fl_id = nova_helper.create_flavor(name=cirros_params['flavor_name'],
vcpus=cirros_params['flavor_vcpus'],
ram=cirros_params['flavor_ram'],
root_disk=cirros_params['flavor_disk'],
is_public=True, add_default_specs=False,
cleanup="module")[1]
fl_id_1 = nova_helper.create_flavor(name=cirros_params['flavor_name_1'],
vcpus=cirros_params['flavor_vcpus'],
ram=cirros_params['flavor_ram'],
root_disk=cirros_params['flavor_disk'],
is_public=True, add_default_specs=False,
cleanup="module")[1]
im_id = glance_helper.create_image(name=cirros_params['image_name'],
source_image_file=cirros_params['image_file'],
disk_format=cirros_params['disk_format'],
cleanup="module")[1]
nova_helper.set_flavor(fl_id, **{"hw:cpu_policy": "dedicated"})
nova_helper.set_flavor(fl_id_1, **{"hw:cpu_policy": "dedicated"})
net_id_list = [{"net-id": create_network[0]}]
vm_helper.boot_vm(flavor=fl_id, nics=net_id_list,
source="image", source_id=im_id,
cleanup="module")
vm_helper.boot_vm(flavor=fl_id_1, nics=net_id_list,
source="image", source_id=im_id,
cleanup="module")

View File

@ -0,0 +1,52 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# From both Horizon and cli. verify setting CPU Policy in the extra spec to a valid value.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
from pytest import mark
from selenium.webdriver.support.select import Select
from testfixtures.horizon import *
from keywords import nova_helper
from utils import exceptions
from utils.horizon.pages.admin.compute import flavorspage
from utils.tis_log import LOG
@mark.nova
def test_cpu_policy_from_cli_horizon_cpu_policy_extra_spec(admin_home_pg_container):
"""
134-CPUPolicy-From-CLI-Horizon-CPU-Policy-Extra-Spec.robot
Args:
admin_home_pg_container:
Returns:
"""
flavor_id = nova_helper.create_flavor(name="flavor_134", vcpus=1, ram=2048,
root_disk=20, is_public=True,
add_default_specs=False, cleanup="function")[1]
nova_helper.set_flavor(flavor_id, **{"hw:cpu_policy": "dedicated"})
LOG.info(nova_helper.get_flavor_properties("flavor_134"))
LOG.fixture_step('Go to Admin > Compute > Flavors')
flavors_pg = flavorspage.FlavorsPage(
admin_home_pg_container.driver, port=admin_home_pg_container.port)
flavors_pg.go_to_target_page()
row = flavors_pg._get_row_by_flavor_name("flavor_134")
update_metadata_form = flavors_pg.flavors_table.update_metadata(row)
element = update_metadata_form.driver.find_element_by_name("property")
LOG.info("Set the extra spec for cpu policy by Horizon")
Select(element).select_by_value("string:shared")
update_metadata_form.submit()
for k, v in nova_helper.get_flavor_properties("flavor_134").items():
if k == 'hw:cpu_policy':
assert v == 'shared'
break
exceptions.NoMatchFoundError("Flavor property set failed")

View File

@ -0,0 +1,34 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Test to verify error when attempting to create a flavor with CPU value below minimum valid range.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
from pytest import mark
from consts.auth import Tenant
from keywords import nova_helper
from utils import cli
from utils.clients.ssh import ControllerClient
@mark.nova
def test_cpu_scaling_verify_error_attempt_set_minimum_cpu_value_below_valid_range():
"""
131-CPUScaling-Verify-Error-Attempt-Set-Minimum-CPU-Value-Below-Valid-Range.robot
Returns:
"""
con_ssh = ControllerClient.get_active_controller()
nova_helper.create_flavor(name="flavor", vcpus=1, ram=1024, root_disk=4, is_public=True,
add_default_specs=False, cleanup="module")
args = "--ram 2048 --disk 4 --vcpus -1 --public --id auto flavor"
exit_code, output = cli.openstack('flavor create ', args, ssh_client=con_ssh,
fail_ok=True, auth_info=Tenant.get('admin'))
assert "is less than the minimum of" in output

View File

@ -0,0 +1,88 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Migrates an instance and checks for migration success.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
import os
from pytest import fixture, mark
from consts.auth import Tenant
from consts.stx import GuestImages, VMStatus
from keywords import nova_helper, glance_helper, vm_helper
from utils import cli
from utils.clients import ssh
from utils.tis_log import LOG
# Flavor, Image, Volume info
cirros_params = {
"flavor_name": "flavor.small",
"flavor_vcpus": 2,
"flavor_ram": 2048,
"flavor_disk": 4,
"image_name": "cirros",
"image_file": os.path.join(GuestImages.DEFAULT["image_dir"], "cirros-0.4.0-x86_64-disk.img"),
"disk_format": "qcow2"
}
# Creating Flavor For Image
@fixture(scope="module")
def create_flavor_and_image():
fl_id = nova_helper.create_flavor(name=cirros_params['flavor_name'],
vcpus=cirros_params['flavor_vcpus'],
ram=cirros_params['flavor_ram'],
root_disk=cirros_params['flavor_disk'],
is_public=True, add_default_specs=False,
cleanup="module")[1]
im_id = glance_helper.create_image(name=cirros_params['image_name'],
source_image_file=cirros_params['image_file'],
disk_format=cirros_params['disk_format'],
cleanup="module")[1]
return {
"flavor": fl_id,
"image": im_id
}
# Creating Instance
@fixture(scope='module')
def launch_instance(create_network, create_flavor_and_image):
net_id_list = [{"net-id": create_network[0]}]
vm_id = vm_helper.boot_vm(flavor=create_flavor_and_image["flavor"], nics=net_id_list,
source="image", source_id=create_flavor_and_image["image"],
cleanup="module")[1]
return vm_id
@mark.nova
def test_evacuate_migrate_vm(no_aio_system, launch_instance):
"""
73-Evacuate-Migrate-VM
Args:
no_aio_system:
launch_instance:
Returns:
"""
con_ssh = ssh.ControllerClient.get_active_controller()
before_host = vm_helper.get_vm_host(launch_instance, con_ssh=con_ssh)
cli.openstack('server migrate ', launch_instance, ssh_client=con_ssh, fail_ok=False,
auth_info=Tenant.get('admin'), timeout=600)
vm_helper.wait_for_vm_status(vm_id=launch_instance, status=VMStatus.VERIFY_RESIZE, timeout=300,
fail_ok=False, con_ssh=con_ssh)
cli.openstack('server resize ', "{} --confirm".format(launch_instance), ssh_client=con_ssh,
fail_ok=False, auth_info=Tenant.get('admin'), timeout=600)
vm_helper.wait_for_vm_status(vm_id=launch_instance, status=VMStatus.ACTIVE, timeout=300,
fail_ok=False, con_ssh=con_ssh)
after_host = vm_helper.get_vm_host(launch_instance, con_ssh=con_ssh)
LOG.info("before and after host is {} {}".format(before_host, after_host))
assert before_host != after_host, "server migrate failed"

View File

@ -0,0 +1,33 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# This test add access to the flavor.
# Test To Create Flavor And Remove Access.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
from pytest import mark
from keywords import nova_helper
from keywords import keystone_helper
@mark.nova
def test_flavor_adding_access_to_the_flavor():
"""
33-Flavor-Adding-Access-To-The-Flavor.robot
54-Create-Flavor-Remove-Access.robot
Returns:
"""
flavor_id = nova_helper.create_flavor(name='flavor_name', add_default_specs=False,
root_disk=10, is_public=False, cleanup="module")[1]
project_id = keystone_helper.get_projects(**{"Name": "admin"})[0]
nova_helper.set_flavor(flavor_id, project=project_id)
flavor = nova_helper.get_flavor_values(flavor_id, "access_project_ids")
assert flavor[0] == project_id, "flavor create failed"

View File

@ -0,0 +1,78 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Flavor - Flavor in use can not be modified (or deleted)
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
import os
from pytest import fixture, mark
from consts.stx import GuestImages
from keywords import nova_helper, vm_helper, glance_helper
# Flavor, Image, Volume info
cirros_params = {
"flavor_name": "vm-0-flavor",
"flavor_vcpus": 1,
"flavor_ram": 2048,
"flavor_disk": 4,
"image_name": "vm-0-image",
"image_file": os.path.join(GuestImages.DEFAULT["image_dir"], "cirros-0.4.0-x86_64-disk.img"),
"disk_format": "qcow2"
}
# Creating Flavor For Image
@fixture(scope="module")
def create_flavor_and_image():
fl_id = nova_helper.create_flavor(name=cirros_params['flavor_name'],
vcpus=cirros_params['flavor_vcpus'],
ram=cirros_params['flavor_ram'],
root_disk=cirros_params['flavor_disk'],
is_public=True, add_default_specs=False,
cleanup="module")[1]
im_id = glance_helper.create_image(name=cirros_params['image_name'],
source_image_file=cirros_params['image_file'],
disk_format=cirros_params['disk_format'],
cleanup="module")[1]
return {
"flavor": fl_id,
"image": im_id
}
# Creating Instance
@fixture(scope='module')
def launch_instance(create_network, create_flavor_and_image):
net_id_list = [{"net-id": create_network[0]}]
vm_helper.boot_vm(flavor=create_flavor_and_image["flavor"], nics=net_id_list, source="image",
source_id=create_flavor_and_image["image"], cleanup="module")
@mark.nova
def test_flavor_use_cannot_be_modified(launch_instance, create_flavor_and_image):
"""
66-Flavor-Use-Cannot-Be-Modified.robot
refer bug: https://bugs.launchpad.net/starlingx/+bug/1832371
Args:
launch_instance:
create_flavor_and_image:
Returns:
"""
flavor_id = create_flavor_and_image["flavor"]
exit_code = nova_helper.set_flavor(flavor_id, fail_ok=True,
**{"quota:disk_write_bytes_sec": "10485760"})[0]
assert exit_code == 1, "The mpdification of a flavor should " \
"be rejected if in use by the instance"
exit_code = nova_helper.delete_flavors(flavor_id, fail_ok=True)[0]
assert exit_code == 1, "The deletion of a flavor should " \
"be rejected if in use by the instance"

View File

@ -0,0 +1,32 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# MigrationTime - Create Flavor extra spec live migration max
# downtime within valid range for live migration max downtime.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
from pytest import mark
from keywords import nova_helper
@mark.nova
def test_flavor_with_extra_migration_spec():
"""
108-Flavor-With-Extra-Migration-Spec.robot
Returns:
"""
fl_id = nova_helper.create_flavor(name="flavor.small", vcpus=2, ram=2048, root_disk=4,
is_public=True, add_default_specs=False, cleanup="module")[1]
nova_helper.set_flavor(fl_id, **{"hw:wrs:live_m_timeout": "120"})
nova_helper.set_flavor(fl_id, **{"hw:wrs:live_migration_max_downtime": "501"})
result = nova_helper.get_flavor_values(fields="properties", flavor="flavor.small")
assert '120' in result[0]["hw:wrs:live_m_timeout"] and '501' \
in result[0]["hw:wrs:live_migration_max_downtime"]

View File

@ -0,0 +1,99 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Test to validate that volume and snapshot from where an instance has been lunched, can be deleted.
# Launches an instance from a volume snapshot with Local_CoW Image Backed storage.
# Test to check that a snapshot of a volume is created.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
import os
from pytest import fixture, mark
from consts.stx import GuestImages
from keywords import vm_helper, glance_helper, nova_helper, cinder_helper
# Flavor, Image, Volume info
cirros_params = {
"flavor_name": "x1.tiny",
"flavor_vcpus": 1,
"flavor_ram": 512,
"flavor_disk": 10,
"volume_size": 20,
"volume_name": "cirror_vol",
"image_name": "cirros",
"image_file": os.path.join(GuestImages.DEFAULT["image_dir"], "cirros-0.4.0-x86_64-disk.img"),
"disk_format": "qcow2",
"snapshot_name": "cirros-snapshot"
}
# Creating Flavor For Image
@fixture(scope="module")
def create_flavor_and_image():
fl_id = nova_helper.create_flavor(name=cirros_params['flavor_name'],
vcpus=cirros_params['flavor_vcpus'],
ram=cirros_params['flavor_ram'],
root_disk=cirros_params['flavor_disk'],
is_public=True, add_default_specs=False,
cleanup="module")[1]
im_id = glance_helper.create_image(name=cirros_params['image_name'],
source_image_file=cirros_params['image_file'],
disk_format=cirros_params['disk_format'],
cleanup="module")[1]
return {
"flavor": fl_id,
"image": im_id
}
# Creating Volume For Instances
@fixture(scope="module")
def create_volume(create_flavor_and_image):
return cinder_helper.create_volume(name=cirros_params['volume_name'], source_type='image',
source_id=create_flavor_and_image["image"],
size=cirros_params['volume_size'], cleanup="module")[1]
@fixture(scope="module")
def snapshot_from_instance(create_flavor_and_image, create_volume):
return cinder_helper.create_volume_snapshot(name=cirros_params['snapshot_name'],
volume=create_volume, cleanup="module")[1]
# Creating Instance
@fixture(scope='module')
def launch_instance(create_network, create_flavor_and_image, snapshot_from_instance):
net_id_list = [{"net-id": create_network[0]}]
vm_helper.boot_vm(flavor=create_flavor_and_image["flavor"], nics=net_id_list,
source="snapshot", source_id=snapshot_from_instance,
cleanup="module")
@mark.nova
def test_local_storage_delete_volume_snapshot_instance_launched(launch_instance,
create_flavor_and_image,
create_volume,
snapshot_from_instance):
"""
67-Local-Storage-Delete-VolumeSnapshot-Instance-Launched.robot
118-Volume-Snapshot-Instance.robot
121-Check-Snapshot-Volume.robot
Args:
launch_instance:
create_flavor_and_image:
create_volume:
snapshot_from_instance:
Returns:
"""
assert create_flavor_and_image["image"]
assert create_volume
assert snapshot_from_instance

View File

@ -0,0 +1,59 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Creates instance that launches in error, catches error, and deletes instance with error.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
import os
from pytest import mark
from consts.stx import GuestImages
from keywords import nova_helper, vm_helper, glance_helper
# Flavor, Image, Volume info
cirros_params = {
"flavor_name": "vm-flavor",
"flavor_vcpus": 1,
"flavor_ram": 2048,
"flavor_disk": 4,
"image_name": "vm-image",
"image_file": os.path.join(GuestImages.DEFAULT["image_dir"], "cirros-0.4.0-x86_64-disk.img"),
"disk_format": "qcow2"
}
@mark.nova
def test_nova_error_instance_delete(no_aio_system, create_network):
"""
76-Nova-Error-Instance-Delete.robot
Args:
no_aio_system:
create_network:
Returns:
"""
fl_id = nova_helper.create_flavor(name=cirros_params['flavor_name'],
vcpus=cirros_params['flavor_vcpus'],
ram=cirros_params['flavor_ram'],
root_disk=cirros_params['flavor_disk'],
is_public=True, add_default_specs=False,
cleanup="module")[1]
im_id = glance_helper.create_image(name=cirros_params['image_name'],
source_image_file=cirros_params['image_file'],
disk_format=cirros_params['disk_format'],
cleanup="module")[1]
net_id_list = [{"net-id": create_network[0]}]
nova_helper.set_flavor(fl_id, **{"hw:cpu_model": "Skylake-Server"})
nova_helper.set_flavor(fl_id, **{"hw:cpu_policy": "dedicated"})
vm_id = vm_helper.boot_vm(flavor=fl_id, nics=net_id_list, source="image",
source_id=im_id)[1]
vm_helper.set_vm_state(vm_id)
vm_helper.delete_vms(vm_id)

View File

@ -0,0 +1,30 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# RecoveryHeartBeat - Using cli set flavor extra sw:wrs:guest:heartbeat to valid values.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
from pytest import mark
from keywords import nova_helper
@mark.nova
def test_recovery_heartbeat_to_valid_values():
"""
150-Recovery-HeartBeat-To-Valid-Values.robot
Returns:
"""
fl_id = nova_helper.create_flavor(name='flavor', ram=2048, vcpus=2, root_disk=4, is_public=True,
add_default_specs=False, cleanup="module")[1]
nova_helper.set_flavor(fl_id, **{"sw:wrs:guest:heartbeat": "TRUE"})
nova_helper.set_flavor(fl_id, **{"sw:wrs:guest:heartbeat": "False"})
nova_helper.set_flavor(fl_id, **{"sw:wrs:guest:heartbeat": "true"})
nova_helper.set_flavor(fl_id, **{"sw:wrs:guest:heartbeat": "FALSE"})

View File

@ -0,0 +1,96 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# SharedCPU - Instance with hw:wrs:shared_vcpu respected on resize.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
import os
from pytest import fixture, mark
from consts.stx import GuestImages
from keywords import nova_helper, glance_helper, host_helper, system_helper, vm_helper
from utils import table_parser, cli
# Flavor, Image, Volume info
cirros_params = {
"flavor_name": "flavor.small",
"flavor_name_1": "flavor.small_1",
"flavor_vcpus": 2,
"flavor_ram": 2048,
"flavor_disk": 4,
"image_name": "cirros",
"image_file": os.path.join(GuestImages.DEFAULT["image_dir"], "cirros-0.4.0-x86_64-disk.img"),
"disk_format": "qcow2"
}
# Creating Flavor For Image
@fixture(scope="module")
def create_flavor_and_image():
fl_id = nova_helper.create_flavor(name=cirros_params['flavor_name'],
vcpus=cirros_params['flavor_vcpus'],
ram=cirros_params['flavor_ram'],
root_disk=cirros_params['flavor_disk'],
is_public=True, add_default_specs=False,
cleanup="module")[1]
fl_id_1 = nova_helper.create_flavor(name=cirros_params['flavor_name_1'],
vcpus=cirros_params['flavor_vcpus'],
ram=cirros_params['flavor_ram'],
root_disk=cirros_params['flavor_disk'],
is_public=True, add_default_specs=False,
cleanup="module")[1]
im_id = glance_helper.create_image(name=cirros_params['image_name'],
source_image_file=cirros_params['image_file'],
disk_format=cirros_params['disk_format'],
cleanup="module")[1]
return {
"flavor": fl_id,
"flavor_1": fl_id_1,
"image": im_id
}
# Creating Instance
@fixture(scope='module')
def launch_instance(create_network, create_flavor_and_image):
net_id_list = [{"net-id": create_network[0]}]
vm_id = vm_helper.boot_vm(flavor=create_flavor_and_image["flavor"], nics=net_id_list,
source="image", source_id=create_flavor_and_image["image"],
cleanup="module")[1]
return vm_id
@mark.nova
def test_sharedcpu(no_aio_system, create_flavor_and_image, launch_instance):
"""
72-SharedCPU.robot
Args:
no_aio_system:
create_flavor_and_image:
launch_instance:
Returns:
"""
computes = system_helper.get_computes()
table_ = table_parser.table(cli.system('host-cpu-list', computes[0])[1])
functions = table_parser.get_values(table_=table_,
target_header='assigned_function')
if "Shared" not in functions:
host_helper.lock_host(computes[0])
host_helper.modify_host_cpu(computes[0], "shared", **{"p0": "1"})
host_helper.unlock_host(computes[0])
nova_helper.set_flavor(create_flavor_and_image["flavor_1"], **{"hw:cpu_policy": "dedicated"})
nova_helper.set_flavor(create_flavor_and_image["flavor_1"], **{"hw:wrs:shared_vcpu": "1"})
vm_helper.resize_vm(launch_instance, create_flavor_and_image["flavor_1"])
cli.system('cpuprofile-add profile-test ', computes[1])
host_helper.lock_host(computes[0])
host_helper.apply_host_cpu_profile(computes[0], "profile-test")
host_helper.unlock_host(computes[0])

View File

@ -0,0 +1,28 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Test to create a flavor and modify metadata.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
from pytest import mark
from keywords import nova_helper
@mark.nova
def test_sharedcpu_flavor_dedicated_shared_vcpu():
"""
82-SharedCPU-Flavor-Dedicated-Shared-VCPU.robot
Returns:
"""
fl_id = nova_helper.create_flavor(name='m3.tiny', ram=512, vcpus=2, root_disk=4, is_public=True,
add_default_specs=False, cleanup="module")[1]
nova_helper.set_flavor(fl_id, **{"hw:wrs:share_vcpu": "1"})
nova_helper.set_flavor(fl_id, **{"hw:cpu_policy": "dedicated"})

View File

@ -0,0 +1,71 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# ImageSnapshot - snapshot a running server, show snapshot and delete image.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
import os
from pytest import fixture, mark
from consts.stx import GuestImages
from keywords import nova_helper, vm_helper, glance_helper
# Flavor, Image, Volume info
cirros_params = {
"flavor_name": "diagnostics-flavor",
"flavor_vcpus": 1,
"flavor_ram": 2048,
"flavor_disk": 4,
"image_name": "diagnostics-image",
"image_file": os.path.join(GuestImages.DEFAULT["image_dir"], "cirros-0.4.0-x86_64-disk.img"),
"disk_format": "qcow2"
}
# Creating Flavor For Image
@fixture(scope="module")
def create_flavor_and_image():
fl_id = nova_helper.create_flavor(name=cirros_params['flavor_name'],
vcpus=cirros_params['flavor_vcpus'],
ram=cirros_params['flavor_ram'],
root_disk=cirros_params['flavor_disk'],
is_public=True, add_default_specs=False,
cleanup="module")[1]
im_id = glance_helper.create_image(name=cirros_params['image_name'],
source_image_file=cirros_params['image_file'],
disk_format=cirros_params['disk_format'],
cleanup="module")[1]
return {
"flavor": fl_id,
"image": im_id
}
# Creating Instance
@fixture(scope='module')
def launch_instance(create_network, create_flavor_and_image):
net_id_list = [{"net-id": create_network[0]}]
return vm_helper.boot_vm(flavor=create_flavor_and_image["flavor"], nics=net_id_list,
source="image", source_id=create_flavor_and_image["image"],
cleanup="module")[1]
@mark.nova
def test_snapshot_show_and_delete_image(launch_instance):
"""
89-Snapshot-Show-And-Delete-Image.robot
Args:
launch_instance:
Returns:
"""
img_id = glance_helper.create_image(name="launch_instance", cleanup="module")[1]
glance_helper.delete_images(img_id)

View File

@ -0,0 +1,42 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Test To Update Aggregate And Add Host.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
from pytest import mark
from consts.auth import Tenant
from keywords import nova_helper, system_helper
from utils import cli
from utils.clients.ssh import ControllerClient
@mark.nova
def test_update_aggregate_add_host(no_aio_system):
"""
68-Update-Aggregate-Add-Host.robot
Args:
no_aio_system:
Returns:
"""
host = system_helper.get_computes()[0]
con_ssh = ControllerClient.get_active_controller()
nova_helper.create_aggregate(name="local_storage_image_hosts")
nova_helper.set_aggregate("local_storage_image_hosts", zone="nova")
code, output = cli.openstack("aggregate add host", "local_storage_image_hosts {}".format(host),
ssh_client=con_ssh, fail_ok=False, auth_info=Tenant.get('admin'))
assert code == 0, output
code, output = cli.openstack("aggregate remove host", "local_storage_image_hosts {}"
.format(host), ssh_client=con_ssh, fail_ok=False,
auth_info=Tenant.get('admin'))
assert code == 0, output
nova_helper.delete_aggregates("local_storage_image_hosts")

View File

@ -0,0 +1,35 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Local Storage - Update metadata in volume and snapshot.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
from pytest import mark
from consts.auth import Tenant
from keywords import cinder_helper
from utils import cli
from utils.clients.ssh import ControllerClient
@mark.nova
def test_update_metadata_volume_snapshot():
"""
173-Update-Metadata-Volume-Snapshot.robot
Returns:
"""
con_ssh = ControllerClient.get_active_controller()
vol_id = cinder_helper.create_volume(name="cirror_vol_test", size=1, cleanup="module")[1]
cli.openstack('volume set ', '--property {} {}'.format("hw_cpu_maxcores='7'", vol_id),
ssh_client=con_ssh, auth_info=Tenant.get('admin'))
snapshot = cinder_helper.create_volume_snapshot("cirror_vol_test")[1]
cli.openstack('volume snapshot set ', '--property {} {}'.format("hw_cpu_maxcores='7'", snapshot),
ssh_client=con_ssh, auth_info=Tenant.get('admin'))
cinder_helper.delete_volume_snapshots(snapshot)

View File

@ -0,0 +1,51 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Test to Verify CPU Policy Options in GUI.
# CPUPolicy - Test case sensitive entries for the value of the hw:cpu_policy.
# Validate Partition Modify operations.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
from pytest import mark
from selenium.webdriver.support.select import Select
from keywords import nova_helper
from testfixtures.horizon import *
from utils.horizon.pages.admin.compute import flavorspage
from utils.tis_log import LOG
@mark.nova
def test_verify_values_for_cpu_policy(admin_home_pg_container):
"""
80-Verify-Values-For-Cpu-Policy.robot
103-Sensitive-Entries-For-Hwcpu.robot
137-CPUPolicy-Invalid-Or-Empty-Values.robot
Returns:
"""
fl_id = nova_helper.create_flavor(name='nova_new', ram=2048, root_disk=10, is_public=True,
add_default_specs=False, cleanup="module")[1]
LOG.fixture_step('Go to Admin > Compute > Flavors')
flavors_pg = flavorspage.FlavorsPage(
admin_home_pg_container.driver, port=admin_home_pg_container.port)
flavors_pg.go_to_target_page()
row = flavors_pg._get_row_by_flavor_name("nova_new")
nova_helper.set_flavor(fl_id, **{"hw:cpu_policy": "shared"})
update_metadata_form = flavors_pg.flavors_table.update_metadata(row)
element = update_metadata_form.driver.find_element_by_name("property")
assert Select(element).first_selected_option.text == "shared"
update_metadata_form.cancel()
nova_helper.set_flavor(fl_id, **{"hw:cpu_policy": "dedicated"})
update_metadata_form_1 = flavors_pg.flavors_table.update_metadata(row)
element_1 = update_metadata_form_1.driver.find_element_by_name("property")
assert Select(element_1).first_selected_option.text == "dedicated"
update_metadata_form_1.cancel()
nova_helper.set_flavor(fl_id, **{"hw:cpu_policy": "bogus"})
nova_helper.set_flavor(fl_id, **{"hw:cpu_policy": ""})

View File

@ -0,0 +1,75 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Test to check vm response to reboot of the active compute.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
import os
from pytest import fixture, mark
from consts.stx import GuestImages
from keywords import nova_helper, glance_helper, vm_helper, host_helper
# Flavor, Image, Volume info
cirros_params = {
"flavor_name": "flavor.small",
"flavor_vcpus": 2,
"flavor_ram": 2048,
"flavor_disk": 4,
"image_name": "cirros",
"image_file": os.path.join(GuestImages.DEFAULT["image_dir"], "cirros-0.4.0-x86_64-disk.img"),
"disk_format": "qcow2"
}
# Creating Flavor For Image
@fixture(scope="module")
def create_flavor_and_image():
fl_id = nova_helper.create_flavor(name=cirros_params['flavor_name'],
vcpus=cirros_params['flavor_vcpus'],
ram=cirros_params['flavor_ram'],
root_disk=cirros_params['flavor_disk'],
is_public=True, add_default_specs=False,
cleanup="module")[1]
im_id = glance_helper.create_image(name=cirros_params['image_name'],
source_image_file=cirros_params['image_file'],
disk_format=cirros_params['disk_format'],
cleanup="module")[1]
return {
"flavor": fl_id,
"image": im_id
}
# Creating Instance
@fixture(scope='module')
def launch_instance(create_network, create_flavor_and_image):
net_id_list = [{"net-id": create_network[0]}]
vm_id = vm_helper.boot_vm(flavor=create_flavor_and_image["flavor"], nics=net_id_list,
source="image", source_id=create_flavor_and_image["image"],
cleanup="module")[1]
return vm_id
@mark.nova
def test_verify_values_for_mem_page_size(no_aio_system, launch_instance):
"""
78-Verify-Values-For-Mem-Page-Size.robot
Args:
no_aio_system:
launch_instance:
Returns:
"""
host = vm_helper.get_vm_host(launch_instance)
host_helper.reboot_hosts(host)
after_host = vm_helper.get_vm_host(launch_instance)
assert after_host != host, "vm auto migrate failed"

View File

@ -0,0 +1,67 @@
###
#
# Copyright (c) 2021 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#
# Local Storage - Launch instance from volume snapshote with Local_CoW Image Backed storage.
#
# Author(s): Yong.Fu <yongx.fu@intel.com>
#
###
import time
import os
from pytest import mark
from consts.stx import GuestImages, VMStatus
from keywords import glance_helper, nova_helper, cinder_helper, vm_helper
from testfixtures.fixture_resources import ResourceCleanup
from testfixtures.horizon import *
from utils.tis_log import LOG
from utils.horizon.pages.project.compute import instancespage
from utils.horizon.pages.project.volumes import volumespage
@mark.nova
def test_volume_snapshot_instance_horizon(tenant_home_pg_container, create_network):
"""
200-Volume-Snapshot-Instance-Horizon.robot
Args:
tenant_home_pg_container:
create_network:
Returns:
"""
nova_helper.create_flavor(name="flavor", vcpus=1, ram=2048, root_disk=4, is_public=True,
add_default_specs=False, cleanup="function")
glance_helper.create_image(name="cirros", disk_format="qcow2", cleanup="function",
source_image_file=os.path.join(GuestImages.DEFAULT["image_dir"],
"cirros-0.4.0-x86_64-disk.img"))
LOG.fixture_step('Go to Project > Volumes > Volumes')
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_200")
snapshot_id = cinder_helper.get_volume_snapshot_values("snapshot_200", fields="ID")[0]
cinder_helper.wait_for_vol_snapshot_status(snapshot_id, status='available')
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_200", flavor_name="flavor",
network_names="network")
time.sleep(30)
vm_id = vm_helper.get_vms(**{"Name": "cirros-snap-vm"})[0]
vm_helper.wait_for_vm_status(vm_id=vm_id, status=VMStatus.ACTIVE)
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

@ -10,7 +10,6 @@ from utils.horizon.regions import tables
from utils.horizon.regions import menus
from consts.stx import Networks
class LaunchInstanceForm(forms.TabbedFormRegion):
_submit_locator = (by.By.XPATH, '//button[@class="btn btn-primary finish"]')
_fields_locator = (by.By.XPATH, "//div[starts-with(@class,'step ng-scope')]")
@ -237,16 +236,17 @@ class InstancesPage(basepage.BasePage):
instance_form.fields['boot-source-type'].text = boot_source_type
time.sleep(1)
instance_form._init_tab_fields(1)
if create_new_volume is True:
instance_form.fields['Create New Volume'].click_yes()
if delete_volume_on_instance_delete is True:
instance_form.fields['Delete Volume on Instance Delete'].click_yes()
if delete_volume_on_instance_delete is False:
instance_form.fields['Delete Volume on Instance Delete'].click_no()
if create_new_volume is False:
instance_form.fields['Create New Volume'].click_no()
if volume_size is not None:
instance_form.fields['volume-size'].value = volume_size
if boot_source_type == "Image" or boot_source_type == "Instance Snapshot":
if create_new_volume is True:
instance_form.fields['Create New Volume'].click_yes()
if delete_volume_on_instance_delete is True:
instance_form.fields['Delete Volume on Instance Delete'].click_yes()
if delete_volume_on_instance_delete is False:
instance_form.fields['Delete Volume on Instance Delete'].click_no()
if create_new_volume is False:
instance_form.fields['Create New Volume'].click_no()
if volume_size is not None:
instance_form.fields['volume-size'].value = volume_size
instance_form.addelement('Name', source_name)
instance_form.switch_to(2)
instance_form.addelement('Name', flavor_name)