commit bc3d532c4e3bf4a5f3053a4f34d5b1075e9a0354 Author: Jiri Pirko jiri@resnulli.us Date: Fri Aug 17 17:01:51 2012 +0200
add support for per-port teamd configs
https://fedorahosted.org/lnst/ticket/8
Signed-off-by: Jiri Pirko jiri@resnulli.us
NetConfig/NetConfigCommon.py | 5 +++- NetConfig/NetConfigDevice.py | 23 ++++++++++++++++++- NetTest/NetTestParse.py | 2 +- recipes/team/netconfig-test1_002.xml | 38 ++++++++++++++++++++++++++++++++++ recipes/team/netconfig-test2_002.xml | 38 ++++++++++++++++++++++++++++++++++ recipes/team/recipe_002.xml | 13 +++++++++++ 6 files changed, 115 insertions(+), 4 deletions(-) --- diff --git a/NetConfig/NetConfigCommon.py b/NetConfig/NetConfigCommon.py index f35d358..f3f2f5d 100644 --- a/NetConfig/NetConfigCommon.py +++ b/NetConfig/NetConfigCommon.py @@ -17,7 +17,10 @@ def get_slaves(netdev): return set()
def get_option(netdev, opt_name): - options = netdev["options"] + try: + options = netdev["options"] + except KeyError: + return None for option, value in options: if option == opt_name: return value diff --git a/NetConfig/NetConfigDevice.py b/NetConfig/NetConfigDevice.py index 534e914..688077b 100644 --- a/NetConfig/NetConfigDevice.py +++ b/NetConfig/NetConfigDevice.py @@ -209,20 +209,35 @@ class NetConfigDeviceVlan(NetConfigDeviceGeneric): else: exec_cmd("vconfig rem %s" % dev_name)
+def prepare_json_str(json_str): + if not json_str: + return "" + json_str = json_str.replace('"', '\"') + json_str = re.sub('\s+', ' ', json_str) + return json_str + class NetConfigDeviceTeam(NetConfigDeviceGeneric): _pidfile = None _modulename = "team_mode_roundrobin team_mode_activebackup team_mode_broadcast team_mode_loadbalance team" _moduleload = False _cleanupcmd = "killall -q teamd"
+ def _should_enable_dbus(self): + for slave_id in get_slaves(self._netdev): + port_netdev = self._config[slave_id] + if get_option(port_netdev, "teamd_port_config"): + return True + return False + def configure(self): teamd_config = get_option(self._netdev, "teamd_config") - teamd_config = teamd_config.replace('"', '\"') + teamd_config = prepare_json_str(teamd_config)
dev_name = self._netdev["name"] pidfile = "/var/run/teamd_%s.pid" % dev_name
- exec_cmd("teamd -r -d -c "%s" -t %s -p %s" % (teamd_config, dev_name, pidfile)) + dbus_option = " -D" if self._should_enable_dbus() else "" + exec_cmd("teamd -r -d -c "%s" -t %s -p %s%s" % (teamd_config, dev_name, pidfile, dbus_option))
self._pidfile = pidfile
@@ -242,6 +257,10 @@ 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") + if teamd_port_config: + teamd_port_config = prepare_json_str(teamd_port_config) + exec_cmd("teamdctl %s PortConfigUpdate %s "%s"" % (dev_name, port_name, teamd_port_config)) NetConfigDevice(port_netdev, self._config).down() exec_cmd("ip link set dev %s master %s" % (port_name, dev_name))
diff --git a/NetTest/NetTestParse.py b/NetTest/NetTestParse.py index 6439c4d..13141e9 100644 --- a/NetTest/NetTestParse.py +++ b/NetTest/NetTestParse.py @@ -226,10 +226,10 @@ class NetConfigParse(RecipeParser):
params = {"dev_id": dev_id} scheme = {"addresses": self._addresses} + scheme["options"] = self._options if dev["type"] == "eth": pass elif dev["type"] in ["bond", "bridge", "vlan", "macvlan", "team"]: - scheme["options"] = self._options scheme["slaves"] = self._slaves else: logging.warn("unknown type "%s"" % dev["type"]) diff --git a/recipes/team/netconfig-test1_002.xml b/recipes/team/netconfig-test1_002.xml new file mode 100644 index 0000000..3dbf67d --- /dev/null +++ b/recipes/team/netconfig-test1_002.xml @@ -0,0 +1,38 @@ +<netconfig> + <interface id="1" phys_id="1" type="eth"> + <options> + <option name="teamd_port_config"> + { + "prio": -10, + "sticky": true + } + </option> + </options> + </interface> + <interface id="2" phys_id="2" type="eth"> + <options> + <option name="teamd_port_config"> + { + "prio": 100 + } + </option> + </options> + </interface> + <interface id="3" type="team"> + <options> + <option name="teamd_config"> + { + "runner": {"name": "activebackup"}, + "link_watch": {"name": "ethtool"} + } + </option> + </options> + <slaves> + <slave id="1"/> + <slave id="2"/> + </slaves> + <addresses> + <address value="192.168.111.1/24"/> + </addresses> + </interface> +</netconfig> diff --git a/recipes/team/netconfig-test2_002.xml b/recipes/team/netconfig-test2_002.xml new file mode 100644 index 0000000..06cfcef --- /dev/null +++ b/recipes/team/netconfig-test2_002.xml @@ -0,0 +1,38 @@ +<netconfig> + <interface id="1" phys_id="1" type="eth"> + <options> + <option name="teamd_port_config"> + { + "prio": -10, + "sticky": true + } + </option> + </options> + </interface> + <interface id="2" phys_id="2" type="eth"> + <options> + <option name="teamd_port_config"> + { + "prio": 100 + } + </option> + </options> + </interface> + <interface id="3" type="team"> + <options> + <option name="teamd_config"> + { + "runner": {"name": "activebackup"}, + "link_watch": {"name": "ethtool"} + } + </option> + </options> + <slaves> + <slave id="1"/> + <slave id="2"/> + </slaves> + <addresses> + <address value="192.168.111.2/24"/> + </addresses> + </interface> +</netconfig> diff --git a/recipes/team/recipe_002.xml b/recipes/team/recipe_002.xml new file mode 100644 index 0000000..ebb250d --- /dev/null +++ b/recipes/team/recipe_002.xml @@ -0,0 +1,13 @@ +<nettestrecipe> + <machines> + <machine id="1"> + <netmachineconfig source="netmachineconfig-test1.xml"/> + <netconfig source="netconfig-test1_002.xml"/> + </machine> + <machine id="2"> + <netmachineconfig source="netmachineconfig-test2.xml"/> + <netconfig source="netconfig-test2_002.xml"/> + </machine> + </machines> + <command_sequence source="sequence_ping_simple.xml"/> +</nettestrecipe>
lnst-developers@lists.fedorahosted.org