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

Jiří Pírko jirka at fedoraproject.org
Thu May 23 19:09:15 UTC 2013


commit aeb59d84f8258e572b80b68b506ded03649b8dbd
Author: Ondrej Lichtner <olichtne at redhat.com>
Date:   Thu May 23 15:57:04 2013 +0200

    recipe format: <options> under <eth> moved under <slave>
    
    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>
    Signed-off-by: Jiri Pirko <jiri at resnulli.us>

 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)


More information about the LNST-developers mailing list