[lxc-devel] [lxc/master] You can specify additional parameters for lxc.script.up/down

vel21ripn on Github lxc-bot at linuxcontainers.org
Thu Jun 30 16:54:37 UTC 2016


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 907 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20160630/b7e66f1b/attachment.bin>
-------------- next part --------------
From 10524f8a87991341bf1769ff40e70e681a3432cc Mon Sep 17 00:00:00 2001
From: Vitaly Lavrov <vel21ripn at gmail.com>
Date: Thu, 30 Jun 2016 19:38:46 +0300
Subject: [PATCH] You can specify additional parameters for lxc.script.up and
 lxc.script.down. This can be useful when working with openvswitch. Config
 example:     lxc.network.type = veth     lxc.network.veth.pair = wfctl.v22   
  lxc.network.script.args = br-ovs0 vlan22     lxc.network.script.up =
 /etc/lxc/ovs     lxc.network.script.down = /etc/lxc/ovs     lxc.network.name
 = vlan0022

    lxc.network.type = veth
    lxc.network.veth.pair = wfctl.v23
    lxc.network.script.args = br-ovs0 vlan23
    lxc.network.script.up = /etc/lxc/ovs
    lxc.network.script.down = /etc/lxc/ovs
    lxc.network.name = vlan0023

Example script for setting openvswitch see in doc/example/ovs.sh
---
 doc/examples/ovs.sh | 31 +++++++++++++++++++++++++++++++
 src/lxc/conf.c      | 17 +++++++++--------
 src/lxc/conf.h      |  1 +
 src/lxc/confile.c   | 18 ++++++++++++++++++
 4 files changed, 59 insertions(+), 8 deletions(-)
 create mode 100644 doc/examples/ovs.sh

diff --git a/doc/examples/ovs.sh b/doc/examples/ovs.sh
new file mode 100644
index 0000000..91bd366
--- /dev/null
+++ b/doc/examples/ovs.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+#
+#lxc.network.script.args = br10 vlan52
+# or
+#lxc.network.script.args = br10 trunk53
+
+BRIDGE="${6}"
+VLAN="${7}"
+
+case "$3" in
+up)
+	[ -n "$BRIDGE" ] || exit 1
+
+	ovs-vsctl --may-exist add-br $BRIDGE
+	ovs-vsctl --if-exists del-port $BRIDGE $5
+	vcfg=""
+	if [ -n "$VLAN" ]; then
+		if [ "${VLAN#vlan}" != "${VLAN}" ]; then
+			vcfg="tag=${VLAN#vlan}"
+		fi
+		if [ "${VLAN#trunk}" != "${VLAN}" ]; then
+			vcfg="trunks=${VLAN#trunk}"
+		fi
+	fi
+	ovs-vsctl add-port $BRIDGE $5 $vcfg
+	;;
+down)
+	[ -z "$BRIDGE" ] && BRIDGE="`ovs-vsctl port-to-br $5`"
+	[ -n "$BRIDGE" ] && ovs-vsctl --if-exists del-port $BRIDGE $5
+	;;
+esac
diff --git a/src/lxc/conf.c b/src/lxc/conf.c
index e8dfaae..968e0d5 100644
--- a/src/lxc/conf.c
+++ b/src/lxc/conf.c
@@ -2605,7 +2605,7 @@ static int instantiate_veth(struct lxc_handler *handler, struct lxc_netdev *netd
 
 	if (netdev->upscript) {
 		err = run_script(handler->name, "net", netdev->upscript, "up",
-				 "veth", veth1, (char*) NULL);
+				 "veth", veth1, netdev->upscript_args, (char*) NULL);
 		if (err)
 			goto out_delete;
 	}
@@ -2635,7 +2635,7 @@ static int shutdown_veth(struct lxc_handler *handler, struct lxc_netdev *netdev)
 
 	if (netdev->downscript) {
 		err = run_script(handler->name, "net", netdev->downscript,
-				 "down", "veth", veth1, (char*) NULL);
+				 "down", "veth", veth1, netdev->upscript_args, (char*) NULL);
 		if (err)
 			return -1;
 	}
@@ -2678,7 +2678,7 @@ static int instantiate_macvlan(struct lxc_handler *handler, struct lxc_netdev *n
 
 	if (netdev->upscript) {
 		err = run_script(handler->name, "net", netdev->upscript, "up",
-				 "macvlan", netdev->link, (char*) NULL);
+				 "macvlan", netdev->link, netdev->upscript_args, (char*) NULL);
 		if (err)
 			goto out;
 	}
@@ -2700,7 +2700,7 @@ static int shutdown_macvlan(struct lxc_handler *handler, struct lxc_netdev *netd
 	if (netdev->downscript) {
 		err = run_script(handler->name, "net", netdev->downscript,
 				 "down", "macvlan", netdev->link,
-				 (char*) NULL);
+				  netdev->upscript_args,(char*) NULL);
 		if (err)
 			return -1;
 	}
