Skip to content
Open
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
39 changes: 39 additions & 0 deletions coriolis/osmorphing/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,39 @@
GRUB2_SERIAL = "serial --word=8 --stop=1 --speed=%d --parity=%s --unit=0"
LOG = logging.getLogger(__name__)

IFCFG_TEMPLATE = """
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=%(device_name)s
DEVICE=%(device_name)s
ONBOOT=yes
NM_CONTROLLED=%(nm_controlled)s
"""

NMCONNECTION_TEMPLATE = """[connection]
id=%(device_name)s
uuid=%(connection_uuid)s
type=ethernet
interface-name=%(device_name)s
autoconnect=true

[ethernet]

[ipv4]
method=auto
may-fail=false

[ipv6]
method=auto
addr-gen-mode=default
"""


# Required OS release fields which are expected from the OSDetect tools.
# 'schemas.CORIOLIS_DETECTED_OS_MORPHING_INFO_SCHEMA' schema:
Expand Down Expand Up @@ -467,6 +500,12 @@ def _get_keyfiles_by_type(self, nmconnection_type, network_scripts_path):
keyfiles.append((file, keyfile))
return keyfiles

def _get_existing_ethernet_nmconnection_files(self):
if not self._test_path(self._NM_CONNECTIONS_PATH):
return []
return [cfg_path for cfg_path, _ in self._get_keyfiles_by_type(
"ethernet", self._NM_CONNECTIONS_PATH)]

def _copy_resolv_conf(self):
resolv_conf = "etc/resolv.conf"
resolv_conf_path = os.path.join(self._os_root_dir, resolv_conf)
Expand Down
44 changes: 2 additions & 42 deletions coriolis/osmorphing/redhat.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,40 +23,6 @@
RELEASE_FEDORA = "Fedora"


IFCFG_TEMPLATE = """
TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=%(device_name)s
DEVICE=%(device_name)s
ONBOOT=yes
NM_CONTROLLED=%(nm_controlled)s
"""

NMCONNECTION_TEMPLATE = """[connection]
id=%(device_name)s
uuid=%(connection_uuid)s
type=ethernet
interface-name=%(device_name)s
autoconnect=true

[ethernet]

[ipv4]
method=auto
may-fail=false

[ipv6]
method=auto
addr-gen-mode=default
"""


class BaseRedHatMorphingTools(base.BaseLinuxOSMorphingTools):
BIOS_GRUB_LOCATION = "/boot/grub2"
UEFI_GRUB_LOCATION = "/boot/efi/EFI/redhat"
Expand Down Expand Up @@ -141,12 +107,6 @@ def _set_dhcp_net_config(self, ifcfgs_ethernet):
del network_cfg["GATEWAY"]
self._write_config_file(network_cfg_file, network_cfg)

def _get_existing_ethernet_nmconnection_files(self):
if not self._test_path(self._NM_CONNECTIONS_PATH):
return []
return [cfg_path for cfg_path, _ in self._get_keyfiles_by_type(
"ethernet", self._NM_CONNECTIONS_PATH)]

