Mahesh Poojary S
Committed by Mahesh Poojary Huawei

[ONOS-4160] PCE REST

Change-Id: Iec0554190876c7363114c03aa5d2b25b42ade071
Showing 20 changed files with 56 additions and 362 deletions
/*
* Copyright 2016 Open Networking Laboratory
* 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.
......@@ -21,6 +21,7 @@ import org.apache.karaf.shell.commands.Argument;
import org.apache.karaf.shell.commands.Command;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.incubator.net.tunnel.TunnelId;
import org.onosproject.pce.pceservice.api.PceService;
import org.slf4j.Logger;
......@@ -41,10 +42,9 @@ public class PceDeletePathCommand extends AbstractShellCommand {
PceService service = get(PceService.class);
//TODO: need to uncomment below lines once releasePath method is added to PceService
//if (!service.releasePath(PcePathId.of(id))) {
// error("Path deletion failed.");
// return;
//}
if (!service.releasePath(TunnelId.valueOf(id))) {
error("Path deletion failed.");
return;
}
}
}
......
/*
* Copyright 2016 Open Networking Laboratory
* 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.
......@@ -22,6 +22,7 @@ import org.apache.karaf.shell.commands.Option;
import org.onosproject.cli.AbstractShellCommand;
import org.onosproject.incubator.net.tunnel.Tunnel;
import org.onosproject.incubator.net.tunnel.TunnelId;
import org.onosproject.net.AnnotationKeys;
import org.onosproject.pce.pceservice.api.PceService;
......@@ -45,8 +46,7 @@ public class PceQueryPathCommand extends AbstractShellCommand {
PceService service = get(PceService.class);
if (null == id) {
//TODO: need to uncomment below line once queryAllPath method is added to PceService
Iterable<Tunnel> tunnels = null; // = service.queryAllPath();
Iterable<Tunnel> tunnels = service.queryAllPath();
if (tunnels != null) {
for (final Tunnel tunnel : tunnels) {
display(tunnel);
......@@ -56,8 +56,7 @@ public class PceQueryPathCommand extends AbstractShellCommand {
return;
}
} else {
//TODO: need to uncomment below line once queryPath method is added to PceService
Tunnel tunnel = null; // = service.queryPath(PcePathId.of(id));
Tunnel tunnel = service.queryPath(TunnelId.valueOf(id));
if (tunnel == null) {
print("Path doesnot exists.");
return;
......
/*
* Copyright 2016 Open Networking Laboratory
* 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.
......@@ -86,9 +86,8 @@ public class PceSetupPathCommand extends AbstractShellCommand {
//listConstrnt.add(LocalBandwidthConstraint.of(bandwidth, DataRateUnit.valueOf("BPS")));
}
//TODO: need to uncomment below lines once setupPath method is modified in PceService
//if (null == service.setupPath(srcDevice, dstDevice, name, listConstrnt, lspType)) {
// error("Path creation failed.");
//}
if (!service.setupPath(srcDevice, dstDevice, name, listConstrnt, lspType)) {
error("Path creation failed.");
}
}
}
......
/*
* Copyright 2016 Open Networking Laboratory
* 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.
......
/*
* Copyright 2016 Open Networking Laboratory
* 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.
......
......@@ -244,12 +244,14 @@ public final class DefaultPcePath implements PcePath {
this.id = TunnelId.valueOf(tunnel.tunnelId().id());
this.source = tunnel.src().toString();
this.destination = tunnel.dst().toString();
//TODO: need to uncomment below line once LSP_SIG_TYPE is added to AnnotationKeys
this.lspType = null; // = LspType.valueOf(tunnel.annotations().value(AnnotationKeys.LSP_SIG_TYPE));
//TODO: need to uncomment below line once LSP_SIG_TYPE is added to AnnotationKeys.
this.lspType = null; // = LspType.valueOf(tunnel.annotations()
//.value(AnnotationKeys.LSP_SIG_TYPE));
this.name = tunnel.tunnelName().toString();
this.costConstraint = null; //CostConstraint.of(tunnel.path().cost());
this.bandwidthConstraint = null;
//LocalBandwidthConstraint.of(tunnel.annotations().value(AnnotationKeys.BANDWIDTH));
//TODO: uncomment below lines once CostConstraint and LocalBandwidthConstraint classes are ready
this.costConstraint = null; // = CostConstraint.of(tunnel.path().cost());
this.bandwidthConstraint = null; // = LocalBandwidthConstraint.of(tunnel.annotations()
//.value(AnnotationKeys.BANDWIDTH));
return this;
}
......
/*
* Copyright 2016 Open Networking Laboratory
* 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.
......@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.pce.web;
package org.onosproject.pce.rest;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
......
/*
* Copyright 2016 Open Networking Laboratory
* 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.
......@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.pce.web;
package org.onosproject.pce.rest;
import static com.google.common.base.Preconditions.checkNotNull;
......
/*
* Copyright 2016 Open Networking Laboratory
* 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.
......@@ -13,9 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.pce.web;
package org.onosproject.pce.rest;
import static javax.ws.rs.core.Response.Status.OK;
import static org.onlab.util.Tools.nullIsNotFound;
import java.io.IOException;
import java.io.InputStream;
......@@ -34,8 +35,10 @@ import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.onosproject.incubator.net.tunnel.Tunnel;
import org.onosproject.incubator.net.tunnel.TunnelId;
import org.onosproject.net.DeviceId;
import org.onosproject.net.intent.Constraint;
import org.onosproject.pce.pceservice.api.PceService;
import org.onosproject.pce.pceservice.PcePath;
import org.onosproject.pce.pceservice.DefaultPcePath;
import org.onosproject.pce.pceservice.LspType;
......@@ -58,6 +61,7 @@ public class PcePathWebResource extends AbstractWebResource {
public static final String PCE_PATH_NOT_FOUND = "Path not found";
public static final String PCE_PATH_ID_EXIST = "Path exists";
public static final String PCE_PATH_ID_NOT_EXIST = "Path does not exist for the identifier";
public static final String PCE_SETUP_PATH_FAILED = "PCE Setup path has failed.";
/**
* Retrieve details of all paths created.
......@@ -68,8 +72,7 @@ public class PcePathWebResource extends AbstractWebResource {
@Produces(MediaType.APPLICATION_JSON)
public Response queryAllPath() {
log.debug("Query all paths.");
//TODO: need to uncomment below line once queryAllPath method is added to PceService
Iterable<Tunnel> tunnels = null; // = get(PceService.class).queryAllPath();
Iterable<Tunnel> tunnels = get(PceService.class).queryAllPath();
ObjectNode result = mapper().createObjectNode();
ArrayNode pathEntry = result.putArray("paths");
if (tunnels != null) {
......@@ -92,9 +95,8 @@ public class PcePathWebResource extends AbstractWebResource {
@Produces(MediaType.APPLICATION_JSON)
public Response queryPath(@PathParam("path_id") String id) {
log.debug("Query path by identifier {}.", id);
//TODO: need to uncomment below lines once queryPath method is added to PceService
Tunnel tunnel = null; // = nullIsNotFound(get(PceService.class).queryPath(PcePathId.of(id)),
//PCE_PATH_NOT_FOUND);
Tunnel tunnel = nullIsNotFound(get(PceService.class).queryPath(TunnelId.valueOf(id)),
PCE_PATH_NOT_FOUND);
PcePath path = DefaultPcePath.builder().of(tunnel).build();
ObjectNode result = mapper().createObjectNode();
result.set("path", codec(PcePath.class).encode(path, this));
......@@ -131,9 +133,9 @@ public class PcePathWebResource extends AbstractWebResource {
//listConstrnt.add(LocalBandwidthConstraint.of(Double.valueOf(path.constraint().bandwidth()), DataRateUnit
// .valueOf("BPS")));
//TODO: need to uncomment below lines once setupPath method is modified in PceService
Boolean issuccess = true; // = (null != get(PceService.class)
//.setupPath(srcDevice, dstDevice, path.name(), listConstrnt, lspType)) ? true : false;
Boolean issuccess = nullIsNotFound(get(PceService.class)
.setupPath(srcDevice, dstDevice, path.name(), listConstrnt, lspType),
PCE_SETUP_PATH_FAILED);
return Response.status(OK).entity(issuccess.toString()).build();
} catch (IOException e) {
log.error("Exception while creating path {}.", e.toString());
......@@ -174,9 +176,8 @@ public class PcePathWebResource extends AbstractWebResource {
// .of(path.constraint().bandwidth(), DataRateUnit.valueOf("BPS")));
}
//TODO: need to uncomment below line once updatePath is added to PceService
Boolean result = true; // = (null != (get(PceService.class).updatePath(PcePathId.of(id), constrntList)))
//? true : false;
Boolean result = nullIsNotFound(get(PceService.class).updatePath(TunnelId.valueOf(id), constrntList),
PCE_PATH_NOT_FOUND);
return Response.status(OK).entity(result.toString()).build();
} catch (IOException e) {
log.error("Update path failed because of exception {}.", e.toString());
......@@ -195,9 +196,8 @@ public class PcePathWebResource extends AbstractWebResource {
public Response releasePath(@PathParam("path_id") String id) {
log.debug("Deletes path by identifier {}.", id);
//TODO: need to uncomment below lines once releasePath method is added to PceService
Boolean isSuccess = true; // = nullIsNotFound(get(PceService.class).releasePath(PcePathId.of(id)),
//PCE_PATH_NOT_FOUND);
Boolean isSuccess = nullIsNotFound(get(PceService.class).releasePath(TunnelId.valueOf(id)),
PCE_PATH_NOT_FOUND);
if (!isSuccess) {
log.debug("Path identifier {} does not exist", id);
}
......
/*
* Copyright 2016 Open Networking Laboratory
* 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.
......@@ -14,7 +14,7 @@
* limitations under the License.
*/
package org.onosproject.pce.web;
package org.onosproject.pce.rest;
import org.onlab.rest.AbstractWebApplication;
......
/*
* Copyright 2016 Open Networking Laboratory
* 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.
......@@ -17,4 +17,4 @@
/**
* PCE rest application.
*/
package org.onosproject.pce.web;
package org.onosproject.pce.rest;
......
<!--
~ Copyright 2016 Open Networking Laboratory
~ 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.
......
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright 2016 Open Networking Laboratory
~ 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.
......@@ -25,7 +25,7 @@
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>org.onosproject.pce.web.PceWebApplication</param-value>
<param-value>org.onosproject.pce.rest.PceWebApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
......
/*
* Copyright 2016 Open Networking Laboratory
* 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.
......@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.pce.web;
package org.onosproject.pce.rest;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.CodecService;
......
/*
* Copyright 2016 Open Networking Laboratory
* 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.
......@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.pce.web;
package org.onosproject.pce.rest;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
......
/*
* Copyright 2016 Open Networking Laboratory
* 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.
......@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.pce.web;
package org.onosproject.pce.rest;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
......
/*
* Copyright 2016 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.pce.web;
//import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.createMock;
//import static org.easymock.EasyMock.expect;
//import static org.easymock.EasyMock.replay;
//import static org.hamcrest.Matchers.containsString;
//import static org.hamcrest.Matchers.is;
//import static org.hamcrest.Matchers.notNullValue;
//import static org.junit.Assert.assertThat;
//import static org.junit.Assert.fail;
//import javax.ws.rs.NotFoundException;
//import javax.ws.rs.client.Entity;
//import javax.ws.rs.client.WebTarget;
//import javax.ws.rs.core.MediaType;
//import javax.ws.rs.core.Response;
//import java.io.InputStream;
//import java.net.HttpURLConnection;
//import java.util.HashSet;
//import java.util.List;
//import java.util.Objects;
//import java.util.Optional;
//import java.util.Set;
//import com.eclipsesource.json.Json;
//import com.eclipsesource.json.JsonObject;
//import com.google.common.collect.ImmutableList;
//import com.google.common.collect.Lists;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onlab.osgi.ServiceDirectory;
import org.onlab.osgi.TestServiceDirectory;
import org.onlab.rest.BaseResource;
import org.onosproject.codec.CodecService;
import org.onosproject.incubator.net.tunnel.TunnelId;
import org.onosproject.net.intent.Constraint;
import org.onosproject.pce.pceservice.PcePath;
import org.onosproject.pce.pceservice.LspType;
import org.onosproject.pce.pceservice.api.PceService;
/**
* Unit tests for pce path REST APIs.
*/
public class PcePathResourceTest extends PceResourceTest {
final PceService pceService = createMock(PceService.class);
final TunnelId pcePathId1 = TunnelId.valueOf("1");
//TODO: will be uncommented below lines once CostConstraint and LocalBandwidthConstraint classes are ready
final Constraint costConstraint = null; //CostConstraint.of("2");
final Constraint bandwidthConstraint = null; //LocalBandwidthConstraint.of("200.0");
final LspType lspType = LspType.WITH_SIGNALLING;
final MockPcePath pcePath1 = new MockPcePath(pcePathId1, "11.0.0.1", "11.0.0.2", lspType, "pcc2",
costConstraint, bandwidthConstraint);
/**
* Mock class for a pce path.
*/
private static class MockPcePath implements PcePath {
private TunnelId id;
private String source;
private String destination;
private LspType lspType;
private String name;
private Constraint costConstraint;
private Constraint bandwidthConstraint;
/**
* Constructor to initialize member variables.
*
* @param id pce path id
* @param src source device
* @param dst destination device
* @param type lsp type
* @param name symbolic path name
* @param constrnt pce constraint
*/
public MockPcePath(TunnelId id, String src, String dst, LspType type, String name,
Constraint costConstrnt, Constraint bandwidthConstrnt) {
this.id = id;
this.source = src;
this.destination = dst;
this.name = name;
this.lspType = type;
this.costConstraint = costConstrnt;
this.bandwidthConstraint = bandwidthConstrnt;
}
@Override
public TunnelId id() {
return id;
}
@Override
public void id(TunnelId id) {
this.id = id;
}
@Override
public String source() {
return source;
}
@Override
public void source(String src) {
this.source = src;
}
@Override
public String destination() {
return destination;
}
@Override
public void destination(String dst) {
this.destination = dst;
}
@Override
public LspType lspType() {
return lspType;
}
@Override
public String name() {
return name;
}
@Override
public Constraint costConstraint() {
return costConstraint;
}
@Override
public Constraint bandwidthConstraint() {
return bandwidthConstraint;
}
@Override
public PcePath copy(PcePath path) {
if (null != path.source()) {
this.source = path.source();
}
if (null != path.destination()) {
this.destination = path.destination();
}
if (this.lspType != path.lspType()) {
this.lspType = path.lspType();
}
if (null != path.name()) {
this.name = path.name();
}
if (null != path.costConstraint()) {
this.costConstraint = path.costConstraint();
}
if (null != path.bandwidthConstraint()) {
this.bandwidthConstraint = path.bandwidthConstraint();
}
return this;
}
}
/**
* Sets up the global values for all the tests.
*/
@Before
public void setUpTest() {
MockPceCodecContext context = new MockPceCodecContext();
ServiceDirectory testDirectory = new TestServiceDirectory().add(PceService.class, pceService)
.add(CodecService.class, context.codecManager());
BaseResource.setServiceDirectory(testDirectory);
}
/**
* Cleans up.
*/
@After
public void tearDownTest() {
}
/**
* Tests the result of the rest api GET when there are no pce paths.
*/
@Test
public void testPcePathsEmpty() {
//TODO: will be uncommented below code once PceService is ready
//expect(pceService.queryAllPath()).andReturn(null).anyTimes();
//replay(pceService);
//final WebTarget wt = target();
//final String response = wt.path("path").request().get(String.class);
//assertThat(response, is("{\"paths\":[]}"));
}
/**
* Tests the result of a rest api GET for pce path id.
*/
@Test
public void testGetTunnelId() {
//TODO: will be uncommented below code once PceService is ready
//final Set<PcePath> pcePaths = new HashSet<>();
//pcePaths.add(pcePath1);
//expect(pceService.queryPath(anyObject())).andReturn(pcePath1).anyTimes();
//replay(pceService);
//final WebTarget wt = target();
//final String response = wt.path("path/1").request().get(String.class);
//final JsonObject result = Json.parse(response).asObject();
//assertThat(result, notNullValue());
}
/**
* Tests that a fetch of a non-existent pce path object throws an exception.
*/
@Test
public void testBadGet() {
//TODO: will be uncommented below code once PceService is ready
//expect(pceService.queryPath(anyObject()))
// .andReturn(null).anyTimes();
//replay(pceService);
//WebTarget wt = target();
//try {
// wt.path("path/1").request().get(String.class);
// fail("Fetch of non-existent pce path did not throw an exception");
//} catch (NotFoundException ex) {
// assertThat(ex.getMessage(),
// containsString("HTTP 404 Not Found"));
//}
}
/**
* Tests creating a pce path with POST.
*/
@Test
public void testPost() {
//TODO: will be uncommented below code once PceService is ready
//expect(pceService.setupPath(anyObject()))
// .andReturn(true).anyTimes();
//replay(pceService);
//WebTarget wt = target();
//InputStream jsonStream = PcePathResourceTest.class.getResourceAsStream("post-PcePath.json");
//Response response = wt.path("path")
// .request(MediaType.APPLICATION_JSON_TYPE)
// .post(Entity.json(jsonStream));
//assertThat(response.getStatus(), is(HttpURLConnection.HTTP_OK));
}
/**
* Tests creating a pce path with PUT.
*/
@Test
public void testPut() {
//TODO: will be uncommented below code once PceService is ready
//expect(pceService.updatePath(anyObject()))
// .andReturn(true).anyTimes();
//replay(pceService);
//WebTarget wt = target();
//InputStream jsonStream = PcePathResourceTest.class.getResourceAsStream("post-PcePath.json");
//Response response = wt.path("path/1")
// .request(MediaType.APPLICATION_JSON_TYPE)
// .put(Entity.json(jsonStream));
//assertThat(response.getStatus(), is(HttpURLConnection.HTTP_OK));
}
/**
* Tests deleting a pce path.
*/
@Test
public void testDelete() {
//TODO: will be uncommented below code once PceService is ready
//expect(pceService.releasePath(anyObject()))
// .andReturn(true).anyTimes();
//replay(pceService);
//WebTarget wt = target();
//String location = "path/1";
//Response deleteResponse = wt.path(location)
// .request(MediaType.APPLICATION_JSON_TYPE)
// .delete();
//assertThat(deleteResponse.getStatus(),
// is(HttpURLConnection.HTTP_OK));
}
}