Add unit tests in OpenstackNetworkingUtil class

Change-Id: Iadae6a52b22b7e36e4149fa0838bd245f2e5a96d
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
index 0253e4d..d0fbe64 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtil.java
@@ -15,6 +15,9 @@
  */
 package org.onosproject.openstacknetworking.util;
 
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
@@ -151,22 +154,18 @@
      */
     public static NetFloatingIP associatedFloatingIp(InstancePort port,
                                                      Set<NetFloatingIP> fips) {
-        try {
-            for (NetFloatingIP fip : fips) {
-                if (Strings.isNullOrEmpty(fip.getFixedIpAddress())) {
-                    continue;
-                }
-                if (Strings.isNullOrEmpty(fip.getFloatingIpAddress())) {
-                    continue;
-                }
-                if (fip.getFixedIpAddress().equals(port.ipAddress().toString())) {
-                    return fip;
-                }
+        for (NetFloatingIP fip : fips) {
+            if (Strings.isNullOrEmpty(fip.getFixedIpAddress())) {
+                continue;
             }
-        } catch (NullPointerException e) {
-            log.error("Exception occurred because of {}", e.toString());
-            throw new NullPointerException();
+            if (Strings.isNullOrEmpty(fip.getFloatingIpAddress())) {
+                continue;
+            }
+            if (fip.getFixedIpAddress().equals(port.ipAddress().toString())) {
+                return fip;
+            }
         }
+
         return null;
     }
 
@@ -378,6 +377,7 @@
                     adminService.addRouterInterface(rIface);
                 }
             } catch (IOException ignore) {
+                log.error("Exception occurred because of {}", ignore.toString());
             }
         });
     }
@@ -406,8 +406,14 @@
         try {
             Object jsonObject = mapper.readValue(jsonString, Object.class);
             return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonObject);
+        } catch (JsonParseException e) {
+            log.debug("JsonParseException caused by {}", e);
+        } catch (JsonMappingException e) {
+            log.debug("JsonMappingException caused by {}", e);
+        } catch (JsonProcessingException e) {
+            log.debug("JsonProcessingException caused by {}", e);
         } catch (IOException e) {
-            log.debug("Json string parsing exception caused by {}", e);
+            log.debug("IOException caused by {}", e);
         }
         return null;
     }
@@ -447,6 +453,21 @@
     }
 
     /**
+     * Compares two router interfaces are equal.
+     * Will be remove this after Openstack4j implements equals.
+     *
+     * @param routerInterface1 router interface
+     * @param routerInterface2 router interface
+     * @return returns true if two router interfaces are equal, false otherwise
+     */
+    public static boolean routerInterfacesEquals(RouterInterface routerInterface1, RouterInterface routerInterface2) {
+        return Objects.equals(routerInterface1.getId(), routerInterface2.getId()) &&
+                Objects.equals(routerInterface1.getPortId(), routerInterface2.getPortId()) &&
+                Objects.equals(routerInterface1.getSubnetId(), routerInterface2.getSubnetId()) &&
+                Objects.equals(routerInterface1.getTenantId(), routerInterface2.getTenantId());
+    }
+
+    /**
      * Builds up and a complete endpoint URL from gateway node.
      *
      * @param node gateway node
diff --git a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackRouterServiceAdapter.java b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackRouterServiceAdapter.java
index 34341d2..d0785b4 100644
--- a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackRouterServiceAdapter.java
+++ b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/impl/OpenstackRouterServiceAdapter.java
@@ -15,8 +15,8 @@
  */
 package org.onosproject.openstacknetworking.impl;
 
+import org.onosproject.openstacknetworking.api.OpenstackRouterAdminService;
 import org.onosproject.openstacknetworking.api.OpenstackRouterListener;
-import org.onosproject.openstacknetworking.api.OpenstackRouterService;
 import org.openstack4j.model.network.NetFloatingIP;
 import org.openstack4j.model.network.Router;
 import org.openstack4j.model.network.RouterInterface;
@@ -26,7 +26,7 @@
 /**
  * Test adapter for OpenstackRouterService.
  */
