OSDN Git Service

fix vlan distribute visualization
[ti2/ti2.git] / linkpair / collect / agent / linuxbridge_agent.py
1 # vim: tabstop=4 shiftwidth=4 softtabstop=4
2 # -*- coding: utf-8 -*-
3 #
4
5 __version__ = '1.1'
6
7 import re
8 from linkpair.device import Device
9 from linkpair.port import Port
10 from linkpair.collect.agent.base_agent import BaseAgent
11
12
13 class LinuxBridgeAgent(BaseAgent):
14     '''
15     Linux bridge Collector Agent
16     '''
17
18     def run(self):
19         self.pick_bridge_configuration()
20
21     def pick_bridge_configuration(self):
22         br_name = ""
23         veth_peers = {}
24         result = self._runner.exec_cmd("brctl show")
25         for br_line in result:
26             br_line = br_line.rstrip()
27             if self._u.d_push(re.match(r'^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$', br_line)) is not None:
28                 match = self._u.d_pop()
29                 br_name = match.group(1)
30                 port_name = match.group(4)
31
32                 if self._cu.exist_linkpair_by_device_port(br_name, port_name):
33                     continue
34
35                 if port_name not in self._port_to_br and br_name != "":
36                     self._port_to_br[port_name] = br_name
37
38                     #### VLAN interface
39                     if self._cu.get_port_vlan_master_if(port_meta) != self._cu.PORT_VLAN_UNSPECIFIED:
40                         master_if = self._cu.get_port_vlan_master_if(
41                             port_meta)
42                         if self._cu._port_to_br.has_key(master_if):
43                             self._cu._port_to_br[port_name] = br_src
44                             port_src = port_name
45                             port_dst = master_if
46                             port_dst_obj = self._cu.get_port(master_if)
47                             br_dst = self._cu._port_to_br[master_if]
48                             br_dst_obj = self._cu.get_device(br_dst)
49                             self._cu.add_linkpair(
50                                 Device(br_src, Device.BR_TYPE),
51                                 br_dst_obj,
52                                 Port(port_src),
53                                 port_dst_obj,
54                                 self._formatter.VLAN_DIST_FORMAT)
55
56                     # veth port
57                     elif self._cu.get_port_veth_peer(port_name) != self._cu.PORT_PEER_UNSPECIFIED:
58                         peer_src = port_name
59                         peer_dst = self._cu.get_port_veth_peer(port_name)
60                         veth_peers[peer_src + ":" + peer_dst] = self.PEER_FOUND
61
62                         if peer_dst + ":" + peer_src in veth_peers:
63                             continue
64
65                         if peer_dst in self._port_to_br:
66                             self._cu.add_linkpair(
67                                 Device(br_name, Device.BR_TYPE),
68                                 Device(self._port_to_br[peer_dst], Device.BR_TYPE),
69                                 Port(peer_src),
70                                 Port(peer_dst),
71                                 self._formatter.VETH_FORMAT)
72                     else:
73                         self._cu.add_linkpair(
74                             Device(br_name),
75                             Device("INTERNAL", Device.OS_ROUTE_TYPE),
76                             Port(port_name),
77                             Port(""))
78
79             elif self._u.d_push(re.match(r'^\s+(\S+)$', br_line)) is not None:
80                 port_name = self._u.d_pop().group(1)
81                 if port_name not in self._port_to_br and br_name != "":
82                     self._port_to_br[port_name] = br_name
83                     ## for OpenStack quntum...
84                     if self._u.d_push(re.match(r'^qvb(.+)', port_name)):
85                         quantum_idprefix = self._u.d_pop().group(1)
86                         if "qvo" + quantum_idprefix in self._port_to_br:
87                             self._cu.add_linkpair(
88                                 Device(br_name, Device.BR_TYPE),
89                                 Device(self._port_to_br[
90                                        "qvo" + quantum_idprefix], Device.BR_TYPE),
91                                 Port(port_name),
92                                 Port("qvo" + quantum_idprefix),
93                                 self._formatter.VETH_FORMAT)
94                     else:
95                         if self._u.d_push(re.match(r'^qvo(.+)', port_name)):
96                             continue
97                         self._cu.add_linkpair(
98                             Device(br_name),
99                             Device("INTERNAL", Device.OS_ROUTE_TYPE),
100                             Port(port_name),
101                             Port(""))