[ONOS-3804] [ONOS-3805] Initial L3 flowrules setup for Compute/Gateway nodes and PNAT Handler for OpenstackRouting

 - Performs app refactoring (openstackrouting and openstackswitching)
 - Implements L3 REST call corresponding openstackRouter and openstackRouterInterface.
 - Implements initail L3 rules population to compute/gateway node.
 - Implements PNAT rules population corresponding packet-in event.
 - Fixs comments and javadocs.
 - Rebases on master.

Change-Id: I5ad68810f50dc977737d30c43150c892b978b7cb
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackExternalGateway.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackExternalGateway.java
index 8f1e741..4005f88 100644
--- a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackExternalGateway.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackExternalGateway.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.openstacknetworking;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import org.onlab.packet.Ip4Address;
 import java.util.Map;
@@ -60,7 +61,7 @@
      * @return External fixed IP informations
      */
     public Map<String, Ip4Address> externalFixedIps() {
-        return externalFixedIps;
+        return ImmutableMap.copyOf(externalFixedIps);
     }
 
     @Override
@@ -137,7 +138,7 @@
          * @return OpenstackExternalGateway object
          */
         public OpenstackExternalGateway build() {
-            return new OpenstackExternalGateway(networkId, enablePnat, externalFixedIps);
+            return new OpenstackExternalGateway(networkId, enablePnat, ImmutableMap.copyOf(externalFixedIps));
         }
     }
 
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackFloatingIP.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackFloatingIP.java
index bed0289..569c885 100644
--- a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackFloatingIP.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackFloatingIP.java
@@ -19,12 +19,14 @@
 
 import java.util.Objects;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 /**
  *  An Openstack Neutron Floating IP Model.
  */
 public final class OpenstackFloatingIP {
 
-    public enum FloatingIPStatus {
+    public enum FloatingIpStatus {
         UP,
         DOWN,
         ACTIVE,
@@ -33,13 +35,13 @@
     private final String tenantId;
     private final String networkId;
     private final Ip4Address fixedIpAddress;
-    private final String portId;
-    private final String routerId;
+    private String portId;
+    private String routerId;
     private final String id;
     private final Ip4Address floatingIpAddress;
-    private final FloatingIPStatus status;
+    private final FloatingIpStatus status;
 
-    private OpenstackFloatingIP(FloatingIPStatus status, String id, String tenantId,
+    private OpenstackFloatingIP(FloatingIpStatus status, String id, String tenantId,
                                 String networkId, Ip4Address fixedIpAddress, String portId,
                                 String routerId, Ip4Address floatingIpAddress) {
         this.status = status;
@@ -57,7 +59,7 @@
      *
      * @return floating IP status
      */
-    public FloatingIPStatus status() {
+    public FloatingIpStatus status() {
         return status;
     }
 
@@ -107,6 +109,15 @@
     }
 
     /**
+     * Updates port ID.
+     *
+     * @param portId Updated port ID
+     */
+    public void updatePortId(String portId) {
+        this.portId = portId;
+    }
+
+    /**
      * Returns router ID.
      *
      * @return router ID
@@ -116,6 +127,15 @@
     }
 
     /**
+     * Updates router ID.
+     *
+     * @param routerId Updated router ID
+     */
+    public void updateRouterId(String routerId) {
+        this.routerId = routerId;
+    }
+
+    /**
      * Returns floating IP address.
      *
      * @return Floating IP address
@@ -162,7 +182,7 @@
         private String routerId;
         private String id;
         private Ip4Address floatingIpAddress;
-        private FloatingIPStatus status;
+        private FloatingIpStatus status;
 
         /**
          * Sets tenant ID.
@@ -181,7 +201,7 @@
          * @param status Floating IP status
          * @return Builder object
          */
-        public Builder status(FloatingIPStatus status) {
+        public Builder status(FloatingIpStatus status) {
             this.status = status;
             return this;
         }
@@ -258,8 +278,9 @@
          * @return OpenstackFloatingIP object
          */
         public OpenstackFloatingIP build() {
-            return new OpenstackFloatingIP(status, id, tenantId, networkId,
-                    fixedIpAddress, portId, routerId, floatingIpAddress);
+            return new OpenstackFloatingIP(checkNotNull(status), checkNotNull(id), checkNotNull(tenantId),
+                    checkNotNull(networkId), fixedIpAddress, portId,
+                    routerId, checkNotNull(floatingIpAddress));
 
         }
     }
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouter.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouter.java
index 8e513f1..5230c18 100644
--- a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouter.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouter.java
@@ -16,6 +16,7 @@
 package org.onosproject.openstacknetworking;
 
 import java.util.Objects;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * An Openstack Neutron Router Model.
@@ -31,9 +32,9 @@
     private final String tenantId;
     private final String id;
     private final String name;
-    private final RouterStatus status;
-    private final boolean adminStateUp;
-    private final OpenstackExternalGateway gatewayExternalInfo;
+    private RouterStatus status;
+    private boolean adminStateUp;
+    private OpenstackExternalGateway gatewayExternalInfo;
 
     private OpenstackRouter(String id, String tenantId, String name, RouterStatus status,
                            boolean adminStateUp, OpenstackExternalGateway gatewayExternalInfo) {
@@ -209,8 +210,8 @@
          * @return OpenstasckRouter object
          */
         public OpenstackRouter build() {
-            return new OpenstackRouter(id, tenantId, name, status,
-                    adminStateUp, gatewayExternalInfo);
+            return new OpenstackRouter(checkNotNull(id), checkNotNull(tenantId), name, checkNotNull(status),
+                    checkNotNull(adminStateUp), gatewayExternalInfo);
         }
     }
 
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouterInterface.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouterInterface.java
index 972e6c5..78ab815 100644
--- a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouterInterface.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouterInterface.java
@@ -99,12 +99,12 @@
      * An Openstack Router Interface Builder class.
      */
     public static final class Builder {
-         private String id;
-         private String tenantId;
-         private String subnetId;
-         private String portId;
+        private String id;
+        private String tenantId;
+        private String subnetId;
+        private String portId;
 
-         /**
+        /**
          * Sets Router Interface ID.
          *
          * @param id router interface ID
@@ -148,14 +148,14 @@
             return this;
         }
 
-
         /**
          * Builds an Openstack Router Interface object.
          *
          * @return OpenstackRouterInterface object
          */
         public OpenstackRouterInterface build() {
-            return new OpenstackRouterInterface(id, tenantId, subnetId, portId);
+            return new OpenstackRouterInterface(checkNotNull(id), checkNotNull(tenantId),
+                    checkNotNull(subnetId), checkNotNull(portId));
         }
 
     }