Просмотр исходного кода

Add disable_predictable_nic_names

* Adds disable_predictable_nic_names() function to OSMorphing base
classes. This is meant to disable net.ifnames and fallback to ethX
nic names.
* Write nics info for RHEL based systems for ethX NICs (coupled
with disable_predictable_nic_names)
Gabriel Adrian Samfira 6 лет назад
Родитель
Сommit
db0f1c1d46
3 измененных файлов с 71 добавлено и 5 удалено
  1. 4 0
      coriolis/osmorphing/base.py
  2. 24 0
      coriolis/osmorphing/debian.py
  3. 43 5
      coriolis/osmorphing/redhat.py

+ 4 - 0
coriolis/osmorphing/base.py

@@ -46,6 +46,10 @@ class BaseOSMorphingTools(object, with_metaclass(abc.ABCMeta)):
     def set_net_config(self, nics_info, dhcp):
     def set_net_config(self, nics_info, dhcp):
         pass
         pass
 
 
+    @abc.abstractmethod
+    def disable_predictable_nic_names(self):
+        pass
+
     def get_packages(self):
     def get_packages(self):
         return [], []
         return [], []
 
 

+ 24 - 0
coriolis/osmorphing/debian.py

@@ -3,6 +3,7 @@
 
 
 import os
 import os
 
 
+from coriolis import utils
 from coriolis.osmorphing import base
 from coriolis.osmorphing import base
 
 
 
 
@@ -21,6 +22,29 @@ class BaseDebianMorphingTools(base.BaseLinuxOSMorphingTools):
                 debian_version_path).decode().split('\n')[0]
                 debian_version_path).decode().split('\n')[0]
             return ('Debian', release)
             return ('Debian', release)
 
 
+    def disable_predictable_nic_names(self):
+        grub_cfg = os.path.join(
+            self._os_root_dir,
+            "etc/default/grub")
+        if self._test_path(grub_cfg) is False:
+            return
+        contents = self._read_file(grub_cfg).decode()
+        cfg = utils.Grub2ConfigEditor(contents)
+        cfg.append_to_option(
+            "GRUB_CMDLINE_LINUX_DEFAULT",
+            {"opt_type": "key_val", "opt_key": "net.ifaces", "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.ifaces", "opt_val": 0})
+        cfg.append_to_option(
+            "GRUB_CMDLINE_LINUX",
+            {"opt_type": "key_val", "opt_key": "biosdevname", "opt_val": 0})
+        self._write_file_sudo(grub_cfg, cfg.dump())
+        self._exec_cmd_chroot("/usr/sbin/update-grub")
+
     def set_net_config(self, nics_info, dhcp):
     def set_net_config(self, nics_info, dhcp):
         if dhcp:
         if dhcp:
             # NOTE: doesn't work with chroot
             # NOTE: doesn't work with chroot

+ 43 - 5
coriolis/osmorphing/redhat.py

@@ -17,6 +17,21 @@ RELEASE_CENTOS = "CentOS Linux"
 RELEASE_FEDORA = "Fedora"
 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=no
+"""
+
 class BaseRedHatMorphingTools(base.BaseLinuxOSMorphingTools):
 class BaseRedHatMorphingTools(base.BaseLinuxOSMorphingTools):
     _NETWORK_SCRIPTS_PATH = "etc/sysconfig/network-scripts"
     _NETWORK_SCRIPTS_PATH = "etc/sysconfig/network-scripts"
 
 
@@ -34,9 +49,16 @@ class BaseRedHatMorphingTools(base.BaseLinuxOSMorphingTools):
                 redhat_release_path).decode().split('\n')[0].strip()
                 redhat_release_path).decode().split('\n')[0].strip()
             m = re.match(r"^(.*) release ([0-9].*) \((.*)\).*$", release_info)
             m = re.match(r"^(.*) release ([0-9].*) \((.*)\).*$", release_info)
             if m:
             if m:
-                distro, version, codename = m.groups()
+                distro, version, _ = m.groups()
                 return (distro, version)
                 return (distro, version)
 
 
+    def disable_predictable_nic_names(self):
+        kernel_versions = self._list_dir("lib/modules")
+        for version in kernel_versions:
+            cmd = '/sbin/new-kernel-pkg --update --kernel-args="%s" %s'
+            self._exec_cmd_chroot(cmd % (
+                "net.ifnames=0 biosdevname=0", version))
+
     def _get_net_ifaces_info(self, ifcfgs_ethernet, mac_addresses):
     def _get_net_ifaces_info(self, ifcfgs_ethernet, mac_addresses):
         net_ifaces_info = []
         net_ifaces_info = []
 
 
@@ -105,12 +127,28 @@ class BaseRedHatMorphingTools(base.BaseLinuxOSMorphingTools):
                 ifcfgs.append((ifcfg_file, ifcfg))
                 ifcfgs.append((ifcfg_file, ifcfg))
         return ifcfgs
         return ifcfgs
 
 
-    def set_net_config(self, nics_info, dhcp):
-        ifcfgs_ethernet = self._get_ifcfgs_by_type("Ethernet")
+    def _write_nic_configs(self, nics_info):
+        for idx,_ in enumerate(nics_info):
+            dev_name = "eth%d" % idx
+            cfg_path = "etc/sysconfig/network-scripts/ifcfg-%s" % 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,
+                IFCFG_TEMPLATE % {
+                    "device_name": dev_name,
+                })
 
 
+    def set_net_config(self, nics_info, dhcp):
         if dhcp:
         if dhcp:
-            self._set_dhcp_net_config(ifcfgs_ethernet)
+            self.disable_predictable_nic_names()
+            self._write_nic_configs(nics_info)
+            return
+            # self._set_dhcp_net_config(ifcfgs_ethernet)
 
 
+        ifcfgs_ethernet = self._get_ifcfgs_by_type("Ethernet")
         mac_addresses = [ni.get("mac_address") for ni in nics_info]
         mac_addresses = [ni.get("mac_address") for ni in nics_info]
         net_ifaces_info = self._get_net_ifaces_info(ifcfgs_ethernet,
         net_ifaces_info = self._get_net_ifaces_info(ifcfgs_ethernet,
                                                     mac_addresses)
                                                     mac_addresses)
@@ -129,7 +167,7 @@ class BaseRedHatMorphingTools(base.BaseLinuxOSMorphingTools):
 
 
     def _yum_clean_all(self):
     def _yum_clean_all(self):
         self._exec_cmd_chroot("yum clean all")
         self._exec_cmd_chroot("yum clean all")
-        if self._test_path('/var/cache/yum'):
+        if self._test_path('var/cache/yum'):
             self._exec_cmd_chroot("rm -rf /var/cache/yum")
             self._exec_cmd_chroot("rm -rf /var/cache/yum")
 
 
     def pre_packages_install(self, package_names):
     def pre_packages_install(self, package_names):