Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add VZLinux support #951

Merged
merged 1 commit into from
Jul 21, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ get in contact with that distribution and send them our way!

| Supported OSes | Supported Public Clouds | Supported Private Clouds |
| --- | --- | --- |
| Alpine Linux<br />ArchLinux<br />Debian<br />DragonFlyBSD<br />Fedora<br />FreeBSD<br />Gentoo Linux<br />NetBSD<br />OpenBSD<br />RHEL/CentOS/AlmaLinux/Rocky/PhotonOS<br />SLES/openSUSE<br />Ubuntu<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /> | Amazon Web Services<br />Microsoft Azure<br />Google Cloud Platform<br />Oracle Cloud Infrastructure<br />Softlayer<br />Rackspace Public Cloud<br />IBM Cloud<br />DigitalOcean<br />Bigstep<br />Hetzner<br />Joyent<br />CloudSigma<br />Alibaba Cloud<br />OVH<br />OpenNebula<br />Exoscale<br />Scaleway<br />CloudStack<br />AltCloud<br />SmartOS<br />HyperOne<br />Vultr<br />Rootbox<br /> | Bare metal installs<br />OpenStack<br />LXD<br />KVM<br />Metal-as-a-Service (MAAS)<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />|
| Alpine Linux<br />ArchLinux<br />Debian<br />DragonFlyBSD<br />Fedora<br />FreeBSD<br />Gentoo Linux<br />NetBSD<br />OpenBSD<br />RHEL/CentOS/AlmaLinux/Rocky/PhotonOS/Virtuozzo<br />SLES/openSUSE<br />Ubuntu<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /> | Amazon Web Services<br />Microsoft Azure<br />Google Cloud Platform<br />Oracle Cloud Infrastructure<br />Softlayer<br />Rackspace Public Cloud<br />IBM Cloud<br />DigitalOcean<br />Bigstep<br />Hetzner<br />Joyent<br />CloudSigma<br />Alibaba Cloud<br />OVH<br />OpenNebula<br />Exoscale<br />Scaleway<br />CloudStack<br />AltCloud<br />SmartOS<br />HyperOne<br />Vultr<br />Rootbox<br /> | Bare metal installs<br />OpenStack<br />LXD<br />KVM<br />Metal-as-a-Service (MAAS)<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />|

## To start developing cloud-init

Expand Down
2 changes: 1 addition & 1 deletion cloudinit/config/cc_ntp.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
NTP_CONF = '/etc/ntp.conf'
NR_POOL_SERVERS = 4
distros = ['almalinux', 'alpine', 'centos', 'debian', 'fedora', 'opensuse',
'photon', 'rhel', 'rocky', 'sles', 'ubuntu']
'photon', 'rhel', 'rocky', 'sles', 'ubuntu', 'virtuozzo']

NTP_CLIENT_CONFIG = {
'chrony': {
Expand Down
6 changes: 4 additions & 2 deletions cloudinit/config/cc_yum_add_repo.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@

**Module frequency:** per always

**Supported distros:** almalinux, centos, fedora, photon, rhel, rocky
**Supported distros:** almalinux, centos, fedora, photon, rhel, rocky,
virtuozzo

**Config keys**::

Expand All @@ -36,7 +37,8 @@

from cloudinit import util

distros = ['almalinux', 'centos', 'fedora', 'photon', 'rhel', 'rocky']
distros = ['almalinux', 'centos', 'fedora', 'photon', 'rhel', 'rocky',
'virtuozzo']


def _canonicalize_id(repo_id):
Expand Down
2 changes: 1 addition & 1 deletion cloudinit/distros/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
'freebsd': ['freebsd'],
'gentoo': ['gentoo'],
'redhat': ['almalinux', 'amazon', 'centos', 'fedora', 'photon', 'rhel',
'rocky'],
'rocky', 'virtuozzo'],
'suse': ['opensuse', 'sles'],
}

Expand Down
9 changes: 9 additions & 0 deletions cloudinit/distros/virtuozzo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# This file is part of cloud-init. See LICENSE file for license information.

from cloudinit.distros import rhel


class Distro(rhel.Distro):
pass

# vi: ts=4 expandtab
3 changes: 2 additions & 1 deletion cloudinit/net/sysconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
is_ipv6_addr, net_prefix_to_ipv4_mask, subnet_is_ipv6, IPV6_DYNAMIC_TYPES)

