[node-patches] Change in ovirt-node[master]: [DRAFT] Replace legacy network backend with new backend

fabiand at fedoraproject.org fabiand at fedoraproject.org
Mon Jun 10 12:29:13 UTC 2013


Fabian Deutsch has uploaded a new change for review.

Change subject: [DRAFT] Replace legacy network backend with new backend
......................................................................

[DRAFT] Replace legacy network backend with new backend

After creating the backend this patch replaces all occurrences of the
old backend code with the new backend.

Change-Id: I30378deb42c270d615353110fcf86ec79d18a345
Signed-off-by: Fabian Deutsch <fabiand at fedoraproject.org>
---
M src/ovirt/node/config/defaults.py
M src/ovirt/node/setup/core/kdump_page.py
M src/ovirt/node/utils/console.py
M src/ovirt/node/utils/storage.py
M src/ovirtnode/network.py
5 files changed, 86 insertions(+), 291 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-node refs/changes/14/15514/1

diff --git a/src/ovirt/node/config/defaults.py b/src/ovirt/node/config/defaults.py
index a5faa47..c5656a7 100644
--- a/src/ovirt/node/config/defaults.py
+++ b/src/ovirt/node/config/defaults.py
@@ -239,35 +239,6 @@
     def transaction(self):
         """Return all transactions to re-configure networking
         """
-        return self.__transaction()
-
-    def __legacy_transaction(self):
-        class ConfigureNIC(utils.Transaction.Element):
-            title = "Configuring NIC"
-
-            def prepare(self):
-                self.logger.debug("Psuedo preparing ovirtnode.Network")
-
-            def commit(self):
-                from ovirtnode.network import Network as oNetwork
-                net = oNetwork()
-                net.configure_interface()
-                net.save_network_configuration()
-                #utils.AugeasWrapper.force_reload()
-
-        class ReloadNetworkConfiguration(utils.Transaction.Element):
-            title = "Reloading network configuration"
-
-            def commit(self):
-                utils.AugeasWrapper.force_reload()
-                utils.network.reset_resolver()
-
-        tx = utils.Transaction("Applying new network configuration")
-        tx.append(ConfigureNIC())
-        tx.append(ReloadNetworkConfiguration())
-        return tx
-
-    def __transaction(self):
         services = ["network", "ntpd", "ntpdate", "rpcbind", "nfslock",
                     "rpcidmapd", "rpcgssd"]
 
@@ -537,21 +508,37 @@
                 self.hostname = hostname
 
             def commit(self):
-                from ovirtnode import network as onet, ovirtfunctions
-                network = onet.Network()
+                aug= AugeasWrapper()
 
+                localhost_entry = None
+                for entry in aug.match("/files/etc/hosts/*"):
+                    if aug.get(entry + "/ipaddr") == "127.0.0.1":
+                        localhost_entry = entry
+                        break
+
+                if not localhost_entry:
+                    raise RuntimeError("Couldn't find entry for localhost")
+
+                # Remove all aliases
+                for alias_entry in aug.match(localhost_entry + "/alias",
+                                             False):
+                    aug.remove(alias_entry, False)
+
+                # ... and create a new one
+                aliases = ["localhost", "localhost.localdomain"]
                 if self.hostname:
-                    network.remove_non_localhost()
-                    network.add_localhost_alias(self.hostname)
-                else:
-                    network.remove_non_localhost()
-                    self.hostname = "localhost.localdomain"
+                    aliases.append(self.hostname)
+
+                for _idx, alias in enumerate(aliases):
+                    idx = _idx + 1
+                    p = "%s/alias[%s]" % (localhost_entry, idx)
+                    aug.set(p, alias, False)
 
                 config.network.hostname(self.hostname)
 
-                ovirtfunctions.ovirt_store_config("/etc/hosts")
-                ovirtfunctions.ovirt_store_config("/etc/hostname")
-                ovirtfunctions.ovirt_store_config("/etc/sysconfig/network")
+                fs.Config().persist("/etc/hosts")
+                fs.Config().persist("/etc/hostname")
+                fs.Config().persist("/etc/sysconfig/network")
 
                 utils.network.reset_resolver()
 
