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();
+ }
}
}