From: t.moriyama Date: Sat, 20 Jul 2013 18:39:15 +0000 (+0900) Subject: refactoring LinuxBridgeAgent X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=995540399291bb0854941417dfdc654312f89606;p=ti2%2Fti2.git refactoring LinuxBridgeAgent --- diff --git a/linkpair/collect/agent/linuxbridge_agent.py b/linkpair/collect/agent/linuxbridge_agent.py index 6434538..fa0e8f8 100755 --- a/linkpair/collect/agent/linuxbridge_agent.py +++ b/linkpair/collect/agent/linuxbridge_agent.py @@ -19,42 +19,28 @@ class LinuxBridgeAgent(BaseAgent): self.pick_bridge_configuration() def pick_bridge_configuration(self): - br_name = "" + br_src = "" veth_peers = {} result = self._runner.exec_cmd("brctl show") for br_line in result: br_line = br_line.rstrip() + + # bridge definition line + # [bridge name] [bridge id] [STP enabled] [interfaces] if self._u.d_push(re.match(r'^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$', br_line)) is not None: match = self._u.d_pop() - br_name = match.group(1) + br_src = match.group(1) port_name = match.group(4) + if self._cu.exist_port(port_name): + port_meta = self._cu.get_port(port_name).metadata + else: + port_meta = self._cu.METADATA_NOT_FOUND - if self._cu.exist_linkpair_by_device_port(br_name, port_name): - continue - - if port_name not in self._port_to_br and br_name != "": - self._port_to_br[port_name] = br_name - - #### VLAN interface - if self._cu.get_port_vlan_master_if(port_meta) != self._cu.PORT_VLAN_UNSPECIFIED: - master_if = self._cu.get_port_vlan_master_if( - port_meta) - if master_if in self._cu._port_to_br: - self._cu._port_to_br[port_name] = br_src - port_src = port_name - port_dst = master_if - port_dst_obj = self._cu.get_port(master_if) - br_dst = self._cu._port_to_br[master_if] - br_dst_obj = self._cu.get_device(br_dst) - self._cu.add_linkpair( - Device(br_src, Device.BR_TYPE), - br_dst_obj, - Port(port_src), - port_dst_obj, - self._formatter.VLAN_DIST_FORMAT) + if port_name not in self._port_to_br and br_src != "": + self._port_to_br[port_name] = br_src # veth port - elif self._cu.get_port_veth_peer(port_name) != self._cu.PORT_PEER_UNSPECIFIED: + if self._cu.get_port_veth_peer(port_name) != self._cu.PORT_PEER_UNSPECIFIED: peer_src = port_name peer_dst = self._cu.get_port_veth_peer(port_name) veth_peers[peer_src + ":" + peer_dst] = self.PEER_FOUND @@ -62,41 +48,189 @@ class LinuxBridgeAgent(BaseAgent): if peer_dst + ":" + peer_src in veth_peers: continue + br_dst = self._port_to_br[peer_dst] +# if self._cu.exist_linkpair(br_src, br_dst, peer_src, peer_dst): +# continue + if peer_dst in self._port_to_br: self._cu.add_linkpair( - Device(br_name, Device.BR_TYPE), - Device(self._port_to_br[ - peer_dst], Device.BR_TYPE), + Device(br_src, Device.BR_TYPE), + Device(br_dst, Device.BR_TYPE), Port(peer_src), Port(peer_dst), self._formatter.VETH_FORMAT) + + # none veth port else: - self._cu.add_linkpair( - Device(br_name), - Device("INTERNAL", Device.OS_ROUTE_TYPE), - Port(port_name), - Port("")) + # physical interface + if self._u.d_push(re.match(r'^eth\d+$', port_name)) \ + or self._u.d_push(re.match(r'^em\d+$', port_name)) \ + or self._u.d_push(re.match(r'^igb\d+$', port_name)) \ + or self._u.d_push(re.match(r'^bond\d+$', port_name)): + self._port_to_br[port_name] = br_src + self._cu.add_linkpair( + Device(br_src, Device.BR_TYPE), + Device("Physical NW", Device.PHYNET_TYPE), + Port(port_name, Port.DEFAULT_TYPE, port_meta), + Port("")) + # tunnel port + elif self._u.d_push(re.match(r'(vxlan\d+)', port_name)) \ + or self._cu.get_port_type(port_meta) == "gre" \ + or self._cu.get_port_type(port_meta) == "stt": + self._port_to_br[port_name] = br_src + self._cu.add_linkpair( + Device(br_src, Device.BR_TYPE), + Device("OS Routing", Device.OS_ROUTE_TYPE), + Port(port_name, Port.DEFAULT_TYPE, port_meta), + Port(""), + self._formatter.OS_ROUTING_FORMAT) + + # Other bridge port + else: + #### VLAN interface + if self._cu.get_port_vlan_master_if(port_name) != self._cu.PORT_VLAN_UNSPECIFIED: + master_if = self._cu.get_port_vlan_master_if(port_name) + if master_if in self._port_to_br: + print port_name + " " + master_if + self._port_to_br[port_name] = br_src + port_src = port_name + port_dst = master_if + port_dst_obj = self._cu.get_port(master_if) + br_dst = self._port_to_br[master_if] + br_dst_obj = self._cu.get_device(br_dst) + self._cu.add_linkpair( + Device(br_src, Device.BR_TYPE), + br_dst_obj, + Port(port_src), + port_dst_obj, + self._formatter.VLAN_DIST_FORMAT) + + elif self._u.d_push(re.match(r'^eth\d+$', master_if)) \ + or self._u.d_push(re.match(r'^em\d+$', master_if)) \ + or self._u.d_push(re.match(r'^igb\d+$', master_if)) \ + or self._u.d_push(re.match(r'^bond\d+$', master_if)): + self._cu.add_linkpair( + Device(br_src, Device.BR_TYPE), + Device("Physical NW", Device.PHYNET_TYPE), + Port(port_name, Port.DEFAULT_TYPE), + Port("")) + + else: + continue +# self._cu.add_linkpair( +# Device(br_src), +# Device("INTERNAL", Device.OS_ROUTE_TYPE), +# Port(port_name), +# Port("")) + ## if (phys if): + + # bridge interface line + # [interfaces] elif self._u.d_push(re.match(r'^\s+(\S+)$', br_line)) is not None: port_name = self._u.d_pop().group(1) - if port_name not in self._port_to_br and br_name != "": - self._port_to_br[port_name] = br_name - ## for OpenStack quntum... - if self._u.d_push(re.match(r'^qvb(.+)', port_name)): - quantum_idprefix = self._u.d_pop().group(1) - if "qvo" + quantum_idprefix in self._port_to_br: + if self._cu.exist_port(port_name): + port_meta = self._cu.get_port(port_name).metadata + else: + port_meta = self._cu.METADATA_NOT_FOUND + + if port_name not in self._port_to_br and br_src != "": + self._port_to_br[port_name] = br_src + + # veth port + if self._cu.get_port_veth_peer(port_name) != self._cu.PORT_PEER_UNSPECIFIED: + peer_src = port_name + peer_dst = self._cu.get_port_veth_peer(port_name) + veth_peers[peer_src + ":" + peer_dst] = self.PEER_FOUND + + if peer_dst + ":" + peer_src in veth_peers: + continue + + br_dst = self._port_to_br[peer_dst] + #if self._cu.exist_linkpair(br_src, br_dst, peer_src, peer_dst): + # continue + + if peer_dst in self._port_to_br: self._cu.add_linkpair( - Device(br_name, Device.BR_TYPE), - Device(self._port_to_br[ - "qvo" + quantum_idprefix], Device.BR_TYPE), - Port(port_name), - Port("qvo" + quantum_idprefix), + Device(br_src, Device.BR_TYPE), + Device(br_dst, Device.BR_TYPE), + Port(peer_src), + Port(peer_dst), self._formatter.VETH_FORMAT) + + # none veth port else: - if self._u.d_push(re.match(r'^qvo(.+)', port_name)): - continue - self._cu.add_linkpair( - Device(br_name), - Device("INTERNAL", Device.OS_ROUTE_TYPE), - Port(port_name), - Port("")) + # physical interface + if self._u.d_push(re.match(r'^eth\d+$', port_name)) \ + or self._u.d_push(re.match(r'^em\d+$', port_name)) \ + or self._u.d_push(re.match(r'^igb\d+$', port_name)) \ + or self._u.d_push(re.match(r'^bond\d+$', port_name)): + self._cu.add_linkpair( + Device(br_src, Device.BR_TYPE), + Device("Physical NW", Device.PHYNET_TYPE), + Port(port_name, Port.DEFAULT_TYPE, port_meta), + Port("")) + + # tunnel port + elif self._u.d_push(re.match(r'(vxlan\d+)', port_name)) \ + or self._cu.get_port_type(port_meta) == "gre" \ + or self._cu.get_port_type(port_meta) == "stt": + self._cu.add_linkpair( + Device(br_src, Device.BR_TYPE), + Device("OS Routing", Device.OS_ROUTE_TYPE), + Port(port_name, Port.DEFAULT_TYPE, port_meta), + Port(""), + self._formatter.OS_ROUTING_FORMAT) + + # Other bridge port + else: + + #### VLAN interface + if self._cu.get_port_vlan_master_if(port_name) != self._cu.PORT_VLAN_UNSPECIFIED: + master_if = self._cu.get_port_vlan_master_if(port_name) + if master_if in self._port_to_br: + port_src = port_name + port_dst = master_if + port_dst_obj = self._cu.get_port(master_if) + br_dst = self._port_to_br[master_if] + br_dst_obj = self._cu.get_device(br_dst) + self._cu.add_linkpair( + Device(br_src, Device.BR_TYPE), + br_dst_obj, + Port(port_src), + port_dst_obj, + self._formatter.VLAN_DIST_FORMAT) + + else: + continue +# self._cu.add_linkpair( +# Device(br_src), +# Device("INTERNAL", Device.OS_ROUTE_TYPE), +# Port(port_name), +# Port("")) + ## if (phys if): + +# if port_name not in self._port_to_br and br_name != "": +# self._port_to_br[port_name] = br_name +# +# ## for OpenStack quntum... +# if self._u.d_push(re.match(r'^qvb(.+)', port_name)): +# quantum_idprefix = self._u.d_pop().group(1) +# if "qvo" + quantum_idprefix in self._port_to_br: +# self._cu.add_linkpair( +# Device(br_name, Device.BR_TYPE), +# Device(self._port_to_br[ +# "qvo" + quantum_idprefix], Device.BR_TYPE), +# Port(port_name), +# Port("qvo" + quantum_idprefix), +# self._formatter.VETH_FORMAT) +# else: +# if self._u.d_push(re.match(r'^qvo(.+)', port_name)): +# continue +# self._cu.add_linkpair( +# Device(br_name), +# Device("INTERNAL", Device.OS_ROUTE_TYPE), +# Port(port_name), +# Port("")) +# #print "int: " + br_name + ": " + port_name +