-public class OpenstackRouterServiceAdapter implements OpenstackRouterService {
+public class OpenstackRouterServiceAdapter implements OpenstackRouterAdminService {
     @Override
     public Router router(String osRouterId) {
         return null;
@@ -76,4 +76,54 @@
     public void removeListener(OpenstackRouterListener listener) {
 
     }
+
+    @Override
+    public void createRouter(Router osRouter) {
+
+    }
+
+    @Override
+    public void updateRouter(Router osRouter) {
+
+    }
+
+    @Override
+    public void removeRouter(String osRouterId) {
+
+    }
+
+    @Override
+    public void addRouterInterface(RouterInterface osRouterIface) {
+
+    }
+
+    @Override
+    public void updateRouterInterface(RouterInterface osRouterIface) {
+
+    }
+
+    @Override
+    public void removeRouterInterface(String osRouterIfaceId) {
+
+    }
+
+    @Override
+    public void createFloatingIp(NetFloatingIP floatingIP) {
+
+    }
+
+    @Override
+    public void updateFloatingIp(NetFloatingIP floatingIP) {
+
+    }
+
+    @Override
+    public void removeFloatingIp(String floatingIpId) {
+
+    }
+
+    @Override
+    public void clear() {
+
+    }
 }
diff --git a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtilTest.java b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtilTest.java
index be4f6d1..eb323ef 100644
--- a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtilTest.java
+++ b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtilTest.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.openstacknetworking.util;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
@@ -36,15 +37,26 @@
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.device.DeviceServiceAdapter;
 import org.onosproject.openstacknetworking.api.InstancePort;
+import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
+import org.onosproject.openstacknetworking.api.OpenstackRouterAdminService;
 import org.onosproject.openstacknetworking.impl.DefaultInstancePort;
+import org.onosproject.openstacknetworking.impl.OpenstackNetworkServiceAdapter;
+import org.onosproject.openstacknetworking.impl.OpenstackRouterServiceAdapter;
+import org.onosproject.openstacknetworking.impl.TestRouterInterface;
 import org.onosproject.openstacknetworking.web.OpenstackFloatingIpWebResourceTest;
 import org.onosproject.openstacknetworking.web.OpenstackNetworkWebResourceTest;
+import org.onosproject.openstacknode.api.DefaultOpenstackAuth;
+import org.onosproject.openstacknode.api.DefaultOpenstackNode;
 import org.onosproject.openstacknode.api.NodeState;
+import org.onosproject.openstacknode.api.OpenstackAuth;
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackNodeTest;
 import org.openstack4j.model.network.NetFloatingIP;
+import org.openstack4j.model.network.Network;
 import org.openstack4j.model.network.Port;
+import org.openstack4j.model.network.RouterInterface;
 import org.openstack4j.openstack.networking.domain.NeutronFloatingIP;
+import org.openstack4j.openstack.networking.domain.NeutronNetwork;
 import org.openstack4j.openstack.networking.domain.NeutronPort;
 
 import java.io.IOException;
@@ -59,7 +71,19 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.addRouterIface;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.associatedFloatingIp;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.checkArpMode;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getConnectedClient;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getGwByComputeDevId;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getGwByInstancePort;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getIntfNameFromPciAddress;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.isAssociatedWithVM;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.jsonToModelEntity;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.modelEntityToJson;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.prettyJson;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.routerInterfacesEquals;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.swapStaleLocation;
 
 public final class OpenstackNetworkingUtilTest {
 
@@ -73,6 +97,9 @@
     private InstancePort instancePort1;
     private InstancePort instancePort2;
     private InstancePort instancePort3;
+    private Map<String, RouterInterface> routerInterfaceMap = Maps.newHashMap();
+    private OpenstackNode openstackControlNodeV2;
+    private OpenstackNode openstackControlNodeV3;
 
     @Before
     public void setUp() {
@@ -117,12 +144,31 @@
                 .getResourceAsStream("openstack-floatingip3.json");
 
         floatingIp1 = (NetFloatingIP)
-                OpenstackNetworkingUtil.jsonToModelEntity(floatingIpjsonStream1, NeutronFloatingIP.class);
+                jsonToModelEntity(floatingIpjsonStream1, NeutronFloatingIP.class);
         floatingIp2 = (NetFloatingIP)
-                OpenstackNetworkingUtil.jsonToModelEntity(floatingIpjsonStream2, NeutronFloatingIP.class);
+                jsonToModelEntity(floatingIpjsonStream2, NeutronFloatingIP.class);
         floatingIp3 = (NetFloatingIP)
-                OpenstackNetworkingUtil.jsonToModelEntity(floatingIpjsonStream3, NeutronFloatingIP.class);
+                jsonToModelEntity(floatingIpjsonStream3, NeutronFloatingIP.class);
 
+        InputStream portJsonStream = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("openstack-port.json");
+
+        InputStream sriovPortJsonStream1 = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("openstack-port-sriov1.json");
+        InputStream sriovPortJsonStream2 = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("openstack-port-sriov2.json");
+        InputStream sriovPortJsonStream3 = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("openstack-port-sriov3.json");
+
+        openstackPort = (Port)
+                jsonToModelEntity(portJsonStream, NeutronPort.class);
+
+        openstackSriovPort1 = (Port)
+                jsonToModelEntity(sriovPortJsonStream1, NeutronPort.class);
+        openstackSriovPort2 = (Port)
+                jsonToModelEntity(sriovPortJsonStream2, NeutronPort.class);
+        openstackSriovPort3 = (Port)
+                jsonToModelEntity(sriovPortJsonStream3, NeutronPort.class);
     }
 
     @After
@@ -135,16 +181,15 @@
     @Test
     public void testFloatingIp() throws IOException {
         ObjectNode floatingIpNode =
-                OpenstackNetworkingUtil.modelEntityToJson(floatingIp1, NeutronFloatingIP.class);
+                modelEntityToJson(floatingIp1, NeutronFloatingIP.class);
         InputStream is = IOUtils.toInputStream(floatingIpNode.toString(), StandardCharsets.UTF_8.name());
         NetFloatingIP floatingIp2 = (NetFloatingIP)
-                OpenstackNetworkingUtil.jsonToModelEntity(is, NeutronFloatingIP.class);
+                jsonToModelEntity(is, NeutronFloatingIP.class);
         new EqualsTester().addEqualityGroup(floatingIp1, floatingIp2).testEquals();
     }
 
     /**
      * Tests the associatedFloatingIp method.
-     * @throws NullPointerException
      */
     @Test
     public void testAsscoatedFloatingIp() throws NullPointerException {
@@ -153,14 +198,37 @@
         testSet.add(floatingIp2);
         testSet.add(floatingIp3);
 
-        NetFloatingIP floatingIp1 = OpenstackNetworkingUtil.associatedFloatingIp(instancePort1, testSet);
-        NetFloatingIP floatingIp2 = OpenstackNetworkingUtil.associatedFloatingIp(instancePort2, testSet);
+        NetFloatingIP floatingIp1 = associatedFloatingIp(instancePort1, testSet);
+        NetFloatingIP floatingIp2 = associatedFloatingIp(instancePort2, testSet);
 
         assertEquals(floatingIp1, this.floatingIp1);
         assertEquals(floatingIp2, null);
     }
 
     /**
+     * Tests the isAssociatedWithVM method.
+     */
+    @Test
+    public void testIsAssociatedWithVM() {
+        OpenstackNetworkService service = new TestOpenstackNetworkService();
+        NetFloatingIP floatingIp4 = new NeutronFloatingIP().toBuilder().portId("portId4").build();
+
+        assertFalse(isAssociatedWithVM(service, floatingIp4));
+        assertFalse(isAssociatedWithVM(service, floatingIp3));
+        assertTrue(isAssociatedWithVM(service, floatingIp1));
+    }
+
+    /**
+     * Tests the isAssociatedWithVM method in case IllegalStateException is occurred.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testIsAssociatedWithVMexceptionCase() {
+        OpenstackNetworkService service = new TestOpenstackNetworkService();
+        isAssociatedWithVM(service, floatingIp2);
+    }
+
+
+    /**
      * Tests the getGwByInstancePort method.
      */
     @Test
@@ -173,9 +241,11 @@
 
         int expectedGwIndex = 2;
 
-        OpenstackNode gw = OpenstackNetworkingUtil.getGwByInstancePort(gws, instancePort1);
+        OpenstackNode gw = getGwByInstancePort(gws, instancePort1);
 
         assertEquals(genGateway(expectedGwIndex), gw);
+
+        assertNull(getGwByInstancePort(gws, null));
     }
 
     /**
@@ -222,33 +292,13 @@
     @Test
     public void testGetIntfNameFromPciAddress() {
 
-        InputStream portJsonStream = OpenstackNetworkWebResourceTest.class
-                .getResourceAsStream("openstack-port.json");
-
-        InputStream sriovPortJsonStream1 = OpenstackNetworkWebResourceTest.class
-                .getResourceAsStream("openstack-port-sriov1.json");
-        InputStream sriovPortJsonStream2 = OpenstackNetworkWebResourceTest.class
-                .getResourceAsStream("openstack-port-sriov2.json");
-        InputStream sriovPortJsonStream3 = OpenstackNetworkWebResourceTest.class
-                .getResourceAsStream("openstack-port-sriov3.json");
-
-        openstackPort = (Port)
-                OpenstackNetworkingUtil.jsonToModelEntity(portJsonStream, NeutronPort.class);
-
-        openstackSriovPort1 = (Port)
-                OpenstackNetworkingUtil.jsonToModelEntity(sriovPortJsonStream1, NeutronPort.class);
-        openstackSriovPort2 = (Port)
-                OpenstackNetworkingUtil.jsonToModelEntity(sriovPortJsonStream2, NeutronPort.class);
-        openstackSriovPort3 = (Port)
-                OpenstackNetworkingUtil.jsonToModelEntity(sriovPortJsonStream3, NeutronPort.class);
-
         String expectedIntfName1 = "enp5s8";
         String expectedIntfName2 = "enp5s8f3";
 
-        assertNull(OpenstackNetworkingUtil.getIntfNameFromPciAddress(openstackPort));
-        assertEquals(expectedIntfName1, OpenstackNetworkingUtil.getIntfNameFromPciAddress(openstackSriovPort1));
-        assertEquals(expectedIntfName2, OpenstackNetworkingUtil.getIntfNameFromPciAddress(openstackSriovPort2));
-        assertNull(OpenstackNetworkingUtil.getIntfNameFromPciAddress(openstackSriovPort3));
+        assertNull(getIntfNameFromPciAddress(openstackPort));
+        assertEquals(expectedIntfName1, getIntfNameFromPciAddress(openstackSriovPort1));
+        assertEquals(expectedIntfName2, getIntfNameFromPciAddress(openstackSriovPort2));
+        assertNull(getIntfNameFromPciAddress(openstackSriovPort3));
     }
 
     /**
@@ -256,7 +306,7 @@
      */
     @Test
     public void testSwapStaleLocation() {
-        InstancePort swappedInstancePort =  OpenstackNetworkingUtil.swapStaleLocation(instancePort3);
+        InstancePort swappedInstancePort =  swapStaleLocation(instancePort3);
 
         assertEquals(instancePort3.oldDeviceId(), swappedInstancePort.deviceId());
         assertEquals(instancePort3.oldPortNumber(), swappedInstancePort.portNumber());
@@ -279,8 +329,38 @@
                 "port4", deviceService));
     }
 
