From a0b161bbde6d7734833a26ced76ca44b888fe152 Mon Sep 17 00:00:00 2001 From: melanie witt Date: Fri, 1 Dec 2023 23:41:44 +0000 Subject: [PATCH] Handle split kernel/ramdisk images Change-Id: I39462a3374c816c855670ff88d3b9556baedce7a --- tempest/api/compute/admin/test_volume.py | 5 ++ tempest/scenario/manager.py | 58 ++++++++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/tempest/api/compute/admin/test_volume.py b/tempest/api/compute/admin/test_volume.py index e7c931ed09..2813d7a756 100644 --- a/tempest/api/compute/admin/test_volume.py +++ b/tempest/api/compute/admin/test_volume.py @@ -59,6 +59,11 @@ class BaseAttachSCSIVolumeTest(base.BaseV2ComputeAdminTest): 'min_ram': image['min_ram'], 'visibility': 'public', } + if 'kernel_id' in image: + create_dict['kernel_id'] = image['kernel_id'] + if 'ramdisk_id' in image: + create_dict['ramdisk_id'] = image['ramdisk_id'] + create_dict.update(kwargs) try: new_image = self.admin_image_client.create_image(**create_dict) diff --git a/tempest/scenario/manager.py b/tempest/scenario/manager.py index 0450d9427b..884850763f 100644 --- a/tempest/scenario/manager.py +++ b/tempest/scenario/manager.py @@ -16,7 +16,11 @@ import copy import os +import re +import shutil import subprocess +import tarfile +import tempfile import netaddr @@ -793,6 +797,60 @@ class ScenarioTest(tempest.test.BaseTestCase): if img_properties: params.update(img_properties) params.update(kwargs) + + # This code is basically copying the devstack code that extracts and + # uploads split kernel/ramdisk images. + if tarfile.is_tarfile(img_path): + extract_dir = os.path.join(tempfile.gettempdir(), 'images', name) + self.addCleanup(shutil.rmtree, extract_dir) + os.makedirs(extract_dir) + with tarfile.open(img_path) as tar: + tar.extractall(extract_dir, filter='data') + filenames = os.listdir(extract_dir) + for fname in filenames: + if re.search(r'(.*-vmlinuz.*|aki-.*/image$)', fname): + kernel_img_path = os.path.join(extract_dir, fname) + elif re.search(r'(.*-initrd.*|ari-.*/image$)', fname): + ramdisk_img_path = os.path.join(extract_dir, fname) + elif re.search(f'(.*\\.img$|ami-.*/image$)', fname): + img_path = os.path.join(extract_dir, fname) + # Create the kernel image. + kparams = { + 'name': name + '-kernel', + 'container_format': 'aki', + 'disk_format': 'aki', + 'visibility': 'private' + } + body = self.image_client.create_image(**kparams) + image = body['image'] if 'image' in body else body + kernel_id = image['id'] + self.addCleanup(self.image_client.delete_image, kernel_id) + self.assertEqual("queued", image['status']) + with open(kernel_img_path, 'rb') as image_file: + self.image_client.store_image_file(kernel_id, image_file) + LOG.debug("image:%s", kernel_id) + # Create the ramdisk image. + rparams = { + 'name': name + '-ramdisk', + 'container_format': 'ari', + 'disk_format': 'ari', + 'visibility': 'private' + } + body = self.image_client.create_image(**rparams) + image = body['image'] if 'image' in body else body + ramdisk_id = image['id'] + self.addCleanup(self.image_client.delete_image, ramdisk_id) + self.assertEqual("queued", image['status']) + with open(ramdisk_img_path, 'rb') as image_file: + self.image_client.store_image_file(ramdisk_id, image_file) + LOG.debug("image:%s", ramdisk_id) + # Set the kernel_id, ramdisk_id, container format, disk format for + # the split image. + params['kernel_id'] = kernel_id + params['ramdisk_id'] = ramdisk_id + params['container_format'] = 'ami' + params['disk_format'] = 'ami' + body = self.image_client.create_image(**params) image = body['image'] if 'image' in body else body self.addCleanup(self.image_client.delete_image, image['id'])