Merge "Add test to rebuild volume backed instance"

This commit is contained in:
Zuul 2023-06-22 18:35:56 +00:00 committed by Gerrit Code Review
commit 2a68b13277
2 changed files with 121 additions and 0 deletions

View File

@ -816,3 +816,118 @@ class ServersAaction247Test(base.BaseV2ComputeTest):
backup_type='daily',
rotation=2,
name=backup1)
class ServerActionsV293TestJSON(base.BaseV2ComputeTest):
min_microversion = '2.93'
volume_min_microversion = '3.68'
@classmethod
def setup_credentials(cls):
cls.prepare_instance_network()
super(ServerActionsV293TestJSON, cls).setup_credentials()
@classmethod
def resource_setup(cls):
super(ServerActionsV293TestJSON, cls).resource_setup()
cls.server_id = cls.recreate_server(None, validatable=True)
@utils.services('volume')
@decorators.idempotent_id('6652dab9-ea24-4c93-ab5a-93d79c3041cf')
def test_rebuild_volume_backed_server(self):
"""Test rebuilding a volume backed server"""
# We have to create a new server that is volume-backed since the one
# from setUp is not volume-backed.
kwargs = {'volume_backed': True,
'wait_until': 'ACTIVE'}
validation_resources = {}
if CONF.validation.run_validation:
validation_resources = self.get_test_validation_resources(
self.os_primary)
kwargs.update({'validatable': True,
'validation_resources': validation_resources})
server = self.create_test_server(**kwargs)
server = self.servers_client.show_server(server['id'])['server']
self.addCleanup(self.delete_server, server['id'])
volume_id = server['os-extended-volumes:volumes_attached'][0]['id']
volume_before_rebuild = self.volumes_client.show_volume(volume_id)
image_before_rebuild = (
volume_before_rebuild['volume']
['volume_image_metadata']['image_id'])
# Verify that image inside volume is our initial image before rebuild
self.assertEqual(self.image_ref, image_before_rebuild)
# Authentication is attempted in the following order of priority:
# 1.The key passed in, if one was passed in.
# 2.Any key we can find through an SSH agent (if allowed).
# 3.Any "id_rsa", "id_dsa" or "id_ecdsa" key discoverable in
# ~/.ssh/ (if allowed).
# 4.Plain username/password auth, if a password was given.
linux_client = remote_client.RemoteClient(
self.get_server_ip(server, validation_resources),
self.ssh_user,
password=None,
pkey=validation_resources['keypair']['private_key'],
server=server,
servers_client=self.servers_client)
output = linux_client.exec_command('touch test_file')
# No output means success
self.assertEqual('', output.strip())
# The server should be rebuilt using the provided image and data
meta = {'rebuild': 'server'}
new_name = data_utils.rand_name(self.__class__.__name__ + '-server')
password = 'rebuildPassw0rd'
rebuilt_server = self.servers_client.rebuild_server(
server['id'],
self.image_ref_alt,
name=new_name,
metadata=meta,
adminPass=password)['server']
# Verify the properties in the initial response are correct
self.assertEqual(server['id'], rebuilt_server['id'])
rebuilt_image_id = rebuilt_server['image']
# Since it is a volume backed server, image id will remain empty
self.assertEqual('', rebuilt_image_id)
self.assert_flavor_equal(self.flavor_ref, rebuilt_server['flavor'])
# Verify the server properties after the rebuild completes
waiters.wait_for_server_status(self.servers_client,
rebuilt_server['id'], 'ACTIVE')
server = self.servers_client.show_server(
rebuilt_server['id'])['server']
volume_id = server['os-extended-volumes:volumes_attached'][0]['id']
volume_after_rebuild = self.volumes_client.show_volume(volume_id)
image_after_rebuild = (
volume_after_rebuild['volume']
['volume_image_metadata']['image_id'])
self.assertEqual(new_name, server['name'])
# Verify that volume ID remains same before and after rebuild
self.assertEqual(volume_before_rebuild['volume']['id'],
volume_after_rebuild['volume']['id'])
# Verify that image inside volume is our final image after rebuild
self.assertEqual(self.image_ref_alt, image_after_rebuild)
# Authentication is attempted in the following order of priority:
# 1.The key passed in, if one was passed in.
# 2.Any key we can find through an SSH agent (if allowed).
# 3.Any "id_rsa", "id_dsa" or "id_ecdsa" key discoverable in
# ~/.ssh/ (if allowed).
# 4.Plain username/password auth, if a password was given.
linux_client = remote_client.RemoteClient(
self.get_server_ip(rebuilt_server, validation_resources),
self.ssh_alt_user,
password,
validation_resources['keypair']['private_key'],
server=rebuilt_server,
servers_client=self.servers_client)
linux_client.validate_authentication()
e = self.assertRaises(lib_exc.SSHExecCommandFailed,
linux_client.exec_command,
'cat test_file')
# If we rebuilt the boot volume, then we should not find
# the file we touched.
self.assertIn('No such file or directory', str(e))

View File

@ -13,6 +13,12 @@
roles: &base_roles
- zuul: opendev.org/openstack/devstack
vars: &base_vars
devstack_localrc:
IMAGE_URLS: http://download.cirros-cloud.net/0.6.2/cirros-0.6.2-x86_64-disk.img, http://download.cirros-cloud.net/0.6.1/cirros-0.6.1-x86_64-disk.img
# When DEFAULT_IMAGE_NAME is set and the image exists in glance,
# devstack sets both image_ref and image_ref_alt with same image
# which we don't want here.
DEFAULT_IMAGE_NAME: 'non-existent-image'
devstack_services:
tempest: true
devstack_local_conf: