Changed to use XOS client to get service and port information
XOS client still gets these information from OpenStack temporarily
until XOS provides these APIs
Change-Id: I1ef9302f719a18a7377221f63b84431c2cdface8
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnPortApi.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnPortApi.java
index 672c81f..baff814 100644
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnPortApi.java
+++ b/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnPortApi.java
@@ -15,18 +15,33 @@
*/
package org.onosproject.xosclient.impl;
+import com.google.common.collect.Maps;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+import org.onosproject.xosclient.api.OpenStackAccess;
import org.onosproject.xosclient.api.VtnPort;
import org.onosproject.xosclient.api.VtnPortApi;
import org.onosproject.xosclient.api.VtnPortId;
import org.onosproject.xosclient.api.VtnServiceId;
import org.onosproject.xosclient.api.XosAccess;
+import org.openstack4j.api.OSClient;
+import org.openstack4j.model.network.IP;
+import org.openstack4j.model.network.Port;
+import org.openstack4j.openstack.OSFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import java.util.Map;
import java.util.Set;
+import static com.google.common.base.Preconditions.checkNotNull;
+
/**
* Provides CORD VTN port APIs.
*/
-public class DefaultVtnPortApi extends XosApi implements VtnPortApi {
+public final class DefaultVtnPortApi extends XosApi implements VtnPortApi {
+
+ private final Logger log = LoggerFactory.getLogger(getClass());
/**
* Default constructor.
@@ -55,4 +70,72 @@
// TODO implement this when XOS provides this information
return null;
}
+
+ @Override
+ // TODO remove this when XOS provides this information
+ public VtnPort vtnPort(String portName, OpenStackAccess osAccess) {
+ checkNotNull(osAccess);
+
+ OSClient osClient = getOpenStackClient(osAccess);
+ Port osPort = osClient.networking().port().list()
+ .stream()
+ .filter(p -> p.getId().contains(portName.substring(3)))
+ .findFirst().orElse(null);
+ if (osPort == null) {
+ log.warn("Failed to get OpenStack port for {}", portName);
+ return null;
+ }
+ return getVtnPort(osPort);
+ }
+
+ @Override
+ // TODO remove this when XOS provides this information
+ public VtnPort vtnPort(VtnPortId portId, OpenStackAccess osAccess) {
+ checkNotNull(osAccess);
+
+ OSClient osClient = getOpenStackClient(osAccess);
+ Port osPort = osClient.networking().port().get(portId.id());
+ if (osPort == null) {
+ log.warn("Failed to get OpenStack port {}", portId);
+ return null;
+ }
+ return getVtnPort(osPort);
+ }
+
+ // TODO remove this when XOS provides this information
+ private VtnPort getVtnPort(Port osPort) {
+ checkNotNull(osPort);
+
+ // assumes all vtn port has single IP address
+ IP ipAddr = osPort.getFixedIps().stream().findFirst().orElse(null);
+ if (ipAddr == null) {
+ log.warn("Failed to get IP address for {}", osPort);
+ return null;
+ }
+
+ Map<IpAddress, MacAddress> addressPairs = Maps.newHashMap();
+ osPort.getAllowedAddressPairs().stream().forEach(
+ pair -> addressPairs.put(IpAddress.valueOf(pair.getIpAddress()),
+ MacAddress.valueOf(pair.getMacAddress())));
+
+ return new VtnPort(VtnPortId.of(osPort.getId()),
+ osPort.getName(),
+ VtnServiceId.of(osPort.getNetworkId()),
+ MacAddress.valueOf(osPort.getMacAddress()),
+ IpAddress.valueOf(ipAddr.getIpAddress()),
+ addressPairs);
+ }
+
+ // TODO remove this when XOS provides this information
+ private OSClient getOpenStackClient(OpenStackAccess osAccess) {
+ checkNotNull(osAccess);
+
+ // creating a client every time must be inefficient, but this method
+ // will be removed once XOS provides equivalent APIs
+ return OSFactory.builder()
+ .endpoint(osAccess.endpoint())
+ .credentials(osAccess.user(), osAccess.password())
+ .tenantName(osAccess.tenant())
+ .authenticate();
+ }
}
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnServiceApi.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnServiceApi.java
index 94d8bbc..b83333c 100644
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnServiceApi.java
+++ b/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnServiceApi.java
@@ -17,12 +17,22 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.base.Strings;
import com.google.common.collect.Sets;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onosproject.xosclient.api.OpenStackAccess;
+import org.onosproject.xosclient.api.VtnService.NetworkType;
+import org.onosproject.xosclient.api.VtnService.ServiceType;
import org.onosproject.xosclient.api.VtnServiceApi;
import org.onosproject.xosclient.api.XosAccess;
import org.onosproject.xosclient.api.VtnService;
import org.onosproject.xosclient.api.VtnServiceId;
+import org.openstack4j.api.OSClient;
+import org.openstack4j.model.network.Network;
+import org.openstack4j.model.network.Subnet;
+import org.openstack4j.openstack.OSFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -30,6 +40,9 @@
import java.util.Set;
import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkArgument;
+import static org.onosproject.xosclient.api.VtnService.NetworkType.*;
+import static org.onosproject.xosclient.api.VtnService.ServiceType.*;
/**
* Provides CORD VTN service and service dependency APIs.
@@ -113,4 +126,76 @@
}
return tServices;
}
+
+ @Override
+ // TODO remove this when XOS provides this information
+ public VtnService service(VtnServiceId serviceId, OpenStackAccess osAccess) {
+ checkNotNull(osAccess);
+
+ OSClient osClient = getOpenStackClient(osAccess);
+ Network osNet = osClient.networking().network().get(serviceId.id());
+ if (osNet == null) {
+ log.warn("Failed to get OpenStack network {}", serviceId);
+ return null;
+ }
+
+ // assumes all cord service networks has single subnet
+ Subnet osSubnet = osNet.getNeutronSubnets().stream()
+ .findFirst().orElse(null);
+ if (osSubnet == null) {
+ log.warn("Failed to get OpenStack subnet of network {}", serviceId);
+ return null;
+ }
+
+ return new VtnService(serviceId,
+ osNet.getName(),
+ serviceType(osNet.getName()),
+ networkType(osNet.getName()),
+ Long.parseLong(osNet.getProviderSegID()),
+ IpPrefix.valueOf(osSubnet.getCidr()),
+ IpAddress.valueOf(osSubnet.getGateway()),
+ providerServices(serviceId),
+ tenantServices(serviceId));
+ }
+
+ // TODO remove this when XOS provides this information
+ private OSClient getOpenStackClient(OpenStackAccess osAccess) {
+ checkNotNull(osAccess);
+
+ // creating a client every time must be inefficient, but this method
+ // will be removed once XOS provides equivalent APIs
+ return OSFactory.builder()
+ .endpoint(osAccess.endpoint())
+ .credentials(osAccess.user(), osAccess.password())
+ .tenantName(osAccess.tenant())
+ .authenticate();
+ }
+
+ // TODO remove this when XOS provides this information
+ private NetworkType networkType(String netName) {
+ checkArgument(!Strings.isNullOrEmpty(netName));
+
+ String name = netName.toUpperCase();
+ if (name.contains(PUBLIC.toString())) {
+ return PUBLIC;
+ } else if (name.contains(MANAGEMENT.toString())) {
+ return MANAGEMENT;
+ } else {
+ return PRIVATE;
+ }
+ }
+
+ // TODO remove this when XOS provides this information
+ private ServiceType serviceType(String netName) {
+ checkArgument(!Strings.isNullOrEmpty(netName));
+
+ String name = netName.toUpperCase();
+ if (name.contains(VSG.toString())) {
+ return VSG;
+ } else if (name.contains(OLT_AGENT.toString())) {
+ return OLT_AGENT;
+ } else {
+ return DUMMY;
+ }
+ }
}
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/XosApi.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/XosApi.java
index 85f312d..4a9ec09 100644
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/XosApi.java
+++ b/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/XosApi.java
@@ -81,13 +81,15 @@
public String restGet(String path) {
WebTarget wt = client.target(access.endpoint() + baseUrl).path(path);
Invocation.Builder builder = wt.request(JSON_UTF_8.toString());
-
- Response response = builder.get();
- if (response.getStatus() != HTTP_OK) {
- log.warn("Failed to get resource {}", access.endpoint() + baseUrl + path);
+ try {
+ Response response = builder.get();
+ if (response.getStatus() != HTTP_OK) {
+ log.warn("Failed to get resource {}", access.endpoint() + baseUrl + path);
+ return EMPTY_JSON_STRING;
+ }
+ } catch (javax.ws.rs.ProcessingException e) {
return EMPTY_JSON_STRING;
}
-
return builder.get(String.class);
}
}