OSDN Git Service

6434538e4e28ada48457ecf8565e0a47960a273c
[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 master_if in self._cu._port_to_br:
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[
69                                        peer_dst], Device.BR_TYPE),
70                                 Port(peer_src),
71                                 Port(peer_dst),
72                                 self._formatter.VETH_FORMAT)
73                     else:
74                         self._cu.add_linkpair(
75                             Device(br_name),
76                             Device("INTERNAL", Device.OS_ROUTE_TYPE),
77                             Port(port_name),
78                             Port(""))
79
80             elif self._u.d_push(re.match(r'^\s+(\S+)$', br_line)) is not None:
81                 port_name = self._u.d_pop().group(1)
82                 if port_name not in self._port_to_br and br_name != "":
83                     self._port_to_br[port_name] = br_name
84                     ## for OpenStack quntum...
85                     if self._u.d_push(re.match(r'^qvb(.+)', port_name)):
86                         quantum_idprefix = self._u.d_pop().group(1)
87                         if "qvo" + quantum_idprefix in self._port_to_br:
88                             self._cu.add_linkpair(
89                                 Device(br_name, Device.BR_TYPE),
90                                 Device(self._port_to_br[
91                                        "qvo" + quantum_idprefix], Device.BR_TYPE),
92                                 Port(port_name),
93                                 Port("qvo" + quantum_idprefix),
94                                 self._formatter.VETH_FORMAT)
95                     else:
96                         if self._u.d_push(re.match(r'^qvo(.+)', port_name)):
97                             continue
98                         self._cu.add_linkpair(
99                             Device(br_name),
100                             Device("INTERNAL", Device.OS_ROUTE_TYPE),
101                             Port(port_name),
102                             Port(""))