diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/Constants.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/Constants.java index c6a917980b..e3e9bcef37 100644 --- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/Constants.java +++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/Constants.java @@ -85,6 +85,7 @@ public final class Constants { // CLI item length public static final int CLI_ID_LENGTH = 30; public static final int CLI_NAME_LENGTH = 30; + public static final int CLI_LONG_NAME_LENGTH = 50; public static final int CLI_IP_ADDRESSES_LENGTH = 50; public static final int CLI_IP_ADDRESS_LENGTH = 25; public static final int CLI_IP_ADDRESS_AVAILABILITY = 15; diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtFloatingIp.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtFloatingIp.java index 213fa4e4d2..488ef8dc7e 100644 --- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtFloatingIp.java +++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtFloatingIp.java @@ -32,6 +32,7 @@ public final class DefaultKubevirtFloatingIp implements KubevirtFloatingIp { private final String id; private final String routerName; private final String podName; + private final String vmName; private final String networkName; private final IpAddress floatingIp; private final IpAddress fixedIp; @@ -42,15 +43,17 @@ public final class DefaultKubevirtFloatingIp implements KubevirtFloatingIp { * @param id floating IP identifier * @param routerName router name * @param podName POD name + * @param vmName VM name * @param networkName network name * @param floatingIp floating IP address * @param fixedIp fixed IP address */ - public DefaultKubevirtFloatingIp(String id, String routerName, String podName, + public DefaultKubevirtFloatingIp(String id, String routerName, String podName, String vmName, String networkName, IpAddress floatingIp, IpAddress fixedIp) { this.id = id; this.routerName = routerName; this.podName = podName; + this.vmName = vmName; this.networkName = networkName; this.floatingIp = floatingIp; this.fixedIp = fixedIp; @@ -81,6 +84,11 @@ public final class DefaultKubevirtFloatingIp implements KubevirtFloatingIp { return fixedIp; } + @Override + public String vmName() { + return vmName; + } + @Override public String podName() { return podName; @@ -94,6 +102,7 @@ public final class DefaultKubevirtFloatingIp implements KubevirtFloatingIp { .routerName(routerName) .floatingIp(floatingIp) .fixedIp(ip) + .vmName(vmName) .podName(podName) .build(); } @@ -106,10 +115,24 @@ public final class DefaultKubevirtFloatingIp implements KubevirtFloatingIp { .routerName(routerName) .floatingIp(floatingIp) .fixedIp(fixedIp) + .vmName(vmName) .podName(name) .build(); } + @Override + public KubevirtFloatingIp updateVmName(String name) { + return DefaultKubevirtFloatingIp.builder() + .id(id) + .networkName(networkName) + .routerName(routerName) + .floatingIp(floatingIp) + .fixedIp(fixedIp) + .vmName(name) + .podName(podName) + .build(); + } + @Override public boolean equals(Object o) { if (this == o) { @@ -157,6 +180,7 @@ public final class DefaultKubevirtFloatingIp implements KubevirtFloatingIp { private String id; private String routerName; private String podName; + private String vmName; private String networkName; private IpAddress floatingIp; private IpAddress fixedIp; @@ -168,7 +192,8 @@ public final class DefaultKubevirtFloatingIp implements KubevirtFloatingIp { checkArgument(routerName != null, NOT_NULL_MSG, "routerName"); checkArgument(floatingIp != null, NOT_NULL_MSG, "floatingIp"); - return new DefaultKubevirtFloatingIp(id, routerName, podName, networkName, floatingIp, fixedIp); + return new DefaultKubevirtFloatingIp(id, routerName, podName, vmName, + networkName, floatingIp, fixedIp); } @Override @@ -201,6 +226,12 @@ public final class DefaultKubevirtFloatingIp implements KubevirtFloatingIp { return this; } + @Override + public Builder vmName(String name) { + this.vmName = name; + return this; + } + @Override public Builder podName(String name) { this.podName = name; diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtFloatingIp.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtFloatingIp.java index 27019b8cc6..2fe85f14aa 100644 --- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtFloatingIp.java +++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtFloatingIp.java @@ -57,6 +57,13 @@ public interface KubevirtFloatingIp { */ IpAddress fixedIp(); + /** + * Returns the name of VM where this floating IP is associated with. + * + * @return VM name + */ + String vmName(); + /** * Returns the name of POD where this floating IP is associated with. * @@ -80,6 +87,14 @@ public interface KubevirtFloatingIp { */ KubevirtFloatingIp updatePodName(String name); + /** + * Updates the kubevirt floating IP with the supplied VM name. + * + * @param name VM name + * @return kubevirt floating IP + */ + KubevirtFloatingIp updateVmName(String name); + interface Builder { /** * Builds an immutable floaing IP instance. @@ -128,6 +143,14 @@ public interface KubevirtFloatingIp { */ Builder fixedIp(IpAddress ip); + /** + * Returns kubevirt floating IP builder with supplied VM name. + * + * @param name VM name + * @return floating IP builder + */ + Builder vmName(String name); + /** * Returns kubevirt floating IP builder with supplied POD name. * diff --git a/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtFloatingIpTest.java b/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtFloatingIpTest.java index b63cf001e9..e995532e06 100644 --- a/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtFloatingIpTest.java +++ b/apps/kubevirt-networking/api/src/test/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtFloatingIpTest.java @@ -38,6 +38,8 @@ public class DefaultKubevirtFloatingIpTest { private static final IpAddress FLOATING_IP_2 = IpAddress.valueOf("20.20.20.20"); private static final String POD_NAME_1 = "pod-1"; private static final String POD_NAME_2 = "pod-2"; + private static final String VM_NAME_1 = "vm-1"; + private static final String VM_NAME_2 = "vm-2"; private static final IpAddress FIXED_IP_1 = IpAddress.valueOf("30.30.30.30"); private static final IpAddress FIXED_IP_2 = IpAddress.valueOf("40.40.40.40"); @@ -64,6 +66,7 @@ public class DefaultKubevirtFloatingIpTest { .networkName(NETWORK_NAME_1) .floatingIp(FLOATING_IP_1) .podName(POD_NAME_1) + .vmName(VM_NAME_1) .fixedIp(FIXED_IP_1) .build(); @@ -73,6 +76,7 @@ public class DefaultKubevirtFloatingIpTest { .networkName(NETWORK_NAME_1) .floatingIp(FLOATING_IP_1) .podName(POD_NAME_1) + .vmName(VM_NAME_1) .fixedIp(FIXED_IP_1) .build(); @@ -82,6 +86,7 @@ public class DefaultKubevirtFloatingIpTest { .networkName(NETWORK_NAME_2) .floatingIp(FLOATING_IP_2) .podName(POD_NAME_2) + .vmName(VM_NAME_2) .fixedIp(FIXED_IP_2) .build(); } @@ -108,6 +113,7 @@ public class DefaultKubevirtFloatingIpTest { assertEquals(NETWORK_NAME_1, fip.networkName()); assertEquals(FLOATING_IP_1, fip.floatingIp()); assertEquals(POD_NAME_1, fip.podName()); + assertEquals(VM_NAME_1, fip.vmName()); assertEquals(FIXED_IP_1, fip.fixedIp()); } } 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 20ab17ede4..3f5ca15bf1 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 @@ -50,16 +50,17 @@ public class KubevirtListFloatingIpCommand extends AbstractShellCommand { 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)); + CLI_IP_ADDRESS_LENGTH, CLI_NAME_LENGTH, CLI_NAME_LENGTH, CLI_IP_ADDRESS_LENGTH)); if (outputJson()) { print("%s", json(fips)); } else { - print(format, "Network Name", "Floating IP", "POD Name", "Fixed IP"); + print(format, "Network Name", "Floating IP", "POD Name", "VM 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(); + String vmName = fip.vmName() == null ? "N/A" : fip.vmName(); print(format, StringUtils.substring(fip.networkName(), 0, CLI_NAME_LENGTH - CLI_MARGIN_LENGTH), @@ -67,6 +68,8 @@ public class KubevirtListFloatingIpCommand extends AbstractShellCommand { CLI_IP_ADDRESS_LENGTH - CLI_MARGIN_LENGTH), StringUtils.substring(podName, 0, CLI_NAME_LENGTH - CLI_MARGIN_LENGTH), + StringUtils.substring(vmName, 0, + CLI_NAME_LENGTH - CLI_MARGIN_LENGTH), StringUtils.substring(fixedIp, 0, CLI_IP_ADDRESS_LENGTH - CLI_MARGIN_LENGTH) ); diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListPodCommand.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListPodCommand.java index 2ad937a73c..5d3dbb3fd5 100644 --- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListPodCommand.java +++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/cli/KubevirtListPodCommand.java @@ -33,9 +33,9 @@ import java.util.Comparator; import java.util.List; import static org.onosproject.kubevirtnetworking.api.Constants.CLI_IP_ADDRESS_LENGTH; +import static org.onosproject.kubevirtnetworking.api.Constants.CLI_LONG_NAME_LENGTH; import static org.onosproject.kubevirtnetworking.api.Constants.CLI_MARGIN_LENGTH; import static org.onosproject.kubevirtnetworking.api.Constants.CLI_NAMESPACE_LENGTH; -import static org.onosproject.kubevirtnetworking.api.Constants.CLI_NAME_LENGTH; import static org.onosproject.kubevirtnetworking.api.Constants.CLI_STATUS_LENGTH; import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.genFormatString; import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.prettyJson; @@ -53,7 +53,7 @@ public class KubevirtListPodCommand extends AbstractShellCommand { List pods = Lists.newArrayList(service.pods()); pods.sort(Comparator.comparing(p -> p.getMetadata().getName())); - String format = genFormatString(ImmutableList.of(CLI_NAME_LENGTH, + String format = genFormatString(ImmutableList.of(CLI_LONG_NAME_LENGTH, CLI_NAMESPACE_LENGTH, CLI_STATUS_LENGTH, CLI_IP_ADDRESS_LENGTH)); if (outputJson()) { @@ -69,7 +69,7 @@ public class KubevirtListPodCommand extends AbstractShellCommand { print(format, StringUtils.substring(pod.getMetadata().getName(), - 0, CLI_NAME_LENGTH - CLI_MARGIN_LENGTH), + 0, CLI_LONG_NAME_LENGTH - CLI_MARGIN_LENGTH), StringUtils.substring(pod.getMetadata().getNamespace(), 0, CLI_NAMESPACE_LENGTH - CLI_MARGIN_LENGTH), pod.getStatus().getPhase(), 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 f2a35058a8..fd530a16bc 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 @@ public final class KubevirtFloatingIpCodec extends JsonCodec private static final String ID = "id"; private static final String ROUTER_NAME = "routerName"; private static final String POD_NAME = "podName"; + private static final String VM_NAME = "vmName"; private static final String NETWORK_NAME = "networkName"; private static final String FLOATING_IP = "floatingIp"; private static final String FIXED_IP = "fixedIp"; @@ -58,6 +59,10 @@ public final class KubevirtFloatingIpCodec extends JsonCodec result.put(POD_NAME, fip.podName()); } + if (fip.vmName() != null) { + result.put(VM_NAME, fip.vmName()); + } + if (fip.fixedIp() != null) { result.put(FIXED_IP, fip.fixedIp().toString()); } @@ -90,6 +95,11 @@ public final class KubevirtFloatingIpCodec extends JsonCodec builder.podName(podName.asText()); } + JsonNode vmName = json.get(VM_NAME); + if (vmName != null) { + builder.vmName(vmName.asText()); + } + JsonNode fixedIp = json.get(FIXED_IP); if (fixedIp != null) { builder.fixedIp(IpAddress.valueOf(fixedIp.asText())); 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 9248f06ffa..4b982aa3fd 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 @@ -415,6 +415,9 @@ public class DistributedKubevirtRouterStore String oldPodName = event.oldValue().value().podName(); String newPodName = event.newValue().value().podName(); + String oldVmName = event.oldValue().value().vmName(); + String newVmName = event.newValue().value().vmName(); + if (Strings.isNullOrEmpty(oldPodName) && !Strings.isNullOrEmpty(newPodName)) { notifyDelegate(new KubevirtRouterEvent( KUBEVIRT_FLOATING_IP_ASSOCIATED, @@ -433,6 +436,24 @@ public class DistributedKubevirtRouterStore event.newValue().value().floatingIp(), MSG_DISASSOCIATED, oldPodName)); } + if (Strings.isNullOrEmpty(oldVmName) && !Strings.isNullOrEmpty(newVmName)) { + notifyDelegate(new KubevirtRouterEvent( + KUBEVIRT_FLOATING_IP_ASSOCIATED, + router, + event.newValue().value(), newVmName)); + log.info(String.format(MSG_FLOATING_IP, + event.newValue().value().floatingIp(), MSG_ASSOCIATED, newVmName)); + } + + if (!Strings.isNullOrEmpty(oldVmName) && Strings.isNullOrEmpty(newVmName)) { + notifyDelegate(new KubevirtRouterEvent( + KUBEVIRT_FLOATING_IP_DISASSOCIATED, + router, + event.oldValue().value(), oldVmName)); + log.info(String.format(MSG_FLOATING_IP, + event.newValue().value().floatingIp(), MSG_DISASSOCIATED, oldVmName)); + } + IpAddress oldFixedIp = event.oldValue().value().fixedIp(); IpAddress newFixedIp = event.newValue().value().fixedIp(); diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtFloatingIpHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtFloatingIpHandler.java index ed086ae944..e9ab1fe252 100644 --- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtFloatingIpHandler.java +++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtFloatingIpHandler.java @@ -158,7 +158,7 @@ public class KubevirtFloatingIpHandler { KubevirtNode electedGw, boolean install) { - KubevirtPort kubevirtPort = getKubevirtPort(floatingIp); + KubevirtPort kubevirtPort = getKubevirtPortByFloatingIp(floatingIp); if (kubevirtPort == null) { return; } @@ -209,10 +209,11 @@ public class KubevirtFloatingIpHandler { install); } - private KubevirtPort getKubevirtPort(KubevirtFloatingIp floatingIp) { + private KubevirtPort getKubevirtPortByFloatingIp(KubevirtFloatingIp floatingIp) { return kubevirtPortService.ports().stream() .filter(port -> port.ipAddress().equals(floatingIp.fixedIp())) + .filter(port -> port.vmName().equals(floatingIp.vmName())) .findAny().orElse(null); } @@ -240,7 +241,6 @@ public class KubevirtFloatingIpHandler { .matchIPSrc(IpPrefix.valueOf(floatingIp.fixedIp(), 32)) .build(); - TrafficTreatment treatment = DefaultTrafficTreatment.builder() .setEthDst(peerMacAddress) .setEthSrc(port.macAddress()) @@ -336,7 +336,7 @@ public class KubevirtFloatingIpHandler { return; } - KubevirtPort kubevirtPort = getKubevirtPort(floatingIp); + KubevirtPort kubevirtPort = getKubevirtPortByFloatingIp(floatingIp); if (kubevirtPort == null) { return; } diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpCodecTest.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpCodecTest.java index f8b5d145bd..216f3e0c50 100644 --- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpCodecTest.java +++ b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpCodecTest.java @@ -74,6 +74,7 @@ public final class KubevirtFloatingIpCodecTest { .networkName("flat-1") .floatingIp(IpAddress.valueOf("10.10.10.10")) .podName("pod-1") + .vmName("vm-1") .fixedIp(IpAddress.valueOf("20.20.20.20")) .build(); @@ -90,6 +91,7 @@ public final class KubevirtFloatingIpCodecTest { assertEquals("flat-1", floatingIp.networkName()); assertEquals("10.10.10.10", floatingIp.floatingIp().toString()); assertEquals("pod-1", floatingIp.podName()); + assertEquals("vm-1", floatingIp.vmName()); assertEquals("20.20.20.20", floatingIp.fixedIp().toString()); } diff --git a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpJsonMatcher.java b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpJsonMatcher.java index ccfb76c509..41d8cfebfa 100644 --- a/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpJsonMatcher.java +++ b/apps/kubevirt-networking/app/src/test/java/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIpJsonMatcher.java @@ -30,6 +30,7 @@ public final class KubevirtFloatingIpJsonMatcher extends TypeSafeDiagnosingMatch private static final String ROUTER_NAME = "routerName"; private static final String NETWORK_NAME = "networkName"; private static final String POD_NAME = "podName"; + private static final String VM_NAME = "vmName"; private static final String FLOATING_IP = "floatingIp"; private static final String FIXED_IP = "fixedIp"; @@ -81,6 +82,15 @@ public final class KubevirtFloatingIpJsonMatcher extends TypeSafeDiagnosingMatch } } + JsonNode jsonVmName = jsonNode.get(VM_NAME); + if (jsonVmName != null) { + if (!floatingIp.vmName().equals(jsonVmName.asText())) { + description.appendText("VM name was " + jsonVmName); + return false; + } + } + + // check fixed IP JsonNode jsonFixedIp = jsonNode.get(FIXED_IP); if (jsonFixedIp != null) { diff --git a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIp.json b/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIp.json index 1424d48650..93819ce1b4 100644 --- a/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIp.json +++ b/apps/kubevirt-networking/app/src/test/resources/org/onosproject/kubevirtnetworking/codec/KubevirtFloatingIp.json @@ -4,5 +4,6 @@ "networkName": "flat-1", "floatingIp": "10.10.10.10", "podName": "pod-1", + "vmName": "vm-1", "fixedIp": "20.20.20.20" } \ No newline at end of file