import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;
-import javax.xml.bind.JAXBElement;
import org.codehaus.enunciate.jaxrs.ResponseCode;
import org.codehaus.enunciate.jaxrs.StatusCodes;
import org.opendaylight.controller.northbound.commons.utils.NorthboundUtils;
import org.opendaylight.controller.sal.authorization.Privilege;
import org.opendaylight.controller.sal.core.Edge;
+import org.opendaylight.controller.sal.core.NodeConnector;
import org.opendaylight.controller.sal.core.Property;
import org.opendaylight.controller.sal.utils.ServiceHelper;
import org.opendaylight.controller.sal.utils.Status;
* Authentication realm : <b>opendaylight</b><br>
* Transport : <b>HTTP and HTTPS</b><br>
* <br>
- * HTTPS Authentication is disabled by default. Administrator can enable it in
- * tomcat-server.xml after adding a proper keystore / SSL certificate from a
- * trusted authority.<br>
- * More info :
- * http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Configuration
+ * HTTPS Authentication is disabled by default.
*/
@Path("/")
@Context
public void setSecurityContext(SecurityContext context) {
- if (context != null && context.getUserPrincipal() != null) username = context.getUserPrincipal().getName();
+ if (context != null && context.getUserPrincipal() != null) {
+ username = context.getUserPrincipal().getName();
+ }
}
protected String getUserName() {
* The container for which we want to retrieve the topology (Eg.
* 'default')
*
- * @return A List of EdgeProps each EdgeProp represent an Edge of the grap
+ * @return A List of EdgeProps each EdgeProp represent an Edge of the graph
* with the corresponding properties attached to it.
*
* <pre>
*
* Example:
*
- * RequestURL:
+ * Request URL:
* http://localhost:8080/controller/nb/v2/topology/default
*
- * Response in XML:
+ * Response body in XML:
* <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
* <topology>
* <edgeProperties>
* </edgeProperties>
* </topology>
*
- * Response in JSON:
- * {"edgeProperties":[{"edge":{"tailNodeConnector":{"node":{"id":"00:00:00:00:00:00:00:02","type":"OF"},
- * "id":"2","type":"OF"},"headNodeConnector":{"node":{"id":"00:00:00:00:00:00:00:51","type":"OF"},"id":
- * "2","type":"OF"}},"properties":{"timeStamp":{"value":"1377278961017","name":"creation"}}},
- * {"edge":{"tailNodeConnector":{"node":{"id":"00:00:00:00:00:00:00:51","type":"OF"},"id":
- * "2","type":"OF"}},"headNodeConnector":{"node":{"id":"00:00:00:00:00:00:00:02","type":"OF"},
- * "id":"2","type":"OF"}},"properties":{"timeStamp":{"value":"1377278961018","name":"creation"}}}]}
- *
+ * Response body in JSON:
+ * {
+ * "edgeProperties":[
+ * {
+ * "edge":{
+ * "tailNodeConnector":{
+ * "node":{
+ * "id":"00:00:00:00:00:00:00:02",
+ * "type":"OF"
+ * },
+ * "id":"2",
+ * "type":"OF"
+ * },
+ * "headNodeConnector":{
+ * "node":{
+ * "id":"00:00:00:00:00:00:00:51",
+ * "type":"OF"
+ * },
+ * "id":"2",
+ * "type":"OF"
+ * }
+ * },
+ * "properties":{
+ * "timeStamp": {
+ * "value": 1379527162648,
+ * "name": "creation",
+ * },
+ * "name": {
+ * "value": "s2-eth3"
+ * },
+ * "state": {
+ * "value": 1
+ * },
+ * "config": {
+ * "value": 1
+ * },
+ * "bandwidth": {
+ * "value": 10000000000
+ * }
+ * }
+ * },
+ * {
+ * "edge":{
+ * "tailNodeConnector":{
+ * "node":{
+ * "id":"00:00:00:00:00:00:00:51",
+ * "type":"OF"
+ * },
+ * "id":"2",
+ * "type":"OF"
+ * },
+ * "headNodeConnector":{
+ * "node":{
+ * "id":"00:00:00:00:00:00:00:02",
+ * "type":"OF"
+ * },
+ * "id":"2",
+ * "type":"OF"
+ * }
+ * },
+ * "properties":{
+ * "timeStamp": {
+ * "value": 1379527162648,
+ * "name": "creation",
+ * }
+ * }
+ * }
+ * ]
+ * }
* </pre>
*/
@Path("/{containerName}")
@StatusCodes({ @ResponseCode(code = 404, condition = "The Container Name was not found") })
public Topology getTopology(@PathParam("containerName") String containerName) {
- if (!NorthboundUtils.isAuthorized(
- getUserName(), containerName, Privilege.READ, this)) {
- throw new UnauthorizedException(
- "User is not authorized to perform this operation on container "
- + containerName);
+ if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) {
+ throw new UnauthorizedException("User is not authorized to perform this operation on container "
+ + containerName);
}
- ITopologyManager topologyManager = (ITopologyManager) ServiceHelper
- .getInstance(ITopologyManager.class, containerName, this);
+ ITopologyManager topologyManager = (ITopologyManager) ServiceHelper.getInstance(ITopologyManager.class,
+ containerName, this);
if (topologyManager == null) {
- throw new ResourceNotFoundException(
- RestMessages.NOCONTAINER.toString());
+ throw new ResourceNotFoundException(RestMessages.NOCONTAINER.toString());
}
Map<Edge, Set<Property>> topo = topologyManager.getEdges();
if (topo != null) {
List<EdgeProperties> res = new ArrayList<EdgeProperties>();
for (Map.Entry<Edge, Set<Property>> entry : topo.entrySet()) {
- EdgeProperties el = new EdgeProperties(entry.getKey(),
- entry.getValue());
+ EdgeProperties el = new EdgeProperties(entry.getKey(), entry.getValue());
res.add(el);
}
return new Topology(res);
* Retrieve the user configured links
*
* @param containerName
- * The container for which we want to retrieve the user links (Eg. 'default')
+ * The container for which we want to retrieve the user links
+ * (Eg. 'default')
*
* @return A List of user configured links
*
- * <pre>
+ * <pre>
*
* Example:
*
- * RequestURL:
- * http://localhost:8080/controller/nb/v2/topology/default/user-link
+ * Request URL:
+ * http://localhost:8080/controller/nb/v2/topology/default/userLinks
*
- * Response in XML:
+ * Response body in XML:
* <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- * <topologyUserLinks>
+ * <list>
* <userLinks>
* <status>Success</status>
* <name>link1</name>
* <srcNodeConnector>OF|2@OF|00:00:00:00:00:00:00:02</srcNodeConnector>
* <dstNodeConnector>OF|2@OF|00:00:00:00:00:00:00:51</dstNodeConnector>
* </userLinks>
- * </topologyUserLinks>
+ * </list>
*
- * Response in JSON:
- * {"userLinks":{"status":"Success","name":"link1","srcNodeConnector":
- * "OF|2@OF|00:00:00:00:00:00:00:02","dstNodeConnector":"OF|2@OF|00:00:00:00:00:00:00:51"}}
+ * Response body in JSON:
+ * {
+ * "userLinks": [
+ * {
+ * "status": "Success",
+ * "name": "link1",
+ * "srcNodeConnector": "OF|2@OF|00:00:00:00:00:00:00:02",
+ * "dstNodeConnector": "OF|5@OF|00:00:00:00:00:00:00:05"
+ * }
+ * ]
+ * }
*
* </pre>
*/
- @Path("/{containerName}/user-link")
+ @Path("/{containerName}/userLinks")
@GET
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@TypeHint(TopologyUserLinks.class)
@StatusCodes({ @ResponseCode(code = 404, condition = "The Container Name was not found") })
- public TopologyUserLinks getUserLinks(
- @PathParam("containerName") String containerName) {
+ public TopologyUserLinks getUserLinks(@PathParam("containerName") String containerName) {
- if (!NorthboundUtils.isAuthorized(
- getUserName(), containerName, Privilege.READ, this)) {
- throw new UnauthorizedException(
- "User is not authorized to perform this operation on container "
- + containerName);
+ if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) {
+ throw new UnauthorizedException("User is not authorized to perform this operation on container "
+ + containerName);
}
- ITopologyManager topologyManager = (ITopologyManager) ServiceHelper
- .getInstance(ITopologyManager.class, containerName, this);
+ ITopologyManager topologyManager = (ITopologyManager) ServiceHelper.getInstance(ITopologyManager.class,
+ containerName, this);
if (topologyManager == null) {
- throw new ResourceNotFoundException(
- RestMessages.NOCONTAINER.toString());
+ throw new ResourceNotFoundException(RestMessages.NOCONTAINER.toString());
}
- ConcurrentMap<String, TopologyUserLinkConfig> userLinks = topologyManager
- .getUserLinks();
+ ConcurrentMap<String, TopologyUserLinkConfig> userLinks = topologyManager.getUserLinks();
if ((userLinks != null) && (userLinks.values() != null)) {
- List<TopologyUserLinkConfig> res = new ArrayList<TopologyUserLinkConfig>(
- userLinks.values());
+ List<TopologyUserLinkConfig> res = new ArrayList<TopologyUserLinkConfig>(userLinks.values());
return new TopologyUserLinks(res);
}
*
* @param containerName
* Name of the Container (Eg. 'default')
+ * @param name
+ * Name of the user link
* @param TopologyUserLinkConfig
* in JSON or XML format
* @return Response as dictated by the HTTP Response Status code
*
- * <pre>
+ * <pre>
*
* Example:
*
- * RequestURL:
- * http://localhost:8080/controller/nb/v2/topology/default/user-link
+ * Request URL:
+ * http://localhost:8080/controller/nb/v2/topology/default/userLink/link1
*
- * Request in XML:
+ * Request body in XML:
* <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
- * <topologyUserLinks>
+ * <topologyUserLinkConfig>
* <status>Success</status>
* <name>link1</name>
* <srcNodeConnector>OF|2@OF|00:00:00:00:00:00:00:02</srcNodeConnector>
* <dstNodeConnector>OF|2@OF|00:00:00:00:00:00:00:51</dstNodeConnector>
- * </topologyUserLinks>
+ * </topologyUserLinkConfig>
*
- * Request in JSON:
- * {"status":"Success","name":"link1","srcNodeConnector":"OF|2@OF|00:00:00:00:00:00:00:02","dstNodeConnector":"OF|2@OF|00:00:00:00:00:00:00:51"}
+ * Request body in JSON:
+ * {
+ * "status":"Success",
+ * "name":"link1",
+ * "srcNodeConnector":"OF|2@OF|00:00:00:00:00:00:00:02",
+ * "dstNodeConnector":"OF|2@OF|00:00:00:00:00:00:00:51"
+ * }
*
* </pre>
*/
- @Path("/{containerName}/user-link")
+ @Path("/{containerName}/userLink/{name}")
@PUT
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@StatusCodes({
- @ResponseCode(code = 201, condition = "User Link added successfully"),
- @ResponseCode(code = 404, condition = "The Container Name was not found"),
- @ResponseCode(code = 409, condition = "Failed to add User Link due to Conflicting Name"),
- @ResponseCode(code = 500, condition = "Failed to add User Link. Failure Reason included in HTTP Error response"),
- @ResponseCode(code = 503, condition = "One or more of Controller services are unavailable") })
- public Response addUserLink(
- @PathParam(value = "containerName") String containerName,
- @TypeHint(TopologyUserLinkConfig.class) JAXBElement<TopologyUserLinkConfig> userLinkConfig) {
+ @ResponseCode(code = 201, condition = "User Link added successfully"),
+ @ResponseCode(code = 404, condition = "The Container Name was not found"),
+ @ResponseCode(code = 409, condition = "Failed to add User Link due to Conflicting Name"),
+ @ResponseCode(code = 500, condition = "Failed to add User Link. Failure Reason included in HTTP Error response"),
+ @ResponseCode(code = 503, condition = "One or more of Controller services are unavailable") })
+ public Response addUserLink(@PathParam(value = "containerName") String containerName,
+ @PathParam(value = "name") String name,
+ @TypeHint(TopologyUserLinkConfig.class) TopologyUserLinkConfig userLinkConfig) {
- if (!NorthboundUtils.isAuthorized(
- getUserName(), containerName, Privilege.WRITE, this)) {
- throw new UnauthorizedException(
- "User is not authorized to perform this operation on container "
- + containerName);
+ if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)) {
+ throw new UnauthorizedException("User is not authorized to perform this operation on container "
+ + containerName);
}
- ITopologyManager topologyManager = (ITopologyManager) ServiceHelper
- .getInstance(ITopologyManager.class, containerName, this);
+ ITopologyManager topologyManager = (ITopologyManager) ServiceHelper.getInstance(ITopologyManager.class,
+ containerName, this);
if (topologyManager == null) {
- throw new ResourceNotFoundException(
- RestMessages.NOCONTAINER.toString());
+ throw new ResourceNotFoundException(RestMessages.NOCONTAINER.toString());
}
- Status status = topologyManager.addUserLink(userLinkConfig.getValue());
+ Status status = topologyManager.addUserLink(userLinkConfig);
if (status.isSuccess()) {
- NorthboundUtils.auditlog("User Link", username, "added", userLinkConfig.getValue().getName(), containerName);
+ NorthboundUtils
+ .auditlog(
+ "User Link",username,"added", userLinkConfig.getName() + " from " + NorthboundUtils.getPortName(
+ NodeConnector.fromString(userLinkConfig.getSrcNodeConnector()),
+ containerName, this) + " to "
+ + NorthboundUtils.getPortName(NodeConnector.fromString
+ (userLinkConfig.getDstNodeConnector()),containerName, this), containerName);
return Response.status(Response.Status.CREATED).build();
}
throw new InternalServerErrorException(status.getDescription());
* Name of the Link Configuration (Eg. 'config1')
* @return Response as dictated by the HTTP Response Status code
*
- * <pre>
+ * <pre>
*
* Example:
*
- * RequestURL:
- * http://localhost:8080/controller/nb/v2/topology/default/user-link/config1
+ * Request URL:
+ * http://localhost:8080/controller/nb/v2/topology/default/userLink/config1
*
* </pre>
*/
- @Path("/{containerName}/user-link/{name}")
+ @Path("/{containerName}/userLink/{name}")
@DELETE
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
- @StatusCodes({
- @ResponseCode(code = 200, condition = "Operation successful"),
- @ResponseCode(code = 404, condition = "The Container Name or Link Configuration Name was not found"),
- @ResponseCode(code = 503, condition = "One or more of Controller services are unavailable") })
- public Response deleteUserLink(
- @PathParam("containerName") String containerName,
- @PathParam("name") String name) {
+ @StatusCodes({ @ResponseCode(code = 204, condition = "User link removed successfully"),
+ @ResponseCode(code = 404, condition = "The Container Name or Link Configuration Name was not found"),
+ @ResponseCode(code = 503, condition = "One or more of Controller services are unavailable") })
+ public Response deleteUserLink(@PathParam("containerName") String containerName, @PathParam("name") String name) {
- if (!NorthboundUtils.isAuthorized(
- getUserName(), containerName, Privilege.WRITE, this)) {
- throw new UnauthorizedException(
- "User is not authorized to perform this operation on container "
- + containerName);
+ if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)) {
+ throw new UnauthorizedException("User is not authorized to perform this operation on container "
+ + containerName);
}
- ITopologyManager topologyManager = (ITopologyManager) ServiceHelper
- .getInstance(ITopologyManager.class, containerName, this);
+ ITopologyManager topologyManager = (ITopologyManager) ServiceHelper.getInstance(ITopologyManager.class,
+ containerName, this);
if (topologyManager == null) {
- throw new ResourceNotFoundException(
- RestMessages.NOCONTAINER.toString());
+ throw new ResourceNotFoundException(RestMessages.NOCONTAINER.toString());
}
Status ret = topologyManager.deleteUserLink(name);
if (ret.isSuccess()) {
NorthboundUtils.auditlog("User Link", username, "removed", name, containerName);
- return Response.ok().build();
+ return Response.noContent().build();
}
- throw new ResourceNotFoundException(ret.getDescription());
+ return NorthboundUtils.getResponse(ret);
}
}