-    private OpenstackNode genGateway(int index) {
+    /**
+     * Tests addRouterIface method.
+     */
+    @Test
+    public void testAddRouterIface() {
+        OpenstackRouterAdminService service = new TestOpenstackRouterAdminService();
 
+        addRouterIface(openstackPort, service);
+        RouterInterface initialRouterInterface = new TestRouterInterface(openstackPort.getDeviceId(),
+                openstackPort.getFixedIps().stream().findAny().get().getSubnetId(),
+                openstackPort.getId(),
+                openstackPort.getTenantId());
+
+        assertTrue(routerInterfacesEquals(initialRouterInterface, service.routerInterface(openstackPort.getId())));
+
+        addRouterIface(openstackSriovPort1, service);
+        RouterInterface updatedInitialRouterInterface = new TestRouterInterface(openstackSriovPort1.getDeviceId(),
+                openstackSriovPort1.getFixedIps().stream().findAny().get().getSubnetId(),
+                openstackSriovPort1.getId(),
+                openstackSriovPort1.getTenantId());
+
+        assertTrue(routerInterfacesEquals(
+                updatedInitialRouterInterface, service.routerInterface(openstackSriovPort1.getId())));
+    }
+
+    /**
+     * Util for generating dummy gateway node.
+     *
+     * @param index dummy gateway number
+     * @return dummy gateway node
+     */
+    public OpenstackNode genGateway(int index) {
         Device intgBrg = InternalOpenstackNodeTest.createDevice(index);
 
         String hostname = "gateway-" + index;
@@ -289,6 +369,75 @@
         String uplinkPort = "eth0";
         return InternalOpenstackNodeTest.createNode(hostname,
                 OpenstackNode.NodeType.GATEWAY, intgBrg, ip, uplinkPort, state);
+    }
+
+    /**
+     * Tests the testPrettyJson method.
+     */
+    @Test
+    public void testPrettyJson() {
+        String string = prettyJson(new ObjectMapper(), "{\"json\":\"json\"}");
+        String prettyJsonString = "{\n  \"json\" : \"json\"\n}";
+        assertEquals(string, prettyJsonString);
+
+        assertNull(prettyJson(new ObjectMapper(), "{\"json\":\"json\""));
+        assertNull(prettyJson(new ObjectMapper(), "{\"json\"\"json\"}"));
+    }
+
+    /**
+     * Tests the checkArpMode method.
+     */
+    @Test
+    public void testCheckArpMode() {
+        assertFalse(checkArpMode(null));
+        assertTrue(checkArpMode("proxy"));
+        assertTrue(checkArpMode("broadcast"));
+    }
+
+    /**
+     * Tests the getConnectedClient method.
+     */
+    @Test(expected = Exception.class)
+    public void testGetConnectedClient() {
+        OpenstackNode.Builder osNodeBuilderV2 = DefaultOpenstackNode.builder();
+        OpenstackAuth.Builder osNodeAuthBuilderV2 = DefaultOpenstackAuth.builder()
+                .version("v2.0")
+                .port(35357)
+                .protocol(OpenstackAuth.Protocol.HTTP)
+                .project("admin")
+                .username("admin")
+                .password("password")
+                .perspective(OpenstackAuth.Perspective.PUBLIC);
+
+        openstackControlNodeV2 = osNodeBuilderV2.hostname("controllerv2")
+                .type(OpenstackNode.NodeType.CONTROLLER)
+                .managementIp(IpAddress.valueOf("1.1.1.1"))
+                .endPoint("1.1.1.1")
+                .authentication(osNodeAuthBuilderV2.build())
+                .state(NodeState.COMPLETE)
+                .build();
+
+
+        OpenstackNode.Builder osNodeBuilderV3 = DefaultOpenstackNode.builder();
+        OpenstackAuth.Builder osNodeAuthBuilderV3 = DefaultOpenstackAuth.builder()
+                .version("v2")
+                .port(80)
+                .protocol(OpenstackAuth.Protocol.HTTP)
+                .project("admin")
+                .username("admin")
+                .password("password")
+                .perspective(OpenstackAuth.Perspective.PUBLIC);
+
+        openstackControlNodeV3 = osNodeBuilderV3.hostname("controllerv3")
+                .type(OpenstackNode.NodeType.CONTROLLER)
+                .managementIp(IpAddress.valueOf("2.2.2.2"))
+                .endPoint("2.2.2.2")
+                .authentication(osNodeAuthBuilderV3.build())
+                .state(NodeState.COMPLETE)
+                .build();
+
+        getConnectedClient(openstackControlNodeV2);
+        getConnectedClient(openstackControlNodeV3);
 
     }
 
@@ -327,4 +476,45 @@
             return ports;
         }
     }
