1 # vim: tabstop=4 shiftwidth=4 softtabstop=4
2 # -*- coding: utf-8 -*-
8 from linkpair.device import Device
9 from linkpair.port import Port
10 from linkpair.collect.agent.base_agent import BaseAgent
13 class LinuxBridgeAgent(BaseAgent):
15 Linux bridge Collector Agent
19 self.pick_bridge_configuration()
21 def pick_bridge_configuration(self):
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)
32 if self._cu.exist_linkpair_by_device_port(br_name, port_name):
35 if port_name not in self._port_to_br and br_name != "":
36 self._port_to_br[port_name] = br_name
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(
42 if self._cu._port_to_br.has_key(master_if):
43 self._cu._port_to_br[port_name] = br_src
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),
54 self._formatter.VLAN_DIST_FORMAT)
57 elif self._cu.get_port_veth_peer(port_name) != self._cu.PORT_PEER_UNSPECIFIED:
59 peer_dst = self._cu.get_port_veth_peer(port_name)
60 veth_peers[peer_src + ":" + peer_dst] = self.PEER_FOUND
62 if peer_dst + ":" + peer_src in veth_peers:
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),
71 self._formatter.VETH_FORMAT)
73 self._cu.add_linkpair(
75 Device("INTERNAL", Device.OS_ROUTE_TYPE),
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),
92 Port("qvo" + quantum_idprefix),
93 self._formatter.VETH_FORMAT)
95 if self._u.d_push(re.match(r'^qvo(.+)', port_name)):
97 self._cu.add_linkpair(
99 Device("INTERNAL", Device.OS_ROUTE_TYPE),