From a8e0f015ea91859163ac9befad8a6e8ac68dec9a Mon Sep 17 00:00:00 2001 From: sskaje Date: Tue, 11 Mar 2025 21:33:46 +0800 Subject: T7092: Change validators: regex to host-name|address + port + path --- data/templates/container/registries.conf.j2 | 6 +++- interface-definitions/container.xml.in | 46 +++++++++++++++++++++++++---- src/conf_mode/container.py | 7 +++++ 3 files changed, 52 insertions(+), 7 deletions(-) diff --git a/data/templates/container/registries.conf.j2 b/data/templates/container/registries.conf.j2 index 48b3c7c4a..b5c7eed9b 100644 --- a/data/templates/container/registries.conf.j2 +++ b/data/templates/container/registries.conf.j2 @@ -30,7 +30,11 @@ unqualified-search-registries = {{ registry_list }} {% for r, r_options in registry.items() if r_options.disable is not vyos_defined %} [[registry]] -location = "{{ r_options.mirror if r_options.mirror is vyos_defined else r }}" +{% if r_options.mirror is vyos_defined %} +location = "{{ r_options.mirror.host_name if r_options.mirror.host_name is vyos_defined else r_options.mirror.address }}{{ ":" + r_options.mirror.port if r_options.mirror.port is vyos_defined }}{{ r_options.mirror.path if r_options.mirror.path is vyos_defined }}" +{% else %} +location = "{{ r }}" +{% endif %} insecure = {{ 'true' if r_options.insecure is vyos_defined else 'false' }} prefix = "{{ r }}" {% endfor %} diff --git a/interface-definitions/container.xml.in b/interface-definitions/container.xml.in index c8d4bbdd1..a17777af0 100644 --- a/interface-definitions/container.xml.in +++ b/interface-definitions/container.xml.in @@ -544,14 +544,48 @@ - + - Registry mirror, use host[:port][/path] - - ^(?:[[:alnum:]-]+(?:\.[[:alnum:]-]+)*|(?:[[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}|\[[[:xdigit:]:]+])(?::[[:digit:]]{1,5})?(?:\/[^[:space:]?#]*)?$ - + Registry mirror, use host-name|address[:port][/path] - + + + + IP address of container registry mirror + + ipv4 + IPv4 address of container registry mirror + + + ipv6 + IPv6 address of container registry mirror + + + + + + + + + + Hostname of container registry mirror + + hostname + FQDN of container registry mirror + + + + + + + #include + + + Path of container registry mirror, optional, must be start with '/' if not empty + + + + diff --git a/src/conf_mode/container.py b/src/conf_mode/container.py index 594de3eb0..8f57be06d 100755 --- a/src/conf_mode/container.py +++ b/src/conf_mode/container.py @@ -273,6 +273,13 @@ def verify(container): if 'registry' in container: for registry, registry_config in container['registry'].items(): + if 'mirror' in registry_config: + if 'host_name' in registry_config['mirror'] and 'address' in registry_config['mirror']: + raise ConfigError(f'Container registry mirror address/host-name are mutually exclusive!') + + if 'path' in registry_config['mirror'] and not registry_config['mirror']['path'].startswith('/'): + raise ConfigError('Container registry mirror path must start with "/"!') + if 'authentication' not in registry_config: continue if not {'username', 'password'} <= set(registry_config['authentication']): -- cgit v1.2.3