@@ -1143,6 +1130,10 @@
                 nfsv4 = storage.NFSv4()
                 nfsv4.domain(domain)
 
+                fs.Config().persist(nfsv4.configfilename)
+                process.check_call("service rpcidmapd restart")
+                process.check_call("nfsidmap -c")
+
         tx = utils.Transaction("Configuring NFSv4")
         tx.append(ConfigureNfsv4())
         return tx
diff --git a/src/ovirt/node/setup/core/kdump_page.py b/src/ovirt/node/setup/core/kdump_page.py
index 3017520..8995ec3 100644
--- a/src/ovirt/node/setup/core/kdump_page.py
+++ b/src/ovirt/node/setup/core/kdump_page.py
@@ -137,7 +137,8 @@
 
         with self.application.ui.suspended():
             utils.process.call("reset")
-            progress_dialog = console.TransactionProgress(txs, self)
+            is_dry = self.application.args.dry
+            progress_dialog = console.TransactionProgress(txs, is_dry)
             progress_dialog.run()
             console.writeln("\nPlease press any key to continue")
             console.wait_for_keypress()
diff --git a/src/ovirt/node/utils/console.py b/src/ovirt/node/utils/console.py
index bdb22b4..9c7f5fe 100644
--- a/src/ovirt/node/utils/console.py
+++ b/src/ovirt/node/utils/console.py
@@ -49,9 +49,13 @@
 class TransactionProgress(base.Base):
     """Display the progress of a transaction on a console
     """
-    def __init__(self, transaction, plugin, initial_text=""):
+    transaction = None
+    texts = None
+    is_dry = False
+
+    def __init__(self, transaction, is_dry, initial_text=""):
         self.transaction = transaction
-        self.plugin = plugin
+        self.is_dry = is_dry
         self.texts = [initial_text, ""]
         super(TransactionProgress, self).__init__()
 
@@ -88,7 +92,10 @@
                     # Sometimes a tx_element is wrapping some code that
                     # writes to stdout/stderr which scrambles the screen,
                     # therefore we are capturing this
-                    self.plugin.dry_or(lambda: e.commit())
+                    if self.is_dry:
+                        self.logger.debug("In dry mode: %s" % e)
+                    else:
+                        e.commit()
             self.add_update("\nAll changes were applied successfully.")
         except Exception as e:
             self.add_update("\nAn error occurred while applying the changes:")
diff --git a/src/ovirt/node/utils/storage.py b/src/ovirt/node/utils/storage.py
index 77eb4a6..a28cbe4 100644
--- a/src/ovirt/node/utils/storage.py
+++ b/src/ovirt/node/utils/storage.py
@@ -20,6 +20,8 @@
 # also available at http://www.gnu.org/copyleft/gpl.html.
 
 from ovirt.node import base
+from ovirt.node.utils import process
+from ovirt.node.utils.fs import File
 import os
 
 
@@ -39,12 +41,30 @@
 class NFSv4(base.Base):
     """A class to deal some external NFSv4 related functionality
     """
-    def domain(self, domain=None):
-        import ovirtnode.network as onet
-        if domain:
-            onet.set_nfsv4_domain(domain)
-        return onet.get_current_nfsv4_domain()
+    configfilename= "/etc/idmapd.conf"
 
