diff --git a/oslo_config/cfg.py b/oslo_config/cfg.py index 39a9878e..35f0cfb5 100644 --- a/oslo_config/cfg.py +++ b/oslo_config/cfg.py @@ -1175,6 +1175,28 @@ class HostAddressOpt(Opt): **kwargs) +class HostDomainOpt(Opt): + + r"""Option for either an IP or a hostname. + + Like HostAddress with the support of _ character. + + Option with ``type`` :class:`oslo_config.types.HostDomain` + + :param name: the option's name + :param version: one of either ``4``, ``6``, or ``None`` to specify + either version. + :param \*\*kwargs: arbitrary keyword arguments passed to :class:`Opt` + + .. versionadded:: 8.6 + """ + + def __init__(self, name, version=None, **kwargs): + super(HostDomainOpt, self).__init__(name, + type=types.HostDomain(version), + **kwargs) + + class URIOpt(Opt): r"""Opt with URI type diff --git a/oslo_config/tests/test_generator.py b/oslo_config/tests/test_generator.py index d75b4d81..6f95176d 100644 --- a/oslo_config/tests/test_generator.py +++ b/oslo_config/tests/test_generator.py @@ -1872,5 +1872,32 @@ class HostAddressTestCase(base.BaseTestCase): self.assertEqual(expected, result) +class HostDomainTestCase(base.BaseTestCase): + + opts = [cfg.HostDomainOpt('foo', help='foo option', default='0.0.0.0')] + + def test_host_domain(self): + + config = [("namespace", [("alpha", self.opts)])] + groups = generator._get_groups(config) + + out = io.StringIO() + formatter = build_formatter(out) + generator._output_opts(formatter, 'alpha', groups.pop('alpha')) + result = out.getvalue() + + expected = textwrap.dedent(''' + [alpha] + + # + # From namespace + # + + # foo option (host domain value) + #foo = 0.0.0.0 + ''').lstrip() + self.assertEqual(expected, result) + + GeneratorTestCase.generate_scenarios() MachineReadableGeneratorTestCase.generate_scenarios() diff --git a/oslo_config/types.py b/oslo_config/types.py index 72242cb3..8ebc6e6e 100644 --- a/oslo_config/types.py +++ b/oslo_config/types.py @@ -871,6 +871,13 @@ class HostDomain(HostAddress): # DOMAIN_REGEX is HOSTNAME_REGEX with the _ character added DOMAIN_REGEX = '(?!-)[A-Z0-9-_]{1,63}(?