sangho
Committed by Gerrit Code Review

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
/*
* 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);
}
......@@ -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;
......
......@@ -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
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();
}
}
}
......