@@ -2766,7 +2766,7 @@ static int instantiate_phys(struct lxc_handler *handler, struct lxc_netdev *netd
 	if (netdev->upscript) {
 		int err;
 		err = run_script(handler->name, "net", netdev->upscript,
-				 "up", "phys", netdev->link, (char*) NULL);
+				 "up", "phys", netdev->upscript_args, netdev->link, (char*) NULL);
 		if (err)
 			return -1;
 	}
@@ -2780,7 +2780,7 @@ static int shutdown_phys(struct lxc_handler *handler, struct lxc_netdev *netdev)
 
 	if (netdev->downscript) {
 		err = run_script(handler->name, "net", netdev->downscript,
-				 "down", "phys", netdev->link, (char*) NULL);
+			 "down", "phys", netdev->link, netdev->upscript_args, (char*) NULL);
 		if (err)
 			return -1;
 	}
@@ -2799,7 +2799,7 @@ static int instantiate_empty(struct lxc_handler *handler, struct lxc_netdev *net
 	if (netdev->upscript) {
 		int err;
 		err = run_script(handler->name, "net", netdev->upscript,
-				 "up", "empty", (char*) NULL);
+				 "up", "empty", netdev->upscript_args, (char*) NULL);
 		if (err)
 			return -1;
 	}
@@ -2812,7 +2812,7 @@ static int shutdown_empty(struct lxc_handler *handler, struct lxc_netdev *netdev
 
 	if (netdev->downscript) {
 		err = run_script(handler->name, "net", netdev->downscript,
-				 "down", "empty", (char*) NULL);
+				 "down", "empty", netdev->upscript_args, (char*) NULL);
 		if (err)
 			return -1;
 	}
@@ -3889,6 +3889,7 @@ static void lxc_remove_nic(struct lxc_list *it)
 	if (netdev->type == LXC_NET_VETH)
 		free(netdev->priv.veth_attr.pair);
 	free(netdev->upscript);
+	free(netdev->upscript_args);
 	free(netdev->hwaddr);
 	free(netdev->mtu);
 	free(netdev->ipv4_gateway);
diff --git a/src/lxc/conf.h b/src/lxc/conf.h
index 2593ce5..7ca634b 100644
--- a/src/lxc/conf.h
+++ b/src/lxc/conf.h
@@ -136,6 +136,7 @@ struct lxc_netdev {
 	bool ipv6_gateway_auto;
 	char *upscript;
 	char *downscript;
+	char *upscript_args;
 };
 
 /*
diff --git a/src/lxc/confile.c b/src/lxc/confile.c
index 14a76b2..516943c 100644
--- a/src/lxc/confile.c
+++ b/src/lxc/confile.c
@@ -89,6 +89,7 @@ static int config_network_vlan_id(const char *, const char *, struct lxc_conf *)
 static int config_network_mtu(const char *, const char *, struct lxc_conf *);
 static int config_network_ipv4(const char *, const char *, struct lxc_conf *);
 static int config_network_ipv4_gateway(const char *, const char *, struct lxc_conf *);
+static int config_network_script_args(const char *, const char *, struct lxc_conf *);
 static int config_network_script_up(const char *, const char *, struct lxc_conf *);
 static int config_network_script_down(const char *, const char *, struct lxc_conf *);
 static int config_network_ipv6(const char *, const char *, struct lxc_conf *);
@@ -152,6 +153,7 @@ static struct lxc_config_t config[] = {
 	{ "lxc.network.name",         config_network_name         },
 	{ "lxc.network.macvlan.mode", config_network_macvlan_mode },
 	{ "lxc.network.veth.pair",    config_network_veth_pair    },
+	{ "lxc.network.script.args",  config_network_script_args  },
 	{ "lxc.network.script.up",    config_network_script_up    },
 	{ "lxc.network.script.down",  config_network_script_down  },
 	{ "lxc.network.hwaddr",       config_network_hwaddr       },
@@ -1002,6 +1004,19 @@ static int config_network_ipv6_gateway(const char *key, const char *value,
 	return 0;
 }
 
+static int config_network_script_args(const char *key, const char *value,
+				    struct lxc_conf *lxc_conf)
+{
+	struct lxc_netdev *netdev;
+
+	netdev = network_netdev(key, value, &lxc_conf->network);
+	if (!netdev)
+ 		return -1;
+
+	return config_string_item(&netdev->upscript_args, value);
+}
+
+
 static int config_network_script_up(const char *key, const char *value,
 				    struct lxc_conf *lxc_conf)
 {
@@ -2372,6 +2387,9 @@ static int lxc_get_item_nic(struct lxc_conf *c, char *retv, int inlen,
 	} else if (strcmp(p1, "flags") == 0) {
 		if (netdev->flags & IFF_UP)
 			strprint(retv, inlen, "up");
+	} else if (strcmp(p1, "script.args") == 0) {
+		if(netdev->upscript_args)
+			strprint(retv, inlen, "%s", netdev->upscript_args);
 	} else if (strcmp(p1, "script.up") == 0) {
 		if (netdev->upscript)
 			strprint(retv, inlen, "%s", netdev->upscript);


More information about the lxc-devel mailing list