+
+    private class TestOpenstackNetworkService extends OpenstackNetworkServiceAdapter {
+        @Override
+        public Network network(String networkId) {
+            if (networkId.equals(openstackSriovPort1.getNetworkId())) {
+                return new NeutronNetwork().toBuilder().name("network").build();
+            } else {
+                return null;
+            }
+        }
+
+        @Override
+        public Port port(String portId) {
+            if (portId.equals(floatingIp1.getPortId())) {
+                return openstackSriovPort1;
+            } else if (portId.equals(floatingIp2.getPortId())) {
+                return openstackSriovPort2;
+            } else if (portId.equals("portId4")) {
+                return new NeutronPort().toBuilder().name("osPort4").build();
+            } else {
+                return null;
+            }
+        }
+    }
+
+    private class TestOpenstackRouterAdminService extends OpenstackRouterServiceAdapter {
+        @Override
+        public void addRouterInterface(RouterInterface osRouterIface) {
+            routerInterfaceMap.put(osRouterIface.getPortId(), osRouterIface);
+        }
+
+        @Override
+        public void updateRouterInterface(RouterInterface osRouterIface) {
+            routerInterfaceMap.put(osRouterIface.getPortId(), osRouterIface);
+        }
+
+        @Override
+        public RouterInterface routerInterface(String osRouterIfaceId) {
+            return routerInterfaceMap.get(osRouterIfaceId);
+        }
+    }
 }