def _backup_nmconnection_files(self, nmconnection_files=None,
backup_file_suffix=".bak"):
if nmconnection_files is None:
Expand Down Expand Up @@ -175,7 +135,7 @@ def _write_nic_configs(self, nics_info):
cfg_path = "%s/ifcfg-%s" % (self._NETWORK_SCRIPTS_PATH, dev_name)
self._write_file_sudo(
cfg_path,
IFCFG_TEMPLATE % {
base.IFCFG_TEMPLATE % {
"device_name": dev_name,
"nm_controlled": self._get_ifcfg_nm_controlled(),
})
Expand All @@ -197,7 +157,7 @@ def _write_nmconnection_configs(self, nics_info, nmconnection_files):
self._NM_CONNECTIONS_PATH, dev_name)
self._write_file_sudo(
cfg_path,
NMCONNECTION_TEMPLATE % {
base.NMCONNECTION_TEMPLATE % {
"device_name": dev_name,
"connection_uuid": str(uuid.uuid4()),
})
Expand Down
98 changes: 94 additions & 4 deletions coriolis/osmorphing/suse.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,102 @@ def check_os_supported(cls, detected_os_info):
return False

def disable_predictable_nic_names(self):
# TODO(gsamfira): implement once we have networking support
pass
grub_cfg = "etc/default/grub"
if not self._test_path(grub_cfg):
LOG.warning(
"Could not find /%s. Skipping predictable NIC names "
"disabling.", grub_cfg)
return
contents = self._read_file_sudo(grub_cfg)
cfg = utils.Grub2ConfigEditor(contents)
cfg.append_to_option(
"GRUB_CMDLINE_LINUX_DEFAULT",
{"opt_type": "key_val", "opt_key": "net.ifnames", "opt_val": 0})
cfg.append_to_option(
"GRUB_CMDLINE_LINUX_DEFAULT",
{"opt_type": "key_val", "opt_key": "biosdevname", "opt_val": 0})
cfg.append_to_option(
"GRUB_CMDLINE_LINUX",
{"opt_type": "key_val", "opt_key": "net.ifnames", "opt_val": 0})
cfg.append_to_option(
"GRUB_CMDLINE_LINUX",
{"opt_type": "key_val", "opt_key": "biosdevname", "opt_val": 0})
self._write_file_sudo("etc/default/grub", cfg.dump())
self._execute_update_grub()

def _get_ifcfg_nm_controlled(self):
if self._version_supported_util(self._version, minimum=15):
return "yes"
return "no"

def _backup_nmconnection_files(self, backup_file_suffix=".bak"):
"""Back up all existing nmconnection profiles."""
if not self._test_path(self._NM_CONNECTIONS_PATH):
return
for cfg_path in self._get_nmconnection_files(
self._NM_CONNECTIONS_PATH):
self._exec_cmd_chroot(
'mv "%s" "%s%s"' % (cfg_path, cfg_path, backup_file_suffix))
LOG.debug("Backed up nmconnection profile '%s'", cfg_path)

def _backup_ifcfg_configs(self, device_names, backup_file_suffix=".bak"):
"""Back up ifcfg profiles for the given device names."""
for dev_name in device_names:
cfg_path = "%s/ifcfg-%s" % (self._NETWORK_SCRIPTS_PATH, dev_name)
if self._test_path(cfg_path):
self._exec_cmd_chroot(
'mv "%s" "%s%s"' % (
cfg_path, cfg_path, backup_file_suffix))
LOG.debug("Backed up ifcfg profile '%s'", cfg_path)

def _write_nic_configs(self, nics_info):
for idx, _ in enumerate(nics_info):
dev_name = "eth%d" % idx
cfg_path = "%s/ifcfg-%s" % (self._NETWORK_SCRIPTS_PATH, dev_name)
if self._test_path(cfg_path):
self._exec_cmd_chroot(
"cp %s %s.bak" % (cfg_path, cfg_path)
)
self._write_file_sudo(
cfg_path,
base.IFCFG_TEMPLATE % {
"device_name": dev_name,
"nm_controlled": self._get_ifcfg_nm_controlled(),
})

def _write_nmconnection_configs(self, nics_info, nmconnection_files=None):
self._backup_nmconnection_files()
device_names = ["eth%d" % idx for idx, _ in enumerate(nics_info)]
self._backup_ifcfg_configs(device_names)

for idx, _ in enumerate(nics_info):
dev_name = "eth%d" % idx
cfg_path = "%s/%s.nmconnection" % (
self._NM_CONNECTIONS_PATH, dev_name)
self._write_file_sudo(
cfg_path,
base.NMCONNECTION_TEMPLATE % {
"device_name": dev_name,
"connection_uuid": str(uuid.uuid4()),
})
self._exec_cmd_chroot("chmod 600 /%s" % cfg_path)

def set_net_config(self, nics_info, dhcp):
Comment thread
mihaelabalutoiu marked this conversation as resolved.
# TODO(alexpilotti): add networking support
pass
if dhcp:
nics_info = nics_info or []
if not nics_info:
return
self.disable_predictable_nic_names()
nmconnection_files = (
self._get_existing_ethernet_nmconnection_files())
if nmconnection_files:
self._write_nmconnection_configs(nics_info, nmconnection_files)
else:
self._write_nic_configs(nics_info)
return

LOG.info("Setting static IP configuration")
self._setup_network_preservation(nics_info)

def get_installed_packages(self):
cmd = 'rpm -qa --qf "%{NAME}\\n"'
Expand Down
16 changes: 8 additions & 8 deletions coriolis/tests/osmorphing/test_redhat.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,14 +162,14 @@ def test_write_nic_configs(
mock_write_file_sudo.assert_has_calls([
mock.call(
"etc/sysconfig/network-scripts/ifcfg-eth0",
redhat.IFCFG_TEMPLATE % {
base.IFCFG_TEMPLATE % {
"device_name": "eth0",
"nm_controlled": "no",
},
),
mock.call(
"etc/sysconfig/network-scripts/ifcfg-eth1",
redhat.IFCFG_TEMPLATE % {
base.IFCFG_TEMPLATE % {
"device_name": "eth1",
"nm_controlled": "no",
},
Expand All @@ -189,7 +189,7 @@ def test_write_nic_configs_rhel8(
mock_backup_all_ifcfg_configs.assert_called_once_with()
mock_write_file_sudo.assert_called_once_with(
"etc/sysconfig/network-scripts/ifcfg-eth0",
redhat.IFCFG_TEMPLATE % {
base.IFCFG_TEMPLATE % {
"device_name": "eth0",
"nm_controlled": "yes",
},
Expand Down Expand Up @@ -276,7 +276,7 @@ def test__backup_nmconnection_files(self, mock_exec_cmd_chroot):
)

@mock.patch.object(
redhat.BaseRedHatMorphingTools,
base.BaseLinuxOSMorphingTools,
'_get_existing_ethernet_nmconnection_files')
@mock.patch.object(base.BaseLinuxOSMorphingTools, '_exec_cmd_chroot')
def test__backup_nmconnection_files_fetches_files(
Expand All @@ -291,7 +291,7 @@ def test__backup_nmconnection_files_fetches_files(
mock_exec_cmd_chroot.assert_called_once()

@mock.patch.object(
redhat.BaseRedHatMorphingTools,
base.BaseLinuxOSMorphingTools,
'_get_existing_ethernet_nmconnection_files')
@mock.patch.object(base.BaseLinuxOSMorphingTools, '_exec_cmd_chroot')
def test__backup_nmconnection_files_no_files(
Expand Down Expand Up @@ -383,7 +383,7 @@ def test__get_existing_ethernet_nmconnection_files_no_dir(
redhat.BaseRedHatMorphingTools, '_write_nmconnection_configs'
)
@mock.patch.object(
redhat.BaseRedHatMorphingTools,
base.BaseLinuxOSMorphingTools,
'_get_existing_ethernet_nmconnection_files',
)
def test_set_net_config_dhcp(
Expand Down Expand Up @@ -412,7 +412,7 @@ def test_set_net_config_dhcp(
)
@mock.patch.object(redhat.BaseRedHatMorphingTools, '_write_nic_configs')
@mock.patch.object(
redhat.BaseRedHatMorphingTools,
base.BaseLinuxOSMorphingTools,
'_get_existing_ethernet_nmconnection_files',
)
def test_set_net_config_dhcp_nmconnection(
Expand Down Expand Up @@ -443,7 +443,7 @@ def test_set_net_config_dhcp_nmconnection(
)
@mock.patch.object(redhat.BaseRedHatMorphingTools, '_write_nic_configs')
@mock.patch.object(
redhat.BaseRedHatMorphingTools,
base.BaseLinuxOSMorphingTools,
'_get_existing_ethernet_nmconnection_files',
)
def test_set_net_config_dhcp_nmconnection_no_nics(
Expand Down
Loading
Loading