diff options
author | Chad Smith <chad.smith@canonical.com> | 2022-07-29 10:33:42 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-29 10:33:42 -0600 |
commit | 6e498773bf153f7b2f5e995a2f2fe24774dd3cab (patch) | |
tree | 7dc4574ac43b8630fbad04c6bd7e78efb44b692b /cloudinit/net | |
parent | 0f3f814de78549d7af91b9b46603e67ac3db2224 (diff) | |
download | cloud-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.py | 46 |
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 |