From: t.moriyama Date: Sat, 15 Jun 2013 14:31:43 +0000 (+0900) Subject: fix vlan distribute visualization X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=9aeb81e1ba0013c793b597bf2037790e177c84da;p=ti2%2Fti2.git fix vlan distribute visualization --- diff --git a/linkpair/collect/agent/linuxbridge_agent.py b/linkpair/collect/agent/linuxbridge_agent.py index f201df3..fd337f9 100755 --- a/linkpair/collect/agent/linuxbridge_agent.py +++ b/linkpair/collect/agent/linuxbridge_agent.py @@ -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("")) diff --git a/linkpair/collect/agent/ovs_agent.py b/linkpair/collect/agent/ovs_agent.py index c41bbcb..08f870f 100755 --- a/linkpair/collect/agent/ovs_agent.py +++ b/linkpair/collect/agent/ovs_agent.py @@ -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)): diff --git a/linkpair/collect/utils.py b/linkpair/collect/utils.py index 9cf8264..a89d74c 100755 --- a/linkpair/collect/utils.py +++ b/linkpair/collect/utils.py @@ -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: