From: Radek Pazdera <rpazdera(a)redhat.com>
This commit modifies NetConfig package to reflect recent changes in
parser implementation.
The original NetConfig was initialized with the machine and net
config's XML strings. Now the config is initialized with a dictionary
that contains parsed configuration the interface.
Signed-off-by: Radek Pazdera <rpazdera(a)redhat.com>
---
NetConfig/NetConfig.py | 34 +++----
NetConfig/NetConfigDevNames.py | 43 ++++-----
NetConfig/NetConfigParse.py | 199 ----------------------------------------
3 files changed, 30 insertions(+), 246 deletions(-)
delete mode 100644 NetConfig/NetConfigParse.py
diff --git a/NetConfig/NetConfig.py b/NetConfig/NetConfig.py
index 4dd63e1..a0a8e20 100644
--- a/NetConfig/NetConfig.py
+++ b/NetConfig/NetConfig.py
@@ -12,30 +12,15 @@ jpirko(a)redhat.com (Jiri Pirko)
import logging
import copy
-from NetConfigParse import NetConfigParse
from NetConfigDevNames import NetConfigDevNames
from NetConfigDevice import NetConfigDevice
from NetConfigDevice import NetConfigDeviceType
from NetConfigCommon import get_slaves
class NetConfig:
- def __init__(self, machine_xml_string, config_xml_string=None):
- parse = NetConfigParse(machine_xml_string)
+ def __init__(self):
devnames = NetConfigDevNames()
-
- if config_xml_string:
- config = parse.parse_config(config_xml_string)
- else:
- '''
- No config is passed so make essential netdevices as they
- are listed in machine config and stores them into config
- '''
- mnetdevs = parse.get_machine_netdevs()
- config = copy.deepcopy(mnetdevs)
- for key in config:
- config[key]["phys_id"] = key
-
- devnames.assign_names(config)
+ config = {}
self._devnames = devnames
self._config = config
@@ -73,14 +58,22 @@ class NetConfig:
types.add(netdev["type"])
return types
- def _types_init(self):
- for dev_type in self._get_used_types():
+ def _type_init(self, dev_type):
+ if not dev_type in self._get_used_types():
NetConfigDeviceType(dev_type).type_init()
def _types_cleanup(self):
for dev_type in self._get_used_types():
NetConfigDeviceType(dev_type).type_cleanup()
+ def add_interface_config(self, if_id, config):
+ self._config[if_id] = config
+ self._type_init(config["type"])
+ self._devnames.assign_name(if_id, self._config)
+
+ def get_interface_config(self, if_id):
+ return self._config[if_id]
+
def configure(self, dev_id):
netdev = self._config[dev_id]
device = NetConfigDevice(netdev, self._config)
@@ -88,7 +81,6 @@ class NetConfig:
device.up()
def configure_all(self):
- self._types_init()
dev_order = self._get_dev_order()
for dev_id in dev_order:
self.configure(dev_id)
@@ -129,7 +121,7 @@ class NetConfig:
if "slaves" in params:
netdev["slaves"] = params["slaves"]
self._config[dev_id] = netdev
- self._devnames.assign_names(self._config)
+ self._devnames.assign_name(dev_id, self._config)
return dev_id
def netdev_del(self, dev_id):
diff --git a/NetConfig/NetConfigDevNames.py b/NetConfig/NetConfigDevNames.py
index 8522e00..1619b7e 100644
--- a/NetConfig/NetConfigDevNames.py
+++ b/NetConfig/NetConfigDevNames.py
@@ -84,29 +84,20 @@ class NetConfigDevNames:
vlan_tci = get_option(netdev, "vlan_tci")
netdev["name"] = "%s.%s" % (real_netdev["name"],
vlan_tci)
- def assign_names(self, config):
- for dev_id in config:
- netdev = config[dev_id]
- if "name" in netdev:
- continue
- dev_type = netdev["type"]
- if dev_type == "eth":
- self.assign_name_by_scan(dev_id, netdev)
- elif dev_type == "bond":
- self._assign_name_bond(netdev, config)
- elif dev_type == "bridge":
- self._assign_name_bridge(netdev, config)
- elif dev_type == "macvlan":
- self._assign_name_macvlan(netdev, config)
- elif dev_type == "team":
- self._assign_name_team(netdev, config)
-
- '''
- In second round assign names for vlans as they use
- previously assigned names
- '''
- for dev_id in config:
- netdev = config[dev_id]
- dev_type = netdev["type"]
- if dev_type == "vlan":
- self._assign_name_vlan(netdev, config)
+ def assign_name(self, dev_id, config):
+ netdev = config[dev_id]
+ if "name" in netdev:
+ return
+ dev_type = netdev["type"]
+ if dev_type == "eth":
+ self.assign_name_by_scan(dev_id, netdev)
+ elif dev_type == "bond":
+ self._assign_name_bond(netdev, config)
+ elif dev_type == "bridge":
+ self._assign_name_bridge(netdev, config)
+ elif dev_type == "macvlan":
+ self._assign_name_macvlan(netdev, config)
+ elif dev_type == "team":
+ self._assign_name_team(netdev, config)
+ elif dev_type == "vlan":
+ self._assign_name_vlan(netdev, config)
diff --git a/NetConfig/NetConfigParse.py b/NetConfig/NetConfigParse.py
deleted file mode 100644
index 9097e88..0000000
--- a/NetConfig/NetConfigParse.py
+++ /dev/null
@@ -1,199 +0,0 @@
-"""
-This module defines NetConfigParse class useful to parse xml configs
-
-Copyright 2011 Red Hat, Inc.
-Licensed under the GNU General Public License, version 2 as
-published by the Free Software Foundation; see COPYING for details.
-"""
-
-__author__ = """
-jpirko(a)redhat.com (Jiri Pirko)
-"""
-
-from xml.dom.minidom import parseString
-import logging
-from NetConfigDevNames import NetConfigDevNames
-from NetConfigDevNames import normalize_hwaddr
-from NetConfigCommon import get_slaves
-
-class NetConfigParse:
- def __init__(self, machine_xml_string):
- self._machine_xml_string = machine_xml_string
- netdevs, info = self.parse_machine_config(machine_xml_string)
- self._machine_netdevs = netdevs
- self._machine_info = info
-
- def get_machine_netdevs(self):
- return self._machine_netdevs
-
- def get_machine_info(self):
- return self._machine_info
-
- def _parse_machine_config(self, machine_xml_string, callback=None):
- dom = parseString(machine_xml_string)
- dom_netmachine = dom.getElementsByTagName("netmachineconfig")[0]
-
- dom_info = dom_netmachine.getElementsByTagName("info")[0]
- hostname = str(dom_info.getAttribute("hostname"))
- rootpass = str(dom_info.getAttribute("rootpass"))
- rpcport = str(dom_info.getAttribute("rpcport"))
- info = {"hostname": hostname}
- if rootpass:
- info["rootpass"] = rootpass
- if rpcport:
- info["rpcport"] = int(rpcport)
- info["system_config"] = {}
-
- dom_netdevs = dom_netmachine.getElementsByTagName("netdevice")
- netdevs = {}
- for dom_netdev in dom_netdevs:
- dev_pid = int(dom_netdev.getAttribute("phys_id"))
- dev_type = str(dom_netdev.getAttribute("type"))
- dev_hwaddr = str(dom_netdev.getAttribute("hwaddr"))
- dev_hwaddr = normalize_hwaddr(dev_hwaddr)
- dev_name = str(dom_netdev.getAttribute("name"))
- netdevs[dev_pid] = {"type": dev_type, "hwaddr":
dev_hwaddr}
- netdev = netdevs[dev_pid]
- if dev_name:
- netdev["name"] = dev_name
- if callback:
- callback(dev_pid, netdev, dom_netdev)
- return netdevs, info, dom
-
- def parse_machine_config(self, machine_xml_string):
- return self._parse_machine_config(machine_xml_string)[0:2]
-
- def _refresh_machine_config_cb(self, dev_pid, netdev, dom_netdev):
- if "name" in netdev:
- del netdev["name"]
- self._dev_names.assign_name_by_scan(dev_pid, netdev)
- dom_netdev.setAttribute("name", netdev["name"])
-
- def refresh_machine_config(self):
- self._dev_names = NetConfigDevNames()
- dom = self._parse_machine_config(self._machine_xml_string,
- self._refresh_machine_config_cb)[2]
- return dom.toxml()
-
- def parse_config(self, net_xml_string):
- dom = parseString(net_xml_string)
- dom_netconfig = dom.getElementsByTagName("netconfig")[0]
- dom_netdevs = dom_netconfig.getElementsByTagName("netdevice")
- config = {}
- for dom_netdev in dom_netdevs:
- self._parse_netdevice(config, dom_netdev)
- self._check_slave_references(config)
- return config
-
- def _parse_list(self, netdev, dom_netdev, config,
- itemname, groupname, handler, container):
- dom_list1 = dom_netdev.getElementsByTagName(groupname)
- if dom_list1:
- netdev[groupname] = container
- for dom_item1 in dom_list1:
- dom_list2 = dom_item1.getElementsByTagName(itemname)
- for dom_item2 in dom_list2:
- handler(netdev[groupname], dom_item2, config)
-
- def _parse_options_handler(self, lst, dom_element, config):
- name = str(dom_element.getAttribute("name"))
-
- value = ""
- if dom_element.hasAttribute("value"):
- value = str(dom_element.getAttribute("value"))
- elif dom_element.hasChildNodes():
- node = dom_element.firstChild
- try:
- value = str(dom_element.firstChild.data)
- except:
- raise Exception("Invalid option value")
-
- lst.append((name, value))
-
- def _parse_options(self, netdev, dom_netdev, config):
- self._parse_list(netdev, dom_netdev, config, "option",
"options",
- self._parse_options_handler, [])
-
- def _check_slave(self, dev_id, config):
- for key in config:
- netdev = config[key]
- if dev_id in get_slaves(netdev):
- logging.warn("netdev id \"%d\" used as slave for "
- "netdev id \"%d\" as well" % (dev_id, key))
-
- def _check_slave_references(self, config):
- for key in config:
- netdev = config[key]
- for slave in get_slaves(netdev):
- if not slave in config:
- logging.error("netdev id \"%d\" references nonexistent
"
- "slave with id \"%d\"" % (key,
slave))
- raise Exception
-
- def _parse_slaves_handler(self, lst, dom_element, config):
- dev_id = int(dom_element.getAttribute("id"))
- self._check_slave(dev_id, config)
- lst.append(dev_id)
-
- def _parse_slaves(self, netdev, dom_netdev, config):
- self._parse_list(netdev, dom_netdev, config, "slave",
"slaves",
- self._parse_slaves_handler, [])
-
- def _parse_addrs_handler(self, lst, dom_element, config):
- lst.append(str(dom_element.getAttribute("value")))
-
- def _parse_addresses(self, netdev, dom_netdev, config):
- self._parse_list(netdev, dom_netdev, config, "address",
"addresses",
- self._parse_addrs_handler, [])
-
- def _check_phys_id(self, dev_pid, config):
- for key in config:
- if not "phys_id" in config[key]:
- continue
- if config[key]["phys_id"] == dev_pid:
- logging.error("same phys_id \"%d\" used more than
once" % dev_pid)
- raise Exception
-
- def _parse_phys_id(self, netdev, dom_netdev, config):
- dev_pid = dom_netdev.getAttribute("phys_id")
- if not dev_pid:
- return
- dev_pid = int(dev_pid)
-
- if netdev["type"] != "eth":
- logging.warn("phys_id found on non-eth netdev, ignoring")
- return
-
- self._check_phys_id(dev_pid, config)
-
- netdev["phys_id"] = dev_pid
- if dev_pid in self._machine_netdevs:
- entry = self._machine_netdevs[dev_pid]
- if entry["type"] == netdev["type"]:
- netdev["hwaddr"] = entry["hwaddr"]
- if "name" in entry:
- netdev["name"] = entry["name"]
- else:
- logging.error("phys_id passed but does not match any device on
machine")
- raise Exception
-
- def _parse_netdevice(self, config, dom_netdev):
- dev_id = int(dom_netdev.getAttribute("id"))
- logging.debug("Parsing netdev id \"%d\"" % dev_id)
- if dev_id in config:
- logging.error("netdev id used more than once")
- raise Exception
- config[dev_id] = {}
- netdev = config[dev_id]
- netdev["type"] = dev_type =
str(dom_netdev.getAttribute("type"))
-
- self._parse_phys_id(netdev, dom_netdev, config)
- self._parse_addresses(netdev, dom_netdev, config)
-
- if dev_type == "eth":
- pass
- elif dev_type in ["bond", "bridge", "vlan",
"macvlan", "team"]:
- self._parse_options(netdev, dom_netdev, config)
- self._parse_slaves(netdev, dom_netdev, config)
- else:
- logging.warn("unknown type \"%s\"" % dev_type)
--
1.7.7.6