Listen on k8s port event to create instance port and host
Change-Id: I59ab1f5f422ce2ba8f5432279ceec6d77cd96f06
diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/Constants.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/Constants.java
index 3588414..db6583a 100644
--- a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/Constants.java
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/Constants.java
@@ -56,13 +56,21 @@
public static final String DEFAULT_SERVICE_IP_CIDR = "10.96.0.0/12";
public static final String DEFAULT_SERVICE_IP_NONE = "none";
- public static final String PORT_NAME_PREFIX_CONTAINER = "veth";
+ public static final String NORMAL_PORT_NAME_PREFIX_CONTAINER = "veth";
+ public static final String PT_PORT_NAME_PREFIX_CONTAINER = "tap";
+ public static final int NORMAL_PORT_PREFIX_LENGTH = 4;
+ public static final int PT_PORT_PREFIX_LENGTH = 3;
public static final String ANNOTATION_NETWORK_ID = "networkId";
public static final String ANNOTATION_PORT_ID = "portId";
public static final String ANNOTATION_CREATE_TIME = "createTime";
public static final String ANNOTATION_SEGMENT_ID = "segId";
+ // network type
+ public static final String VXLAN = "VXLAN";
+ public static final String GRE = "GRE";
+ public static final String GENEVE = "GENEVE";
+
public static final long DEFAULT_METADATA_MASK = 0xffffffffffffffffL;
public static final int DEFAULT_NAMESPACE_HASH = 0xffffffff;
diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sPort.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sPort.java
index 4d2b906..a779a87 100644
--- a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sPort.java
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sPort.java
@@ -114,6 +114,19 @@
}
@Override
+ public K8sPort updateDeviceId(DeviceId deviceId) {
+ return new Builder()
+ .networkId(networkId)
+ .portId(portId)
+ .macAddress(macAddress)
+ .ipAddress(ipAddress)
+ .deviceId(deviceId)
+ .portNumber(portNumber)
+ .state(state)
+ .build();
+ }
+
+ @Override
public boolean equals(Object o) {
if (this == o) {
return true;
diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sPort.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sPort.java
index f25a725..633de51 100644
--- a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sPort.java
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sPort.java
@@ -107,6 +107,14 @@
K8sPort updatePortNumber(PortNumber portNumber);
/**
+ * Returns new port instance with the given device ID.
+ *
+ * @param deviceId device identifier
+ * @return updated port
+ */
+ K8sPort updateDeviceId(DeviceId deviceId);
+
+ /**
* Builder of new port.
*/
interface Builder {
diff --git a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/K8sSwitchingHandler.java b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/K8sSwitchingHandler.java
index 0165975..d62a923 100644
--- a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/K8sSwitchingHandler.java
+++ b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/K8sSwitchingHandler.java
@@ -66,8 +66,12 @@
import static org.onosproject.k8snetworking.api.Constants.PRIORITY_TUNNEL_TAG_RULE;
import static org.onosproject.k8snetworking.api.Constants.TUN_ENTRY_TABLE;
import static org.onosproject.k8snetworking.api.Constants.VTAG_TABLE;
+import static org.onosproject.k8snetworking.api.K8sNetwork.Type.GENEVE;
+import static org.onosproject.k8snetworking.api.K8sNetwork.Type.GRE;
+import static org.onosproject.k8snetworking.api.K8sNetwork.Type.VXLAN;
import static org.onosproject.k8snetworking.util.K8sNetworkingUtil.getPropertyValue;
import static org.onosproject.k8snetworking.util.K8sNetworkingUtil.tunnelPortNumByNetId;
+import static org.onosproject.k8snetworking.util.K8sNetworkingUtil.tunnelPortNumByNetType;
import static org.onosproject.k8snetworking.util.RulePopulatorUtil.buildExtension;
import static org.slf4j.LoggerFactory.getLogger;
@@ -228,9 +232,9 @@
}
private void setRulesForTunnelBridge(K8sNode node, boolean install) {
- setRulesForTunnelBridgeByType(node, K8sNetwork.Type.VXLAN, install);
- setRulesForTunnelBridgeByType(node, K8sNetwork.Type.GRE, install);
- setRulesForTunnelBridgeByType(node, K8sNetwork.Type.GENEVE, install);
+ setRulesForTunnelBridgeByType(node, VXLAN, install);
+ setRulesForTunnelBridgeByType(node, GRE, install);
+ setRulesForTunnelBridgeByType(node, GENEVE, install);
}
private void setRulesForTunnelBridgeByType(K8sNode node, K8sNetwork.Type type, boolean install) {
@@ -239,13 +243,13 @@
switch (type) {
case VXLAN:
- portNum = node.vxlanPortNum();
+ portNum = tunnelPortNumByNetType(VXLAN, node);
break;
case GRE:
- portNum = node.grePortNum();
+ portNum = tunnelPortNumByNetType(GRE, node);
break;
case GENEVE:
- portNum = node.genevePortNum();
+ portNum = tunnelPortNumByNetType(GENEVE, node);
break;
default:
return;
diff --git a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/K8sSwitchingHostProvider.java b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/K8sSwitchingHostProvider.java
index 7510aaf..167d4ca 100644
--- a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/K8sSwitchingHostProvider.java
+++ b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/K8sSwitchingHostProvider.java
@@ -23,6 +23,8 @@
import org.onosproject.core.CoreService;
import org.onosproject.k8snetworking.api.K8sNetwork;
import org.onosproject.k8snetworking.api.K8sNetworkAdminService;
+import org.onosproject.k8snetworking.api.K8sNetworkEvent;
+import org.onosproject.k8snetworking.api.K8sNetworkListener;
import org.onosproject.k8snetworking.api.K8sPort;
import org.onosproject.k8snode.api.K8sNode;
import org.onosproject.k8snode.api.K8sNodeEvent;
@@ -65,8 +67,11 @@
import static org.onosproject.k8snetworking.api.Constants.ANNOTATION_NETWORK_ID;
import static org.onosproject.k8snetworking.api.Constants.ANNOTATION_PORT_ID;
import static org.onosproject.k8snetworking.api.Constants.ANNOTATION_SEGMENT_ID;
+import static org.onosproject.k8snetworking.api.Constants.GENEVE;
+import static org.onosproject.k8snetworking.api.Constants.GRE;
import static org.onosproject.k8snetworking.api.Constants.K8S_NETWORKING_APP_ID;
-import static org.onosproject.k8snetworking.api.Constants.PORT_NAME_PREFIX_CONTAINER;
+import static org.onosproject.k8snetworking.api.Constants.VXLAN;
+import static org.onosproject.k8snetworking.util.K8sNetworkingUtil.existingContainerPort;
import static org.onosproject.k8snetworking.util.K8sNetworkingUtil.isContainer;
import static org.onosproject.k8snode.api.K8sNodeState.INIT;
import static org.onosproject.net.AnnotationKeys.PORT_NAME;
@@ -81,7 +86,6 @@
private static final String ERR_ADD_HOST = "Failed to add host: ";
private static final String SONA_HOST_SCHEME = "sona-k8s";
- private static final int PORT_PREFIX_LENGTH = 4;
@Reference(cardinality = ReferenceCardinality.MANDATORY)
protected CoreService coreService;
@@ -112,6 +116,8 @@
new InternalDeviceListener();
private final InternalK8sNodeListener internalK8sNodeListener =
new InternalK8sNodeListener();
+ private final InternalK8sNetworkListener internalK8sNetworkListener =
+ new InternalK8sNetworkListener();
/**
* Creates kubernetes switching host provider.
@@ -125,6 +131,7 @@
coreService.registerApplication(K8S_NETWORKING_APP_ID);
deviceService.addListener(internalDeviceListener);
k8sNodeService.addListener(internalK8sNodeListener);
+ k8sNetworkService.addListener(internalK8sNetworkListener);
hostProviderService = hostProviderRegistry.register(this);
log.info("Started");
@@ -133,6 +140,7 @@
@Deactivate
protected void deactivate() {
hostProviderRegistry.unregister(this);
+ k8sNetworkService.removeListener(internalK8sNetworkListener);
k8sNodeService.removeListener(internalK8sNodeListener);
deviceService.removeListener(internalDeviceListener);
@@ -272,7 +280,7 @@
if (isContainer(portName)) {
return k8sNetworkService.ports().stream()
- .filter(p -> p.portId().contains(portName.substring(PORT_PREFIX_LENGTH)))
+ .filter(p -> existingContainerPort(p.portId(), portName))
.findAny().orElse(null);
} else {
return null;
@@ -290,8 +298,7 @@
String portName = port.annotations().value(PORT_NAME);
- return !Strings.isNullOrEmpty(portName) &&
- portName.startsWith(PORT_NAME_PREFIX_CONTAINER);
+ return !Strings.isNullOrEmpty(portName) && isContainer(portName);
}
private boolean isRelevantHelper(DeviceEvent event) {
@@ -435,4 +442,46 @@
});
}
}
+
+ private class InternalK8sNetworkListener implements K8sNetworkListener {
+
+ @Override
+ public void event(K8sNetworkEvent event) {
+ switch (event.type()) {
+ case K8S_PORT_CREATED:
+ executor.execute(() -> processK8sPortAddition(event));
+ break;
+ default:
+ break;
+ }
+ }
+
+ private void processK8sPortAddition(K8sNetworkEvent event) {
+ String portId = event.port().portId();
+ for (Device device : deviceService.getDevices()) {
+ Port port = deviceService.getPorts(device.id()).stream()
+ .filter(Port::isEnabled)
+ .filter(p -> p.annotations().value(PORT_NAME) != null)
+ .filter(p -> existingContainerPort(portId, p.annotations().value(PORT_NAME)))
+ .findAny().orElse(null);
+
+ if (port != null) {
+ String upperPortName = port.annotations().value(PORT_NAME).toUpperCase();
+ // we do not handle tunnel typed port
+ if (upperPortName.contains(VXLAN) || upperPortName.contains(GRE) ||
+ upperPortName.contains(GENEVE)) {
+ continue;
+ }
+
+ // if we have null device ID, we simply update the device ID on the k8s port
+ if (event.port().deviceId() == null) {
+ K8sPort updated = event.port().updateDeviceId(device.id());
+ k8sNetworkService.updatePort(updated);
+ }
+
+ processPortAdded(port);
+ }
+ }
+ }
+ }
}
diff --git a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/util/K8sNetworkingUtil.java b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/util/K8sNetworkingUtil.java
index dfe70f2..41e1239 100644
--- a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/util/K8sNetworkingUtil.java
+++ b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/util/K8sNetworkingUtil.java
@@ -29,6 +29,7 @@
import io.fabric8.kubernetes.client.KubernetesClient;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.util.SubnetUtils;
+import org.onlab.osgi.DefaultServiceDirectory;
import org.onlab.packet.IpAddress;
import org.onlab.packet.MacAddress;
import org.onlab.packet.TpPort;
@@ -43,10 +44,15 @@
import org.onosproject.k8snetworking.api.K8sServiceService;
import org.onosproject.k8snode.api.K8sApiConfig;
import org.onosproject.k8snode.api.K8sApiConfigService;
+import org.onosproject.k8snode.api.K8sHost;
+import org.onosproject.k8snode.api.K8sHostService;
import org.onosproject.k8snode.api.K8sNode;
import org.onosproject.k8snode.api.K8sNodeService;
+import org.onosproject.k8snode.api.K8sTunnelBridge;
import org.onosproject.net.DeviceId;
+import org.onosproject.net.Port;
import org.onosproject.net.PortNumber;
+import org.onosproject.net.device.DeviceService;
import org.onosproject.net.group.DefaultGroupKey;
import org.onosproject.net.group.GroupKey;
import org.slf4j.Logger;
@@ -62,8 +68,13 @@
import java.util.stream.Collectors;
import static org.onosproject.k8snetworking.api.Constants.DEFAULT_NAMESPACE_HASH;
-import static org.onosproject.k8snetworking.api.Constants.PORT_NAME_PREFIX_CONTAINER;
+import static org.onosproject.k8snetworking.api.Constants.NORMAL_PORT_NAME_PREFIX_CONTAINER;
+import static org.onosproject.k8snetworking.api.Constants.NORMAL_PORT_PREFIX_LENGTH;
+import static org.onosproject.k8snetworking.api.Constants.PT_PORT_NAME_PREFIX_CONTAINER;
+import static org.onosproject.k8snetworking.api.Constants.PT_PORT_PREFIX_LENGTH;
import static org.onosproject.k8snetworking.api.K8sPort.State.INACTIVE;
+import static org.onosproject.k8snode.api.K8sApiConfig.Mode.PASSTHROUGH;
+import static org.onosproject.net.AnnotationKeys.PORT_NAME;
/**
* An utility that used in kubernetes networking app.
@@ -100,7 +111,31 @@
* @return true if the port is associated with container; false otherwise
*/
public static boolean isContainer(String portName) {
- return portName != null && portName.contains(PORT_NAME_PREFIX_CONTAINER);
+ return portName != null && (portName.contains(NORMAL_PORT_NAME_PREFIX_CONTAINER) ||
+ portName.contains(PT_PORT_NAME_PREFIX_CONTAINER));
+ }
+
+ /**
+ * Checks that whether the compared ports exist in the source name.
+ *
+ * @param sourceName source port name
+ * @param comparedName port name to be compared
+ * @return true if the compared port name exists, false otherwise
+ */
+ public static boolean existingContainerPort(String sourceName, String comparedName) {
+ if (comparedName == null) {
+ return false;
+ }
+
+ if (comparedName.contains(NORMAL_PORT_NAME_PREFIX_CONTAINER)) {
+ return sourceName.contains(comparedName.substring(NORMAL_PORT_PREFIX_LENGTH));
+ }
+
+ if (comparedName.contains(PT_PORT_NAME_PREFIX_CONTAINER)) {
+ return sourceName.contains(comparedName.substring(PT_PORT_PREFIX_LENGTH));
+ }
+
+ return false;
}
/**
@@ -132,19 +167,58 @@
*/
public static PortNumber tunnelPortNumByNetType(K8sNetwork.Type netType,
K8sNode node) {
- switch (netType) {
- case VXLAN:
- return node.vxlanPortNum();
- case GRE:
- return node.grePortNum();
- case GENEVE:
- return node.genevePortNum();
- default:
+ if (node.mode() == PASSTHROUGH) {
+ K8sHostService hostService =
+ DefaultServiceDirectory.getService(K8sHostService.class);
+ Port port = null;
+ for (K8sHost host : hostService.hosts()) {
+ if (host.nodeNames().contains(node.hostname())) {
+ for (K8sTunnelBridge bridge : host.tunBridges()) {
+ if (bridge.tunnelId() == node.segmentId()) {
+ String portName = netType.name().toLowerCase() +
+ "-" + node.segmentId();
+ port = port(bridge.deviceId(), portName);
+ }
+ }
+ }
+ }
+
+ if (port == null) {
return null;
+ } else {
+ return port.number();
+ }
+
+ } else {
+ switch (netType) {
+ case VXLAN:
+ return node.vxlanPortNum();
+ case GRE:
+ return node.grePortNum();
+ case GENEVE:
+ return node.genevePortNum();
+ default:
+ return null;
+ }
}
}
/**
+ * Obtains the port from the device with the given port name.
+ *
+ * @param deviceId device identifier
+ * @param portName port name
+ * @return port object
+ */
+ public static Port port(DeviceId deviceId, String portName) {
+ DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
+ return deviceService.getPorts(deviceId).stream()
+ .filter(p -> p.isEnabled() &&
+ Objects.equals(p.annotations().value(PORT_NAME), portName))
+ .findAny().orElse(null);
+ }
+
+ /**
* Obtains the property value with specified property key name.
*
* @param properties a collection of properties
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/Constants.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/Constants.java
index b6382d7..82b63cb 100644
--- a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/Constants.java
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/Constants.java
@@ -28,14 +28,14 @@
public static final String LOCAL_BRIDGE = "kbr-local";
public static final String TUNNEL_BRIDGE = "kbr-tun";
public static final String EXTERNAL_ROUTER = "kbr-router";
- public static final String INTEGRATION_TO_EXTERNAL_BRIDGE = "kbr-int-ex";
- public static final String PHYSICAL_EXTERNAL_BRIDGE = "phy-kbr-ex";
- public static final String INTEGRATION_TO_LOCAL_BRIDGE = "kbr-int-local";
- public static final String LOCAL_TO_INTEGRATION_BRIDGE = "kbr-local-int";
- public static final String EXTERNAL_TO_ROUTER = "kbr-ex-router";
- public static final String ROUTER_TO_EXTERNAL = "kbr-router-ex";
- public static final String INTEGRATION_TO_TUN_BRIDGE = "kbr-int-tun";
- public static final String TUN_TO_INTEGRATION_BRIDGE = "kbr-tun-int";
+ public static final String INTEGRATION_TO_EXTERNAL_BRIDGE = "int-ex";
+ public static final String PHYSICAL_EXTERNAL_BRIDGE = "ex-int";
+ public static final String INTEGRATION_TO_LOCAL_BRIDGE = "int-local";
+ public static final String LOCAL_TO_INTEGRATION_BRIDGE = "local-int";
+ public static final String EXTERNAL_TO_ROUTER = "ex-router";
+ public static final String ROUTER_TO_EXTERNAL = "router-ex";
+ public static final String INTEGRATION_TO_TUN_BRIDGE = "int-tun";
+ public static final String TUN_TO_INTEGRATION_BRIDGE = "tun-int";
public static final String VXLAN_TUNNEL = "vxlan";
public static final String GRE_TUNNEL = "gre";
public static final String GENEVE_TUNNEL = "geneve";
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java
index 7e4b4bc..6bb2001 100644
--- a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java
@@ -190,7 +190,24 @@
@Override
public DeviceId tunBridge() {
- return tunBridge;
+
+ if (mode == PASSTHROUGH) {
+ K8sHostService hostService =
+ DefaultServiceDirectory.getService(K8sHostService.class);
+ DeviceId deviceId = null;
+ for (K8sHost host : hostService.hosts()) {
+ if (host.nodeNames().contains(hostname())) {
+ for (K8sTunnelBridge bridge : host.tunBridges()) {
+ if (bridge.tunnelId() == segmentId()) {
+ deviceId = bridge.deviceId();
+ }
+ }
+ }
+ }
+ return deviceId;
+ } else {
+ return tunBridge;
+ }
}
@Override
@@ -403,7 +420,28 @@
@Override
public PortNumber tunToIntgPortNum() {
- return portNumber(tunBridge, tunToIntgPatchPortName());
+ if (mode() == PASSTHROUGH) {
+ K8sHostService hostService =
+ DefaultServiceDirectory.getService(K8sHostService.class);
+ Port port = null;
+ for (K8sHost host : hostService.hosts()) {
+ if (host.nodeNames().contains(hostname())) {
+ for (K8sTunnelBridge bridge : host.tunBridges()) {
+ if (bridge.tunnelId() == segmentId()) {
+ port = port(bridge.deviceId(), tunToIntgPatchPortName());
+ }
+ }
+ }
+ }
+
+ if (port == null) {
+ return null;
+ } else {
+ return port.number();
+ }
+ } else {
+ return portNumber(tunBridge, tunToIntgPatchPortName());
+ }
}
@Override
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/K8sNodeCodec.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/K8sNodeCodec.java
index 4cc6609..2a938e0 100644
--- a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/K8sNodeCodec.java
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/codec/K8sNodeCodec.java
@@ -44,6 +44,7 @@
private static final String CLUSTER_NAME = "clusterName";
private static final String HOSTNAME = "hostname";
private static final String TYPE = "type";
+ private static final String MODE = "mode";
private static final String SEGMENT_ID = "segmentId";
private static final String MANAGEMENT_IP = "managementIp";
private static final String DATA_IP = "dataIp";
@@ -67,6 +68,7 @@
.put(CLUSTER_NAME, node.clusterName())
.put(HOSTNAME, node.hostname())
.put(TYPE, node.type().name())
+ .put(MODE, node.mode().name())
.put(SEGMENT_ID, node.segmentId())
.put(STATE, node.state().name())
.put(MANAGEMENT_IP, node.managementIp().toString());
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sApiConfigHandler.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sApiConfigHandler.java
index 342787c..cf78b6e 100644
--- a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sApiConfigHandler.java
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sApiConfigHandler.java
@@ -61,6 +61,7 @@
import static org.onosproject.k8snode.api.K8sNode.Type.MASTER;
import static org.onosproject.k8snode.api.K8sNode.Type.MINION;
import static org.onosproject.k8snode.api.K8sNodeService.APP_ID;
+import static org.onosproject.k8snode.api.K8sNodeState.ON_BOARDED;
import static org.onosproject.k8snode.api.K8sNodeState.PRE_ON_BOARD;
import static org.onosproject.k8snode.util.K8sNodeUtil.k8sClient;
import static org.slf4j.LoggerFactory.getLogger;
@@ -82,7 +83,7 @@
private static final String DEFAULT_GATEWAY_IP = "127.0.0.1";
private static final String DEFAULT_BRIDGE_IP = "127.0.0.1";
- private static final long SLEEP_MS = 3000; // we wait 3s
+ private static final long SLEEP_MS = 10000; // we wait 10s
@Reference(cardinality = ReferenceCardinality.MANDATORY)
protected CoreService coreService;
@@ -151,9 +152,22 @@
return;
}
- k8sClient.nodes().list().getItems().forEach(n ->
- k8sNodeAdminService.createNode(buildK8sNode(n, config))
- );
+ for (Node node : k8sClient.nodes().list().getItems()) {
+ K8sNode k8sNode = buildK8sNode(node, config);
+ k8sNodeAdminService.createNode(k8sNode);
+
+ while (k8sNodeAdminService.node(k8sNode.hostname()).state() != ON_BOARDED) {
+ try {
+ sleep(SLEEP_MS);
+ } catch (InterruptedException e) {
+ log.error("Exception caused during on-boarding state checking...");
+ }
+
+ if (k8sNodeAdminService.node(k8sNode.hostname()).state() == ON_BOARDED) {
+ break;
+ }
+ }
+ }
}
private void bootstrapK8sHosts(K8sApiConfig config) {
@@ -299,13 +313,9 @@
bootstrapK8sNodes(config);
- try {
- sleep(SLEEP_MS);
- } catch (InterruptedException e) {
- log.error("Exception caused during init state checking...");
+ if (config.infos().size() > 0) {
+ bootstrapK8sHosts(config);
}
-
- bootstrapK8sHosts(config);
}
}
}
diff --git a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sNodeHandler.java b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sNodeHandler.java
index 7e99f47..cec3d2c 100644
--- a/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sNodeHandler.java
+++ b/apps/k8s-node/app/src/main/java/org/onosproject/k8snode/impl/DefaultK8sNodeHandler.java
@@ -354,42 +354,42 @@
// integration bridge -> external bridge
PatchDescription brIntExtPatchDesc =
DefaultPatchDescription.builder()
- .deviceId(k8sNode.intgBridgeName())
- .ifaceName(k8sNode.intgToExtPatchPortName())
- .peer(k8sNode.extToIntgPatchPortName())
- .build();
+ .deviceId(k8sNode.intgBridgeName())
+ .ifaceName(k8sNode.intgToExtPatchPortName())
+ .peer(k8sNode.extToIntgPatchPortName())
+ .build();
// integration bridge -> tunnel bridge
PatchDescription brIntTunPatchDesc =
DefaultPatchDescription.builder()
- .deviceId(k8sNode.intgBridgeName())
- .ifaceName(k8sNode.intgToTunPatchPortName())
- .peer(k8sNode.tunToIntgPatchPortName())
- .build();
+ .deviceId(k8sNode.intgBridgeName())
+ .ifaceName(k8sNode.intgToTunPatchPortName())
+ .peer(k8sNode.tunToIntgPatchPortName())
+ .build();
// external bridge -> integration bridge
PatchDescription brExtIntPatchDesc =
DefaultPatchDescription.builder()
- .deviceId(k8sNode.extBridgeName())
- .ifaceName(k8sNode.extToIntgPatchPortName())
- .peer(k8sNode.intgToExtPatchPortName())
- .build();
+ .deviceId(k8sNode.extBridgeName())
+ .ifaceName(k8sNode.extToIntgPatchPortName())
+ .peer(k8sNode.intgToExtPatchPortName())
+ .build();
// integration bridge -> local bridge
PatchDescription brIntLocalPatchDesc =
DefaultPatchDescription.builder()
- .deviceId(k8sNode.intgBridgeName())
- .ifaceName(k8sNode.intgToLocalPatchPortName())
- .peer(k8sNode.localToIntgPatchPortName())
- .build();
+ .deviceId(k8sNode.intgBridgeName())
+ .ifaceName(k8sNode.intgToLocalPatchPortName())
+ .peer(k8sNode.localToIntgPatchPortName())
+ .build();
// local bridge -> integration bridge
PatchDescription brLocalIntPatchDesc =
DefaultPatchDescription.builder()
- .deviceId(k8sNode.localBridgeName())
- .ifaceName(k8sNode.localToIntgPatchPortName())
- .peer(k8sNode.intgToLocalPatchPortName())
- .build();
+ .deviceId(k8sNode.localBridgeName())
+ .ifaceName(k8sNode.localToIntgPatchPortName())
+ .peer(k8sNode.intgToLocalPatchPortName())
+ .build();
InterfaceConfig ifaceConfig = device.as(InterfaceConfig.class);
ifaceConfig.addPatchMode(k8sNode.intgToExtPatchPortName(), brIntExtPatchDesc);
@@ -402,10 +402,10 @@
// tunnel bridge -> integration bridge
PatchDescription brTunIntPatchDesc =
DefaultPatchDescription.builder()
- .deviceId(k8sNode.tunBridgeName())
- .ifaceName(k8sNode.tunToIntgPatchPortName())
- .peer(k8sNode.intgToTunPatchPortName())
- .build();
+ .deviceId(k8sNode.tunBridgeName())
+ .ifaceName(k8sNode.tunToIntgPatchPortName())
+ .peer(k8sNode.intgToTunPatchPortName())
+ .build();
ifaceConfig.addPatchMode(k8sNode.tunToIntgPatchPortName(), brTunIntPatchDesc);
}