Refactor external peer router store, fix NPE due to MAC is not ready

Change-Id: Id0381d9d1d7e0888dfbf1fc20acdd44d0a303e4c
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/OpenstackNetworkEvent.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/OpenstackNetworkEvent.java
index 5815b7a..84c9b21 100644
--- a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/OpenstackNetworkEvent.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/api/OpenstackNetworkEvent.java
@@ -32,6 +32,7 @@
     private final Port port;
     private final Subnet subnet;
     private final String securityGroupId;
+    private final ExternalPeerRouter peerRouter;
 
     public enum Type {
         /**
@@ -97,11 +98,32 @@
         /**
          * Signifies that the OpenStack security group rule is removed from a specific port.
          */
-        OPENSTACK_PORT_SECURITY_GROUP_REMOVED
+        OPENSTACK_PORT_SECURITY_GROUP_REMOVED,
+
+        /**
+         * Signifies that the external peer router is created.
+         */
+        EXTERNAL_PEER_ROUTER_CREATED,
+
+        /**
+         * Signifies that the external peer router is updated.
+         */
+        EXTERNAL_PEER_ROUTER_UPDATED,
+
+        /**
+         * Signifies that the external peer router MAC is updated.
+         */
+        EXTERNAL_PEER_ROUTER_MAC_UPDATED,
+
+        /**
+         * Signifies that the external peer router is removed.
+         */
+        EXTERNAL_PEER_ROUTER_REMOVED,
     }
 
     /**
      * Creates an event of a given type for the specified network and the current time.
+     *
      * @param type    openstack network event type
      * @param network openstack network
      */
@@ -110,6 +132,7 @@
         this.port = null;
         this.subnet = null;
         this.securityGroupId = null;
+        this.peerRouter = null;
     }
 
     /**
@@ -125,6 +148,7 @@
         this.port = port;
         this.subnet = null;
         this.securityGroupId = null;
+        this.peerRouter = null;
     }
 
     /**
@@ -140,6 +164,7 @@
         this.port = null;
         this.subnet = subnet;
         this.securityGroupId = null;
+        this.peerRouter = null;
     }
 
     /**
@@ -154,6 +179,21 @@
         this.port = port;
         this.subnet = null;
         this.securityGroupId = securityGroupId;
+        this.peerRouter = null;
+    }
+
+    /**
+     * Creates an event of a given type for the specified external peer router.
+     *
+     * @param type openstack network event type
+     * @param peerRouter external peer router
+     */
+    public OpenstackNetworkEvent(Type type, ExternalPeerRouter peerRouter) {
+        super(type, null);
+        this.port = null;
+        this.subnet = null;
+        this.securityGroupId = null;
+        this.peerRouter = peerRouter;
     }
 
     /**
@@ -175,6 +215,15 @@
     }
 
     /**
+     * Returns the external peer router.
+     *
+     * @return external peer router; null if the event is not peer router specific
+     */
+    public ExternalPeerRouter peerRouter() {
+        return peerRouter;
+    }
+
+    /**
      * Returns the security group rule IDs updated.
      *
      * @return openstack security group
@@ -195,6 +244,7 @@
                 .add("port", port)
                 .add("subnet", subnet)
                 .add("security group", securityGroupId())
+                .add("external peer router", peerRouter)
                 .toString();
     }
 }