Merge "Add test to verify hostname allows FQDN"

This commit is contained in:
Zuul 2024-07-17 11:17:57 +00:00 committed by Gerrit Code Review
commit 95064194ad
4 changed files with 115 additions and 32 deletions

View File

@ -538,6 +538,37 @@ class BaseV2ComputeTest(api_version_utils.BaseMicroversionTest,
volume['id'], 'available')
return volume
@classmethod
def verify_metadata_from_api(self, server, ssh_client, verify_method):
md_url = 'http://169.254.169.254/openstack/latest/meta_data.json'
LOG.info('Attempting to verify tagged devices in server %s via '
'the metadata service: %s', server['id'], md_url)
def get_and_verify_metadata():
try:
ssh_client.exec_command('curl -V')
except exceptions.SSHExecCommandFailed:
if not CONF.compute_feature_enabled.config_drive:
raise self.skipException('curl not found in guest '
'and config drive is '
'disabled')
LOG.warning('curl was not found in the guest, device '
'tagging metadata was not checked in the '
'metadata API')
return True
cmd = 'curl %s' % md_url
md_json = ssh_client.exec_command(cmd)
return verify_method(md_json)
# NOTE(gmann) Keep refreshing the metadata info until the metadata
# cache is refreshed. For safer side, we will go with wait loop of
# build_interval till build_timeout. verify_method() above will return
# True if all metadata verification is done as expected.
if not test_utils.call_until_true(get_and_verify_metadata,
CONF.compute.build_timeout,
CONF.compute.build_interval):
raise lib_exc.TimeoutException('Timeout while verifying '
'metadata on server.')
def _detach_volume(self, server, volume):
"""Helper method to detach a volume.

View File

@ -16,6 +16,8 @@
import netaddr
import testtools
from oslo_serialization import jsonutils as json
from tempest.api.compute import base
from tempest.common import utils
from tempest.common.utils.linux import remote_client
@ -235,3 +237,76 @@ class ServersTestFqdnHostnames(base.BaseV2ComputeTest):
servers_client=self.client)
hostname = linux_client.exec_command("hostname").rstrip()
self.assertEqual('guest-instance-1-domain-com', hostname)
class ServersV294TestFqdnHostnames(base.BaseV2ComputeTest):
"""Test creating server with FQDN hostname and verifying attributes
Starting Antelope release, Nova allows to set hostname as an FQDN
type and allows free form characters in hostname using --hostname
parameter with API above 2.94 .
This is to create server with --hostname having FQDN type value having
more than 64 characters
"""
min_microversion = '2.94'
@classmethod
def setup_credentials(cls):
cls.prepare_instance_network()
super(ServersV294TestFqdnHostnames, cls).setup_credentials()
@classmethod
def setup_clients(cls):
super(ServersV294TestFqdnHostnames, cls).setup_clients()
cls.client = cls.servers_client
@classmethod
def resource_setup(cls):
super(ServersV294TestFqdnHostnames, cls).resource_setup()
cls.validation_resources = cls.get_class_validation_resources(
cls.os_primary)
cls.accessIPv4 = '1.1.1.1'
cls.name = 'guest-instance-1'
cls.password = data_utils.rand_password()
cls.hostname = 'x' * 52 + '-guest-test.domaintest.com'
cls.test_server = cls.create_test_server(
validatable=True,
validation_resources=cls.validation_resources,
wait_until='ACTIVE',
name=cls.name,
accessIPv4=cls.accessIPv4,
adminPass=cls.password,
hostname=cls.hostname)
cls.server = cls.client.show_server(cls.test_server['id'])['server']
def verify_metadata_hostname(self, md_json):
md_dict = json.loads(md_json)
dhcp_domain = CONF.compute_feature_enabled.dhcp_domain
if md_dict['hostname'] == f"{self.hostname}{dhcp_domain}":
return True
else:
return False
@decorators.idempotent_id('e7b05488-f9d5-4fce-91b3-e82216c52017')
@testtools.skipUnless(CONF.validation.run_validation,
'Instance validation tests are disabled.')
def test_verify_hostname_allows_fqdn(self):
"""Test to verify --hostname allows FQDN type name scheme
Verify the hostname has FQDN value and Freeform characters
in the hostname are allowed
"""
self.assertEqual(
self.hostname, self.server['OS-EXT-SRV-ATTR:hostname'])
# Verify that metadata API has correct hostname inside guest
linux_client = remote_client.RemoteClient(
self.get_server_ip(self.test_server, self.validation_resources),
self.ssh_user,
self.password,
self.validation_resources['keypair']['private_key'],
server=self.test_server,
servers_client=self.client)
self.verify_metadata_from_api(
self.test_server, linux_client, self.verify_metadata_hostname)

View File

@ -23,9 +23,7 @@ from tempest.common.utils.linux import remote_client
from tempest.common import waiters
from tempest import config
from tempest.lib.common.utils import data_utils
from tempest.lib.common.utils import test_utils
from tempest.lib import decorators
from tempest.lib import exceptions
CONF = config.CONF
@ -64,36 +62,6 @@ class DeviceTaggingBase(base.BaseV2ComputeTest):
dhcp=True)
super(DeviceTaggingBase, cls).setup_credentials()
def verify_metadata_from_api(self, server, ssh_client, verify_method):
md_url = 'http://169.254.169.254/openstack/latest/meta_data.json'
LOG.info('Attempting to verify tagged devices in server %s via '
'the metadata service: %s', server['id'], md_url)
def get_and_verify_metadata():
try:
ssh_client.exec_command('curl -V')
except exceptions.SSHExecCommandFailed:
if not CONF.compute_feature_enabled.config_drive:
raise self.skipException('curl not found in guest '
'and config drive is '
'disabled')
LOG.warning('curl was not found in the guest, device '
'tagging metadata was not checked in the '
'metadata API')
return True
cmd = 'curl %s' % md_url
md_json = ssh_client.exec_command(cmd)
return verify_method(md_json)
# NOTE(gmann) Keep refreshing the metadata info until the metadata
# cache is refreshed. For safer side, we will go with wait loop of
# build_interval till build_timeout. verify_method() above will return
# True if all metadata verification is done as expected.
if not test_utils.call_until_true(get_and_verify_metadata,
CONF.compute.build_timeout,
CONF.compute.build_interval):
raise exceptions.TimeoutException('Timeout while verifying '
'metadata on server.')
def verify_metadata_on_config_drive(self, server, ssh_client,
verify_method):
LOG.info('Attempting to verify tagged devices in server %s via '

View File

@ -469,6 +469,15 @@ ComputeFeaturesGroup = [
"the '.' with '-' to comply with fqdn hostname. Nova "
"changed that in Wallaby cycle, if your cloud is older "
"than wallaby then you can keep/make it False."),
cfg.StrOpt('dhcp_domain',
default='.novalocal',
help="Configure a fully-qualified domain name for instance "
"hostnames. The value is suffixed to instance hostname "
"from the database to construct the hostname that "
"appears in the metadata API. To disable this behavior "
"(for example in order to correctly support "
"microversion's 2.94 FQDN hostnames), set this to the "
"empty string."),
cfg.BoolOpt('change_password',
default=False,
help="Does the test environment support changing the admin "