diff --git a/apps/openstacknetworking/app/src/test/resources/org/onosproject/openstacknetworking/web/openstack-port-sriov2.json b/apps/openstacknetworking/app/src/test/resources/org/onosproject/openstacknetworking/web/openstack-port-sriov2.json
index ac994db..5f3b97f 100644
--- a/apps/openstacknetworking/app/src/test/resources/org/onosproject/openstacknetworking/web/openstack-port-sriov2.json
+++ b/apps/openstacknetworking/app/src/test/resources/org/onosproject/openstacknetworking/web/openstack-port-sriov2.json
@@ -17,7 +17,7 @@
       }
     ],
     "mac_address": "fa:16:3e:c9:cb:f0",
-    "network_id": "a87cc70a-3e15-4acf-8205-9b711a3531b7",
+    "network_id": "a87cc70a-3e15-4acf-8205-9b711a3531b6",
     "status": "ACTIVE",
     "tenant_id": "d6700c0c9ffa4f1cb322cd4a1f3906fa",
     "security_groups": [
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuth.java b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultOpenstackAuth.java
similarity index 98%
rename from apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuth.java
rename to apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultOpenstackAuth.java
index b073f5f..fb6f53b 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuth.java
+++ b/apps/openstacknode/api/src/main/java/org/onosproject/openstacknode/api/DefaultOpenstackAuth.java
@@ -13,10 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.onosproject.openstacknode.impl;
+package org.onosproject.openstacknode.api;
 
 import com.google.common.base.MoreObjects;
-import org.onosproject.openstacknode.api.OpenstackAuth;
 
 import java.util.Objects;
 
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackAuthCodec.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackAuthCodec.java
index 5556d9c..35e806d 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackAuthCodec.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/codec/OpenstackAuthCodec.java
@@ -19,7 +19,7 @@
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
 import org.onosproject.openstacknode.api.OpenstackAuth;
-import org.onosproject.openstacknode.impl.DefaultOpenstackAuth;
+import org.onosproject.openstacknode.api.DefaultOpenstackAuth;
 import org.slf4j.Logger;
 
 import static com.google.common.base.Preconditions.checkNotNull;
diff --git a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DistributedOpenstackNodeStore.java b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DistributedOpenstackNodeStore.java
index 6b77efb..106e4ea 100644
--- a/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DistributedOpenstackNodeStore.java
+++ b/apps/openstacknode/app/src/main/java/org/onosproject/openstacknode/impl/DistributedOpenstackNodeStore.java
@@ -26,6 +26,7 @@
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.net.behaviour.ControllerInfo;
+import org.onosproject.openstacknode.api.DefaultOpenstackAuth;
 import org.onosproject.openstacknode.api.DefaultOpenstackNode;
 import org.onosproject.openstacknode.api.NodeState;
 import org.onosproject.openstacknode.api.OpenstackNode;
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackNodeCodecTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackNodeCodecTest.java
index a42bfcd..77759c3 100644
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackNodeCodecTest.java
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/codec/OpenstackNodeCodecTest.java
@@ -34,7 +34,7 @@
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackPhyInterface;
 import org.onosproject.openstacknode.api.OpenstackSshAuth;
-import org.onosproject.openstacknode.impl.DefaultOpenstackAuth;
+import org.onosproject.openstacknode.api.DefaultOpenstackAuth;
 import org.onosproject.openstacknode.api.DefaultOpenstackNode;
 import org.onosproject.openstacknode.impl.DefaultOpenstackPhyInterface;
 import org.onosproject.openstacknode.impl.DefaultOpenstackSshAuth;
diff --git a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuthTest.java b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuthTest.java
index 723ea27..7a09f96 100644
--- a/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuthTest.java
+++ b/apps/openstacknode/app/src/test/java/org/onosproject/openstacknode/impl/DefaultOpenstackAuthTest.java
@@ -17,6 +17,7 @@
 
 import com.google.common.testing.EqualsTester;
 import org.junit.Test;
+import org.onosproject.openstacknode.api.DefaultOpenstackAuth;
 import org.onosproject.openstacknode.api.OpenstackAuth;
 
 import static org.hamcrest.MatcherAssert.assertThat;