LOG = logging.getLogger(__name__)
KNOWN_DISTROS = ['almalinux', 'centos', 'fedora', 'rhel', 'rocky', 'suse']
KNOWN_DISTROS = ['almalinux', 'centos', 'fedora', 'rhel', 'rocky', 'suse',
'virtuozzo']
NM_CFG_FILE = "/etc/NetworkManager/NetworkManager.conf"


Expand Down
32 changes: 32 additions & 0 deletions cloudinit/tests/test_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,20 @@
ROCKY_SUPPORT_PRODUCT_VERSION="8"
""")

OS_RELEASE_VIRTUOZZO_8 = dedent("""\
NAME="Virtuozzo Linux"
VERSION="8"
ID="virtuozzo"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Virtuozzo Linux"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:virtuozzoproject:vzlinux:8"
HOME_URL="https://www.vzlinux.org"
BUG_REPORT_URL="https://bugs.openvz.org"
""")

REDHAT_RELEASE_CENTOS_6 = "CentOS release 6.10 (Final)"
REDHAT_RELEASE_CENTOS_7 = "CentOS Linux release 7.5.1804 (Core)"
REDHAT_RELEASE_REDHAT_6 = (
Expand All @@ -150,6 +164,8 @@
"AlmaLinux release 8.3 (Purple Manul)")
REDHAT_RELEASE_ROCKY_8 = (
"Rocky Linux release 8.3 (Green Obsidian)")
REDHAT_RELEASE_VIRTUOZZO_8 = (
"Virtuozzo Linux release 8")

OS_RELEASE_DEBIAN = dedent("""\
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
Expand Down Expand Up @@ -581,6 +597,22 @@ def test_get_linux_rocky8_osrelease(self, m_os_release, m_path_exists):
dist = util.get_linux_distro()
self.assertEqual(('rocky', '8.3', 'Green Obsidian'), dist)

@mock.patch('cloudinit.util.load_file')
def test_get_linux_virtuozzo8_rhrelease(self, m_os_release, m_path_exists):
"""Verify virtuozzo linux 8 read from redhat-release."""
m_os_release.return_value = REDHAT_RELEASE_VIRTUOZZO_8
m_path_exists.side_effect = TestGetLinuxDistro.redhat_release_exists
dist = util.get_linux_distro()
self.assertEqual(('virtuozzo', '8', 'Virtuozzo Linux'), dist)

@mock.patch('cloudinit.util.load_file')
def test_get_linux_virtuozzo8_osrelease(self, m_os_release, m_path_exists):
"""Verify virtuozzo linux 8 read from os-release."""
m_os_release.return_value = OS_RELEASE_VIRTUOZZO_8
m_path_exists.side_effect = TestGetLinuxDistro.os_release_exists
dist = util.get_linux_distro()
self.assertEqual(('virtuozzo', '8', 'Virtuozzo Linux'), dist)

@mock.patch('cloudinit.util.load_file')
def test_get_linux_debian(self, m_os_release, m_path_exists):
"""Verify we get the correct name and release name on Debian."""
Expand Down
17 changes: 16 additions & 1 deletion cloudinit/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -453,9 +453,19 @@ def _parse_redhat_release(release_file=None):
redhat_regex = (
r'(?P<name>.+) release (?P<version>[\d\.]+) '
r'\((?P<codename>[^)]+)\)')

# Virtuozzo deviates here
if "Virtuozzo" in redhat_release:
redhat_regex = r'(?P<name>.+) release (?P<version>[\d\.]+)'

match = re.match(redhat_regex, redhat_release)
if match:
group = match.groupdict()

# Virtuozzo has no codename in this file
if "Virtuozzo" in group['name']:
group['codename'] = group['name']

