Support active-standby mode in openstacknetworking app

Change-Id: I155e1a082078e5c1b7e8a35275dfd517c787ade7
diff --git a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackFloatingIpWebResource.java b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackFloatingIpWebResource.java
index 25bc74b..33a0fa6 100644
--- a/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackFloatingIpWebResource.java
+++ b/apps/openstacknetworking/app/src/main/java/org/onosproject/openstacknetworking/web/OpenstackFloatingIpWebResource.java
@@ -16,6 +16,8 @@
 
 package org.onosproject.openstacknetworking.web;
 
+import org.apache.commons.io.IOUtils;
+import org.onosproject.openstacknetworking.api.OpenstackHaService;
 import org.onosproject.openstacknetworking.api.OpenstackRouterAdminService;
 import org.onosproject.rest.AbstractWebResource;
 import org.openstack4j.openstack.networking.domain.NeutronFloatingIP;
@@ -34,12 +36,17 @@
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriBuilder;
 import javax.ws.rs.core.UriInfo;
+import java.io.IOException;
 import java.io.InputStream;
 
 import static javax.ws.rs.core.Response.created;
 import static javax.ws.rs.core.Response.noContent;
 import static javax.ws.rs.core.Response.status;
+import static org.onosproject.openstacknetworking.api.Constants.REST_UTF8;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.jsonToModelEntity;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.syncDelete;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.syncPost;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.syncPut;
 
 /**
  * Handles floating IP REST API call of Neutron L3 plugin.
@@ -53,6 +60,7 @@
 
     private final OpenstackRouterAdminService adminService =
                                         get(OpenstackRouterAdminService.class);
+    private final OpenstackHaService haService = get(OpenstackHaService.class);
 
     @Context
     private UriInfo uriInfo;
@@ -63,16 +71,23 @@
      * @param input floating ip JSON input stream
      * @return 201 CREATED if the JSON is correct, 400 BAD_REQUEST if the JSON
      * is invalid or duplicated floating ip already exists
+     * @throws IOException exception
      * @onos.rsModel NeutronFloatingIp
      */
     @POST
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    public Response createFloatingIp(InputStream input) {
+    public Response createFloatingIp(InputStream input) throws IOException {
         log.trace(String.format(MESSAGE, "CREATE"));
 
+        String inputStr = IOUtils.toString(input, REST_UTF8);
+
+        if (!haService.isActive()) {
+            return syncPost(haService, FLOATING_IPS, inputStr);
+        }
+
         final NeutronFloatingIP floatingIp = (NeutronFloatingIP)
-                                jsonToModelEntity(input, NeutronFloatingIP.class);
+                jsonToModelEntity(inputStr, NeutronFloatingIP.class);
 
         adminService.createFloatingIp(floatingIp);
 
@@ -90,17 +105,24 @@
      * @param input floating ip JSON input stream
      * @return 200 OK with the updated floating ip, 400 BAD_REQUEST if the requested
      * floating ip does not exist
+     * @throws IOException exception
      * @onos.rsModel NeutronFloatingIp
      */
     @PUT
     @Path("{id}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    public Response updateFloatingIp(@PathParam("id") String id, InputStream input) {
+    public Response updateFloatingIp(@PathParam("id") String id, InputStream input) throws IOException {
         log.trace(String.format(MESSAGE, "UPDATE " + id));
 
+        String inputStr = IOUtils.toString(input, REST_UTF8);
+
+        if (!haService.isActive()) {
+            return syncPut(haService, FLOATING_IPS, id, inputStr);
+        }
+
         final NeutronFloatingIP floatingIp = (NeutronFloatingIP)
-                                jsonToModelEntity(input, NeutronFloatingIP.class);
+                jsonToModelEntity(inputStr, NeutronFloatingIP.class);
 
         adminService.updateFloatingIp(floatingIp);
 
@@ -119,6 +141,10 @@
     public Response deleteFloatingIp(@PathParam("id") String id) {
         log.trace(String.format(MESSAGE, "DELETE " + id));
 
+        if (!haService.isActive()) {
+            return syncDelete(haService, FLOATING_IPS, id);
+        }
+
         adminService.removeFloatingIp(id);
         return noContent().build();
     }