Add check for max disk attach
The commit [1] added a THT parameter that can set the maximum number of disks that can be attached to a single guest. Refactored VirtioSCSIDisk into ultimately three new classes. * VirtioSCSIBase - parent class hold standard setup and supporting methods for test cases * VirtioSCSIDiskMultiAttachment - repuprose of the test methods from VirtioSCSIDisk which are meant to test guest support of six or more disks * VirtioSCSIDiskRestrictAttachments - New test method that validates [1] is being enforced correctly. Since [1] could be set to a value less than six, added skip checks for VirtioSCSIDiskMultiAttachment if the max allowed disks that can be attached are six or less. [1] https://review.opendev.org/c/openstack/puppet-nova/+/708666/ Change-Id: I78f7f47ffa2644c71945bba2b5c1af29e0603363
This commit is contained in:
parent
5e6f6f5fd5
commit
9f98d0aaf9
@ -66,6 +66,7 @@
|
||||
compute:
|
||||
cpu_dedicated_set: '0-3'
|
||||
cpu_shared_set: '4,5'
|
||||
max_disk_devices_to_attach: '7'
|
||||
libvirt:
|
||||
cpu_mode: custom
|
||||
cpu_models: Nehalem
|
||||
@ -85,6 +86,7 @@
|
||||
compute:
|
||||
cpu_dedicated_set: '4-7'
|
||||
cpu_shared_set: '2,3'
|
||||
max_disk_devices_to_attach: '7'
|
||||
libvirt:
|
||||
cpu_mode: custom
|
||||
cpu_models: Nehalem
|
||||
|
@ -17,6 +17,7 @@ function configure {
|
||||
iniset $TEMPEST_CONFIG whitebox cpu_model_extra_flags $WHITEBOX_CPU_MODEL_EXTRA_FLAGS
|
||||
iniset $TEMPEST_CONFIG whitebox rx_queue_size $WHITEBOX_RX_QUEUE_SIZE
|
||||
iniset $TEMPEST_CONFIG whitebox default_video_model $WHITEBOX_DEFAULT_VIDEO_MODEL
|
||||
iniset $TEMPEST_CONFIG whitebox max_disk_devices_to_attach $WHITEBOX_MAX_DISK_DEVICES_TO_ATTACH
|
||||
|
||||
iniset $TEMPEST_CONFIG whitebox-nova-compute config_path "$WHITEBOX_NOVA_COMPUTE_CONFIG_PATH"
|
||||
iniset $TEMPEST_CONFIG whitebox-nova-compute stop_command "$WHITEBOX_NOVA_COMPUTE_STOP_COMMAND"
|
||||
|
@ -5,6 +5,7 @@ SMT_HOSTS=${SMT_HOSTS:-''}
|
||||
WHITEBOX_FILE_BACKED_MEMORY_SIZE=${WHITEBOX_FILE_BACKED_MEMORY_SIZE:-8192}
|
||||
WHITEBOX_RX_QUEUE_SIZE=${WHITEBOX_RX_QUEUE_SIZE:-1024}
|
||||
WHITEBOX_DEFAULT_VIDEO_MODEL=${WHITEBOX_DEFAULT_VIDEO_MODEL:-'virtio'}
|
||||
WHITEBOX_MAX_DISK_DEVICES_TO_ATTACH=${WHITEBOX_MAX_DISK_DEVICES_TO_ATTACH:-7}
|
||||
|
||||
WHITEBOX_NOVA_COMPUTE_CONFIG_PATH=${WHITEBOX_NOVA_COMPUTE_CONFIG_PATH:-/etc/nova/nova-cpu.conf}
|
||||
WHITEBOX_NOVA_COMPUTE_STOP_COMMAND=${WHITEBOX_NOVA_COMPUTE_STOP_COMMAND:-'systemctl stop devstack@n-cpu'}
|
||||
|
@ -13,10 +13,9 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import testtools
|
||||
|
||||
from oslo_log import log as logging
|
||||
from tempest import config
|
||||
from tempest.lib.exceptions import Forbidden
|
||||
|
||||
from whitebox_tempest_plugin.api.compute import base
|
||||
|
||||
@ -25,15 +24,10 @@ CONF = config.CONF
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class VirtioSCSIDisk(base.BaseWhiteboxComputeTest):
|
||||
# NOTE: The class variable disk_to_create is specifically set to seven in
|
||||
# order to validate Nova bug 1686116 beyond six disks, minimum number of
|
||||
# disks present on a VM should be greater than six for tests to function
|
||||
# appropriately
|
||||
disks_to_create = 7
|
||||
class VirtioSCSIBase(base.BaseWhiteboxComputeTest):
|
||||
|
||||
def setUp(self):
|
||||
super(VirtioSCSIDisk, self).setUp()
|
||||
super(VirtioSCSIBase, self).setUp()
|
||||
# NOTE: Flavor and image are common amongst every test of the class
|
||||
# so setting them once in setUP method.
|
||||
self.flavor = self.create_flavor()
|
||||
@ -101,11 +95,29 @@ class VirtioSCSIDisk(base.BaseWhiteboxComputeTest):
|
||||
None]
|
||||
return serial_ids
|
||||
|
||||
@testtools.skipUnless(CONF.whitebox.available_cinder_storage >
|
||||
(CONF.whitebox.flavor_volume_size + disks_to_create),
|
||||
'Need more than %sGB of storage to execute'
|
||||
% (CONF.whitebox.flavor_volume_size + disks_to_create
|
||||
))
|
||||
|
||||
class VirtioSCSIDiskMultiAttachment(VirtioSCSIBase):
|
||||
# NOTE: The class variable disk_to_create is specifically set to seven in
|
||||
# order to validate Nova bug 1686116 beyond six disks, minimum number of
|
||||
# disks present on a VM should be greater than six for tests to function
|
||||
# appropriately
|
||||
disks_to_create = 7
|
||||
|
||||
@classmethod
|
||||
def skip_checks(cls):
|
||||
super(VirtioSCSIDiskMultiAttachment, cls).skip_checks()
|
||||
if getattr(CONF.whitebox, 'max_disk_devices_to_attach', None):
|
||||
if CONF.whitebox.max_disk_devices_to_attach < cls.disks_to_create:
|
||||
msg = "Tests may only run if allowed disk attachment " \
|
||||
"is %s or more devices" % cls.disks_to_create
|
||||
raise cls.skipException(msg)
|
||||
required_disk_space = \
|
||||
CONF.whitebox.flavor_volume_size + cls.disks_to_create
|
||||
if CONF.whitebox.available_cinder_storage < required_disk_space:
|
||||
msg = "Need more than %sGB of storage to execute" \
|
||||
% required_disk_space
|
||||
raise cls.skipException(msg)
|
||||
|
||||
def test_boot_with_multiple_disks(self):
|
||||
"""Using block device mapping, boot an instance with more than six
|
||||
volumes. Total volume count is determined by class variable
|
||||
@ -157,11 +169,6 @@ class VirtioSCSIDisk(base.BaseWhiteboxComputeTest):
|
||||
# Assert that the attached volume ids are present as serials
|
||||
self.assertCountEqual(attached_volume_ids, attached_serial_ids)
|
||||
|
||||
@testtools.skipUnless(CONF.whitebox.available_cinder_storage >
|
||||
(CONF.whitebox.flavor_volume_size + disks_to_create),
|
||||
'Need more than %sGB of storage to execute'
|
||||
% (CONF.whitebox.flavor_volume_size + disks_to_create
|
||||
))
|
||||
def test_attach_multiple_scsi_disks(self):
|
||||
"""After booting an instance from an image with virtio-scsi properties
|
||||
attach multiple additional virtio-scsi disks to the point that the
|
||||
@ -204,3 +211,71 @@ class VirtioSCSIDisk(base.BaseWhiteboxComputeTest):
|
||||
|
||||
# Assert that the volume IDs we attached are present in the serials
|
||||
self.assertCountEqual(vol_ids, attached_serial_ids)
|
||||
|
||||
|
||||
class VirtioSCSIDiskRestrictAttachments(VirtioSCSIBase):
|
||||
|
||||
@classmethod
|
||||
def skip_checks(cls):
|
||||
super(VirtioSCSIDiskRestrictAttachments, cls).skip_checks()
|
||||
if getattr(CONF.whitebox, 'max_disk_devices_to_attach', None) is None:
|
||||
msg = "Requires max_disk_devices_to_attach to be explicitly set " \
|
||||
"in the deployment to test"
|
||||
raise cls.skipException(msg)
|
||||
required_disk_space = CONF.whitebox.flavor_volume_size + \
|
||||
CONF.whitebox.max_disk_devices_to_attach
|
||||
if CONF.whitebox.available_cinder_storage < required_disk_space:
|
||||
msg = "Need more than %sGB of storage to execute" \
|
||||
% required_disk_space
|
||||
raise cls.skipException(msg)
|
||||
|
||||
def test_max_iscsi_disks_attachment_enforced(self):
|
||||
"""After booting an instance from an image with virtio-scsi properties
|
||||
attach multiple additional virtio-scsi disks to the point that the
|
||||
instance reaches the limit of allowed attached disks. After confirming
|
||||
they are all attached correctly, add one more volume and confirm the
|
||||
action is Forbidden.
|
||||
"""
|
||||
disks_to_create = CONF.whitebox.max_disk_devices_to_attach
|
||||
server = self.create_test_server(flavor=self.flavor['id'],
|
||||
image_id=self.img_id,
|
||||
wait_until='ACTIVE')
|
||||
vol_ids = []
|
||||
# A virtio-scsi disk has already been attached to the server's disk
|
||||
# controller since hw_scsi_model of the image was already set to
|
||||
# 'virtio-scsi' in self.setUp(). Decrementing disks_to_create by 1.
|
||||
for _ in range(disks_to_create - 1):
|
||||
volume = self.create_volume(size=1)
|
||||
vol_ids.append(volume['id'])
|
||||
self.addCleanup(self.delete_volume, volume['id'])
|
||||
self.attach_volume(server, volume)
|
||||
|
||||
disk_ctrl = self.get_scsi_disk_controllers(server_id=server['id'])
|
||||
self.assertEqual(len(disk_ctrl), 1,
|
||||
"One and only one SCSI Disk controller should have "
|
||||
"been created but instead "
|
||||
"found: {} controllers".format(len(disk_ctrl)))
|
||||
|
||||
cntrl_index = disk_ctrl[0].attrib['index']
|
||||
scsi_disks = self.get_scsi_disks(server_id=server['id'],
|
||||
controller_index=cntrl_index)
|
||||
self.assertEqual(len(scsi_disks),
|
||||
disks_to_create,
|
||||
"Expected {} disks but only "
|
||||
"found {}".format(disks_to_create,
|
||||
len(scsi_disks)))
|
||||
|
||||
attached_volume_ids = self.get_attached_volume_ids(server['id'])
|
||||
attached_serial_ids = self.get_attached_serial_ids(scsi_disks)
|
||||
|
||||
# Assert that the volumes IDs we attached are listed as attached
|
||||
self.assertCountEqual(vol_ids, attached_volume_ids)
|
||||
|
||||
# Assert that the volume IDs we attached are present in the serials
|
||||
self.assertCountEqual(vol_ids, attached_serial_ids)
|
||||
|
||||
# Create and attempt to attach one more volume to guest and confirm
|
||||
# action is forbidden
|
||||
volume = self.create_volume(size=1)
|
||||
self.addCleanup(self.delete_volume, volume['id'])
|
||||
self.assertRaises(Forbidden, self.attach_volume, server, volume)
|
||||
|
@ -121,7 +121,11 @@ general_opts = [
|
||||
cfg.StrOpt(
|
||||
'default_video_model',
|
||||
default=None,
|
||||
help='The expected default video display for the guest')
|
||||
help='The expected default video display for the guest'),
|
||||
cfg.IntOpt(
|
||||
'max_disk_devices_to_attach',
|
||||
default=None,
|
||||
help='Maximum number of disks allowed to attach to a singler server')
|
||||
]
|
||||
|
||||
nova_compute_group = cfg.OptGroup(
|
||||
|
Loading…
x
Reference in New Issue
Block a user