+    def domain(self, domain=None):
+        if domain:
+            self.__set_domain(domain)
+        return self.__get_domain()
+
+    def __set_domain(self, domain):
+        current_domain = self.__get_domain()
+        if current_domain.startswith("#"):
+            current_domain = "#Domain = %s" % current_domain.replace("# ","")
+            process.check_call("sed -i 's/%s/Domain = %s/g' %s" \
+                % (current_domain, domain, self.configfilename))
+        else:
+            process.check_call("sed -i '/^Domain/ s/%s/%s/g' %s" \
+                % (current_domain, domain, self.configfilename))
+
+    def __get_domain(self):
+        domain = None
+        nfs_config = File(self.configfilename)
+        for line in nfs_config:
+            if "Domain =" in line:
+                domain = line.replace("Domain =", "").strip()
+        return domain
 
 class Devices(base.Base):
     """A class to retrieve available storage devices
diff --git a/src/ovirtnode/network.py b/src/ovirtnode/network.py
index 41e10ff..e1b8d26 100644
--- a/src/ovirtnode/network.py
+++ b/src/ovirtnode/network.py
@@ -171,84 +171,10 @@
             pass
         return True
 
-    def get_localhost_entry(self):
-        entries = _functions.augtool("match", "/files/etc/hosts/*", "")
-        for entry in entries:
-            ipaddr = _functions.augtool("get", entry + "/ipaddr", "")
-            if ipaddr == "127.0.0.1":
-                return entry
-        return None
-
-    def get_num_localhost_aliases(self):
-        if self.localhost_entry:
-            aliases = _functions.augtool("match", self.localhost_entry + \
-                                         "/alias", "")
-            return len(aliases)
-        return 0
-
-    def remove_non_localhost(self):
-        last_alias = _functions.augtool("get", self.localhost_entry + \
-                                        "/alias[" + \
-                                        str(self.alias_count) + "]", "")
-        while self.alias_count != 0:
-            if last_alias == "localhost":
-                break
-            elif last_alias == "localhost.localdomain":
-                break
-            _functions.augtool("rm", self.localhost_entry + "/alias[" + \
-                          str(self.alias_count) + "]", "")
-            self.alias_count = self.alias_count - 1
-
-    def add_localhost_alias(self, alias):
-        self.alias_count = self.alias_count + 1
-        _functions.augtool("set", self.localhost_entry + "/alias[" + \
-                       str(self.alias_count) + "]", alias)
-
     def configure_dns(self):
-        logger.warn("Configuring DNS")
-        OVIRT_VARS = _functions.parse_defaults()
-        have_peerdns = True
-        DNS = ""
-        if "OVIRT_DNS" in OVIRT_VARS:
-            DNS = OVIRT_VARS["OVIRT_DNS"]
-            logger.debug("Found DNS key with value '%s'" % DNS)
-            try:
-                # Write resolv.conf any way, sometimes without servers
-                tui_cmt = ("Please make changes through the TUI. " + \
-                           "Manual edits to this file will be " + \
-                           "lost on reboot")
-                _functions.augtool("set", \
-                                   "/files/etc/resolv.conf/#comment[1]", \
-                                   tui_cmt)
-                DNS = [s for s in DNS.split(",") if s]
-                i = 1
-                for server in DNS:
-                    logger.debug("Setting DNS server %d: %s" % (i, server))
-                    setting = "/files/etc/resolv.conf/nameserver[%s]" % i
-                    _functions.augtool("set", setting, server)
-                    # PEERDNS=no is required with manual DNS servers
-                    have_peerdns = False
-                    i = i + i
-                _functions.ovirt_store_config("/etc/resolv.conf")
-            except:
-                logger.warn("Failed to set DNS servers")
-
-        # Remove all spare DNS servers
-        logger.debug("Removing DNS servers")
-        if len(DNS) < 2:
-            _functions.augtool("rm", "/files/etc/resolv.conf/nameserver[2]", "")
-        if len(DNS) < 1:
-            _functions.augtool("rm", "/files/etc/resolv.conf/nameserver[1]", "")
-
-        # Set or remove PEERDNS for all ifcfg-*
-        for nic in glob("/etc/sysconfig/network-scripts/ifcfg-*"):
-            if "ifcfg-lo" in nic:
-                continue
-            path = "/files%s/PEERDNS" % nic
-            if have_peerdns:
-                _functions.augtool("rm", path, "")
-            else:
-                _functions.augtool("set", path, "no")
+        from ovirt.node.config.defaults import Network
+        mnet = Network()
+        mnet.transaction()
 
     def configure_ntp(self):
         if "OVIRT_NTP" in OVIRT_VARS:
@@ -433,166 +359,6 @@
                 _functions.test_ntp_configuration()
 
 
-def get_system_nics():
-    # Re-trigger udev for rhbz#866584
-    for sysfspath in glob("/sys/class/net/*"):
-        _functions.system_closefds("udevadm test %s > /dev/null 2> /dev/null" % quote(sysfspath))
-
-    client = _functions.gudev.Client(['net'])
-    configured_nics = 0
-    ntp_dhcp = 0
-    nic_dict = {}
-    for device in client.query_by_subsystem("net"):
-        try:
-            dev_interface = device.get_property("INTERFACE")
-            dev_vendor = device.get_property("ID_VENDOR_FROM_DATABASE")
-            dev_type = device.get_property("DEVTYPE")
-            dev_path = device.get_property("DEVPATH")
-
-            if (dev_interface == "lo" or \
-                dev_interface.startswith("bond") or \
-                dev_interface.startswith("sit") or \
-                dev_interface.startswith("vnet") or \
-                "." in dev_interface or \
-                dev_type == "bridge"):
-                logger.info("Skipping interface '%s'" % dev_interface)
-                continue
-            else:
-                logger.info("Gathering informations for '%s'" % dev_interface)
-
-            try:
-                dev_vendor = dev_vendor.replace(",", "")
-            except AttributeError:
-                logger.debug("2. vendor approach: %s" % dev_vendor)
-                try:
-                    # rhevh workaround since udev version
-                    # doesn't have vendor info
-                    dev_path = dev_path.split('/')
-                    if "virtio" in dev_path[4]:
-                        pci_dev = dev_path[3].replace("0000:", "")
-                    else:
-                        pci_dev = dev_path[4].replace("0000:", "")
-                    pci_lookup_cmd = (("lspci|grep '%s'|awk -F \":\" " % pci_dev) +
-                                     "{'print $3'}")
-                    pci_lookup = _functions.subprocess_closefds(pci_lookup_cmd,
-                                 shell=True, stdout=subprocess.PIPE,
-                                 stderr=subprocess.STDOUT)
-                    dev_vendor = pci_lookup.stdout.read().strip()
-                except:
-                    dev_vendor = "unknown"
-                    logger.debug("3. vendor approach: %s" % dev_vendor)
-            try:
-                dev_vendor = dev_vendor.replace(",", "")
-            except AttributeError:
-                dev_vendor = "unknown"
-                logger.debug("4. vendor approach: %s" % dev_vendor)
-
-            dev_vendor = _functions.pad_or_trim(25, dev_vendor)
-            dev_driver = ""
-            try:
-                dev_driver = os.readlink("/sys/class/net/" + dev_interface + \
-                                         "/device/driver")
-                dev_driver = os.path.basename(dev_driver)
-            except Exception as e:
-                logger.debug("Exception while determining NIC driver: %s" % (
-                             repr(e)))
-            nic_addr_file = open("/sys/class/net/" + dev_interface + \
-                                 "/address")
-            dev_address = nic_addr_file.read().strip()
-            cmd = ("/files/etc/sysconfig/network-scripts/" + \
-                   "ifcfg-%s/BOOTPROTO") % str(dev_interface)
-            dev_bootproto = _functions.augtool_get(cmd)
-            type_cmd = ("/files/etc/sysconfig/network-scripts/" + \
-                        "ifcfg-%s/TYPE") % str(dev_interface)
-            bridge_cmd = ("/files/etc/sysconfig/network-scripts/" + \
-                          "ifcfg-%s/BRIDGE") % str(dev_interface)
-            dev_bridge = _functions.augtool_get(bridge_cmd)
-
-            # check for vlans
-            logger.debug("checking for vlan")
-            vlans = glob("/etc/sysconfig/network-scripts/ifcfg-%s.*" %
-                                                                 dev_interface)
-            if (len(vlans) > 0):
-                dev_conf_status = "Configured  "
-                vlanid = vlans[0].split(".")[-1]
-                logger.debug("found vlan %s" % vlanid)
-
-                # if no bridge in nic, check clan-nic for bridge
-                if not dev_bridge:
-                    vlancfg = "ifcfg-%s.%s" % (str(dev_interface), vlanid)
-                    cmd = ("/files/etc/sysconfig/network-scripts/%s/" +
-                           "BRIDGE") % vlancfg
-                    dev_bridge = augtool_get(cmd)
-                    logger.debug("Getting bridge '%s' from vlan: %s" % (
-                                                              dev_bridge, cmd))
-
-            if dev_bootproto is None:
-                logger.debug("Looking for bootproto in %s" % dev_bridge)
-                cmd = ("/files/etc/sysconfig/network-scripts/" + \
-                       "ifcfg-%s/BOOTPROTO") % str(dev_bridge)
-                dev_bootproto = _functions.augtool_get(cmd)
-                if dev_bootproto is None:
-                    dev_bootproto = "Disabled"
-                    dev_conf_status = "Unconfigured"
-                else:
-                    dev_conf_status = "Configured  "
-            else:
-                dev_conf_status = "Configured  "
-            if dev_conf_status == "Configured  ":
-                configured_nics = configured_nics + 1
-        except Exception as e:
-            logger.warning("Error while determining NICs: %s" % repr(e))
-
-        nic_info = "%s,%s,%s,%s,%s,%s,%s" % ( \
-                   dev_interface, dev_bootproto, \
-                   dev_vendor, dev_address, \
-                   dev_driver, dev_conf_status, \
-                   dev_bridge)
-        logger.debug("NIC info: %s" % nic_info)
-        nic_dict[dev_interface] = nic_info
-
-        if dev_bootproto == "dhcp":
-            ntp_dhcp = 1
-    return nic_dict, configured_nics, ntp_dhcp
-
-
-def get_system_vlans():
-    """Retrieves a list of VLANs on this host
-    """
-    vlandir = "/proc/net/vlan/"
-    vlans = []
-    if os.path.exists(vlandir):
-        vlans = os.listdir(vlandir)
-        vlans.remove("config")
-    return vlans
-
-def get_current_nfsv4_domain():
-    domain = None
-    with open("/etc/idmapd.conf") as nfs_config:
-        for line in nfs_config:
-            if "Domain =" in line:
-                domain = line.replace("Domain =", "").strip()
-        nfs_config.close()
-        return domain
-
-def set_nfsv4_domain(domain):
-    idmap_conf = "/etc/idmapd.conf"
-    current_domain = get_current_nfsv4_domain()
-    _functions.unmount_config(idmap_conf)
-    if current_domain.startswith("#"):
-        current_domain = "#Domain = %s" % current_domain.replace("# ","")
-        _functions.system("sed -i 's/%s/Domain = %s/g' %s" \
-            % (current_domain, domain, idmap_conf))
-    else:
-        _functions.system("sed -i '/^Domain/ s/%s/%s/g' %s" \
-            % (current_domain, domain, idmap_conf))
-    if _functions.ovirt_store_config(idmap_conf):
-        logger.info("NFSv4 domain set as: " + domain)
-    else:
-        logger.warning("Setting nfsv4 domain failed")
-    _functions.system_closefds("service rpcidmapd restart")
-    _functions.system_closefds("nfsidmap -c &>/dev/null")
-
 def convert_to_biosdevname():
     if not "BIOSDEVNAMES_CONVERSION" in OVIRT_VARS:
         # check for appropriate bios version
@@ -650,12 +416,22 @@
 
 def network_auto():
     try:
-        network = Network()
-        network.configure_interface()
-        network.configure_dns()
-        network.configure_ntp()
-        network.save_ntp_configuration()
-        network.save_network_configuration()
+        from ovirt.node.config.defaults import Network, Nameservers, \
+            Timeservers
+        from ovirt.node.utils.console import TransactionProgress
+
+        txs = []
+
+        mnet = Network()
+        txs += mnet.transaction()
+
+        mdns = Nameservers()
+        txs += mdns.transaction()
+
+        mntp = Timeservers()
+        txs += mntp.transaction()
+
+        TransactionProgress(txs, is_dry=False)
     except:
         logger.warn("Network Configuration Failed....")
         return False


-- 
To view, visit http://gerrit.ovirt.org/15514
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I30378deb42c270d615353110fcf86ec79d18a345
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-node
Gerrit-Branch: master
Gerrit-Owner: Fabian Deutsch <fabiand at fedoraproject.org>



More information about the node-patches mailing list