This pulls a lot of common code out of lxc_user_nic.c. It also moves one function from conf.c that was duplicated in lxc_user_nic.c (It removes a DEBUG statement because (a) it doesn't seem actually useful and (b) DEBUG doesn't work in network.c).
Also replace the old test of only parsing code with a skeleton for a full test. (Note - the test will need some work, it's just there as do-what-i-mean code example) Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com> --- src/lxc/Makefile.am | 2 +- src/lxc/conf.c | 41 ----- src/lxc/lxc_user_nic.c | 403 +-------------------------------------------- src/lxc/network.c | 45 ++++- src/lxc/network.h | 4 + src/tests/Makefile.am | 4 +- src/tests/lxc-test-usernic | 126 +++++++++++--- 7 files changed, 156 insertions(+), 469 deletions(-) diff --git a/src/lxc/Makefile.am b/src/lxc/Makefile.am index bcb644e..6534381 100644 --- a/src/lxc/Makefile.am +++ b/src/lxc/Makefile.am @@ -222,7 +222,7 @@ lxc_kill_SOURCES = lxc_kill.c lxc_create_SOURCES = lxc_create.c lxc_snapshot_SOURCES = lxc_snapshot.c lxc_usernsexec_SOURCES = lxc_usernsexec.c -lxc_user_nic_SOURCES = lxc_user_nic.c +lxc_user_nic_SOURCES = lxc_user_nic.c network.c network.h install-exec-local: install-soPROGRAMS mkdir -p $(DESTDIR)$(datadir)/lxc diff --git a/src/lxc/conf.c b/src/lxc/conf.c index 4b786b1..860fc5b 100644 --- a/src/lxc/conf.c +++ b/src/lxc/conf.c @@ -2583,47 +2583,6 @@ void lxc_rename_phys_nics_on_shutdown(struct lxc_conf *conf) free(conf->saved_nics); } -static int setup_private_host_hw_addr(char *veth1) -{ - struct ifreq ifr; - int err; - int sockfd; - - process_lock(); - sockfd = socket(AF_INET, SOCK_DGRAM, 0); - process_unlock(); - if (sockfd < 0) - return -errno; - - snprintf((char *)ifr.ifr_name, IFNAMSIZ, "%s", veth1); - err = ioctl(sockfd, SIOCGIFHWADDR, &ifr); - if (err < 0) { - process_lock(); - close(sockfd); - process_unlock(); - return -errno; - } - - ifr.ifr_hwaddr.sa_data[0] = 0xfe; - err = ioctl(sockfd, SIOCSIFHWADDR, &ifr); - process_lock(); - close(sockfd); - process_unlock(); - if (err < 0) - return -errno; - - DEBUG("mac address of host interface '%s' changed to private " - "%02x:%02x:%02x:%02x:%02x:%02x", veth1, - ifr.ifr_hwaddr.sa_data[0] & 0xff, - ifr.ifr_hwaddr.sa_data[1] & 0xff, - ifr.ifr_hwaddr.sa_data[2] & 0xff, - ifr.ifr_hwaddr.sa_data[3] & 0xff, - ifr.ifr_hwaddr.sa_data[4] & 0xff, - ifr.ifr_hwaddr.sa_data[5] & 0xff); - - return 0; -} - static char *default_rootfs_mount = LXCROOTFSMOUNT; struct lxc_conf *lxc_conf_init(void) diff --git a/src/lxc/lxc_user_nic.c b/src/lxc/lxc_user_nic.c index 952fe14..af1e944 100644 --- a/src/lxc/lxc_user_nic.c +++ b/src/lxc/lxc_user_nic.c @@ -45,51 +45,9 @@ #include <linux/rtnetlink.h> #include <linux/sockios.h> #include <sys/param.h> -#include <sched.h> #include "config.h" #include "utils.h" - -#if ISTEST -#define CONF_FILE "/tmp/lxc-usernet" -#define DB_FILE "/tmp/nics" -#else -#define CONF_FILE LXC_USERNIC_CONF -#define DB_FILE LXC_USERNIC_DB -#endif - -#include "nl.h" - -#ifndef IFLA_LINKMODE -# define IFLA_LINKMODE 17 -#endif - -#ifndef IFLA_LINKINFO -# define IFLA_LINKINFO 18 -#endif - -#ifndef IFLA_NET_NS_PID -# define IFLA_NET_NS_PID 19 -#endif - -#ifndef IFLA_INFO_KIND -# define IFLA_INFO_KIND 1 -#endif - -#ifndef IFLA_VLAN_ID -# define IFLA_VLAN_ID 1 -#endif - -#ifndef IFLA_INFO_DATA -# define IFLA_INFO_DATA 2 -#endif - -#ifndef VETH_INFO_PEER -# define VETH_INFO_PEER 1 -#endif - -#ifndef IFLA_MACVLAN_MODE -# define IFLA_MACVLAN_MODE 1 -#endif +#include "network.h" void usage(char *me, bool fail) { @@ -146,14 +104,14 @@ static char *get_username(void) */ static int get_alloted(char *me, char *intype, char *link) { - FILE *fin = fopen(CONF_FILE, "r"); + FILE *fin = fopen(LXC_USERNIC_CONF, "r"); char *line = NULL; char user[100], type[100], br[100]; size_t len = 0; int n = -1, ret; if (!fin) { - fprintf(stderr, "Failed to open %s: %s\n", CONF_FILE, + fprintf(stderr, "Failed to open %s: %s\n", LXC_USERNIC_CONF, strerror(errno)); return -1; } @@ -229,11 +187,7 @@ static bool nic_exists(char *nic) int ret; struct stat sb; -#if ISTEST - ret = snprintf(path, MAXPATHLEN, "/tmp/lxcnettest/%s", nic); -#else ret = snprintf(path, MAXPATHLEN, "/sys/class/net/%s", nic); -#endif if (ret < 0 || ret >= MAXPATHLEN) // should never happen! return true; ret = stat(path, &sb); @@ -242,198 +196,6 @@ static bool nic_exists(char *nic) return true; } -struct link_req { - struct nlmsg nlmsg; - struct ifinfomsg ifinfomsg; -}; - -#if ! ISTEST - -static int lxc_veth_create(const char *name1, const char *name2) -{ - struct nl_handler nlh; - struct nlmsg *nlmsg = NULL, *answer = NULL; - struct link_req *link_req; - struct rtattr *nest1, *nest2, *nest3; - int len, err; - - err = netlink_open(&nlh, NETLINK_ROUTE); - if (err) - return err; - - err = -EINVAL; - len = strlen(name1); - if (len == 1 || len >= IFNAMSIZ) - goto out; - - len = strlen(name2); - if (len == 1 || len >= IFNAMSIZ) - goto out; - - err = -ENOMEM; - nlmsg = nlmsg_alloc(NLMSG_GOOD_SIZE); - if (!nlmsg) - goto out; - - answer = nlmsg_alloc(NLMSG_GOOD_SIZE); - if (!answer) - goto out; - - link_req = (struct link_req *)nlmsg; - link_req->ifinfomsg.ifi_family = AF_UNSPEC; - nlmsg->nlmsghdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); - nlmsg->nlmsghdr.nlmsg_flags = - NLM_F_REQUEST|NLM_F_CREATE|NLM_F_EXCL|NLM_F_ACK; - nlmsg->nlmsghdr.nlmsg_type = RTM_NEWLINK; - - err = -EINVAL; - nest1 = nla_begin_nested(nlmsg, IFLA_LINKINFO); - if (!nest1) - goto out; - - if (nla_put_string(nlmsg, IFLA_INFO_KIND, "veth")) - goto out; - - nest2 = nla_begin_nested(nlmsg, IFLA_INFO_DATA); - if (!nest2) - goto out; - - nest3 = nla_begin_nested(nlmsg, VETH_INFO_PEER); - if (!nest3) - goto out; - - nlmsg->nlmsghdr.nlmsg_len += sizeof(struct ifinfomsg); - - if (nla_put_string(nlmsg, IFLA_IFNAME, name2)) - goto out; - - nla_end_nested(nlmsg, nest3); - - nla_end_nested(nlmsg, nest2); - - nla_end_nested(nlmsg, nest1); - - if (nla_put_string(nlmsg, IFLA_IFNAME, name1)) - goto out; - - err = netlink_transaction(&nlh, nlmsg, answer); -out: - netlink_close(&nlh); - nlmsg_free(answer); - nlmsg_free(nlmsg); - return err; -} - -static int lxc_netdev_move(char *ifname, pid_t pid) -{ - struct nl_handler nlh; - struct nlmsg *nlmsg = NULL; - struct link_req *link_req; - int err, index; - - index = if_nametoindex(ifname); - if (!ifname) - return -EINVAL; - - err = netlink_open(&nlh, NETLINK_ROUTE); - if (err) - return err; - - err = -ENOMEM; - nlmsg = nlmsg_alloc(NLMSG_GOOD_SIZE); - if (!nlmsg) - goto out; - - link_req = (struct link_req *)nlmsg; - link_req->ifinfomsg.ifi_family = AF_UNSPEC; - link_req->ifinfomsg.ifi_index = index; - nlmsg->nlmsghdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); - nlmsg->nlmsghdr.nlmsg_flags = NLM_F_REQUEST|NLM_F_ACK; - nlmsg->nlmsghdr.nlmsg_type = RTM_NEWLINK; - - if (nla_put_u32(nlmsg, IFLA_NET_NS_PID, pid)) - goto out; - - err = netlink_transaction(&nlh, nlmsg, nlmsg); -out: - netlink_close(&nlh); - nlmsg_free(nlmsg); - return err; -} - -static int setup_private_host_hw_addr(char *veth1) -{ - struct ifreq ifr; - int err; - int sockfd; - - sockfd = socket(AF_INET, SOCK_DGRAM, 0); - if (sockfd < 0) - return -errno; - - snprintf((char *)ifr.ifr_name, IFNAMSIZ, "%s", veth1); - err = ioctl(sockfd, SIOCGIFHWADDR, &ifr); - if (err < 0) { - close(sockfd); - return -errno; - } - - ifr.ifr_hwaddr.sa_data[0] = 0xfe; - err = ioctl(sockfd, SIOCSIFHWADDR, &ifr); - close(sockfd); - if (err < 0) - return -errno; - - return 0; -} - -static int netdev_set_flag(const char *name, int flag) -{ - struct nl_handler nlh; - struct nlmsg *nlmsg = NULL, *answer = NULL; - struct link_req *link_req; - int index, len, err; - - err = netlink_open(&nlh, NETLINK_ROUTE); - if (err) - return err; - - err = -EINVAL; - len = strlen(name); - if (len == 1 || len >= IFNAMSIZ) - goto out; - - err = -ENOMEM; - nlmsg = nlmsg_alloc(NLMSG_GOOD_SIZE); - if (!nlmsg) - goto out; - - answer = nlmsg_alloc(NLMSG_GOOD_SIZE); - if (!answer) - goto out; - - err = -EINVAL; - index = if_nametoindex(name); - if (!index) - goto out; - - link_req = (struct link_req *)nlmsg; - link_req->ifinfomsg.ifi_family = AF_UNSPEC; - link_req->ifinfomsg.ifi_index = index; - link_req->ifinfomsg.ifi_change |= IFF_UP; - link_req->ifinfomsg.ifi_flags |= flag; - nlmsg->nlmsghdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); - nlmsg->nlmsghdr.nlmsg_flags = NLM_F_REQUEST|NLM_F_ACK; - nlmsg->nlmsghdr.nlmsg_type = RTM_NEWLINK; - - err = netlink_transaction(&nlh, nlmsg, answer); -out: - netlink_close(&nlh); - nlmsg_free(nlmsg); - nlmsg_free(answer); - return err; -} - static int instanciate_veth(char *n1, char **n2) { int err; @@ -463,99 +225,8 @@ static int instanciate_veth(char *n1, char **n2) return netdev_set_flag(n1, IFF_UP); } -static int lxc_bridge_attach(const char *bridge, const char *ifname) -{ - int fd, index, err; - struct ifreq ifr; - - if (strlen(ifname) >= IFNAMSIZ) - return -EINVAL; - - index = if_nametoindex(ifname); - if (!index) - return -EINVAL; - - fd = socket(AF_INET, SOCK_STREAM, 0); - if (fd < 0) - return -errno; - - strncpy(ifr.ifr_name, bridge, IFNAMSIZ-1); - ifr.ifr_name[IFNAMSIZ-1] = '\0'; - ifr.ifr_ifindex = index; - err = ioctl(fd, SIOCBRADDIF, &ifr); - close(fd); - if (err) - err = -errno; - - return err; -} - -static int lxc_netdev_delete_by_index(int ifindex) -{ - struct nl_handler nlh; - struct nlmsg *nlmsg = NULL, *answer = NULL; - struct link_req *link_req; - int err; - - err = netlink_open(&nlh, NETLINK_ROUTE); - if (err) - return err; - - err = -ENOMEM; - nlmsg = nlmsg_alloc(NLMSG_GOOD_SIZE); - if (!nlmsg) - goto out; - - answer = nlmsg_alloc(NLMSG_GOOD_SIZE); - if (!answer) - goto out; - - link_req = (struct link_req *)nlmsg; - link_req->ifinfomsg.ifi_family = AF_UNSPEC; - link_req->ifinfomsg.ifi_index = ifindex; - nlmsg->nlmsghdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); - nlmsg->nlmsghdr.nlmsg_flags = NLM_F_ACK|NLM_F_REQUEST; - nlmsg->nlmsghdr.nlmsg_type = RTM_DELLINK; - - err = netlink_transaction(&nlh, nlmsg, answer); -out: - netlink_close(&nlh); - nlmsg_free(answer); - nlmsg_free(nlmsg); - return err; -} - -static int lxc_netdev_delete_by_name(const char *name) -{ - int index; - - index = if_nametoindex(name); - if (!index) - return -EINVAL; - - return lxc_netdev_delete_by_index(index); -} -#else -static int lxc_netdev_delete_by_name(const char *name) -{ - char path[200]; - sprintf(path, "/tmp/lxcnettest/%s", name); - return unlink(path); -} - -#endif - static bool create_nic(char *nic, char *br, int pid, char **cnic) { -#if ISTEST - char path[200]; - sprintf(path, "/tmp/lxcnettest/%s", nic); - int fd = open(path, O_RDWR|O_CREAT, S_IWUSR | S_IRUSR); - if (fd < 0) - return false; - close(fd); - return true; -#else char *veth1buf, *veth2buf; veth1buf = alloca(IFNAMSIZ); veth2buf = alloca(IFNAMSIZ); @@ -580,7 +251,7 @@ static bool create_nic(char *nic, char *br, int pid, char **cnic) } /* pass veth2 to target netns */ - ret = lxc_netdev_move(veth2buf, pid); + ret = lxc_netdev_move_by_name(veth2buf, pid); if (ret < 0) { fprintf(stderr, "Error moving %s to netns %d\n", veth2buf, pid); goto out_del; @@ -591,7 +262,6 @@ static bool create_nic(char *nic, char *br, int pid, char **cnic) out_del: lxc_netdev_delete_by_name(veth1buf); return false; -#endif } /* @@ -775,65 +445,6 @@ again: goto again; } -static int lxc_netdev_rename_by_index(int ifindex, const char *newname) -{ - struct nl_handler nlh; - struct nlmsg *nlmsg = NULL, *answer = NULL; - struct link_req *link_req; - int len, err; - - err = netlink_open(&nlh, NETLINK_ROUTE); - if (err) - return err; - - len = strlen(newname); - if (len == 1 || len >= IFNAMSIZ) - goto out; - - err = -ENOMEM; - nlmsg = nlmsg_alloc(NLMSG_GOOD_SIZE); - if (!nlmsg) - goto out; - - answer = nlmsg_alloc(NLMSG_GOOD_SIZE); - if (!answer) - goto out; - - link_req = (struct link_req *)nlmsg; - link_req->ifinfomsg.ifi_family = AF_UNSPEC; - link_req->ifinfomsg.ifi_index = ifindex; - nlmsg->nlmsghdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)); - nlmsg->nlmsghdr.nlmsg_flags = NLM_F_ACK|NLM_F_REQUEST; - nlmsg->nlmsghdr.nlmsg_type = RTM_NEWLINK; - - if (nla_put_string(nlmsg, IFLA_IFNAME, newname)) - goto out; - - err = netlink_transaction(&nlh, nlmsg, answer); -out: - netlink_close(&nlh); - nlmsg_free(answer); - nlmsg_free(nlmsg); - return err; -} - -static int lxc_netdev_rename_by_name(const char *oldname, const char *newname) -{ - int len, index; - - len = strlen(oldname); - if (len == 1 || len >= IFNAMSIZ) - return -EINVAL; - - index = if_nametoindex(oldname); - if (!index) { - fprintf(stderr, "Error getting ifindex for %s\n", oldname); - return -EINVAL; - } - - return lxc_netdev_rename_by_index(index, newname); -} - static int rename_in_ns(int pid, char *oldname, char *newname) { char nspath[MAXPATHLEN]; @@ -952,13 +563,13 @@ int main(int argc, char *argv[]) exit(1); } - if (!create_db_dir(DB_FILE)) { + if (!create_db_dir(LXC_USERNIC_DB)) { fprintf(stderr, "Failed to create directory for db file\n"); exit(1); } - if ((fd = open_and_lock(DB_FILE)) < 0) { - fprintf(stderr, "Failed to lock %s\n", DB_FILE); + if ((fd = open_and_lock(LXC_USERNIC_DB)) < 0) { + fprintf(stderr, "Failed to lock %s\n", LXC_USERNIC_DB); exit(1); } diff --git a/src/lxc/network.c b/src/lxc/network.c index c30287e..94ff1f0 100644 --- a/src/lxc/network.c +++ b/src/lxc/network.c @@ -130,6 +130,17 @@ out: return err; } +int lxc_netdev_move_by_name(char *ifname, pid_t pid) +{ + int index; + + index = if_nametoindex(ifname); + if (!ifname) + return -EINVAL; + + return lxc_netdev_move_by_index(index, pid); +} + int lxc_netdev_delete_by_index(int ifindex) { struct nl_handler nlh; @@ -233,7 +244,7 @@ int lxc_netdev_rename_by_name(const char *oldname, const char *newname) return lxc_netdev_rename_by_index(index, newname); } -static int netdev_set_flag(const char *name, int flag) +int netdev_set_flag(const char *name, int flag) { struct nl_handler nlh; struct nlmsg *nlmsg = NULL, *answer = NULL; @@ -1036,3 +1047,35 @@ const char *lxc_net_type_to_str(int type) return NULL; return lxc_network_types[type]; } + +int setup_private_host_hw_addr(char *veth1) +{ + struct ifreq ifr; + int err; + int sockfd; + + process_lock(); + sockfd = socket(AF_INET, SOCK_DGRAM, 0); + process_unlock(); + if (sockfd < 0) + return -errno; + + snprintf((char *)ifr.ifr_name, IFNAMSIZ, "%s", veth1); + err = ioctl(sockfd, SIOCGIFHWADDR, &ifr); + if (err < 0) { + process_lock(); + close(sockfd); + process_unlock(); + return -errno; + } + + ifr.ifr_hwaddr.sa_data[0] = 0xfe; + err = ioctl(sockfd, SIOCSIFHWADDR, &ifr); + process_lock(); + close(sockfd); + process_unlock(); + if (err < 0) + return -errno; + + return 0; +} diff --git a/src/lxc/network.h b/src/lxc/network.h index 0ca7a9a..58db9a1 100644 --- a/src/lxc/network.h +++ b/src/lxc/network.h @@ -32,6 +32,7 @@ extern int lxc_convert_mac(char *macaddr, struct sockaddr *sockaddr); * Move a device between namespaces */ extern int lxc_netdev_move_by_index(int ifindex, pid_t pid); +extern int lxc_netdev_move_by_name(char *ifname, pid_t pid); /* * Delete a network device @@ -45,6 +46,8 @@ extern int lxc_netdev_delete_by_index(int ifindex); extern int lxc_netdev_rename_by_name(const char *oldname, const char *newname); extern int lxc_netdev_rename_by_index(int ifindex, const char *newname); +extern int netdev_set_flag(const char *name, int flag); + /* * Set the device network up or down */ @@ -123,4 +126,5 @@ extern int lxc_neigh_proxy_on(const char *name, int family); extern int lxc_neigh_proxy_off(const char *name, int family); extern const char *lxc_net_type_to_str(int type); +extern int setup_private_host_hw_addr(char *veth1); #endif diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am index cae82bf..ab956be 100644 --- a/src/tests/Makefile.am +++ b/src/tests/Makefile.am @@ -15,8 +15,6 @@ lxc_test_lxcpath_SOURCES = lxcpath.c lxc_test_cgpath_SOURCES = cgpath.c lxc_test_clonetest_SOURCES = clonetest.c lxc_test_console_SOURCES = console.c -lxc_usernic_test_SOURCES = ../lxc/lxc_user_nic.c ../lxc/nl.c -lxc_usernic_test_CFLAGS = -DISTEST lxc_test_snapshot_SOURCES = snapshot.c lxc_test_concurrent_SOURCES = concurrent.c lxc_test_may_control_SOURCES = may_control.c @@ -42,7 +40,7 @@ endif bin_PROGRAMS = lxc-test-containertests lxc-test-locktests lxc-test-startone \ lxc-test-destroytest lxc-test-saveconfig lxc-test-createtest \ lxc-test-shutdowntest lxc-test-get_item lxc-test-getkeys lxc-test-lxcpath \ - lxc-test-cgpath lxc-test-clonetest lxc-test-console lxc-usernic-test \ + lxc-test-cgpath lxc-test-clonetest lxc-test-console \ lxc-test-snapshot lxc-test-concurrent lxc-test-may-control \ lxc-test-reboot lxc-test-list lxc-test-attach diff --git a/src/tests/lxc-test-usernic b/src/tests/lxc-test-usernic index 9e6d834..168bac0 100755 --- a/src/tests/lxc-test-usernic +++ b/src/tests/lxc-test-usernic @@ -21,47 +21,119 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -conffile="/tmp/lxc-usernet" -dbfile="/tmp/nics" -sysfsdir=/tmp/lxcnettest +cleanup() { + sed -i '/usernic-user/d' /var/run/lxc/nics /etc/lxc/lxc-usernet + ifconfig usernic-br0 down + ifconfig usernic-br1 down + sudo brctl delbr usernic-br0 + sudo brctl delbr usernic-br1 + sudo deluser usernic-user + su -l usernic-user -c "lxc-stop -P /tmp/usernic-test/lxcbase -n b1" + rm -rf /tmp/usernic-test + exit $1 +} -rm -f $conffile $dbfile +# create a test user +deluser usernic-user || true +useradd usernic-user +sudo mkdir -p /home/usernic-user +sudo chown usernic-user /home/usernic-user +usermod -v 910000-919999 -w 910000-919999 usernic-user +mkdir -p /tmp/usernic-test/lxcbase +chown usernic-user /tmp/usernic-test/lxcbase +uid=$(id -u usernic-user) +cat > /home/usernic-user/.bashrc << EOF +export XDG_RUNTIME_DIR=/run/user/$uid +EOF +XDG_RUNTIME_DIR=/run/user/$uid +export XDG_RUNTIME_DIR=/run/user/$uid +mkdir -p /run/user/$uid +chown usernic-user /run/user/$uid +env +echo XXX[ +su -l usernic-user -c "env" +sleep 20 + +# +cat > /tmp/lxc-usernic.conf << EOF +lxc.network.type = empty +lxc.id_map = u 0 911000 10000 +lxc.id_map = g 0 911000 10000 +EOF -rm -rf $sysfsdir -mkdir -p $sysfsdir +# Create two test bridges -# there is no conffile, so we have no permissions -lxc-usernic-test 1111 veth lxcbr0 > /dev/null 2>&1 +brctl addbr usernic-br0 +brctl addbr usernic-br1 +ifconfig usernic-br0 0.0.0.0 up +ifconfig usernic-br1 0.0.0.0 up + +# Create three containers +su -l usernic-user -c "lxc-create -P /tmp/usernic-test/lxcbase -t busybox -n b1 -f /tmp/lxc-usernic.conf" +su -l usernic-user -c "lxc-start -P /tmp/usernic-test/lxcbase -n b1 -d" +p1=`lxc-info -P /tmp/usernic-test/lxcbase -n b1 -p | awk -F: '{ print $2 }'` + +# Assign one veth, should fail as no allowed entries yet +su -l usernic-user -c "lxc-user-nic $p1 veth usernic-br0 xx1" if [ $? -eq 0 ]; then - echo "Fail: empty conffile should not allow me a nic" - exit 1 + echo "FAIL: able to create nic with no entries" + cleanup 1 fi -cat > $conffile << EOF -$(id -un) veth lxcbr0 1 -EOF +# Give him a quota of two +echo "lxc-usernet veth usernic-br0 2" >> /etc/lxc/lxc-usernet + +# Assign one veth to second bridge, should fail +su -l usernic-user -c "lxc-user-nic $p1 veth usernic-br1 xx1" +if [ $? -eq 0 ]; then + echo "FAIL: able to create nic with no entries" + cleanup 1 +fi -# Should be allowed one but not two -lxc-usernic-test 1111 veth lxcbr0 > /dev/null 2>&1 +# Assign two veths, should succeed +su -l usernic-user -c "lxc-user-nic $p1 veth usernic-br0 xx2" +if [ $? -ne 0 ]; then + echo "FAIL: unable to create first nic" + cleanup 1 +fi +su -l usernic-user -c "lxc-user-nic $p1 veth usernic-br0 xx3" if [ $? -ne 0 ]; then - echo "Failed to get one allowed nic" - exit 1 + echo "FAIL: unable to create second nic" + cleanup 1 fi -lxc-usernic-test 1111 veth lxcbr0 > /dev/null 2>&1 +# Assign one more veth, should fail. +su -l usernic-user -c "lxc-user-nic $p1 veth usernic-br0 xx4" if [ $? -eq 0 ]; then - echo "Fail: was able to get a second nic" - exit 1 + echo "FAIL: able to create third nic" + cleanup 1 fi -# now remove the 'existing nic' and make sure we're allowed to create -# a new one -lxc-usernic-test 1111 veth lxcbr0 > /dev/null 2>&1 -rm -rf $sysfsdir -mkdir -p $sysfsdir +# Shut down and restart the container, should be able to assign more nics +su -l usernic-user -c "lxc-stop -P /tmp/usernic-test/lxcbase -n b1" +su -l usernic-user -c "lxc-start -P /tmp/usernic-test/lxcbase -n b1 -d" +p1=`lxc-info -P /tmp/usernic-test/lxcbase -n b1 -p | awk -F: '{ print $2 }'` +su -l usernic-user -c "lxc-user-nic $p1 veth usernic-br0 xx5" if [ $? -ne 0 ]; then - echo "Fail: was unable to get a replacement nic" - exit 1 + echo "FAIL: unable to create nic after destroying the old" + cleanup 1 +fi + +su -l usernic-user -c "lxc-stop -P /tmp/usernic-test/lxcbase -n b1" + +# Create a root-owned ns +lxc-create -t busybox -n usernic-c1 +lxc-start -n usernic-c1 -d +p2=`lxc-info -n usernic-c1 -p | awk -F: '{ print $2}'` + +# assign veth to it - should fail +su -l usernic-user -c "lxc-user-nic $p2 veth usernic-br0 xx6" +ret=$? +lxc-stop -n usernic-c1 +lxc-destroy -n usernic-c1 +if [ $ret -eq 0 ]; then + echo "FAIL: able to attach nic to root-owned container" + cleanup 1 fi echo "All tests passed" -- 1.8.3.2 ------------------------------------------------------------------------------ Shape the Mobile Experience: Free Subscription Software experts and developers: Be at the forefront of tech innovation. Intel(R) Software Adrenaline delivers strategic insight and game-changing conversations that shape the rapidly evolving mobile landscape. Sign up now. http://pubads.g.doubleclick.net/gampad/clk?id=63431311&iu=/4140/ostg.clktrk _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel