Skip to content

Commit

Permalink
Add new distro 'azurelinux' for Microsoft Azure Linux.
Browse files Browse the repository at this point in the history
  • Loading branch information
ddstreetmicrosoft committed Mar 1, 2024
1 parent b538549 commit b1d692b
Show file tree
Hide file tree
Showing 15 changed files with 318 additions and 32 deletions.
10 changes: 10 additions & 0 deletions cloudinit/config/cc_ntp.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
distros = [
"almalinux",
"alpine",
"azurelinux",
"centos",
"cloudlinux",
"cos",
Expand Down Expand Up @@ -109,6 +110,15 @@
"service_name": "ntpd",
},
},
"azurelinux": {
"chrony": {
"service_name": "chronyd",
},
"systemd-timesyncd": {
"check_exe": "/usr/lib/systemd/systemd-timesyncd",
"confpath": "/etc/systemd/timesyncd.conf",
},
},
"centos": {
"ntp": {
"service_name": "ntpd",
Expand Down
1 change: 1 addition & 0 deletions cloudinit/config/cc_resolv_conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
"description": MODULE_DESCRIPTION,
"distros": [
"alpine",
"azurelinux",
"fedora",
"mariner",
"opensuse",
Expand Down
1 change: 1 addition & 0 deletions cloudinit/config/cc_yum_add_repo.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@

distros = [
"almalinux",
"azurelinux",
"centos",
"cloudlinux",
"eurolinux",
Expand Down
1 change: 1 addition & 0 deletions cloudinit/distros/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
"redhat": [
"almalinux",
"amazon",
"azurelinux",
"centos",
"cloudlinux",
"eurolinux",
Expand Down
72 changes: 72 additions & 0 deletions cloudinit/distros/azurelinux.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Copyright (C) 2024 Microsoft Corporation
#
# Author: Dan Streetman <ddstreet@microsoft.com>
#
# This file is part of cloud-init. See LICENSE file for license information.

import logging

from cloudinit import subp, util
from cloudinit.distros import rhel
from cloudinit.net.netplan import CLOUDINIT_NETPLAN_FILE

LOG = logging.getLogger(__name__)

NETWORK_FILE_HEADER = """\
# This file is generated from information provided by the datasource. Changes
# to it will not persist across an instance reboot. To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
"""


class Distro(rhel.Distro):
def __init__(self, name, cfg, paths):
super().__init__(name, cfg, paths)
self.osfamily = "azurelinux"

self.network_conf_dir = "/etc/systemd/network/"
self.systemd_locale_conf_fn = "/etc/locale.conf"
self.resolve_conf_fn = "/etc/systemd/resolved.conf"
self.init_cmd = ["systemctl"]

self.network_conf_fn = {"netplan": CLOUDINIT_NETPLAN_FILE}
self.renderer_configs = {
"networkd": {
"resolv_conf_fn": self.resolve_conf_fn,
"network_conf_dir": self.network_conf_dir,
},
"netplan": {
"netplan_path": self.network_conf_fn["netplan"],
"netplan_header": NETWORK_FILE_HEADER,
"postcmds": "True",
},
}

def package_command(self, command, args=None, pkgs=None):
if pkgs is None:
pkgs = []

if subp.which("dnf"):
LOG.debug("Using DNF for package management")
cmd = ["dnf"]
else:
LOG.debug("Using TDNF for package management")
cmd = ["tdnf"]
# Determines whether or not dnf/tdnf prompts for confirmation
# of critical actions. We don't want to prompt...
cmd.append("-y")

if args and isinstance(args, str):
cmd.append(args)
elif args and isinstance(args, list):
cmd.extend(args)

cmd.append(command)

pkglist = util.expand_package_list("%s-%s", pkgs)
cmd.extend(pkglist)

# Allow the output of this to flow outwards (ie not be captured)
subp.subp(cmd, capture=False)
1 change: 1 addition & 0 deletions cloudinit/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -649,6 +649,7 @@ def _get_variant(info):
"almalinux",
"alpine",
"arch",
"azurelinux",
"centos",
"cloudlinux",
"debian",
Expand Down
50 changes: 27 additions & 23 deletions config/cloud.cfg.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@
{% set is_bsd = variant in ["dragonfly", "freebsd", "netbsd", "openbsd"] %}
{% set is_rhel = variant in ["almalinux", "centos", "cloudlinux", "eurolinux",
"miraclelinux", "rhel", "rocky", "virtuozzo"] %}
{% set gecos = ({"amazon": "EC2 Default User", "centos": "Cloud User",
"debian": "Debian", "dragonfly": "DragonFly",
"freebsd": "FreeBSD", "mariner": "MarinerOS",
"rhel": "Cloud User", "netbsd": "NetBSD",
"openbsd": "openBSD", "openmandriva": "OpenMandriva admin",
"photon": "PhotonOS", "ubuntu": "Ubuntu",
"unknown": "Ubuntu"}) %}
{% set gecos = ({"amazon": "EC2 Default User", "azurelinux": "Azure Linux",
"centos": "Cloud User", "debian": "Debian",
"dragonfly": "DragonFly", "freebsd": "FreeBSD",
"mariner": "MarinerOS", "rhel": "Cloud User",
"netbsd": "NetBSD", "openbsd": "openBSD",
"openmandriva": "OpenMandriva admin", "photon": "PhotonOS",
"ubuntu": "Ubuntu", "unknown": "Ubuntu"}) %}
{% set groups = ({"alpine": "adm, wheel", "arch": "wheel, users",
"azurelinux": "wheel",
"debian": "adm, audio, cdrom, dialout, dip, floppy, netdev, plugdev, sudo, video",
"gentoo": "users, wheel", "mariner": "wheel",
"photon": "wheel",
Expand Down Expand Up @@ -165,8 +166,8 @@ cloud_config_modules:
{% if variant == "ubuntu" %}
- ubuntu_pro
{% endif %}
{% elif variant in ["fedora", "mariner", "openeuler", "openmandriva",
"photon"] or is_rhel %}
{% elif variant in ["azurelinux", "fedora", "mariner", "openeuler",
"openmandriva", "photon"] or is_rhel %}
{% if is_rhel %}
- rh_subscription
{% endif %}
Expand Down Expand Up @@ -219,10 +220,10 @@ cloud_final_modules:
# (not accessible to handlers/transforms)
system_info:
# This will affect which distro class gets used
{% if variant in ["alpine", "amazon", "arch", "debian", "fedora", "freebsd",
"gentoo", "mariner", "netbsd", "openbsd", "OpenCloudOS",
"openeuler", "openmandriva", "photon", "suse", "TencentOS",
"ubuntu"] or is_rhel %}
{% if variant in ["alpine", "amazon", "arch", "azurelinux", "debian", "fedora",
"freebsd", "gentoo", "mariner", "netbsd", "openbsd",
"OpenCloudOS", "openeuler", "openmandriva", "photon", "suse",
"TencentOS", "ubuntu"] or is_rhel %}
distro: {{ variant }}
{% elif variant == "dragonfly" %}
distro: dragonflybsd
Expand All @@ -237,9 +238,10 @@ system_info:
{% else %}
name: {{ variant }}
{% endif %}
{% if variant in ["alpine", "amazon", "arch", "debian", "fedora", "gentoo",
"mariner", "OpenCloudOS", "openeuler", "openmandriva",
"photon", "suse", "TencentOS", "ubuntu", "unknown"]
{% if variant in ["alpine", "amazon", "arch", "azurelinux", "debian", "fedora",
"gentoo", "mariner", "OpenCloudOS", "openeuler",
"openmandriva", "photon", "suse", "TencentOS", "ubuntu",
"unknown"]
or is_bsd or is_rhel %}
lock_passwd: True
{% endif %}
Expand Down Expand Up @@ -292,7 +294,7 @@ system_info:
{% elif variant in ["freebsd", "netbsd", "openbsd"] %}
network:
renderers: ['{{ variant }}']
{% elif variant in ["mariner", "photon"] %}
{% elif variant in ["azurelinux", "mariner", "photon"] %}
network:
renderers: ['networkd']
{% elif variant == "openmandriva" %}
Expand All @@ -318,9 +320,10 @@ system_info:
# Automatically discover the best ntp_client
ntp_client: auto
{% endif %}
{% if variant in ["alpine", "amazon", "arch", "debian", "fedora", "gentoo",
"mariner", "OpenCloudOS", "openeuler", "openmandriva",
"photon", "suse", "TencentOS", "ubuntu", "unknown"]
{% if variant in ["alpine", "amazon", "arch", "azurelinux", "debian", "fedora",
"gentoo", "mariner", "OpenCloudOS", "openeuler",
"openmandriva", "photon", "suse", "TencentOS", "ubuntu",
"unknown"]
or is_rhel %}
# Other config here will be given to the distro class and/or path classes
paths:
Expand Down Expand Up @@ -365,8 +368,9 @@ system_info:
{% endif %}
{% if variant in ["debian", "ubuntu", "unknown"] %}
ssh_svcname: ssh
{% elif variant in ["alpine", "amazon", "arch", "fedora", "gentoo",
"mariner", "OpenCloudOS", "openeuler", "openmandriva",
"photon", "suse", "TencentOS"] or is_rhel %}
{% elif variant in ["alpine", "amazon", "arch", "azurelinux", "fedora",
"gentoo", "mariner", "OpenCloudOS", "openeuler",
"openmandriva", "photon", "suse", "TencentOS"]
or is_rhel %}
ssh_svcname: sshd
{% endif %}
4 changes: 2 additions & 2 deletions doc/rtd/reference/network-config.rst
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ Example output:
.. code-block::
usage: /usr/bin/cloud-init devel net-convert [-h] -p PATH -k {eni,network_data.json,yaml,azure-imds,vmware-imc} -d PATH -D
{alpine,arch,debian,ubuntu,freebsd,dragonfly,gentoo,cos,netbsd,openbsd,almalinux,amazon,centos,cloudlinux,eurolinux,fedora,mariner,miraclelinux,openmandriva,photon,rhel,rocky,virtuozzo,opensuse,sles,openEuler}
{alpine,arch,azurelinux,debian,ubuntu,freebsd,dragonfly,gentoo,cos,netbsd,openbsd,almalinux,amazon,centos,cloudlinux,eurolinux,fedora,mariner,miraclelinux,openmandriva,photon,rhel,rocky,virtuozzo,opensuse,sles,openEuler}
[-m name,mac] [--debug] -O {eni,netplan,networkd,sysconfig,network-manager}
options:
Expand All @@ -284,7 +284,7 @@ Example output:
The format of the given network config
-d PATH, --directory PATH
directory to place output in
-D {alpine,arch,debian,ubuntu,freebsd,dragonfly,gentoo,cos,netbsd,openbsd,almalinux,amazon,centos,cloudlinux,eurolinux,fedora,mariner,miraclelinux,openmandriva,photon,rhel,rocky,virtuozzo,opensuse,sles,openeuler}, --distro {alpine,arch,debian,ubuntu,freebsd,dragonfly,gentoo,cos,netbsd,openbsd,almalinux,amazon,centos,cloudlinux,eurolinux,fedora,mariner,miraclelinux,openmandriva,photon,rhel,rocky,virtuozzo,opensuse,sles,openEuler}
-D {alpine,arch,azurelinux,debian,ubuntu,freebsd,dragonfly,gentoo,cos,netbsd,openbsd,almalinux,amazon,centos,cloudlinux,eurolinux,fedora,mariner,miraclelinux,openmandriva,photon,rhel,rocky,virtuozzo,opensuse,sles,openeuler}, --distro {alpine,arch,azurelinux,debian,ubuntu,freebsd,dragonfly,gentoo,cos,netbsd,openbsd,almalinux,amazon,centos,cloudlinux,eurolinux,fedora,mariner,miraclelinux,openmandriva,photon,rhel,rocky,virtuozzo,opensuse,sles,openEuler}
-m name,mac, --mac name,mac
interface name to mac mapping
--debug enable debug logging to stderr.
Expand Down
22 changes: 22 additions & 0 deletions templates/hosts.azurelinux.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
## template:jinja
{#
This file /etc/cloud/templates/hosts.azurelinux.tmpl is only utilized
if enabled in cloud-config. Specifically, in order to enable it
you need to add the following to config:
manage_etc_hosts: True
-#}
# Your system has configured 'manage_etc_hosts' as True.
# As a result, if you wish for changes to this file to persist
# then you will need to either
# a.) make changes to the master file in /etc/cloud/templates/hosts.azurelinux.tmpl
# b.) change or remove the value of 'manage_etc_hosts' in
# /etc/cloud/cloud.cfg or cloud-config from user-data
#
# The following lines are desirable for IPv4 capable hosts
127.0.0.1 {{fqdn}} {{hostname}}
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4

# The following lines are desirable for IPv6 capable hosts
::1 {{fqdn}} {{hostname}}
::1 localhost6.localdomain6 localhost6
25 changes: 25 additions & 0 deletions tests/unittests/distros/test_azurelinux.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# This file is part of cloud-init. See LICENSE file for license information.

from tests.unittests.helpers import CiTestCase

from . import _get_distro

SYSTEM_INFO = {
"paths": {
"cloud_dir": "/var/lib/cloud/",
"templates_dir": "/etc/cloud/templates/",
},
"network": {"renderers": "networkd"},
}


class TestAzurelinux(CiTestCase):
with_logs = True
distro = _get_distro("azurelinux", SYSTEM_INFO)
expected_log_line = "Rely on Azure Linux default network config"

def test_network_renderer(self):
self.assertEqual(self.distro._cfg["network"]["renderers"], "networkd")

def test_get_distro(self):
self.assertEqual(self.distro.osfamily, "azurelinux")
Loading

0 comments on commit b1d692b

Please sign in to comment.