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:
|
compute:
|
||||||
cpu_dedicated_set: '0-3'
|
cpu_dedicated_set: '0-3'
|
||||||
cpu_shared_set: '4,5'
|
cpu_shared_set: '4,5'
|
||||||
|
max_disk_devices_to_attach: '7'
|
||||||
libvirt:
|
libvirt:
|
||||||
cpu_mode: custom
|
cpu_mode: custom
|
||||||
cpu_models: Nehalem
|
cpu_models: Nehalem
|
||||||
@ -85,6 +86,7 @@
|
|||||||
compute:
|
compute:
|
||||||
cpu_dedicated_set: '4-7'
|
cpu_dedicated_set: '4-7'
|
||||||
cpu_shared_set: '2,3'
|
cpu_shared_set: '2,3'
|
||||||
|
max_disk_devices_to_attach: '7'
|
||||||
libvirt:
|
libvirt:
|
||||||
cpu_mode: custom
|
cpu_mode: custom
|
||||||
cpu_models: Nehalem
|
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 cpu_model_extra_flags $WHITEBOX_CPU_MODEL_EXTRA_FLAGS
|
||||||
iniset $TEMPEST_CONFIG whitebox rx_queue_size $WHITEBOX_RX_QUEUE_SIZE
|
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 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 config_path "$WHITEBOX_NOVA_COMPUTE_CONFIG_PATH"
|
||||||
iniset $TEMPEST_CONFIG whitebox-nova-compute stop_command "$WHITEBOX_NOVA_COMPUTE_STOP_COMMAND"
|
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_FILE_BACKED_MEMORY_SIZE=${WHITEBOX_FILE_BACKED_MEMORY_SIZE:-8192}
|
||||||
WHITEBOX_RX_QUEUE_SIZE=${WHITEBOX_RX_QUEUE_SIZE:-1024}
|
WHITEBOX_RX_QUEUE_SIZE=${WHITEBOX_RX_QUEUE_SIZE:-1024}
|
||||||
WHITEBOX_DEFAULT_VIDEO_MODEL=${WHITEBOX_DEFAULT_VIDEO_MODEL:-'virtio'}
|
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_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'}
|
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
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import testtools
|
|
||||||
|
|
||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
from tempest import config
|
from tempest import config
|
||||||
|
from tempest.lib.exceptions import Forbidden
|
||||||
|
|
||||||
from whitebox_tempest_plugin.api.compute import base
|
from whitebox_tempest_plugin.api.compute import base
|
||||||
|
|
||||||
@ -25,15 +24,10 @@ CONF = config.CONF
|
|||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class VirtioSCSIDisk(base.BaseWhiteboxComputeTest):
|
class VirtioSCSIBase(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
|
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(VirtioSCSIDisk, self).setUp()
|
super(VirtioSCSIBase, self).setUp()
|
||||||
# NOTE: Flavor and image are common amongst every test of the class
|
# NOTE: Flavor and image are common amongst every test of the class
|
||||||
# so setting them once in setUP method.
|
# so setting them once in setUP method.
|
||||||
self.flavor = self.create_flavor()
|
self.flavor = self.create_flavor()
|
||||||
@ -101,11 +95,29 @@ class VirtioSCSIDisk(base.BaseWhiteboxComputeTest):
|
|||||||
None]
|
None]
|
||||||
return serial_ids
|
return serial_ids
|
||||||
|
|
||||||
@testtools.skipUnless(CONF.whitebox.available_cinder_storage >
|
|
||||||
(CONF.whitebox.flavor_volume_size + disks_to_create),
|
class VirtioSCSIDiskMultiAttachment(VirtioSCSIBase):
|
||||||
'Need more than %sGB of storage to execute'
|
# NOTE: The class variable disk_to_create is specifically set to seven in
|
||||||
% (CONF.whitebox.flavor_volume_size + disks_to_create
|
# 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):
|
def test_boot_with_multiple_disks(self):
|
||||||
"""Using block device mapping, boot an instance with more than six
|
"""Using block device mapping, boot an instance with more than six
|
||||||
volumes. Total volume count is determined by class variable
|
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
|
# Assert that the attached volume ids are present as serials
|
||||||
self.assertCountEqual(attached_volume_ids, attached_serial_ids)
|
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):
|
def test_attach_multiple_scsi_disks(self):
|
||||||
"""After booting an instance from an image with virtio-scsi properties
|
"""After booting an instance from an image with virtio-scsi properties
|
||||||
attach multiple additional virtio-scsi disks to the point that the
|
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
|
# Assert that the volume IDs we attached are present in the serials
|
||||||
self.assertCountEqual(vol_ids, attached_serial_ids)
|
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(
|
cfg.StrOpt(
|
||||||
'default_video_model',
|
'default_video_model',
|
||||||
default=None,
|
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(
|
nova_compute_group = cfg.OptGroup(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user