OSDN Git Service

refactoring LinuxBridgeAgent
authort.moriyama <t.moriyama@users.sourceforge.jp>
Sat, 20 Jul 2013 18:39:15 +0000 (03:39 +0900)
committert.moriyama <t.moriyama@users.sourceforge.jp>
Sat, 20 Jul 2013 18:39:15 +0000 (03:39 +0900)
linkpair/collect/agent/linuxbridge_agent.py

index 6434538..fa0e8f8 100755 (executable)
@@ -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
+