summaryrefslogtreecommitdiff
path: root/cloudinit/net
diff options
context:
space:
mode:
authorChad Smith <chad.smith@canonical.com>2022-07-29 10:33:42 -0600
committerGitHub <noreply@github.com>2022-07-29 10:33:42 -0600
commit6e498773bf153f7b2f5e995a2f2fe24774dd3cab (patch)
tree7dc4574ac43b8630fbad04c6bd7e78efb44b692b /cloudinit/net
parent0f3f814de78549d7af91b9b46603e67ac3db2224 (diff)
downloadcloud-init-git-6e498773bf153f7b2f5e995a2f2fe24774dd3cab.tar.gz
network: add system_info network activator cloud.cfg overrides (#1619)
Support overriding network activators in cloud.cfg system_info on disk. Default cloud-init activators are used either during hot-plug or for datasources that are detected during init-network stage when basic networking has already been setup by the OS.a Activators are discovered in the following priority order and determined based on the presence of related network tools: system_info: network: activators: [eni, netplan, network-manager, networkd] On some systems where multiple network config tools are installed it is necessary to override the priority order of detection to ensure one activator is chosen over the other. This is done by providing the a custom cloud config snippet in a /etc/cloud/cloud.cfg.d/*cfg. Surface configured Distro.network_activator from system_info so that the hotplug hook has visibility to the configured distribution network activator during interface bring_up and tear_down. Add typing hints to net.activators search_activator and select_activator functions. LP: #1958377
Diffstat (limited to 'cloudinit/net')
-rw-r--r--cloudinit/net/activators.py46
1 files changed, 29 insertions, 17 deletions
diff --git a/cloudinit/net/activators.py b/cloudinit/net/activators.py
index f2cc078f..b6af3770 100644
--- a/cloudinit/net/activators.py
+++ b/cloudinit/net/activators.py
@@ -1,7 +1,7 @@
# This file is part of cloud-init. See LICENSE file for license information.
import logging
from abc import ABC, abstractmethod
-from typing import Iterable, List, Type
+from typing import Dict, Iterable, List, Optional, Type, Union
from cloudinit import subp, util
from cloudinit.net.eni import available as eni_available
@@ -32,7 +32,7 @@ def _alter_interface(cmd, device_name) -> bool:
class NetworkActivator(ABC):
@staticmethod
@abstractmethod
- def available() -> bool:
+ def available(target: Optional[str] = None) -> bool:
"""Return True if activator is available, otherwise return False."""
raise NotImplementedError()
@@ -97,7 +97,7 @@ class IfUpDownActivator(NetworkActivator):
# E.g., NetworkManager has a ifupdown plugin that requires the name
# of a specific connection.
@staticmethod
- def available(target=None) -> bool:
+ def available(target: str = None) -> bool:
"""Return true if ifupdown can be used on this system."""
return eni_available(target=target)
@@ -254,33 +254,43 @@ class NetworkdActivator(NetworkActivator):
# This section is mostly copied and pasted from renderers.py. An abstract
# version to encompass both seems overkill at this point
DEFAULT_PRIORITY = [
- IfUpDownActivator,
- NetplanActivator,
- NetworkManagerActivator,
- NetworkdActivator,
+ "eni",
+ "netplan",
+ "network-manager",
+ "networkd",
]
+NAME_TO_ACTIVATOR: Dict[str, Type[NetworkActivator]] = {
+ "eni": IfUpDownActivator,
+ "netplan": NetplanActivator,
+ "network-manager": NetworkManagerActivator,
+ "networkd": NetworkdActivator,
+}
+
def search_activator(
- priority=None, target=None
+ priority: List[str], target: Union[str, None]
) -> List[Type[NetworkActivator]]:
- if priority is None:
- priority = DEFAULT_PRIORITY
-
unknown = [i for i in priority if i not in DEFAULT_PRIORITY]
if unknown:
raise ValueError(
"Unknown activators provided in priority list: %s" % unknown
)
-
- return [activator for activator in priority if activator.available(target)]
+ activator_classes = [NAME_TO_ACTIVATOR[name] for name in priority]
+ return [
+ activator_cls
+ for activator_cls in activator_classes
+ if activator_cls.available(target)
+ ]
-def select_activator(priority=None, target=None) -> Type[NetworkActivator]:
+def select_activator(
+ priority: Optional[List[str]] = None, target: Optional[str] = None
+) -> Type[NetworkActivator]:
+ if priority is None:
+ priority = DEFAULT_PRIORITY
found = search_activator(priority, target)
if not found:
- if priority is None:
- priority = DEFAULT_PRIORITY
tmsg = ""
if target and target != "/":
tmsg = " in target=%s" % target
@@ -289,5 +299,7 @@ def select_activator(priority=None, target=None) -> Type[NetworkActivator]:
"through list: %s" % (tmsg, priority)
)
selected = found[0]
- LOG.debug("Using selected activator: %s", selected)
+ LOG.debug(
+ "Using selected activator: %s from priority: %s", selected, priority
+ )
return selected