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 0000000000..284a840ac1 --- /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 b963988a22..82a5bacb35 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.Component; 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.OpenstackInterfaceService; 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 @@ import static org.onosproject.openstacknetworking.Constants.*; * */ @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 @@ public class OpenstackSecurityGroupRulePopulator extends AbstractVmHandler { 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 e23a3eec4e..4dd2533786 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.PathParam; 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 @@ public class OpenstackPortWebResource extends AbstractWebResource { @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(); + } } }