[ONOS-6137] Refactoring SecurityGroup features for stateful SONA

- Caches the security group information
- Supports seucrity group & rules update

Change-Id: Id7cdfb84e53e00aab49fbe736fb39e37492eeb61
diff --git a/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/api/OpenstackNetworkEvent.java b/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/api/OpenstackNetworkEvent.java
index c022c29..bfad9ed 100644
--- a/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/api/OpenstackNetworkEvent.java
+++ b/apps/openstacknetworking/src/main/java/org/onosproject/openstacknetworking/api/OpenstackNetworkEvent.java
@@ -21,6 +21,8 @@
 import org.openstack4j.model.network.Port;
 import org.openstack4j.model.network.Subnet;
 
+import java.util.Collection;
+
 import static com.google.common.base.MoreObjects.toStringHelper;
 
 /**
@@ -30,6 +32,7 @@
 
     private final Port port;
     private final Subnet subnet;
+    private final Collection<String> sgRuleIds;
 
     public enum Type {
         /**
@@ -75,7 +78,17 @@
         /**
          * Signifies that the OpenStack port is removed.
          */
-        OPENSTACK_PORT_REMOVED
+        OPENSTACK_PORT_REMOVED,
+
+        /**
+         * Signifies that the OpenStack security group rule is added to a specific port.
+         */
+        OPENSTACK_SECURITY_GROUP_ADDED_TO_PORT,
+
+        /**
+         * Signifies that the OpenStack security group rule is removed from a specific port.
+         */
+        OPENSTACK_SECURITY_GROUP_REMOVED_FROM_PORT
     }
 
     /**
@@ -87,6 +100,7 @@
         super(type, network);
         this.port = null;
         this.subnet = null;
+        this.sgRuleIds = null;
     }
 
     /**
@@ -101,6 +115,7 @@
         super(type, network);
         this.port = port;
         this.subnet = null;
+        this.sgRuleIds = null;
     }
 
     /**
@@ -115,6 +130,21 @@
         super(type, network);
         this.port = null;
         this.subnet = subnet;
+        this.sgRuleIds = null;
+    }
+
+    /**
+     * Creates an event of a given type for the specified port and security groups.
+     *
+     * @param type openstack network event type
+     * @param sgRuleIds openstack security group rules
+     * @param port openstack port
+     */
+    public OpenstackNetworkEvent(Type type, Collection<String> sgRuleIds, Port port) {
+        super(type, null);
+        this.port = port;
+        this.sgRuleIds = sgRuleIds;
+        this.subnet = null;
     }
 
     /**
@@ -135,6 +165,15 @@
         return subnet;
     }
 
+    /**
+     * Returns the security group rule IDs updated.
+     *
+     * @return collection of security group rule ID
+     */
+    public Collection<String> securityGroupRuleIds() {
+        return sgRuleIds;
+    }
+
     @Override
     public String toString() {
         if (port == null && subnet == null) {
@@ -146,6 +185,7 @@
                 .add("network", subject())
                 .add("port", port)
                 .add("subnet", subnet)
+                .add("security group rules", securityGroupRuleIds())
                 .toString();
     }
 }