Inject service FQDN into kubevirt node, let onos resolve service IP
Change-Id: I6f3f66ad97f8be461c464dad5d133f3477c40f5a
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigCodec.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigCodec.java
index 3c09605..84a17e5 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigCodec.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigCodec.java
@@ -41,6 +41,7 @@
private static final String CA_CERT_DATA = "caCertData";
private static final String CLIENT_CERT_DATA = "clientCertData";
private static final String CLIENT_KEY_DATA = "clientKeyData";
+ private static final String SERVICE_FQDN = "serviceFqdn";
private static final String MISSING_MESSAGE = " is required in KubevirtApiConfig";
@@ -79,6 +80,10 @@
}
}
+ if (entity.serviceFqdn() != null) {
+ node.put(SERVICE_FQDN, entity.serviceFqdn());
+ }
+
return node;
}
@@ -104,6 +109,7 @@
JsonNode caCertDataJson = json.get(CA_CERT_DATA);
JsonNode clientCertDataJson = json.get(CLIENT_CERT_DATA);
JsonNode clientKeyDataJson = json.get(CLIENT_KEY_DATA);
+ JsonNode serviceFqdn = json.get(SERVICE_FQDN);
String token = "";
String caCertData = "";
@@ -156,6 +162,10 @@
builder.clientKeyData(clientKeyData);
}
+ if (serviceFqdn != null) {
+ builder.serviceFqdn(serviceFqdn.asText());
+ }
+
return builder.build();
}
}
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java
index b9c0880..86fa27d 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/impl/DefaultKubevirtNodeHandler.java
@@ -99,6 +99,7 @@
import static org.onosproject.kubevirtnode.util.KubevirtNodeUtil.getBooleanProperty;
import static org.onosproject.kubevirtnode.util.KubevirtNodeUtil.getOvsdbClient;
import static org.onosproject.kubevirtnode.util.KubevirtNodeUtil.isOvsdbConnected;
+import static org.onosproject.kubevirtnode.util.KubevirtNodeUtil.resolveHostname;
import static org.onosproject.kubevirtnode.util.KubevirtNodeUtil.structurePortName;
import static org.onosproject.net.AnnotationKeys.PORT_NAME;
import static org.slf4j.LoggerFactory.getLogger;
@@ -123,6 +124,7 @@
private static final long SLEEP_SHORT_MS = 1000; // we wait 1s
private static final long SLEEP_MID_MS = 2000; // we wait 2s
private static final long SLEEP_LONG_MS = 5000; // we wait 5s
+ private static final IpAddress DNS_SERVER_IP = IpAddress.valueOf("169.254.25.10");
@Reference(cardinality = ReferenceCardinality.MANDATORY)
protected CoreService coreService;
@@ -298,7 +300,20 @@
private void createBridge(KubevirtNode node, String bridgeName, DeviceId devId) {
Device device = deviceService.getDevice(node.ovsdb());
- IpAddress serverIp = apiConfigService.apiConfig().ipAddress();
+ IpAddress serverIp;
+ String serviceFqdn = apiConfigService.apiConfig().serviceFqdn();
+ IpAddress serviceIp = null;
+
+ if (serviceFqdn != null) {
+ serviceIp = resolveHostname(serviceFqdn);
+ }
+
+ if (serviceIp != null) {
+ serverIp = serviceIp;
+ } else {
+ serverIp = apiConfigService.apiConfig().ipAddress();
+ }
+
ControllerInfo controlInfo = new ControllerInfo(serverIp, DEFAULT_OFPORT, DEFAULT_OF_PROTO);
List<ControllerInfo> controllers = Lists.newArrayList(controlInfo);
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/util/KubevirtNodeUtil.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/util/KubevirtNodeUtil.java
index a4b0abb..839695f 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/util/KubevirtNodeUtil.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/util/KubevirtNodeUtil.java
@@ -44,8 +44,11 @@
import org.onosproject.ovsdb.controller.OvsdbNodeId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.xbill.DNS.Address;
import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
import java.util.Dictionary;
import java.util.HashSet;
import java.util.List;
@@ -82,6 +85,7 @@
private static final String INTERFACE_KEY = "interface";
private static final int PORT_NAME_MAX_LENGTH = 15;
+ private static final int DNS_DEFAULT_PORT = 53;
/**
* Prevents object installation from external.
@@ -385,4 +389,20 @@
.gatewayBridgeName(gatewayBridgeName)
.build();
}
+
+ /**
+ * Resolve a DNS with the given DNS server and hostname.
+ *
+ * @param hostname hostname to be resolved
+ * @return resolved IP address
+ */
+ public static IpAddress resolveHostname(String hostname) {
+ try {
+ InetAddress addr = Address.getByName(hostname);
+ return IpAddress.valueOf(IpAddress.Version.INET, addr.getAddress());
+ } catch (UnknownHostException e) {
+ log.warn("Failed to resolve IP address of host {}", hostname);
+ }
+ return null;
+ }
}
diff --git a/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigCodecTest.java b/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigCodecTest.java
index 773401e..bd1c62b 100644
--- a/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigCodecTest.java
+++ b/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigCodecTest.java
@@ -86,6 +86,7 @@
.caCertData("caCertData")
.clientCertData("clientCertData")
.clientKeyData("clientKeyData")
+ .serviceFqdn("kubevirt.edgestack.svc.cluster.local")
.build();
ObjectNode configJson = kubevirtApiConfigCodec.encode(config, context);
assertThat(configJson, matchesKubevirtApiConfig(config));
@@ -107,6 +108,7 @@
assertEquals("caCertData", config.caCertData());
assertEquals("clientCertData", config.clientCertData());
assertEquals("clientKeyData", config.clientKeyData());
+ assertEquals("kubevirt.edgestack.svc.cluster.local", config.serviceFqdn());
}
private KubevirtApiConfig getKubevirtApiConfig(String resourceName) throws IOException {
diff --git a/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigJsonMatcher.java b/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigJsonMatcher.java
index 17df9bc..1372d7d 100644
--- a/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigJsonMatcher.java
+++ b/apps/kubevirt-node/app/src/test/java/org/onosproject/kubevirtnode/codec/KubevirtApiConfigJsonMatcher.java
@@ -35,6 +35,7 @@
private static final String CA_CERT_DATA = "caCertData";
private static final String CLIENT_CERT_DATA = "clientCertData";
private static final String CLIENT_KEY_DATA = "clientKeyData";
+ private static final String SERVICE_FQDN = "serviceFqdn";
private KubevirtApiConfigJsonMatcher(KubevirtApiConfig kubevirtApiConfig) {
this.kubevirtApiConfig = kubevirtApiConfig;
@@ -118,6 +119,17 @@
}
}
+ // service FQDN
+ JsonNode jsonServiceFqdn = jsonNode.get(SERVICE_FQDN);
+ String serviceFqdn = kubevirtApiConfig.serviceFqdn();
+
+ if (jsonServiceFqdn != null) {
+ if (!jsonServiceFqdn.asText().equals(serviceFqdn)) {
+ description.appendText("serviceFqdn was " + jsonServiceFqdn);
+ return false;
+ }
+ }
+
return true;
}
diff --git a/apps/kubevirt-node/app/src/test/resources/org/onosproject/kubevirtnode/codec/KubevirtApiConfig.json b/apps/kubevirt-node/app/src/test/resources/org/onosproject/kubevirtnode/codec/KubevirtApiConfig.json
index f706cc3..b42e618 100644
--- a/apps/kubevirt-node/app/src/test/resources/org/onosproject/kubevirtnode/codec/KubevirtApiConfig.json
+++ b/apps/kubevirt-node/app/src/test/resources/org/onosproject/kubevirtnode/codec/KubevirtApiConfig.json
@@ -5,5 +5,6 @@
"token": "token",
"caCertData": "caCertData",
"clientCertData": "clientCertData",
- "clientKeyData": "clientKeyData"
+ "clientKeyData": "clientKeyData",
+ "serviceFqdn": "kubevirt.edgestack.svc.cluster.local"
}
\ No newline at end of file