Follow up for OpenstackSwitching Refactoring: Updates flow rules for security group updated.

- When security groups are updated, updates the flow rules for the security groups via the SecurityGroupService.

Change-Id: I13eacd3a21f804221bdd29105a304a9a1e10f2a8
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSecurityGroupService.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSecurityGroupService.java
new file mode 100644
index 0000000..284a840
--- /dev/null
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSecurityGroupService.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.openstacknetworking;
+
+import org.onosproject.openstackinterface.OpenstackPort;
+
+/**
+ * Represents OpenstackSecurityGroupService Interface.
+ */
+public interface OpenstackSecurityGroupService {
+
+    /**
+     * Updates the flow rules for Security Group for the VM (OpenstackPort).
+     *
+     * @param osPort OpenstackPort information for the VM
+     */
+    void updateSecurityGroup(OpenstackPort osPort);
+}
diff --git a/apps/openstacknetworking/switching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSecurityGroupRulePopulator.java b/apps/openstacknetworking/switching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSecurityGroupRulePopulator.java
index b963988..82a5bac 100644
--- a/apps/openstacknetworking/switching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSecurityGroupRulePopulator.java
+++ b/apps/openstacknetworking/switching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSecurityGroupRulePopulator.java
@@ -23,6 +23,7 @@
 import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.IPv4;
 import org.onlab.packet.Ip4Address;
@@ -41,6 +42,7 @@
 import org.onosproject.openstackinterface.OpenstackPort;
 import org.onosproject.openstackinterface.OpenstackSecurityGroup;
 import org.onosproject.openstackinterface.OpenstackSecurityGroupRule;
+import org.onosproject.openstacknetworking.OpenstackSecurityGroupService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -57,7 +59,9 @@
  *
  */
 @Component(immediate = true)
-public class OpenstackSecurityGroupRulePopulator extends AbstractVmHandler {
+@Service
+public class OpenstackSecurityGroupRulePopulator extends AbstractVmHandler
+        implements OpenstackSecurityGroupService {
 
     private final Logger log = LoggerFactory.getLogger(getClass());
 
@@ -84,7 +88,7 @@
         super.deactivate();
     }
 
-    // TODO call this when port is updated from OpenStack
+    @Override
     public void updateSecurityGroup(OpenstackPort osPort) {
         if (!osPort.status().equals(OpenstackPort.PortStatus.ACTIVE)) {
             return;
diff --git a/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortWebResource.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortWebResource.java
index e23a3ee..4dd2533 100644
--- a/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortWebResource.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortWebResource.java
@@ -15,7 +15,14 @@
  */
 package org.onosproject.openstacknetworking.web;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.openstackinterface.OpenstackPort;
+import org.onosproject.openstackinterface.web.OpenstackPortCodec;
+import org.onosproject.openstacknetworking.OpenstackSecurityGroupService;
 import org.onosproject.rest.AbstractWebResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
@@ -26,13 +33,20 @@
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import java.io.IOException;
 import java.io.InputStream;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 /**
  * Handles Rest API call from Neutron ML2 plugin.
  */
 @Path("ports")
 public class OpenstackPortWebResource extends AbstractWebResource {
+    private final Logger log = LoggerFactory.getLogger(getClass());
+
+    private static final OpenstackPortCodec PORT_CODEC
+            = new OpenstackPortCodec();
 
     @POST
     @Consumes(MediaType.APPLICATION_JSON)
@@ -51,8 +65,26 @@
     @Path("{id}")
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    public Response updatePorts(InputStream input) {
-        // TODO call security group update here
-        return Response.status(Response.Status.OK).build();
+    public Response updatePorts(@PathParam("id") String id, InputStream input) {
+        checkNotNull(input);
+        checkNotNull(id);
+
+        try {
+            ObjectMapper mapper = new ObjectMapper();
+            ObjectNode portNode = (ObjectNode) mapper.readTree(input);
+            OpenstackPort osPort = PORT_CODEC.decode(portNode, this);
+
+            OpenstackSecurityGroupService sgService
+                    = getService(OpenstackSecurityGroupService.class);
+            sgService.updateSecurityGroup(osPort);
+
+            return Response.status(Response.Status.OK).build();
+
+        } catch (IOException e) {
+            log.error("UpdatePort post process failed due to {}", e.getMessage());
+
+            return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.getMessage())
+                    .build();
+        }
     }
 }