group['name'] = group['name'].lower().partition(' linux')[0]
if group['name'] == 'red hat enterprise':
group['name'] = 'redhat'
Expand All @@ -470,9 +480,11 @@ def get_linux_distro():
distro_version = ''
flavor = ''
os_release = {}
os_release_rhel = False
if os.path.exists('/etc/os-release'):
os_release = load_shell_content(load_file('/etc/os-release'))
if not os_release:
os_release_rhel = True
os_release = _parse_redhat_release()
if os_release:
distro_name = os_release.get('ID', '')
Expand All @@ -485,6 +497,9 @@ def get_linux_distro():
flavor = platform.machine()
elif distro_name == 'photon':
flavor = os_release.get('PRETTY_NAME', '')
elif distro_name == 'virtuozzo' and not os_release_rhel:
# Only use this if the redhat file is not parsed
flavor = os_release.get('PRETTY_NAME', '')
else:
flavor = os_release.get('VERSION_CODENAME', '')
if not flavor:
Expand Down Expand Up @@ -533,7 +548,7 @@ def system_info():
linux_dist = info['dist'][0].lower()
if linux_dist in (
'almalinux', 'alpine', 'arch', 'centos', 'debian', 'fedora',
'photon', 'rhel', 'rocky', 'suse'):
'photon', 'rhel', 'rocky', 'suse', 'virtuozzo'):
var = linux_dist
elif linux_dist in ('ubuntu', 'linuxmint', 'mint'):
var = 'ubuntu'
Expand Down
6 changes: 3 additions & 3 deletions config/cloud.cfg.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ disable_root: true
{% endif %}

{% if variant in ["almalinux", "alpine", "amazon", "centos", "fedora",
"rhel", "rocky"] %}
"rhel", "rocky", "virtuozzo"] %}
mount_default_fields: [~, ~, 'auto', 'defaults,nofail', '0', '2']
{% if variant == "amazon" %}
resize_rootfs: noblock
Expand Down Expand Up @@ -174,7 +174,7 @@ system_info:
# This will affect which distro class gets used
{% if variant in ["almalinux", "alpine", "amazon", "arch", "centos", "debian",
"fedora", "freebsd", "netbsd", "openbsd", "photon", "rhel",
"rocky", "suse", "ubuntu"] %}
"rocky", "suse", "ubuntu", "virtuozzo"] %}
distro: {{ variant }}
{% elif variant in ["dragonfly"] %}
distro: dragonflybsd
Expand Down Expand Up @@ -228,7 +228,7 @@ system_info:
security: http://ports.ubuntu.com/ubuntu-ports
ssh_svcname: ssh
{% elif variant in ["almalinux", "alpine", "amazon", "arch", "centos", "fedora",
"rhel", "rocky", "suse"] %}
"rhel", "rocky", "suse", "virtuozzo"] %}
# Default user name + that default users groups (if added/used)
default_user:
{% if variant == "amazon" %}
Expand Down
2 changes: 1 addition & 1 deletion systemd/cloud-init-generator.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ default() {

check_for_datasource() {
local ds_rc=""
{% if variant in ["almalinux", "rhel", "fedora", "centos", "rocky"] %}
{% if variant in ["almalinux", "rhel", "fedora", "centos", "rocky", "virtuozzo"] %}
local dsidentify="/usr/libexec/cloud-init/ds-identify"
{% else %}
local dsidentify="/usr/lib/cloud-init/ds-identify"
Expand Down
2 changes: 1 addition & 1 deletion systemd/cloud-init.service.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ After=systemd-networkd-wait-online.service
{% if variant in ["ubuntu", "unknown", "debian"] %}
After=networking.service
{% endif %}
{% if variant in ["almalinux", "centos", "fedora", "rhel", "rocky"] %}
{% if variant in ["almalinux", "centos", "fedora", "rhel", "rocky", "virtuozzo"] %}
After=network.service
After=NetworkManager.service
{% endif %}
Expand Down
2 changes: 1 addition & 1 deletion tests/unittests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@ def test_wb_devel_schema_subcommand_doc_content(self):
expected_doc_sections = [
'**Supported distros:** all',
('**Supported distros:** almalinux, alpine, centos, debian, '
'fedora, opensuse, photon, rhel, rocky, sles, ubuntu'),
'fedora, opensuse, photon, rhel, rocky, sles, ubuntu, virtuozzo'),
'**Config schema**:\n **resize_rootfs:** (true/false/noblock)',
'**Examples**::\n\n runcmd:\n - [ ls, -l, / ]\n'
]
Expand Down
2 changes: 1 addition & 1 deletion tools/render-cloudcfg
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import sys

VARIANTS = ["almalinux", "alpine", "amazon", "arch", "centos", "debian",
"fedora", "freebsd", "netbsd", "openbsd", "photon", "rhel",
"suse","rocky", "ubuntu", "unknown"]
"suse","rocky", "ubuntu", "unknown", "virtuozzo"]


if "avoid-pep8-E402-import-not-top-of-file":
Expand Down