1 ##############################################################################
2 # Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
11 from vstf.common.utils import IPCommandHelper
12 from vstf.agent.perf import ethtool
13 from vstf.common.utils import check_call, check_output, ns_cmd, my_popen, my_sleep
15 LOG = logging.getLogger(__name__)
20 super(Netns, self).__init__()
21 self.netns_add_str = "ip netns add %s"
22 self.netns_del_str = " ip netns del %s"
23 self.netns_add_device_str = " ip link set %s netns %s"
24 self.set_link_up_str = "ip link set dev %s up"
25 self.set_link_addr_str = "ip addr replace %s dev %s"
26 self.netns_remove_device_str = "ip netns exec %s ip link set %s netns 1"
27 # self.set_link_addr_str = "ifconfig %s %s up"
30 def clean_all_namespace(self):
31 out = check_output("ip netns list", shell=True)
32 for ns in out.splitlines():
33 self.remove_namespace(ns)
36 def create_namespace(self, name):
37 if name in (None, 'None', 'none'):
39 cmd = self.netns_add_str % name
40 check_call(cmd, shell=True)
43 def remove_namespace(self, ns):
44 if ns in (None, 'None', 'none'):
46 ip_helper = IPCommandHelper(ns)
47 for dev in ip_helper.device_mac_map:
48 cmd = self.netns_remove_device_str % (ns, dev)
49 check_call(cmd, shell=True)
50 self.activate_device(None, dev)
51 cmd = self.netns_del_str % ns
52 check_call(cmd, shell=True)
55 def add_device(self, ns, device):
58 cmd = self.netns_add_device_str % (device, ns)
59 check_call(cmd, shell=True)
62 def config_ip(self, ns, device, ip):
63 self.activate_device(ns, device)
64 cmd = self.set_link_addr_str % (ip, device)
66 check_call(cmd, shell=True)
69 def activate_device(self, ns, device):
70 cmd = self.set_link_up_str % device
72 check_call(cmd, shell=True)
76 class NetnsManager(object):
78 super(NetnsManager, self).__init__()
81 def config_dev(self, netdev):
82 ns, device, ip = netdev["namespace"], netdev["iface"], netdev['ip_setting'] if "ip_setting" in netdev else \
84 self._netns.create_namespace(ns)
85 self._netns.add_device(ns, device)
86 self._netns.config_ip(ns, device, ip)
88 ethtool.autoneg_off(device, ns)
91 def recover_dev(self, netdev):
92 ns = netdev["namespace"]
93 return self._netns.remove_namespace(ns)
95 def clean_all_namespace(self):
96 return self._netns.clean_all_namespace()
100 cmd = "ping -w2 -c1 %s" % ip
101 cmd = ns_cmd(ns, cmd)
102 child = my_popen(cmd, shell=True)
103 return 0 == child.wait()
106 if __name__ == '__main__':
107 logging.basicConfig(level=logging.DEBUG)