X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fnorthbound%2Fhosttracker%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fhosttracker%2Fnorthbound%2FHostTrackerNorthbound.java;h=769461167c1036812ea33f17d0ffcf8f2b21a6c5;hp=dbc99d06e477bb238a5c49af13cade4dd30ae5dd;hb=04187bee472c35e1f200bff6ef0daeb5163d36fa;hpb=eb9e1983a0fce7e4a381eff33e40cae957cddf53 diff --git a/opendaylight/northbound/hosttracker/src/main/java/org/opendaylight/controller/hosttracker/northbound/HostTrackerNorthbound.java b/opendaylight/northbound/hosttracker/src/main/java/org/opendaylight/controller/hosttracker/northbound/HostTrackerNorthbound.java index dbc99d06e4..769461167c 100644 --- a/opendaylight/northbound/hosttracker/src/main/java/org/opendaylight/controller/hosttracker/northbound/HostTrackerNorthbound.java +++ b/opendaylight/northbound/hosttracker/src/main/java/org/opendaylight/controller/hosttracker/northbound/HostTrackerNorthbound.java @@ -10,21 +10,22 @@ package org.opendaylight.controller.hosttracker.northbound; import java.net.InetAddress; import java.net.UnknownHostException; -import java.security.Principal; +import java.util.HashSet; import java.util.List; +import java.util.Set; + import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; -import javax.ws.rs.DefaultValue; 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; -import javax.ws.rs.QueryParam; import javax.ws.rs.core.Context; 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; @@ -40,6 +41,7 @@ import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailab import org.opendaylight.controller.northbound.commons.exception.UnauthorizedException; import org.opendaylight.controller.northbound.commons.exception.UnsupportedMediaTypeException; import org.opendaylight.controller.northbound.commons.utils.NorthboundUtils; +import org.opendaylight.controller.sal.authorization.Privilege; import org.opendaylight.controller.sal.core.Node; import org.opendaylight.controller.sal.core.NodeConnector; import org.opendaylight.controller.sal.utils.GlobalConstants; @@ -48,8 +50,6 @@ import org.opendaylight.controller.sal.utils.Status; import org.opendaylight.controller.sal.utils.StatusCode; import org.opendaylight.controller.switchmanager.ISwitchManager; -import org.opendaylight.controller.sal.authorization.Privilege; - /** * Host Tracker Northbound REST APIs.
* This class provides REST APIs to track host location in a network. Host @@ -78,7 +78,7 @@ public class HostTrackerNorthbound { @Context public void setSecurityContext(SecurityContext context) { - username = context.getUserPrincipal().getName(); + if (context != null && context.getUserPrincipal() != null) username = context.getUserPrincipal().getName(); } protected String getUserName() { @@ -117,6 +117,17 @@ public class HostTrackerNorthbound { return hostTracker; } + private Hosts convertHosts(Set hostNodeConnectors) { + if(hostNodeConnectors == null) { + return null; + } + Set hosts = new HashSet(); + for(HostNodeConnector hnc : hostNodeConnectors) { + hosts.add(HostConfig.convert(hnc)); + } + return new Hosts(hosts); + } + /** * Returns a list of all Hosts : both configured via PUT API and dynamically * learnt on the network. @@ -125,6 +136,66 @@ public class HostTrackerNorthbound { * Name of the Container. The Container name for the base * controller is "default". * @return List of Active Hosts. + *
+     *
+     * Example:
+     *
+     * RequestURL:
+     *
+     * http://localhost:8080/controller/nb/v2/host/default
+     *
+     * Response in XML
+     *
+     * <list>
+     *  <hostConfig>
+     *   <dataLayerAddress>00:00:00:00:01:01</dataLayerAddress>
+     *   <networkAddress>1.1.1.1</networkAddress>
+     *   <nodeType>OF</nodeType>
+     *   <nodeId>00:00:00:00:00:00:00:01</nodeId>
+     *   <nodeConnectorType>OF</nodeConnectorType>
+     *   <nodeConnectorId>9</nodeConnectorId>
+     *   <vlan>0</vlan>
+     *   <staticHost>false</staticHost>
+     *  </hostConfig>
+     *  <hostConfig>
+     *   <dataLayerAddress>00:00:00:00:02:02</dataLayerAddress>
+     *   <networkAddress>2.2.2.2</networkAddress>
+     *   <nodeType>OF</nodeType>
+     *   <nodeId>00:00:00:00:00:00:00:02</nodeId>
+     *   <nodeConnectorType>OF</nodeConnectorType>
+     *   <nodeConnectorId>5</nodeConnectorId>
+     *   <vlan>0</vlan>
+     *   <staticHost>false</staticHost>
+     *  </hostConfig>
+     * </list>
+     *
+     * Response in JSON:
+     *
+     * {
+     *  "hostConfig":[
+     *   {
+     *    "dataLayerAddress":"00:00:00:00:01:01",
+     *    "nodeType":"OF",
+     *    "nodeId":"00:00:00:00:00:00:00:01",
+     *    "nodeConnectorType":"OF",
+     *    "nodeConnectorId":"9",
+     *    "vlan":"0",
+     *    "staticHost":"false",
+     *    "networkAddress":"1.1.1.1"
+     *   },
+     *   {
+     *    "dataLayerAddress":"00:00:00:00:02:02",
+     *    "nodeType":"OF",
+     *    "nodeId":"00:00:00:00:00:00:00:02",
+     *    "nodeConnectorType":"OF",
+     *    "nodeConnectorId":"5",
+     *    "vlan":"0",
+     *    "staticHost":"false",
+     *    "networkAddress":"2.2.2.2"
+     *   }
+     *  ]
+     * }
+     * 
*/ @Path("/{containerName}") @GET @@ -147,8 +218,7 @@ public class HostTrackerNorthbound { throw new ServiceUnavailableException("Host Tracker " + RestMessages.SERVICEUNAVAILABLE.toString()); } - - return new Hosts(hostTracker.getAllHosts()); + return convertHosts(hostTracker.getAllHosts()); } /** @@ -159,6 +229,66 @@ public class HostTrackerNorthbound { * Name of the Container. The Container name for the base * controller is "default". * @return List of inactive Hosts. + *
+     *
+     * Example:
+     *
+     * RequestURL:
+     *
+     * http://localhost:8080/controller/nb/v2/host/default/inactive
+     *
+     * Response in XML
+     *
+     * <list>
+     *  <hostConfig>
+     *   <dataLayerAddress>00:00:00:00:01:01</dataLayerAddress>
+     *   <networkAddress>1.1.1.1</networkAddress>
+     *   <nodeType>OF</nodeType>
+     *   <nodeId>00:00:00:00:00:00:00:01</nodeId>
+     *   <nodeConnectorType>OF</nodeConnectorType>
+     *   <nodeConnectorId>9</nodeConnectorId>
+     *   <vlan>0</vlan>
+     *   <staticHost>false</staticHost>
+     *  </hostConfig>
+     *  <hostConfig>
+     *   <dataLayerAddress>00:00:00:00:02:02</dataLayerAddress>
+     *   <networkAddress>2.2.2.2</networkAddress>
+     *   <nodeType>OF</nodeType>
+     *   <nodeId>00:00:00:00:00:00:00:02</nodeId>
+     *   <nodeConnectorType>OF</nodeConnectorType>
+     *   <nodeConnectorId>5</nodeConnectorId>
+     *   <vlan>0</vlan>
+     *   <staticHost>false</staticHost>
+     *  </hostConfig>
+     * </list>
+     *
+     * Response in JSON:
+     *
+     * {
+     *  "hostConfig":[
+     *   {
+     *    "dataLayerAddress":"00:00:00:00:01:01",
+     *    "nodeType":"OF",
+     *    "nodeId":"00:00:00:00:00:00:00:01",
+     *    "nodeConnectorType":"OF",
+     *    "nodeConnectorId":"9",
+     *    "vlan":"0",
+     *    "staticHost":"false",
+     *    "networkAddress":"1.1.1.1"
+     *   },
+     *   {
+     *    "dataLayerAddress":"00:00:00:00:02:02",
+     *    "nodeType":"OF",
+     *    "nodeId":"00:00:00:00:00:00:00:02",
+     *    "nodeConnectorType":"OF",
+     *    "nodeConnectorId":"5",
+     *    "vlan":"0",
+     *    "staticHost":"false",
+     *    "networkAddress":"2.2.2.2"
+     *   }
+     *  ]
+     * }
+     * 
*/ @Path("/{containerName}/inactive") @GET @@ -181,8 +311,7 @@ public class HostTrackerNorthbound { throw new ServiceUnavailableException("Host Tracker " + RestMessages.SERVICEUNAVAILABLE.toString()); } - - return new Hosts(hostTracker.getInactiveStaticHosts()); + return convertHosts(hostTracker.getInactiveStaticHosts()); } /** @@ -194,17 +323,51 @@ public class HostTrackerNorthbound { * @param networkAddress * IP Address being looked up * @return host that matches the IP Address + *
+     *
+     * Example:
+     *
+     * RequestURL:
+     *
+     * http://localhost:8080/controller/nb/v2/host/default/1.1.1.1
+     *
+     * Response in XML
+     *
+     * <hostConfig>
+     *  <dataLayerAddress>00:00:00:00:01:01</dataLayerAddress>
+     *  <networkAddress>1.1.1.1</networkAddress>
+     *  <nodeType>OF</nodeType>
+     *  <nodeId>00:00:00:00:00:00:00:01</nodeId>
+     *  <nodeConnectorType>OF</nodeConnectorType>
+     *  <nodeConnectorId>9</nodeConnectorId>
+     *  <vlan>0</vlan>
+     *  <staticHost>false</staticHost>
+     * </hostConfig>
+     *
+     * Response in JSON:
+     *
+     * {
+     *  "dataLayerAddress":"00:00:00:00:01:01",
+     *  "nodeType":"OF",
+     *  "nodeId":"00:00:00:00:00:00:00:01",
+     *  "nodeConnectorType":"OF",
+     *  "nodeConnectorId":"9",
+     *  "vlan":"0",
+     *  "staticHost":"false",
+     *  "networkAddress":"1.1.1.1"
+     * }
+     * 
*/ @Path("/{containerName}/{networkAddress}") @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - @TypeHint(HostNodeConnector.class) + @TypeHint(HostConfig.class) @StatusCodes({ @ResponseCode(code = 200, condition = "Operation successful"), @ResponseCode(code = 404, condition = "The containerName is not found"), @ResponseCode(code = 415, condition = "Invalid IP Address passed in networkAddress parameter"), @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") }) - public HostNodeConnector getHostDetails( + public HostConfig getHostDetails( @PathParam("containerName") String containerName, @PathParam("networkAddress") String networkAddress) { if (!NorthboundUtils.isAuthorized( @@ -228,7 +391,7 @@ public class HostTrackerNorthbound { } for (HostNodeConnector host : hostTracker.getAllHosts()) { if (host.getNetworkAddress().equals(ip)) { - return host; + return HostConfig.convert(host); } } throw new ResourceNotFoundException(RestMessages.NOHOST.toString()); @@ -242,26 +405,51 @@ public class HostTrackerNorthbound { * controller is "default". * @param networkAddress * Host IP Address - * @param dataLayerAddress - * Host L2 data-layer address. - * @param nodeType - * Node Type as specifid by Node class - * @param nodeId - * Node Identifier as specifid by Node class - * @param nodeConnectorType - * Port Type as specified by NodeConnector class - * @param nodeConnectorId - * Port Identifier as specified by NodeConnector class - * @param vlan - * Vlan number + * @param hostConfig + * Host Config Details * @return Response as dictated by the HTTP Response Status code + * + *
+     *
+     * Example:
+     *
+     * RequestURL:
+     *
+     * http://localhost:8080/controller/nb/v2/host/default/1.1.1.1
+     *
+     * Request in XML
+     *
+     * <hostConfig>
+     *  <dataLayerAddress>00:00:00:00:01:01</dataLayerAddress>
+     *  <networkAddress>1.1.1.1</networkAddress>
+     *  <nodeType>OF</nodeType>
+     *  <nodeId>00:00:00:00:00:00:00:01</nodeId>
+     *  <nodeConnectorType>OF</nodeConnectorType>
+     *  <nodeConnectorId>9</nodeConnectorId>
+     *  <vlan>0</vlan>
+     *  <staticHost>false</staticHost>
+     * </hostConfig>
+     *
+     * Request in JSON:
+     *
+     * {
+     *  "dataLayerAddress":"00:00:00:00:01:01",
+     *  "nodeType":"OF",
+     *  "nodeId":"00:00:00:00:00:00:00:01",
+     *  "nodeConnectorType":"OF",
+     *  "nodeConnectorId":"9",
+     *  "vlan":"0",
+     *  "staticHost":"false",
+     *  "networkAddress":"1.1.1.1"
+     * }
+     * 
*/ @Path("/{containerName}/{networkAddress}") - @POST + @PUT @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @StatusCodes({ - @ResponseCode(code = 201, condition = "Flow Config processed successfully"), + @ResponseCode(code = 201, condition = "Static host created successfully"), @ResponseCode(code = 404, condition = "The Container Name or nodeId or configuration name is not found"), @ResponseCode(code = 406, condition = "Cannot operate on Default Container when other Containers are active"), @ResponseCode(code = 415, condition = "Invalid IP Address passed in networkAddress parameter"), @@ -269,12 +457,7 @@ public class HostTrackerNorthbound { @ResponseCode(code = 503, condition = "One or more of Controller services are unavailable") }) public Response addHost(@PathParam("containerName") String containerName, @PathParam("networkAddress") String networkAddress, - @QueryParam("dataLayerAddress") String dataLayerAddress, - @QueryParam("nodeType") String nodeType, - @QueryParam("nodeId") String nodeId, - @QueryParam("nodeConnectorType") String nodeConnectorType, - @QueryParam("nodeConnectorId") String nodeConnectorId, - @DefaultValue("0") @QueryParam("vlan") String vlan) { + @TypeHint(HostConfig.class) JAXBElement hostConfig) { if (!NorthboundUtils.isAuthorized( getUserName(), containerName, Privilege.WRITE, this)) { @@ -290,7 +473,8 @@ public class HostTrackerNorthbound { + RestMessages.SERVICEUNAVAILABLE.toString()); } - Node node = handleNodeAvailability(containerName, nodeType, nodeId); + HostConfig hc = hostConfig.getValue(); + Node node = handleNodeAvailability(containerName, hc.getNodeType(), hc.getNodeId()); if (node == null) { throw new InternalServerErrorException( RestMessages.NONODE.toString()); @@ -302,15 +486,22 @@ public class HostTrackerNorthbound { throw new UnsupportedMediaTypeException(networkAddress + " " + RestMessages.INVALIDADDRESS.toString()); } - NodeConnector nc = NodeConnector.fromStringNoNode(nodeConnectorType, - nodeConnectorId, node); + if(!networkAddress.equals(hc.getNetworkAddress())) { + throw new UnsupportedMediaTypeException(networkAddress + " is not the same as " + + hc.getNetworkAddress()); + } + if(!hc.isStaticHost()) { + throw new UnsupportedMediaTypeException("StaticHost flag must be true"); + } + NodeConnector nc = NodeConnector.fromStringNoNode(hc.getNodeConnectorType(), hc.getNodeConnectorId(), node); if (nc == null) { - throw new ResourceNotFoundException(nodeConnectorType + "|" - + nodeConnectorId + " : " + RestMessages.NONODE.toString()); + throw new ResourceNotFoundException(hc.getNodeConnectorType() + "|" + + hc.getNodeConnectorId() + " : " + RestMessages.NONODE.toString()); } Status status = hostTracker.addStaticHost(networkAddress, - dataLayerAddress, nc, vlan); + hc.getDataLayerAddress(), nc, hc.getVlan()); if (status.isSuccess()) { + NorthboundUtils.auditlog("Static Host", username, "added", networkAddress, containerName); return Response.status(Response.Status.CREATED).build(); } else if (status.getCode().equals(StatusCode.BADREQUEST)) { throw new UnsupportedMediaTypeException(status.getDescription()); @@ -365,6 +556,7 @@ public class HostTrackerNorthbound { Status status = hostTracker.removeStaticHost(networkAddress); if (status.isSuccess()) { + NorthboundUtils.auditlog("Static Host", username, "removed", networkAddress, containerName); return Response.ok().build(); } throw new InternalServerErrorException(status.getDescription());