OSDN Git Service

refactoring CollectUtils
authort.moriyama <t.moriyama@users.sourceforge.jp>
Sat, 20 Jul 2013 18:40:14 +0000 (03:40 +0900)
committert.moriyama <t.moriyama@users.sourceforge.jp>
Sat, 20 Jul 2013 18:40:14 +0000 (03:40 +0900)
linkpair/collect/utils.py

index b9b3451..26d3670 100755 (executable)
@@ -25,9 +25,11 @@ class CollectUtils(object):
     PEER_FOUND = 1
     DEVICE_NOT_FOUND = -1
     PORT_NOT_FOUND = -1
+    LINKPAIR_NOT_FOUND = -1
     PORT_TYPE_UNSPECIFIED = "UNSPECIFIED"
     PORT_PEER_UNSPECIFIED = "UNSPECIFIED"
     PORT_VLAN_UNSPECIFIED = "UNSPECIFIED"
+    METADATA_NOT_FOUND = {}
 
     def __init__(self, cd, util, formatter=GraphEasyFormatter()):
         self._devices = cd.devices
@@ -59,13 +61,47 @@ class CollectUtils(object):
         if format == "":
             format = self._formatter.DEFAULT_FORMAT
 
-        self._linkpairs.append(
-            LinkPair(
-                self._devices[dev1.label],
-                self._devices[dev2.label],
-                self._ports[port1.label],
-                self._ports[port2.label],
-                format))
+        if self.exist_linkpair_by_ports(port1.label, port2.label) \
+            and port2.label != "INTERNAL":
+            exist_linkpair = self.get_linkpair_by_ports(port1.label, port2.label)
+            regist_dev1 = exist_linkpair.device1
+            regist_dev2 = exist_linkpair.device2
+            regist_port1 = exist_linkpair.port1
+            regist_port2 = exist_linkpair.port2
+            
+            if exist_linkpair.device2.label == "NOT CONNECTED":
+                if dev1.label == exist_linkpair.device1.label:
+                    regist_dev1 = self._devices[dev1.label]
+                    regist_dev2 = self._devices[dev2.label]
+                    regist_port1 = exist_linkpair.port1
+                    regist_port2 = exist_linkpair.port2
+                elif dev2.label == exist_linkpair.device1.label:
+                    regist_dev1 = self._devices[dev2.label]
+                    regist_dev2 = self._devices[dev1.label]
+                    regist_port1 = exist_linkpair.port2
+                    regist_port2 = exist_linkpair.port1
+
+                self.delete_linkpair(
+                    exist_linkpair.device1.label,
+                    exist_linkpair.device2.label,
+                    exist_linkpair.port1.label,
+                    exist_linkpair.port2.label)
+                self._linkpairs.append(
+                    LinkPair(
+                        regist_dev1,
+                        regist_dev2,
+                        regist_port1,
+                        regist_port2,
+                        format))
+            
+        else:
+            self._linkpairs.append(
+                LinkPair(
+                    self._devices[dev1.label],
+                    self._devices[dev2.label],
+                    self._ports[port1.label],
+                    self._ports[port2.label],
+                    format))
 #        if self._dbu.enable_db:
 #            insert_record(fmt, src, src_style, label, dst, dst_style)
 
@@ -81,17 +117,54 @@ class CollectUtils(object):
         else:
             return self.DEVICE_NOT_FOUND
 
-    def get_linkpair_by_device_port(self, dev1_name, port1_name):
+    def get_linkpair(self, dev1_name, dev2_name, port1_name, port2_name):
         for linkpair in self._linkpairs:
-            if linkpair.device1 == dev1_name:
-                if linkpair.port1 == port1_name:
+            if linkpair.device1.label == dev1_name \
+                and linkpair.device2.label == dev2_name \
+                and linkpair.port1.label == port1_name \
+                and linkpair.port2.label == port2_name:
                     return linkpair
+            elif linkpair.device2.label == dev1_name \
+                and linkpair.device1.label == dev2_name \
+                and linkpair.port2.label == port1_name \
+                and linkpair.port1.label == port2_name:
+                    return linkpair            
+        return self.LINKPAIR_NOT_FOUND
+
+    def delete_linkpair(self, dev1_name, dev2_name, port1_name, port2_name):
+        for i in range(0, len(self._linkpairs)):
+            if self._linkpairs[i].device1.label == dev1_name \
+                and self._linkpairs[i].device2.label == dev2_name \
+                and self._linkpairs[i].port1.label == port1_name \
+                and self._linkpairs[i].port2.label == port2_name:
+                    del self._linkpairs[i]
+                    return True
+            elif self._linkpairs[i].device2.label == dev1_name \
+                and self._linkpairs[i].device1.label == dev2_name \
+                and self._linkpairs[i].port2.label == port1_name \
+                and self._linkpairs[i].port1.label == port2_name:
+                    del self._linkpairs[i]
+                    return True            
+        return False
 
-    def exist_linkpair_by_device_port(self, dev1_name, port1_name):
+    def get_linkpair_by_ports(self, port1_name, port2_name):
         for linkpair in self._linkpairs:
-            if linkpair.device1 == dev1_name:
-                if linkpair.port1 == port1_name:
+            if linkpair.port1.label == port1_name \
+                and linkpair.port2.label == port2_name:
+                    return linkpair
+            elif  linkpair.port2.label == port1_name \
+                and linkpair.port1.label == port2_name:
+                    return linkpair            
+        return self.LINKPAIR_NOT_FOUND
+        
+    def exist_linkpair_by_ports(self, port1_name, port2_name):
+        for linkpair in self._linkpairs:
+            if linkpair.port1.label == port1_name \
+                and linkpair.port2.label == port2_name:
                     return True
+            elif  linkpair.port2.label == port1_name \
+                and linkpair.port1.label == port2_name:
+                    return True            
         return False
 
     def exist_port(self, device_name):
@@ -163,23 +236,23 @@ class CollectUtils(object):
 #         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
+#     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: