OSDN Git Service

fix vlan distribute visualization
authort.moriyama <t.moriyama@users.sourceforge.jp>
Sat, 15 Jun 2013 14:31:43 +0000 (23:31 +0900)
committert.moriyama <t.moriyama@users.sourceforge.jp>
Sat, 15 Jun 2013 14:31:43 +0000 (23:31 +0900)
linkpair/collect/agent/linuxbridge_agent.py
linkpair/collect/agent/ovs_agent.py
linkpair/collect/utils.py

index f201df3..fd337f9 100755 (executable)
@@ -20,59 +20,82 @@ class LinuxBridgeAgent(BaseAgent):
 
     def pick_bridge_configuration(self):
         br_name = ""
+        veth_peers = {}
         result = self._runner.exec_cmd("brctl show")
         for br_line in result:
             br_line = br_line.rstrip()
             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)
-                port = match.group(4)
-                if port not in self._port_to_br and br_name != "":
-                    self._port_to_br[port] = br_name
-                    ## for OpenStack quntum...
-                    if self._u.d_push(re.match(r'^qvb(.+)', port)):
-                        quantum_idprefix = self._u.d_pop().group(1)
-                        if "qvo" + quantum_idprefix in self._port_to_br:
+                port_name = match.group(4)
+
+                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 self._cu._port_to_br.has_key(master_if):
+                            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)
+
+                    # veth port
+                    elif 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
+
+                        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),
-                                Port("qvo" + quantum_idprefix),
+                                Device(self._port_to_br[peer_dst], Device.BR_TYPE),
+                                Port(peer_src),
+                                Port(peer_dst),
                                 self._formatter.VETH_FORMAT)
                     else:
                         self._cu.add_linkpair(
                             Device(br_name),
                             Device("INTERNAL", Device.OS_ROUTE_TYPE),
-                            Port(port),
+                            Port(port_name),
                             Port(""))
-    #            else:
-    #                print self._port_to_br.keys()
-    #                if self._u.d_push(re.match(r'^qvo(.+)', port)):
-    #                    continue
-    #                add_linkpair(self.DEFAULT_FORMAT, br_name, self.DEFAULT_TYPE, port, \
-    #                  "INTERNAL", self.OS_ROUTE_TYPE )
 
             elif self._u.d_push(re.match(r'^\s+(\S+)$', br_line)) is not None:
-                port = self._u.d_pop().group(1)
-                if port not in self._port_to_br and br_name != "":
-                    self._port_to_br[port] = br_name
+                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)):
+                    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),
+                                Port(port_name),
                                 Port("qvo" + quantum_idprefix),
                                 self._formatter.VETH_FORMAT)
                     else:
-                        if self._u.d_push(re.match(r'^qvo(.+)', port)):
+                        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),
+                            Port(port_name),
                             Port(""))
index c41bbcb..08f870f 100755 (executable)
@@ -98,7 +98,7 @@ class OVSAgent(BaseAgent):
                     patch_src = port_name
                     patch_dst = self._cu.get_port_peer(port_meta)
                     patch_peers[patch_src + ":" + patch_dst] = self.PEER_FOUND
-
+                                        
                     if patch_dst + ":" + patch_src in patch_peers:
                         continue
 
@@ -188,7 +188,22 @@ class OVSAgent(BaseAgent):
                             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 self._u.d_push(re.match(r'^eth\d+$', master_if)) \
+                                if self._cu._port_to_br.has_key(master_if):
+                                    self._cu._port_to_br[port_name] = br_src
+                                    port_src = port_name
+                                    port_src_meta = port_meta
+                                    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_src_meta),
+                                        br_dst_obj,
+                                        Port(port_src, Port.DEFAULT_TYPE, port_src_meta),
+                                        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)):
index 9cf8264..a89d74c 100755 (executable)
@@ -78,6 +78,12 @@ class CollectUtils(object):
         else:
             self._devices[device.label] = device
 
+    def get_device(self, device_name):
+        if device_name in self._devices:
+            return self._devices[device_name]
+        else:
+            return self.DEVICE_NOT_FOUND
+            
     def get_linkpair_by_device_port(self, dev1_name, port1_name):
         for linkpair in self._linkpairs:
             if linkpair.device1 == dev1_name:
@@ -149,12 +155,35 @@ class CollectUtils(object):
         else:
             return self.PORT_TYPE_UNSPECIFIED
 
+#     def get_port_peer(self, port_name):
+#         port = self.get_port(port_name)
+#         if port != self.PORT_NOT_FOUND:
+#             port_meta = port.metadata
+#             if self.get_port_type(port_meta) == "patch":
+#                 return port_meta["peer"].replace("\"", "")
+#             else:
+#                 return self.PORT_TYPE_UNSPECIFIED
+#         else:
+#             return self.PORT_TYPE_UNSPECIFIED
+
+
     def get_port_vlan_master_if(self, port_meta):
         if "vlan_master_if" in port_meta:
             return port_meta["vlan_master_if"]
         else:
             return self.PORT_VLAN_UNSPECIFIED
 
+#     def get_port_vlan_master_if(self, port_name):
+#         port = self.get_port(port_name)
+#         if port != self.PORT_NOT_FOUND:
+#             port_meta = port.metadata
+#             if "vlan_master_if" in port_meta:
+#                 return port_meta["vlan_master_if"]
+#             else:
+#                 return self.PORT_VLAN_UNSPECIFIED
+#         else:
+#             return self.PORT_VLAN_UNSPECIFIED
+
     def get_port_veth_peer(self, port_name):
         port = self.get_port(port_name)
         if port != self.PORT_NOT_FOUND: