CORD-471 Added physical port and data plane IP as node attribtes
Change-Id: I4c28053151e61feb4b9b0ca60e98f7e0e4af0207
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java
index 1a56b42..107f3e7 100644
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java
@@ -105,9 +105,13 @@
.register(KryoNamespaces.API)
.register(CordVtnNode.class)
.register(NodeState.class);
+
private static final String DEFAULT_BRIDGE = "br-int";
private static final String VPORT_PREFIX = "tap";
private static final String DEFAULT_TUNNEL = "vxlan";
+ private static final String OK = "OK";
+ private static final String NO = "NO";
+
private static final Map<String, String> DEFAULT_TUNNEL_OPTIONS = new HashMap<String, String>() {
{
put("key", "flow");
@@ -213,6 +217,8 @@
}
};
+ // TODO Add physical port add state
+
public abstract void process(CordVtn cordVtn, CordVtnNode node);
}
@@ -307,6 +313,27 @@
}
@Override
+ public String checkNodeInitState(CordVtnNode node) {
+ checkNotNull(node);
+
+ NodeState state = getNodeState(node);
+ if (state == null) {
+ log.warn("Failed to get init state of {}", node.hostname());
+ return null;
+ }
+
+ String result = String.format(
+ "Integration bridge created/connected : %s (%s)%n" +
+ "VXLAN interface created : %s%n" +
+ "Physical interface added : %s (%s)",
+ checkIntegrationBridge(node) ? OK : NO, DEFAULT_BRIDGE,
+ checkTunnelInterface(node) ? OK : NO,
+ checkPhyInterface(node) ? OK : NO, node.phyPortName());
+
+ return result;
+ }
+
+ @Override
public void createServiceDependency(CordServiceId tServiceId, CordServiceId pServiceId) {
CordService tService = getCordService(tServiceId);
CordService pService = getCordService(pServiceId);
@@ -374,7 +401,12 @@
checkNotNull(node);
if (checkIntegrationBridge(node) && checkTunnelInterface(node)) {
- return NodeState.COMPLETE;
+ // TODO add physical port add state
+ if (checkPhyInterface(node)) {
+ return NodeState.COMPLETE;
+ } else {
+ return NodeState.INCOMPLETE;
+ }
} else if (checkIntegrationBridge(node)) {
return NodeState.BRIDGE_CREATED;
} else if (getOvsdbConnectionState(node)) {
@@ -488,6 +520,16 @@
}
/**
+ * Returns port name.
+ *
+ * @param port port
+ * @return port name
+ */
+ private String getPortName(Port port) {
+ return port.annotations().value("portName");
+ }
+
+ /**
* Returns OVSDB client for a given node.
*
* @param node cordvtn node
@@ -520,6 +562,7 @@
ControllerInfo ctrlInfo = new ControllerInfo(controller.ip(), OFPORT, "tcp");
controllers.add(ctrlInfo);
});
+
String dpid = node.intBrId().toString().substring(DPID_BEGIN);
try {
@@ -545,9 +588,11 @@
for (String key : DEFAULT_TUNNEL_OPTIONS.keySet()) {
optionBuilder.set(key, DEFAULT_TUNNEL_OPTIONS.get(key));
}
- TunnelDescription description =
- new DefaultTunnelDescription(null, null, VXLAN, TunnelName.tunnelName(DEFAULT_TUNNEL),
- optionBuilder.build());
+
+ TunnelDescription description = new DefaultTunnelDescription(
+ null, null, VXLAN, TunnelName.tunnelName(DEFAULT_TUNNEL),
+ optionBuilder.build());
+
try {
DriverHandler handler = driverService.createHandler(node.ovsdbId());
TunnelConfig tunnelConfig = handler.behaviour(TunnelConfig.class);
@@ -578,7 +623,26 @@
try {
deviceService.getPorts(node.intBrId())
.stream()
- .filter(p -> p.annotations().value("portName").contains(DEFAULT_TUNNEL)
+ .filter(p -> getPortName(p).contains(DEFAULT_TUNNEL)
+ && p.isEnabled())
+ .findAny().get();
+ return true;
+ } catch (NoSuchElementException e) {
+ return false;
+ }
+ }
+
+ /**
+ * Checks if physical interface exists.
+ *
+ * @param node cordvtn node
+ * @return true if the interface exists, false otherwise
+ */
+ private boolean checkPhyInterface(CordVtnNode node) {
+ try {
+ deviceService.getPorts(node.intBrId())
+ .stream()
+ .filter(p -> getPortName(p).contains(node.phyPortName())
&& p.isEnabled())
.findAny().get();
return true;
@@ -596,7 +660,7 @@
private PortNumber getTunnelPort(DeviceId bridgeId) {
try {
return deviceService.getPorts(bridgeId).stream()
- .filter(p -> p.annotations().value("portName").contains(DEFAULT_TUNNEL)
+ .filter(p -> getPortName(p).contains(DEFAULT_TUNNEL)
&& p.isEnabled())
.findFirst().get().number();
} catch (NoSuchElementException e) {
@@ -613,8 +677,7 @@
private Ip4Address getRemoteIp(DeviceId bridgeId) {
CordVtnNode node = getNodeByBridgeId(bridgeId);
if (node != null) {
- // TODO get data plane IP for tunneling
- return node.ovsdbIp().getIp4Address();
+ return node.localIp().getIp4Address();
} else {
return null;
}
@@ -712,7 +775,7 @@
private boolean isVm(Host host) {
Port port = deviceService.getPort(host.location().deviceId(),
host.location().port());
- return port.annotations().value("portName").contains(VPORT_PREFIX);
+ return getPortName(port).contains(VPORT_PREFIX);
}
/**
@@ -866,41 +929,48 @@
/**
* Handles port added situation.
- * If the added port is tunnel port, proceed remaining node initialization.
- * Otherwise, do nothing.
+ * If the added port is tunnel or physical port, proceed remaining node
+ * initialization. Otherwise, do nothing.
*
* @param port port
*/
public void portAdded(Port port) {
- // TODO add host by updating network config
- if (!port.annotations().value("portName").contains(DEFAULT_TUNNEL)) {
+ CordVtnNode node = getNodeByBridgeId((DeviceId) port.element().id());
+ if (node == null) {
return;
}
- CordVtnNode node = getNodeByBridgeId((DeviceId) port.element().id());
- if (node != null) {
- setNodeState(node, checkNodeState(node));
+ // TODO add host by updating network config
+ String portName = getPortName(port);
+ if (!portName.contains(DEFAULT_TUNNEL) && !portName.equals(node.phyPortName())) {
+ return;
}
+
+ log.info("Port {} is added to {}", portName, node.hostname());
+ setNodeState(node, checkNodeState(node));
}
/**
* Handles port removed situation.
- * If the removed port is tunnel port, proceed remaining node initialization.
- * Others, do nothing.
+ * If the removed port is tunnel or physical port, proceed remaining node
+ * initialization.Others, do nothing.
*
* @param port port
*/
public void portRemoved(Port port) {
- // TODO remove host by updating network config
- if (!port.annotations().value("portName").contains(DEFAULT_TUNNEL)) {
+ CordVtnNode node = getNodeByBridgeId((DeviceId) port.element().id());
+ if (node == null) {
return;
}
- CordVtnNode node = getNodeByBridgeId((DeviceId) port.element().id());
- if (node != null) {
- log.info("Tunnel interface is removed from {}", node.hostname());
- setNodeState(node, NodeState.INCOMPLETE);
+ // TODO remove host by updating network config
+ String portName = getPortName(port);
+ if (!portName.contains(DEFAULT_TUNNEL) && !portName.equals(node.phyPortName())) {
+ return;
}
+
+ log.info("Port {} is removed from {}", portName, node.hostname());
+ setNodeState(node, NodeState.INCOMPLETE);
}
}