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(""))
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
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)):
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:
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: