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();
+    }
 }