Jian Li
Committed by Gerrit Code Review

Allow to specify appId through FlowObjective REST API

Change-Id: Iadff74d379e1d5ec4f6e8ff2cda2ad96892d2cc1
......@@ -20,7 +20,6 @@ import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
import org.onosproject.net.flow.TrafficTreatment;
import org.onosproject.net.flow.criteria.Criterion;
......@@ -37,7 +36,7 @@ import static org.slf4j.LoggerFactory.getLogger;
/**
* Filtering Objective Codec.
*/
public class FilteringObjectiveCodec extends JsonCodec<FilteringObjective> {
public final class FilteringObjectiveCodec extends JsonCodec<FilteringObjective> {
private final Logger log = getLogger(getClass());
// JSON field names
......@@ -45,6 +44,7 @@ public class FilteringObjectiveCodec extends JsonCodec<FilteringObjective> {
private static final String TYPE = "type";
private static final String KEY = "key";
private static final String META = "meta";
private static final String APP_ID = "appId";
private static final String OPERATION = "operation";
private static final String CONDITIONS = "conditions";
......@@ -118,9 +118,12 @@ public class FilteringObjectiveCodec extends JsonCodec<FilteringObjective> {
final DefaultFilteringObjective.Builder builder =
(DefaultFilteringObjective.Builder) och.decode(json, baseBuilder, context);
// application id
ApplicationId appId = coreService.registerApplication(REST_APP_ID);
builder.fromApp(appId);
JsonNode appIdJson = json.get(APP_ID);
String appId = appIdJson != null ? appIdJson.asText() : REST_APP_ID;
builder.fromApp(coreService.registerApplication(appId));
// decode type
String typeStr = nullIsIllegal(json.get(TYPE), TYPE + MISSING_MEMBER_MESSAGE).asText();
......
......@@ -19,7 +19,6 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.TrafficTreatment;
......@@ -34,11 +33,12 @@ import static org.slf4j.LoggerFactory.getLogger;
/**
* Forwarding Objective Codec.
*/
public class ForwardingObjectiveCodec extends JsonCodec<ForwardingObjective> {
public final class ForwardingObjectiveCodec extends JsonCodec<ForwardingObjective> {
private final Logger log = getLogger(getClass());
// JSON field names
private static final String ID = "id";
private static final String APP_ID = "appId";
private static final String SELECTOR = "selector";
private static final String FLAG = "flag";
private static final String OPERATION = "operation";
......@@ -116,8 +116,9 @@ public class ForwardingObjectiveCodec extends JsonCodec<ForwardingObjective> {
(DefaultForwardingObjective.Builder) och.decode(json, baseBuilder, context);
// application id
ApplicationId appId = coreService.registerApplication(REST_APP_ID);
builder.fromApp(appId);
JsonNode appIdJson = json.get(APP_ID);
String appId = appIdJson != null ? appIdJson.asText() : REST_APP_ID;
builder.fromApp(coreService.registerApplication(appId));
// decode flag
String flagStr = nullIsIllegal(json.get(FLAG), FLAG + MISSING_MEMBER_MESSAGE).asText();
......
......@@ -20,7 +20,6 @@ import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.TrafficTreatment;
......@@ -37,12 +36,13 @@ import static org.slf4j.LoggerFactory.getLogger;
/**
* Next Objective Codec.
*/
public class NextObjectiveCodec extends JsonCodec<NextObjective> {
public final class NextObjectiveCodec extends JsonCodec<NextObjective> {
private final Logger log = getLogger(getClass());
// JSON field names
private static final String ID = "id";
private static final String APP_ID = "appId";
private static final String TYPE = "type";
private static final String OPERATION = "operation";
private static final String TREATMENTS = "treatments";
......@@ -121,8 +121,9 @@ public class NextObjectiveCodec extends JsonCodec<NextObjective> {
builder.withId(idJson.asInt());
// decode application id
ApplicationId appId = coreService.registerApplication(REST_APP_ID);
builder.fromApp(appId);
JsonNode appIdJson = json.get(APP_ID);
String appId = appIdJson != null ? appIdJson.asText() : REST_APP_ID;
builder.fromApp(coreService.registerApplication(appId));
// decode type
String typeStr = nullIsIllegal(json.get(TYPE), TYPE + MISSING_MEMBER_MESSAGE).asText();
......
......@@ -21,7 +21,9 @@ import org.junit.Before;
import org.junit.Test;
import org.onlab.packet.VlanId;
import org.onosproject.codec.JsonCodec;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
import org.onosproject.core.DefaultApplicationId;
import org.onosproject.net.flow.criteria.Criteria;
import org.onosproject.net.flow.criteria.Criterion;
import org.onosproject.net.flowobjective.DefaultFilteringObjective;
......@@ -47,6 +49,7 @@ public class FilteringObjectiveCodecTest {
MockCodecContext context;
JsonCodec<FilteringObjective> filteringObjectiveCodec;
final CoreService mockCoreService = createMock(CoreService.class);
static final String SAMPLE_APP_ID = "org.onosproject.sample";
/**
* Sets up for each test.
......@@ -58,9 +61,6 @@ public class FilteringObjectiveCodecTest {
filteringObjectiveCodec = context.codec(FilteringObjective.class);
assertThat(filteringObjectiveCodec, notNullValue());
expect(mockCoreService.registerApplication(FilteringObjectiveCodec.REST_APP_ID))
.andReturn(APP_ID).anyTimes();
replay(mockCoreService);
context.registerService(CoreService.class, mockCoreService);
}
......@@ -93,6 +93,12 @@ public class FilteringObjectiveCodecTest {
*/
@Test
public void testFilteringObjectiveDecode() throws IOException {
ApplicationId appId = new DefaultApplicationId(0, SAMPLE_APP_ID);
expect(mockCoreService.registerApplication(SAMPLE_APP_ID)).andReturn(appId).anyTimes();
replay(mockCoreService);
FilteringObjective filteringObjective = getFilteringObjective("FilteringObjective.json");
assertThat(filteringObjective.type(), is(FilteringObjective.Type.PERMIT));
......
......@@ -21,7 +21,9 @@ import org.junit.Before;
import org.junit.Test;
import org.onlab.packet.VlanId;
import org.onosproject.codec.JsonCodec;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
import org.onosproject.core.DefaultApplicationId;
import org.onosproject.net.flow.DefaultTrafficSelector;
import org.onosproject.net.flow.TrafficSelector;
import org.onosproject.net.flow.criteria.Criteria;
......@@ -32,9 +34,7 @@ import org.onosproject.net.flowobjective.ForwardingObjective;
import java.io.IOException;
import java.io.InputStream;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.*;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
......@@ -49,6 +49,7 @@ public class ForwardingObjectiveCodecTest {
MockCodecContext context;
JsonCodec<ForwardingObjective> forwardingObjectiveCodec;
final CoreService mockCoreService = createMock(CoreService.class);
static final String SAMPLE_APP_ID = "org.onosproject.sample";
/**
* Sets up for each test.
......@@ -60,9 +61,6 @@ public class ForwardingObjectiveCodecTest {
forwardingObjectiveCodec = context.codec(ForwardingObjective.class);
assertThat(forwardingObjectiveCodec, notNullValue());
expect(mockCoreService.registerApplication(ForwardingObjectiveCodec.REST_APP_ID))
.andReturn(APP_ID).anyTimes();
replay(mockCoreService);
context.registerService(CoreService.class, mockCoreService);
}
......@@ -97,6 +95,12 @@ public class ForwardingObjectiveCodecTest {
*/
@Test
public void testForwardingObjectiveDecode() throws IOException {
ApplicationId appId = new DefaultApplicationId(0, SAMPLE_APP_ID);
expect(mockCoreService.registerApplication(SAMPLE_APP_ID)).andReturn(appId).anyTimes();
replay(mockCoreService);
ForwardingObjective forwardingObjective = getForwardingObjective("ForwardingObjective.json");
assertThat(forwardingObjective.flag(), is(ForwardingObjective.Flag.SPECIFIC));
......@@ -104,6 +108,7 @@ public class ForwardingObjectiveCodecTest {
assertThat(forwardingObjective.timeout(), is(1));
assertThat(forwardingObjective.op(), is(ForwardingObjective.Operation.ADD));
assertThat(forwardingObjective.permanent(), is(false));
assertThat(forwardingObjective.appId().name(), is(SAMPLE_APP_ID));
}
/**
......
......@@ -20,7 +20,9 @@ import com.fasterxml.jackson.databind.node.ObjectNode;
import org.junit.Before;
import org.junit.Test;
import org.onosproject.codec.JsonCodec;
import org.onosproject.core.ApplicationId;
import org.onosproject.core.CoreService;
import org.onosproject.core.DefaultApplicationId;
import org.onosproject.net.flow.DefaultTrafficTreatment;
import org.onosproject.net.flow.TrafficTreatment;
import org.onosproject.net.flowobjective.DefaultNextObjective;
......@@ -46,6 +48,7 @@ public class NextObjectiveCodecTest {
MockCodecContext context;
JsonCodec<NextObjective> nextObjectiveCodec;
final CoreService mockCoreService = createMock(CoreService.class);
static final String SAMPLE_APP_ID = "org.onosproject.sample";
/**
* Sets up for each test.
......@@ -57,9 +60,6 @@ public class NextObjectiveCodecTest {
nextObjectiveCodec = context.codec(NextObjective.class);
assertThat(nextObjectiveCodec, notNullValue());
expect(mockCoreService.registerApplication(NextObjectiveCodec.REST_APP_ID))
.andReturn(APP_ID).anyTimes();
replay(mockCoreService);
context.registerService(CoreService.class, mockCoreService);
}
......@@ -89,6 +89,12 @@ public class NextObjectiveCodecTest {
*/
@Test
public void testNextObjectiveDecode() throws IOException {
ApplicationId appId = new DefaultApplicationId(0, SAMPLE_APP_ID);
expect(mockCoreService.registerApplication(SAMPLE_APP_ID)).andReturn(appId).anyTimes();
replay(mockCoreService);
NextObjective nextObjective = getNextObjective("NextObjective.json");
assertThat(nextObjective.type(), is(NextObjective.Type.FAILOVER));
......
{
"priority": 60,
"appId": "org.onosproject.sample",
"isPermanent": "false",
"timeout": 1,
"type": "PERMIT",
......
{
"priority": 60,
"appId": "org.onosproject.sample",
"isPermanent": "false",
"timeout": 1,
"flag": "SPECIFIC",
......
{
"id": 1,
"appId": "org.onosproject.sample",
"type": "FAILOVER",
"operation": "ADD",
"treatments": [
......
......@@ -30,6 +30,7 @@ import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
......@@ -57,6 +58,7 @@ public class FlowObjectiveWebResource extends AbstractWebResource {
/**
* Creates and installs a new filtering objective for the specified device.
*
* @param appId application identifier
* @param deviceId device identifier
* @param stream filtering objective JSON
* @return status of the request - CREATED if the JSON is correct,
......@@ -67,12 +69,18 @@ public class FlowObjectiveWebResource extends AbstractWebResource {
@Path("{deviceId}/filter")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createFilteringObjective(@PathParam("deviceId") String deviceId,
public Response createFilteringObjective(@QueryParam("appId") String appId,
@PathParam("deviceId") String deviceId,
InputStream stream) {
try {
UriBuilder locationBuilder = null;
ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
if (validateDeviceId(deviceId, jsonTree)) {
if (appId != null) {
jsonTree.put("appId", appId);
}
DeviceId did = DeviceId.deviceId(deviceId);
FilteringObjective filteringObjective =
codec(FilteringObjective.class).decode(jsonTree, this);
......@@ -94,6 +102,7 @@ public class FlowObjectiveWebResource extends AbstractWebResource {
/**
* Creates and installs a new forwarding objective for the specified device.
*
* @param appId application identifier
* @param deviceId device identifier
* @param stream forwarding objective JSON
* @return status of the request - CREATED if the JSON is correct,
......@@ -104,12 +113,18 @@ public class FlowObjectiveWebResource extends AbstractWebResource {
@Path("{deviceId}/forward")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createForwardingObjective(@PathParam("deviceId") String deviceId,
public Response createForwardingObjective(@QueryParam("appId") String appId,
@PathParam("deviceId") String deviceId,
InputStream stream) {
try {
UriBuilder locationBuilder = null;
ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
if (validateDeviceId(deviceId, jsonTree)) {
if (appId != null) {
jsonTree.put("appId", appId);
}
DeviceId did = DeviceId.deviceId(deviceId);
ForwardingObjective forwardingObjective =
codec(ForwardingObjective.class).decode(jsonTree, this);
......@@ -131,6 +146,7 @@ public class FlowObjectiveWebResource extends AbstractWebResource {
/**
* Creates and installs a new next objective for the specified device.
*
* @param appId application identifier
* @param deviceId device identifier
* @param stream next objective JSON
* @return status of the request - CREATED if the JSON is correct,
......@@ -141,12 +157,18 @@ public class FlowObjectiveWebResource extends AbstractWebResource {
@Path("{deviceId}/next")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response createNextObjective(@PathParam("deviceId") String deviceId,
public Response createNextObjective(@QueryParam("appId") String appId,
@PathParam("deviceId") String deviceId,
InputStream stream) {
try {
UriBuilder locationBuilder = null;
ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
if (validateDeviceId(deviceId, jsonTree)) {
if (appId != null) {
jsonTree.put("appId", appId);
}
DeviceId did = DeviceId.deviceId(deviceId);
NextObjective nextObjective =
codec(NextObjective.class).decode(jsonTree, this);
......