Feed kubevirt port info from K8S port, add a CLI to query port info
Change-Id: Id791fbae66b72cbb8908687463355ecb62ef8543
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
index cef1f95..5e14817 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
@@ -16,13 +16,21 @@
package org.onosproject.kubevirtnetworking.util;
import com.fasterxml.jackson.databind.ObjectMapper;
+import io.fabric8.kubernetes.api.model.Pod;
import io.fabric8.kubernetes.client.ConfigBuilder;
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClient;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.net.util.SubnetUtils;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
import org.onosproject.cfg.ConfigProperty;
+import org.onosproject.kubevirtnetworking.api.DefaultKubevirtPort;
+import org.onosproject.kubevirtnetworking.api.KubevirtNetwork;
+import org.onosproject.kubevirtnetworking.api.KubevirtPort;
import org.onosproject.kubevirtnode.api.KubevirtApiConfig;
import org.onosproject.kubevirtnode.api.KubevirtApiConfigService;
import org.slf4j.Logger;
@@ -32,6 +40,7 @@
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
@@ -47,6 +56,12 @@
private static final String COLON_SLASH = "://";
private static final String COLON = ":";
+ private static final String NETWORK_STATUS_KEY = "k8s.v1.cni.cncf.io/network-status";
+ private static final String NAME = "name";
+ private static final String NETWORK_PREFIX = "default/";
+ private static final String MAC = "mac";
+ private static final String IPS = "ips";
+
/**
* Prevents object installation from external.
*/
@@ -232,4 +247,52 @@
return client;
}
+
+ /**
+ * Obtains the kubevirt port from kubevirt POD.
+ *
+ * @param networks set of existing kubevirt networks
+ * @param pod kubevirt POD
+ * @return kubevirt port
+ */
+ public static KubevirtPort getPort(Set<KubevirtNetwork> networks, Pod pod) {
+ try {
+ Map<String, String> annots = pod.getMetadata().getAnnotations();
+ String networkStatusStr = annots.get(NETWORK_STATUS_KEY);
+
+ if (networkStatusStr == null) {
+ return null;
+ }
+
+ JSONArray networkStatus = new JSONArray(networkStatusStr);
+
+ for (int i = 0; i < networkStatus.length(); i++) {
+ JSONObject object = networkStatus.getJSONObject(i);
+ String name = object.getString(NAME);
+ KubevirtNetwork network = networks.stream()
+ .filter(n -> (NETWORK_PREFIX + n.name()).equals(name))
+ .findAny().orElse(null);
+ if (network != null) {
+ String mac = object.getString(MAC);
+
+ KubevirtPort.Builder builder = DefaultKubevirtPort.builder()
+ .macAddress(MacAddress.valueOf(mac))
+ .networkId(network.networkId());
+
+ if (object.has(IPS)) {
+ JSONArray ips = object.getJSONArray(IPS);
+ String ip = (String) ips.get(0);
+ builder.ipAddress(IpAddress.valueOf(ip));
+ }
+
+ return builder.build();
+ }
+ }
+
+ } catch (JSONException e) {
+ log.error("Failed to parse network status object", e);
+ }
+
+ return null;
+ }
}