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