Notify kubevirt router internal and external network related events
1. Add networkName attribute into FloatingIp class.
Change-Id: I4aeb8031ef4c86d7ae9a6423276b024c05fe0649
(cherry picked from commit 4acd4543cf7e6d48883ed0f7d9813b69f0d2c414)
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListFloatingIpCommand.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListFloatingIpCommand.java
index 574bba5..20ab17e 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListFloatingIpCommand.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListFloatingIpCommand.java
@@ -47,7 +47,7 @@
protected void doExecute() throws Exception {
KubevirtRouterService service = get(KubevirtRouterService.class);
List<KubevirtFloatingIp> fips = Lists.newArrayList(service.floatingIps());
- fips.sort(Comparator.comparing(KubevirtFloatingIp::routerName));
+ fips.sort(Comparator.comparing(KubevirtFloatingIp::networkName));
String format = genFormatString(ImmutableList.of(CLI_NAME_LENGTH,
CLI_IP_ADDRESS_LENGTH, CLI_NAME_LENGTH, CLI_IP_ADDRESS_LENGTH));
@@ -55,13 +55,13 @@
if (outputJson()) {
print("%s", json(fips));
} else {
- print(format, "Router Name", "Floating IP", "POD Name", "Fixed IP");
+ print(format, "Network Name", "Floating IP", "POD Name", "Fixed IP");
for (KubevirtFloatingIp fip : fips) {
String fixedIp = fip.fixedIp() == null ? "N/A" : fip.fixedIp().toString();
String podName = fip.podName() == null ? "N/A" : fip.podName();
- print(format, StringUtils.substring(fip.routerName(), 0,
+ print(format, StringUtils.substring(fip.networkName(), 0,
CLI_NAME_LENGTH - CLI_MARGIN_LENGTH),
StringUtils.substring(fip.floatingIp().toString(), 0,
CLI_IP_ADDRESS_LENGTH - CLI_MARGIN_LENGTH),
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpCodec.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpCodec.java
index 16fd082..f2a3505 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpCodec.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpCodec.java
@@ -38,6 +38,7 @@
private static final String ID = "id";
private static final String ROUTER_NAME = "routerName";
private static final String POD_NAME = "podName";
+ private static final String NETWORK_NAME = "networkName";
private static final String FLOATING_IP = "floatingIp";
private static final String FIXED_IP = "fixedIp";
@@ -50,6 +51,7 @@
ObjectNode result = context.mapper().createObjectNode()
.put(ID, fip.id())
.put(ROUTER_NAME, fip.routerName())
+ .put(NETWORK_NAME, fip.networkName())
.put(FLOATING_IP, fip.floatingIp().toString());
if (fip.podName() != null) {
@@ -74,10 +76,13 @@
ROUTER_NAME + MISSING_MESSAGE);
String floatingIp = nullIsIllegal(json.get(FLOATING_IP).asText(),
FLOATING_IP + MISSING_MESSAGE);
+ String networkName = nullIsIllegal(json.get(NETWORK_NAME).asText(),
+ NETWORK_NAME + MISSING_MESSAGE);
KubevirtFloatingIp.Builder builder = DefaultKubevirtFloatingIp.builder()
.id(id)
.routerName(routerName)
+ .networkName(networkName)
.floatingIp(IpAddress.valueOf(floatingIp));
JsonNode podName = json.get(POD_NAME);
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtRouterStore.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtRouterStore.java
index 2d566fc..c11fb2d 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtRouterStore.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/DistributedKubevirtRouterStore.java
@@ -44,6 +44,7 @@
import org.slf4j.Logger;
import java.util.Collection;
+import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ExecutorService;
@@ -56,6 +57,10 @@
import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_FLOATING_IP_REMOVED;
import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_FLOATING_IP_UPDATED;
import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_ROUTER_CREATED;
+import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_ROUTER_EXTERNAL_NETWORK_ATTACHED;
+import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_ROUTER_EXTERNAL_NETWORK_DETACHED;
+import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_ROUTER_INTERNAL_NETWORKS_ATTACHED;
+import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_ROUTER_INTERNAL_NETWORKS_DETACHED;
import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_ROUTER_REMOVED;
import static org.onosproject.kubevirtnetworking.api.KubevirtRouterEvent.Type.KUBEVIRT_ROUTER_UPDATED;
import static org.slf4j.LoggerFactory.getLogger;
@@ -72,6 +77,10 @@
private static final String ERR_NOT_FOUND = " does not exist";
private static final String ERR_DUPLICATE = " already exists";
+ private static final String MSG_FLOATING_IP = "Kubevirt floating IP %s %s with %s";
+ private static final String MSG_ASSOCIATED = "associated";
+ private static final String MSG_DISASSOCIATED = "disassociated";
+
private static final String APP_ID = "org.onosproject.kubevirtnetwork";
private static final KryoNamespace
@@ -223,10 +232,7 @@
KUBEVIRT_ROUTER_CREATED, event.newValue().value())));
break;
case UPDATE:
- log.debug("Kubevirt router updated");
- eventExecutor.execute(() ->
- notifyDelegate(new KubevirtRouterEvent(
- KUBEVIRT_ROUTER_UPDATED, event.newValue().value())));
+ eventExecutor.execute(() -> processRouterMapUpdate(event));
break;
case REMOVE:
log.debug("Kubevirt router removed");
@@ -239,6 +245,59 @@
break;
}
}
+
+ private void processRouterMapUpdate(MapEvent<String, KubevirtRouter> event) {
+ log.debug("Kubevirt router updated");
+ eventExecutor.execute(() ->
+ notifyDelegate(new KubevirtRouterEvent(
+ KUBEVIRT_ROUTER_UPDATED, event.newValue().value())));
+
+ KubevirtRouter router = Strings.isNullOrEmpty(
+ event.newValue().value().name()) ?
+ null :
+ router(event.newValue().value().name());
+
+ KubevirtRouter oldValue = event.oldValue().value();
+ KubevirtRouter newValue = event.newValue().value();
+
+ if (oldValue.external().size() == 0 && newValue.external().size() > 0) {
+ newValue.external().entrySet().stream().findAny()
+ .ifPresent(entry ->
+ notifyDelegate(new KubevirtRouterEvent(
+ KUBEVIRT_ROUTER_EXTERNAL_NETWORK_ATTACHED,
+ router, entry.getKey(), entry.getValue(),
+ newValue.peerRouter().ipAddress().toString())));
+ }
+
+ if (oldValue.external().size() > 0 && newValue.external().size() == 0) {
+ oldValue.external().entrySet().stream().findAny()
+ .ifPresent(entry ->
+ notifyDelegate(new KubevirtRouterEvent(
+ KUBEVIRT_ROUTER_EXTERNAL_NETWORK_DETACHED,
+ router, entry.getKey(), entry.getValue(),
+ oldValue.peerRouter().ipAddress().toString())));
+ }
+
+ Set<String> added = new HashSet<>(newValue.internal());
+ Set<String> oldset = oldValue.internal();
+ added.removeAll(oldset);
+
+ Set<String> removed = new HashSet<>(oldValue.internal());
+ Set<String> newset = newValue.internal();
+ removed.removeAll(newset);
+
+ if (added.size() > 0) {
+ notifyDelegate(new KubevirtRouterEvent(
+ KUBEVIRT_ROUTER_INTERNAL_NETWORKS_ATTACHED,
+ router, added));
+ }
+
+ if (removed.size() > 0) {
+ notifyDelegate(new KubevirtRouterEvent(
+ KUBEVIRT_ROUTER_INTERNAL_NETWORKS_DETACHED,
+ router, removed));
+ }
+ }
}
private class KubevirtFloatingIpMapListener implements MapEventListener<String, KubevirtFloatingIp> {
@@ -307,6 +366,8 @@
KUBEVIRT_FLOATING_IP_ASSOCIATED,
router,
event.newValue().value(), newPodName));
+ log.info(String.format(MSG_FLOATING_IP,
+ event.newValue().value().floatingIp(), MSG_ASSOCIATED, newPodName));
}
if (!Strings.isNullOrEmpty(oldPodName) && Strings.isNullOrEmpty(newPodName)) {
@@ -314,6 +375,8 @@
KUBEVIRT_FLOATING_IP_DISASSOCIATED,
router,
event.newValue().value(), oldPodName));
+ log.info(String.format(MSG_FLOATING_IP,
+ event.newValue().value().floatingIp(), MSG_DISASSOCIATED, oldPodName));
}
}
}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
index 18caff1..7f539de 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
@@ -394,6 +394,7 @@
KubevirtNode electedGateway = gatewayNodeForSpecifiedNetwork(network);
if (electedGateway == null) {
log.warn("There's no elected gateway for the network {}", network.name());
+ return;
}
setGatewayArpRule(network, PRE_FLAT_TABLE, electedGateway.intgBridge(), install);