[PATCH] recipe format: <options> under <eth> moved under <slave>

olichtne at redhat.com olichtne at redhat.com
Thu May 23 13:57:04 UTC 2013


From: Ondrej Lichtner <olichtne at redhat.com>

Until now when setting options of team interface slaves the options had
to be specified under the <netdevice> or <eth> tag (in the new format).
However the new format didn't accept any <options> tags under the <eth>
tag. This commit fixes that by moving the <options> tag under its
respective <slave> tag. The team configuration now looks something like
this:

<eth id="1" network="A"/>
<team id="testiface">
    <options>
        <option>...</option>
    </options>
    <slaves>
        <slave id="1">
            <options>
                <option name="teamd_port_config">
                    {
                        "prio": -10,
                        "sticky": true
                    }
                </option>
            </options>
        </slave>
    </slaves>
    <addresses>
        <address>...</address>
    </addresses>
</team>

This doesn't change the behaviour of <options> tag that are under the
not-eth tags.

Signed-off-by: Ondrej Lichtner <olichtne at redhat.com>
---
 lnst/Controller/Machine.py           | 10 +++++++++-
 lnst/Controller/NetTestController.py |  1 +
 lnst/Controller/RecipeParse.py       | 21 +++++++++++++++++++++
 lnst/Slave/NetConfigCommon.py        | 10 ++++++++++
 lnst/Slave/NetConfigDevice.py        |  5 +++--
 5 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py
index 78f4c70..d8162fc 100644
--- a/lnst/Controller/Machine.py
+++ b/lnst/Controller/Machine.py
@@ -309,6 +309,7 @@ class Interface(object):
         self._network = None
 
         self._slaves = {}
+        self._slave_options = {}
         self._addresses = []
         self._options = []
 
@@ -351,6 +352,12 @@ class Interface(object):
     def add_slave(self, iface):
         self._slaves[iface.get_id()] = iface
 
+    def set_slave_options(self, slave_options):
+        self._slave_options = slave_options
+
+    def get_slave_options(self):
+        return self._slave_options
+
     def add_address(self, addr):
         self._addresses.append(addr)
 
@@ -360,7 +367,8 @@ class Interface(object):
     def _get_config(self):
         config = {"hwaddr": self._hwaddr, "type": self._type,
                   "addresses": self._addresses, "slaves": self._slaves.keys(),
-                  "options": self._options}
+                  "options": self._options,
+                  "slave_options": self._slave_options}
         if self._type == "eth":
             config["phys_id"] = self.get_id()
         return config
diff --git a/lnst/Controller/NetTestController.py b/lnst/Controller/NetTestController.py
index 9f1c9fa..a43c299 100644
--- a/lnst/Controller/NetTestController.py
+++ b/lnst/Controller/NetTestController.py
@@ -153,6 +153,7 @@ class NetTestController:
         if "slaves" in ifconfig:
             for slave_id in ifconfig["slaves"]:
                 iface.add_slave(machine.get_interface(slave_id))
+            iface.set_slave_options(ifconfig["slave_options"])
 
         if "addresses" in ifconfig:
             for addr in ifconfig["addresses"]:
diff --git a/lnst/Controller/RecipeParse.py b/lnst/Controller/RecipeParse.py
index 9a91a7c..8cac525 100644
--- a/lnst/Controller/RecipeParse.py
+++ b/lnst/Controller/RecipeParse.py
@@ -296,6 +296,7 @@ class InterfaceParse(LnstParser):
         self._iface["options"].append((name, value))
 
     def _slaves(self, node, params):
+        self._iface["slave_options"] = {}
         self._list_init(node, params, "slaves", {"slave": self._slave})
 
     def _slave(self, node, params):
@@ -306,6 +307,26 @@ class InterfaceParse(LnstParser):
 
         self._iface["slaves"].append(slave_id)
 
+        self._iface["slave_options"][slave_id] = []
+        self._slave_opts = self._iface["slave_options"][slave_id]
+
+        scheme = {"options": self._slave_options}
+        self._process_child_nodes(node, scheme, params)
+
+    def _slave_options(self, node, params):
+        scheme = {"option": self._slave_option}
+        self._process_child_nodes(node, scheme, params)
+
+    def _slave_option(self, node, params):
+        name = self._get_attribute(node, "name")
+
+        if self._has_attribute(node, "value"):
+            value = self._get_attribute(node, "value")
+        else:
+            value = self._get_text_content(node)
+
+        self._slave_opts.append((name, value))
+
     def _list_init(self, node, params, node_name, scheme):
         self._iface[node_name] = []
 
diff --git a/lnst/Slave/NetConfigCommon.py b/lnst/Slave/NetConfigCommon.py
index f3f2f5d..c60419b 100644
--- a/lnst/Slave/NetConfigCommon.py
+++ b/lnst/Slave/NetConfigCommon.py
@@ -25,3 +25,13 @@ def get_option(netdev, opt_name):
         if option == opt_name:
             return value
     return None
+
+def get_slave_option(netdev, slave_id, opt_name):
+    try:
+        options = netdev["slave_options"][slave_id]
+    except KeyError:
+        return None
+    for option, value in options:
+        if option == opt_name:
+            return value
+    return None
diff --git a/lnst/Slave/NetConfigDevice.py b/lnst/Slave/NetConfigDevice.py
index c781e83..d9806db 100644
--- a/lnst/Slave/NetConfigDevice.py
+++ b/lnst/Slave/NetConfigDevice.py
@@ -15,7 +15,7 @@ import logging
 import re
 import sys
 from lnst.Common.ExecCmd import exec_cmd
-from lnst.Slave.NetConfigCommon import get_slaves, get_option
+from lnst.Slave.NetConfigCommon import get_slaves, get_option, get_slave_option
 from lnst.Common.Utils import kmod_in_use, bool_it
 
 class NetConfigDeviceGeneric:
@@ -270,7 +270,8 @@ class NetConfigDeviceTeam(NetConfigDeviceGeneric):
         dev_name = self._netdev["name"]
         port_netdev = self._config[slaveid]
         port_name = port_netdev["name"]
-        teamd_port_config = get_option(port_netdev, "teamd_port_config")
+        teamd_port_config = get_slave_option(self._netdev,
+                                             slaveid, "teamd_port_config")
         dbus_option = "-D" if self._should_enable_dbus() else ""
         if teamd_port_config:
             teamd_port_config = prepare_json_str(teamd_port_config)
-- 
1.7.11.7



More information about the LNST-developers mailing list