summaryrefslogtreecommitdiff
path: root/cloudinit
diff options
context:
space:
mode:
authorsshedi <53473811+sshedi@users.noreply.github.com>2021-08-09 22:19:13 +0530
committerGitHub <noreply@github.com>2021-08-09 11:49:13 -0500
commit049d62b658b06e729291def6b7b6f9520827d0ba (patch)
tree7c7166cc75742c66c58087609acb4d7ea9ab61f3 /cloudinit
parent00dbaf1e9ab0e59d81662f0f3561897bef499a3f (diff)
downloadvyos-cloud-init-049d62b658b06e729291def6b7b6f9520827d0ba.tar.gz
vyos-cloud-init-049d62b658b06e729291def6b7b6f9520827d0ba.zip
photon: refactor hostname handling and add networkd activator (#958)
Diffstat (limited to 'cloudinit')
-rw-r--r--cloudinit/distros/photon.py56
-rw-r--r--cloudinit/net/activators.py27
-rw-r--r--cloudinit/net/networkd.py2
3 files changed, 52 insertions, 33 deletions
diff --git a/cloudinit/distros/photon.py b/cloudinit/distros/photon.py
index 61e270c0..4ff90ea6 100644
--- a/cloudinit/distros/photon.py
+++ b/cloudinit/distros/photon.py
@@ -13,13 +13,12 @@ from cloudinit import helpers
from cloudinit import log as logging
from cloudinit.settings import PER_INSTANCE
from cloudinit.distros import rhel_util as rhutil
-from cloudinit.distros.parsers.hostname import HostnameConf
LOG = logging.getLogger(__name__)
class Distro(distros.Distro):
- hostname_conf_fn = '/etc/hostname'
+ systemd_hostname_conf_fn = '/etc/hostname'
network_conf_dir = '/etc/systemd/network/'
systemd_locale_conf_fn = '/etc/locale.conf'
resolve_conf_fn = '/etc/systemd/resolved.conf'
@@ -43,17 +42,18 @@ class Distro(distros.Distro):
self.osfamily = 'photon'
self.init_cmd = ['systemctl']
- def exec_cmd(self, cmd, capture=False):
+ def exec_cmd(self, cmd, capture=True):
LOG.debug('Attempting to run: %s', cmd)
try:
(out, err) = subp.subp(cmd, capture=capture)
if err:
LOG.warning('Running %s resulted in stderr output: %s',
cmd, err)
- return True, out, err
+ return True, out, err
+ return False, out, err
except subp.ProcessExecutionError:
util.logexc(LOG, 'Command %s failed', cmd)
- return False, None, None
+ return True, None, None
def generate_fallback_config(self):
key = 'disable_fallback_netcfg'
@@ -85,41 +85,32 @@ class Distro(distros.Distro):
# For locale change to take effect, reboot is needed or we can restart
# systemd-localed. This is equivalent of localectl
cmd = ['systemctl', 'restart', 'systemd-localed']
- _ret, _out, _err = self.exec_cmd(cmd)
+ self.exec_cmd(cmd)
def install_packages(self, pkglist):
# self.update_package_sources()
self.package_command('install', pkgs=pkglist)
- def _bring_up_interfaces(self, device_names):
- cmd = ['systemctl', 'restart', 'systemd-networkd', 'systemd-resolved']
- LOG.debug('Attempting to run bring up interfaces using command %s',
- cmd)
- ret, _out, _err = self.exec_cmd(cmd)
- return ret
-
def _write_hostname(self, hostname, filename):
- conf = None
- try:
- # Try to update the previous one
- # Let's see if we can read it first.
- conf = HostnameConf(util.load_file(filename))
- conf.parse()
- except IOError:
- pass
- if not conf:
- conf = HostnameConf('')
- conf.set_hostname(hostname)
- util.write_file(filename, str(conf), mode=0o644)
+ if filename and filename.endswith('/previous-hostname'):
+ util.write_file(filename, hostname)
+ else:
+ ret, _out, err = self.exec_cmd(['hostnamectl', 'set-hostname',
+ str(hostname)])
+ if ret:
+ LOG.warning(('Error while setting hostname: %s\n'
+ 'Given hostname: %s', err, hostname))
def _read_system_hostname(self):
- sys_hostname = self._read_hostname(self.hostname_conf_fn)
- return (self.hostname_conf_fn, sys_hostname)
+ sys_hostname = self._read_hostname(self.systemd_hostname_conf_fn)
+ return (self.systemd_hostname_conf_fn, sys_hostname)
def _read_hostname(self, filename, default=None):
- _ret, out, _err = self.exec_cmd(['hostname'])
+ if filename and filename.endswith('/previous-hostname'):
+ return util.load_file(filename).strip()
- return out if out else default
+ _ret, out, _err = self.exec_cmd(['hostname', '-f'])
+ return out.strip() if out else default
def _get_localhost_ip(self):
return '127.0.1.1'
@@ -128,7 +119,7 @@ class Distro(distros.Distro):
distros.set_etc_timezone(tz=tz, tz_file=self._find_tz_file(tz))
def package_command(self, command, args=None, pkgs=None):
- if pkgs is None:
+ if not pkgs:
pkgs = []
cmd = ['tdnf', '-y']
@@ -142,8 +133,9 @@ class Distro(distros.Distro):
pkglist = util.expand_package_list('%s-%s', pkgs)
cmd.extend(pkglist)
- # Allow the output of this to flow outwards (ie not be captured)
- _ret, _out, _err = self.exec_cmd(cmd, capture=False)
+ ret, _out, err = self.exec_cmd(cmd)
+ if ret:
+ LOG.error('Error while installing packages: %s', err)
def update_package_sources(self):
self._runner.run('update-sources', self.package_command,
diff --git a/cloudinit/net/activators.py b/cloudinit/net/activators.py
index 84aaafc9..11149548 100644
--- a/cloudinit/net/activators.py
+++ b/cloudinit/net/activators.py
@@ -8,6 +8,7 @@ from cloudinit import subp
from cloudinit import util
from cloudinit.net.eni import available as eni_available
from cloudinit.net.netplan import available as netplan_available
+from cloudinit.net.networkd import available as networkd_available
from cloudinit.net.network_state import NetworkState
from cloudinit.net.sysconfig import NM_CFG_FILE
@@ -213,12 +214,38 @@ class NetplanActivator(NetworkActivator):
return _alter_interface(NetplanActivator.NETPLAN_CMD, 'all')
+class NetworkdActivator(NetworkActivator):
+ @staticmethod
+ def available(target=None) -> bool:
+ """Return true if ifupdown can be used on this system."""
+ return networkd_available(target=target)
+
+ @staticmethod
+ def bring_up_interface(device_name: str) -> bool:
+ """ Return True is successful, otherwise return False """
+ cmd = ['ip', 'link', 'set', 'up', device_name]
+ return _alter_interface(cmd, device_name)
+
+ @staticmethod
+ def bring_up_all_interfaces(network_state: NetworkState) -> bool:
+ """ Return True is successful, otherwise return False """
+ cmd = ['systemctl', 'restart', 'systemd-networkd', 'systemd-resolved']
+ return _alter_interface(cmd, 'all')
+
+ @staticmethod
+ def bring_down_interface(device_name: str) -> bool:
+ """ Return True is successful, otherwise return False """
+ cmd = ['ip', 'link', 'set', 'down', device_name]
+ return _alter_interface(cmd, device_name)
+
+
# This section is mostly copied and pasted from renderers.py. An abstract
# version to encompass both seems overkill at this point
DEFAULT_PRIORITY = [
IfUpDownActivator,
NetworkManagerActivator,
NetplanActivator,
+ NetworkdActivator,
]
diff --git a/cloudinit/net/networkd.py b/cloudinit/net/networkd.py
index 2dffce59..63e3a07f 100644
--- a/cloudinit/net/networkd.py
+++ b/cloudinit/net/networkd.py
@@ -246,7 +246,7 @@ class Renderer(renderer.Renderer):
def available(target=None):
- expected = ['systemctl']
+ expected = ['ip', 'systemctl']
search = ['/usr/bin', '/bin']
for p in expected:
if not subp.which(p, search=search, target=target):