summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorl0crian1 <ryan.claridge13@gmail.com>2025-08-28 22:05:54 -0400
committerl0crian1 <ryan.claridge13@gmail.com>2025-08-28 22:05:54 -0400
commit048ff4fab605a1c6ebf5124fe2adedb81788066e (patch)
tree006eb0d55ad5145a1a5da57d1ce73faf00d0fe96
parent86b3b035b8559ee5dd8da8d4a57a11c041b32882 (diff)
downloadvyos-1x-048ff4fab605a1c6ebf5124fe2adedb81788066e.tar.gz
vyos-1x-048ff4fab605a1c6ebf5124fe2adedb81788066e.zip
container: T7186: Add macvlan network type for containers
- Moved gen_mac function outside of 'for network' loop - Cached result of get_host_identity() to prevent multiple calls - Other minor improvements per Copilot suggestions
-rw-r--r--python/vyos/utils/network.py3
-rwxr-xr-xsrc/conf_mode/container.py13
2 files changed, 9 insertions, 7 deletions
diff --git a/python/vyos/utils/network.py b/python/vyos/utils/network.py
index 50f1771e2..e6b838cdc 100644
--- a/python/vyos/utils/network.py
+++ b/python/vyos/utils/network.py
@@ -68,7 +68,7 @@ def get_host_identity() -> str:
host = cmd("hostname").strip().lower()
return f"{uuid}:{host}"
-def gen_mac(name: str, addr: str) -> str:
+def gen_mac(name: str, addr: str, ident: str) -> str:
"""
Generate a deterministic locally-administered MAC address.
@@ -88,7 +88,6 @@ def gen_mac(name: str, addr: str) -> str:
Returns:
str: Deterministic MAC address in standard "xx:xx:xx:xx:xx:xx" format.
"""
- ident = get_host_identity()
h = hashlib.sha256(f"{ident}:{name}:{addr}".encode()).hexdigest()
# 0x02 = locally-administered, unicast
b = [0x02] + [int(h[i:i+2], 16) for i in range(0, 10, 2)] # 5 bytes = 40 bits
diff --git a/src/conf_mode/container.py b/src/conf_mode/container.py
index b58c722fc..8950f857e 100755
--- a/src/conf_mode/container.py
+++ b/src/conf_mode/container.py
@@ -37,6 +37,7 @@ from vyos.utils.process import call
from vyos.utils.process import cmd
from vyos.utils.process import run
from vyos.utils.network import gen_mac
+from vyos.utils.network import get_host_identity
from vyos.utils.network import interface_exists
from vyos.template import bracketize_ipv6
from vyos.template import inc_ip
@@ -343,7 +344,7 @@ def verify(container):
return None
-def generate_run_arguments(name, container_config):
+def generate_run_arguments(name, container_config, host_ident):
image = container_config['image']
cpu_quota = container_config['cpu_quota']
memory = container_config['memory']
@@ -469,7 +470,7 @@ def generate_run_arguments(name, container_config):
return f'{container_base_cmd} --net host {entrypoint} {image} {command} {command_arguments}'.strip()
ip_param = ''
- mac_address = ''
+ addr_info = ''
networks = ",".join(container_config['network'])
for network in container_config['network']:
if 'address' not in container_config['network'][network]:
@@ -481,7 +482,8 @@ def generate_run_arguments(name, container_config):
ip_param += f' --ip {address}'
addr_info = ''.join(container_config['network'][network]['address'])
- mac_address = f'--mac-address {gen_mac(name, addr_info)}'
+
+ mac_address = f'--mac-address {gen_mac(name, addr_info, host_ident)}'
return f'{container_base_cmd} --no-healthcheck --net {networks} {ip_param} {mac_address} {entrypoint} {image} {command} {command_arguments}'.strip()
@@ -501,7 +503,7 @@ def generate(container):
net_interface = dict_search('macvlan.parent', type_config)
driver = 'macvlan'
mode = dict_search('macvlan.mode', type_config)
- elif dict_search('bridge', type_config) != None:
+ elif dict_search('bridge', type_config) is not None:
net_interface = f'pod-{network}'
driver = 'bridge'
else:
@@ -560,12 +562,13 @@ def generate(container):
render(config_storage, 'container/storage.conf.j2', container)
if 'name' in container:
+ host_ident = get_host_identity()
for name, container_config in container['name'].items():
if 'disable' in container_config:
continue
file_path = os.path.join(systemd_unit_path, f'vyos-container-{name}.service')
- run_args = generate_run_arguments(name, container_config)
+ run_args = generate_run_arguments(name, container_config, host_ident)
render(file_path, 'container/systemd-unit.j2', {'name': name, 'run_args': run_args, },
formater=lambda _: _.replace("&quot;", '"').replace("&apos;", "'"))