X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fnorthbound%2Ftopology%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Ftopology%2Fnorthbound%2FTopologyNorthboundJAXRS.java;h=c20cb26885006f0f5a3234466bfb4445ed641033;hp=323e2d2211deaa916ce5b81257bde2074592aa65;hb=04187bee472c35e1f200bff6ef0daeb5163d36fa;hpb=39e1d43dc8f41f682fb818469a3aeb542e76ea8e diff --git a/opendaylight/northbound/topology/src/main/java/org/opendaylight/controller/topology/northbound/TopologyNorthboundJAXRS.java b/opendaylight/northbound/topology/src/main/java/org/opendaylight/controller/topology/northbound/TopologyNorthboundJAXRS.java index 323e2d2211..c20cb26885 100644 --- a/opendaylight/northbound/topology/src/main/java/org/opendaylight/controller/topology/northbound/TopologyNorthboundJAXRS.java +++ b/opendaylight/northbound/topology/src/main/java/org/opendaylight/controller/topology/northbound/TopologyNorthboundJAXRS.java @@ -17,7 +17,7 @@ import java.util.concurrent.ConcurrentMap; import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; -import javax.ws.rs.POST; +import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @@ -66,7 +66,7 @@ public class TopologyNorthboundJAXRS { @Context public void setSecurityContext(SecurityContext context) { - username = context.getUserPrincipal().getName(); + if (context != null && context.getUserPrincipal() != null) username = context.getUserPrincipal().getName(); } protected String getUserName() { @@ -78,16 +78,109 @@ public class TopologyNorthboundJAXRS { * Retrieve the Topology * * @param containerName - * The container for which we want to retrieve the topology + * 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 * with the corresponding properties attached to it. + * + *
+     *
+     * Example:
+     *
+     * RequestURL:
+     * http://localhost:8080/controller/nb/v2/topology/default
+     *
+     * Response in XML:
+     * <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+     * <topology>
+     *     <edgeProperties>
+     *         <edge>
+     *             <tailNodeConnector>
+     *                 <node>
+     *                     <id>00:00:00:00:00:00:00:02</id>
+     *                     <type>OF</type>
+     *                 </node>
+     *                 <id>2</id>
+     *                 <type>OF</type>
+     *             </tailNodeConnector>
+     *             <headNodeConnector>
+     *                 <node>
+     *                     <id>00:00:00:00:00:00:00:51</id>
+     *                     <type>OF</type>
+     *                 </node>
+     *                 <id>2</id>
+     *                 <type>OF</type>
+     *             </headNodeConnector>
+     *         </edge>
+     *         <properties>
+     *             <state>
+     *                 <value>1</value>
+     *             </state>
+     *             <config>
+     *                 <value>1</value>
+     *             </config>
+     *             <name>
+     *                 <value>C1_2-L2_2</value>
+     *             </name>
+     *             <timeStamp>
+     *                 <value>1377279422032</value>
+     *                 <name>creation</name>
+     *             </timeStamp>
+     *         </properties>
+     *     </edgeProperties>
+     *     <edgeProperties>
+     *         <edge>
+     *             <tailNodeConnector>
+     *                 <node>
+     *                     <id>00:00:00:00:00:00:00:51</id>
+     *                     <type>OF</type>
+     *                 </node>
+     *                 <id>2</id>
+     *                 <type>OF</type>
+     *             </tailNodeConnector>
+     *             <headNodeConnector>
+     *                 <node>
+     *                     <id>00:00:00:00:00:00:00:02</id>
+     *                     <type>OF</type>
+     *                 </node>
+     *                 <id>2</id>
+     *                 <type>OF</type>
+     *             </headNodeConnector>
+     *         </edge>
+     *         <properties>
+     *             <state>
+     *                 <value>1</value>
+     *             </state>
+     *             <name>
+     *                 <value>L2_2-C1_2</value>
+     *             </name>
+     *             <config>
+     *                 <value>1</value>
+     *             </config>
+     *             <timeStamp>
+     *                 <value>1377279423564</value>
+     *                 <name>creation</name>
+     *             </timeStamp>
+     *         </properties>
+     *     </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"}}}]}
+     *
+     * 
*/ @Path("/{containerName}") @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @TypeHint(Topology.class) - @StatusCodes({ @ResponseCode(code = 404, condition = "The Container Name passed was not found") }) + @StatusCodes({ @ResponseCode(code = 404, condition = "The Container Name was not found") }) public Topology getTopology(@PathParam("containerName") String containerName) { if (!NorthboundUtils.isAuthorized( @@ -121,15 +214,39 @@ public class TopologyNorthboundJAXRS { * Retrieve the user configured links * * @param containerName - * The container for which we want to retrieve the user links + * The container for which we want to retrieve the user links (Eg. 'default') * * @return A List of user configured links + * + *
+     *
+     * Example:
+     *
+     * RequestURL:
+     * http://localhost:8080/controller/nb/v2/topology/default/user-link
+     *
+     * Response in XML:
+     * <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+     * <topologyUserLinks>
+     * <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>
+     *
+     * 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"}}
+     *
+     * 
*/ - @Path("/{containerName}/userLink") + @Path("/{containerName}/user-link") @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @TypeHint(TopologyUserLinks.class) - @StatusCodes({ @ResponseCode(code = 404, condition = "The Container Name passed was not found") }) + @StatusCodes({ @ResponseCode(code = 404, condition = "The Container Name was not found") }) public TopologyUserLinks getUserLinks( @PathParam("containerName") String containerName) { @@ -161,18 +278,39 @@ public class TopologyNorthboundJAXRS { * Add an User Link * * @param containerName - * Name of the Container. The base Container is "default". + * Name of the Container (Eg. 'default') * @param TopologyUserLinkConfig * in JSON or XML format * @return Response as dictated by the HTTP Response Status code + * + *
+     *
+     * Example:
+     *
+     * RequestURL:
+     * http://localhost:8080/controller/nb/v2/topology/default/user-link
+     *
+     * Request in XML:
+     * <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+     * <topologyUserLinks>
+     * <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>
+     *
+     * 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"}
+     *
+     * 
*/ - - @Path("/{containerName}/userLink") - @POST + @Path("/{containerName}/user-link") + @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 passed was not found"), + @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") }) @@ -195,6 +333,7 @@ public class TopologyNorthboundJAXRS { Status status = topologyManager.addUserLink(userLinkConfig.getValue()); if (status.isSuccess()) { + NorthboundUtils.auditlog("User Link", username, "added", userLinkConfig.getValue().getName(), containerName); return Response.status(Response.Status.CREATED).build(); } throw new InternalServerErrorException(status.getDescription()); @@ -204,15 +343,24 @@ public class TopologyNorthboundJAXRS { * Delete an User Link * * @param containerName - * Name of the Container. The base Container is "default". + * Name of the Container (Eg. 'default') * @param name - * Name of the Link Configuration + * Name of the Link Configuration (Eg. 'config1') * @return Response as dictated by the HTTP Response Status code + * + *
+     *
+     * Example:
+     *
+     * RequestURL:
+     * http://localhost:8080/controller/nb/v2/topology/default/user-link/config1
+     *
+     * 
*/ - - @Path("/{containerName}/userLink/{name}") + @Path("/{containerName}/user-link/{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"), @@ -236,9 +384,9 @@ public class TopologyNorthboundJAXRS { Status ret = topologyManager.deleteUserLink(name); if (ret.isSuccess()) { + NorthboundUtils.auditlog("User Link", username, "removed", name, containerName); return Response.ok().build(); } throw new ResourceNotFoundException(ret.getDescription()); } - }