diff options
author | Brett Holman <brett.holman@canonical.com> | 2022-07-06 17:30:03 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-06 17:30:03 -0600 |
commit | af404781299d3223af306456f994b4d0f5f27ce4 (patch) | |
tree | f2fd494df5d1f1be0375de848b1ebbb4d1fd7981 /cloudinit/net | |
parent | c58ea03114838341a1c4bd99a91da5c1b98f4cef (diff) | |
download | cloud-init-git-af404781299d3223af306456f994b4d0f5f27ce4.tar.gz |
net: fix interface matching support (#1552)
- broken in bf94945fb855c40c5188cef5fb
- factor out a reusable helper function
- stylistic change for Python's new match keyword
LP: #1979877
Diffstat (limited to 'cloudinit/net')
-rw-r--r-- | cloudinit/net/__init__.py | 7 | ||||
-rw-r--r-- | cloudinit/net/network_state.py | 16 |
2 files changed, 18 insertions, 5 deletions
diff --git a/cloudinit/net/__init__.py b/cloudinit/net/__init__.py index f5545fc1..4bc48676 100644 --- a/cloudinit/net/__init__.py +++ b/cloudinit/net/__init__.py @@ -928,6 +928,13 @@ def get_interfaces_by_mac(blacklist_drivers=None) -> dict: ) +def find_interface_name_from_mac(mac: str) -> Optional[str]: + for interface_mac, interface_name in get_interfaces_by_mac().items(): + if mac.lower() == interface_mac.lower(): + return interface_name + return None + + def get_interfaces_by_mac_on_freebsd(blacklist_drivers=None) -> dict: (out, _) = subp.subp(["ifconfig", "-a", "ether"]) diff --git a/cloudinit/net/network_state.py b/cloudinit/net/network_state.py index 2c64e492..80f2b108 100644 --- a/cloudinit/net/network_state.py +++ b/cloudinit/net/network_state.py @@ -11,6 +11,7 @@ from typing import Any, Dict from cloudinit import safeyaml, util from cloudinit.net import ( + find_interface_name_from_mac, get_interfaces_by_mac, ipv4_mask_to_net_prefix, ipv6_mask_to_net_prefix, @@ -700,15 +701,14 @@ class NetworkStateInterpreter(metaclass=CommandHandlerMeta): # * interface name looked up by mac # * value of "eth" key from this loop name = eth - set_name = cfg.get("set-name", None) + set_name = cfg.get("set-name") if set_name: name = set_name elif mac_address and ifaces_by_mac: lcase_mac_address = mac_address.lower() - for iface_mac, iface_name in ifaces_by_mac.items(): - if lcase_mac_address == iface_mac.lower(): - name = iface_name - break + mac = find_interface_name_from_mac(lcase_mac_address) + if mac: + name = mac phy_cmd["name"] = name driver = match.get("driver", None) @@ -780,6 +780,12 @@ class NetworkStateInterpreter(metaclass=CommandHandlerMeta): if len(dns) > 0: name_cmd.update({"address": dns}) self.handle_nameserver(name_cmd) + + mac_address = dev_cfg.get("match", {}).get("macaddress") + real_if_name = find_interface_name_from_mac(mac_address) + if real_if_name: + iface = real_if_name + self._handle_individual_nameserver(name_cmd, iface) def _handle_bond_bridge(self, command, cmd_type=None): |