d5552fa25875b4e3a597e11d738cf7f4c8224934
[bottlenecks.git] / vstf / vstf / agent / perf / netns.py
1 """
2 Created on 2015-8-6
3
4 @author: y00228926
5 """
6 import logging
7 from vstf.common.utils import IPCommandHelper
8 from vstf.agent.perf import ethtool
9 from vstf.common.utils import check_call, check_output, ns_cmd, my_popen, my_sleep
10
11 LOG = logging.getLogger(__name__)
12
13
14 class Netns(object):
15     def __init__(self):
16         super(Netns, self).__init__()
17         self.netns_add_str = "ip netns add %s"
18         self.netns_del_str = " ip netns del %s"
19         self.netns_add_device_str = " ip link set %s netns %s"
20         self.set_link_up_str = "ip link set dev %s up"
21         self.set_link_addr_str = "ip addr replace %s dev %s"
22         self.netns_remove_device_str = "ip netns exec %s ip link set %s netns  1"
23         # self.set_link_addr_str = "ifconfig %s %s up"
24         self.ns_devices = {}
25
26     def clean_all_namespace(self):
27         out = check_output("ip netns list", shell=True)
28         for ns in out.splitlines():
29             self.remove_namespace(ns)
30         return True
31
32     def create_namespace(self, name):
33         if name in (None, 'None', 'none'):
34             return True
35         cmd = self.netns_add_str % name
36         check_call(cmd, shell=True)
37         return True
38
39     def remove_namespace(self, ns):
40         if ns in (None, 'None', 'none'):
41             return True
42         ip_helper = IPCommandHelper(ns)
43         for dev in ip_helper.device_mac_map:
44             cmd = self.netns_remove_device_str % (ns, dev)
45             check_call(cmd, shell=True)
46             self.activate_device(None, dev)
47         cmd = self.netns_del_str % ns
48         check_call(cmd, shell=True)
49         return True
50
51     def add_device(self, ns, device):
52         if ns is None:
53             return True
54         cmd = self.netns_add_device_str % (device, ns)
55         check_call(cmd, shell=True)
56         return True
57
58     def config_ip(self, ns, device, ip):
59         self.activate_device(ns, device)
60         cmd = self.set_link_addr_str % (ip, device)
61         cmd = ns_cmd(ns, cmd)
62         check_call(cmd, shell=True)
63         return True
64
65     def activate_device(self, ns, device):
66         cmd = self.set_link_up_str % device
67         cmd = ns_cmd(ns, cmd)
68         check_call(cmd, shell=True)
69         return True
70
71
72 class NetnsManager(object):
73     def __init__(self):
74         super(NetnsManager, self).__init__()
75         self._netns = Netns()
76
77     def config_dev(self, netdev):
78         ns, device, ip = netdev["namespace"], netdev["iface"], netdev['ip_setting'] if "ip_setting" in netdev else \
79             netdev['ip']
80         self._netns.create_namespace(ns)
81         self._netns.add_device(ns, device)
82         self._netns.config_ip(ns, device, ip)
83         my_sleep(1)
84         ethtool.autoneg_off(device, ns)
85         return True
86
87     def recover_dev(self, netdev):
88         ns = netdev["namespace"]
89         return self._netns.remove_namespace(ns)
90
91     def clean_all_namespace(self):
92         return self._netns.clean_all_namespace()
93
94     @staticmethod
95     def ping(ns, ip):
96         cmd = "ping -w2 -c1 %s" % ip
97         cmd = ns_cmd(ns, cmd)
98         child = my_popen(cmd, shell=True)
99         return 0 == child.wait()
100
101
102 if __name__ == '__main__':
103     logging.basicConfig(level=logging.DEBUG)