diff --git a/nova/api/metadata/base.py b/nova/api/metadata/base.py index d9c3bb250f24..e3e25fe54115 100644 --- a/nova/api/metadata/base.py +++ b/nova/api/metadata/base.py @@ -528,9 +528,10 @@ class InstanceMetadata(object): return self._check_version(required, requested, OPENSTACK_VERSIONS) def _get_hostname(self): - return "%s%s%s" % (self.instance.hostname, - '.' if CONF.dhcp_domain else '', - CONF.dhcp_domain) + if CONF.dhcp_domain: + return '.'.join([self.instance.hostname, CONF.dhcp_domain]) + + return self.instance.hostname def lookup(self, path): if path == "" or path[0] != "/": diff --git a/nova/tests/functional/test_metadata.py b/nova/tests/functional/test_metadata.py index d1d664c07329..187d3cca7d5e 100644 --- a/nova/tests/functional/test_metadata.py +++ b/nova/tests/functional/test_metadata.py @@ -59,7 +59,7 @@ class MetadataTest(test.TestCase): projects=[]) instance = objects.Instance(ctxt, flavor=flavor, vcpus=1, memory_mb=256, root_gb=0, ephemeral_gb=0, - project_id='fake') + project_id='fake', hostname='test') instance.create() # NOTE(mikal): We could create a network and a fixed IP here, but it @@ -100,6 +100,9 @@ class MetadataTest(test.TestCase): url = '%sopenstack/latest/meta_data.json' % self.md_url res = requests.request('GET', url, timeout=5) self.assertEqual(200, res.status_code) + j = jsonutils.loads(res.text) + self.assertIn('hostname', j) + self.assertEqual('test.novalocal', j['hostname']) def test_lookup_external_service(self): self.flags( diff --git a/nova/tests/unit/test_metadata.py b/nova/tests/unit/test_metadata.py index 43fa5473bd25..d8fe32395601 100644 --- a/nova/tests/unit/test_metadata.py +++ b/nova/tests/unit/test_metadata.py @@ -85,7 +85,7 @@ def fake_inst_obj(context): vcpus=1, fixed_ips=[], root_device_name='/dev/sda1', - hostname='test.novadomain', + hostname='test', display_name='my_displayname', metadata={}, device_metadata=fake_metadata_objects(), @@ -310,11 +310,19 @@ class MetadataTestCase(test.TestCase): self.flags(use_neutron=True) self._test_security_groups() - def test_local_hostname_fqdn(self): + def test_local_hostname(self): + self.flags(dhcp_domain=None) md = fake_InstanceMetadata(self, self.instance.obj_clone()) data = md.get_ec2_metadata(version='2009-04-04') self.assertEqual(data['meta-data']['local-hostname'], - "%s.%s" % (self.instance['hostname'], CONF.dhcp_domain)) + self.instance['hostname']) + + def test_local_hostname_fqdn(self): + self.flags(dhcp_domain='fakedomain') + md = fake_InstanceMetadata(self, self.instance.obj_clone()) + data = md.get_ec2_metadata(version='2009-04-04') + self.assertEqual('%s.fakedomain' % self.instance['hostname'], + data['meta-data']['local-hostname']) def test_format_instance_mapping(self): # Make sure that _format_instance_mappings works. diff --git a/releasenotes/notes/bug-1824813-4441265dc805e792.yaml b/releasenotes/notes/bug-1824813-4441265dc805e792.yaml new file mode 100644 index 000000000000..2f7de43e52b7 --- /dev/null +++ b/releasenotes/notes/bug-1824813-4441265dc805e792.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + Unsetting '[DEFAULT] dhcp_domain' will now correctly result in the metadata + service/config drive providing an instance hostname of '${hostname}' instead + of '${hostname}None', as was previously seen.