X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=northbound-api%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fneutron%2Fnorthbound%2Fapi%2FNeutronPortsNorthbound.java;h=63d5aaf1e585e096045ebe9e0004ad3a598a0c70;hb=58234da0bd3710227656ca8d8b4eb1082c28340a;hp=c6e91b918274a8962d6b745ca9586dd8867af2b9;hpb=a2dd33471374b463adff91aa62c280d3eb68f9de;p=neutron.git diff --git a/northbound-api/src/main/java/org/opendaylight/neutron/northbound/api/NeutronPortsNorthbound.java b/northbound-api/src/main/java/org/opendaylight/neutron/northbound/api/NeutronPortsNorthbound.java index c6e91b918..63d5aaf1e 100644 --- a/northbound-api/src/main/java/org/opendaylight/neutron/northbound/api/NeutronPortsNorthbound.java +++ b/northbound-api/src/main/java/org/opendaylight/neutron/northbound/api/NeutronPortsNorthbound.java @@ -1,5 +1,5 @@ /* - * Copyright IBM Corporation, 2013. All rights reserved. + * Copyright (c) 2013, 2015 IBM Corporation and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, @@ -11,7 +11,6 @@ package org.opendaylight.neutron.northbound.api; import java.net.HttpURLConnection; import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -38,8 +37,6 @@ import org.opendaylight.neutron.spi.INeutronPortCRUD; import org.opendaylight.neutron.spi.INeutronSubnetCRUD; import org.opendaylight.neutron.spi.NeutronCRUDInterfaces; import org.opendaylight.neutron.spi.NeutronPort; -import org.opendaylight.neutron.spi.NeutronSubnet; -import org.opendaylight.neutron.spi.Neutron_IPs; /** * Neutron Northbound REST APIs.
@@ -60,18 +57,9 @@ import org.opendaylight.neutron.spi.Neutron_IPs; */ @Path("/ports") -public class NeutronPortsNorthbound { +public class NeutronPortsNorthbound extends AbstractNeutronNorthbound { - private static final int HTTP_OK_BOTTOM = 200; - private static final int HTTP_OK_TOP = 299; - private static final String INTERFACE_NAME = "Port CRUD Interface"; - private static final String UUID_NO_EXIST = "Port UUID does not exist."; - private static final String UUID_EXISTS = "Port UUID already exists."; - private static final String NO_PROVIDERS = "No providers registered. Please try again later"; - private static final String NO_PROVIDER_LIST = "Couldn't get providers list. Please try again later"; - private static final String NET_UUID_MATCH = "Network UUID must match that of subnet"; - - private static final String MAC_REGEX="^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$"; + private static final String RESOURCE_NAME = "Port"; private NeutronPort extractFields(NeutronPort o, List fields) { return o.extractFields(fields); @@ -80,8 +68,7 @@ public class NeutronPortsNorthbound { private NeutronCRUDInterfaces getNeutronInterfaces(boolean needNetworks, boolean needSubnets) { NeutronCRUDInterfaces answer = new NeutronCRUDInterfaces().fetchINeutronPortCRUD(this); if (answer.getPortInterface() == null) { - throw new ServiceUnavailableException(INTERFACE_NAME - + RestMessages.SERVICEUNAVAILABLE.toString()); + throw new ServiceUnavailableException(serviceUnavailable(RESOURCE_NAME)); } if (needNetworks) { answer = answer.fetchINeutronNetworkCRUD( this); @@ -186,7 +173,7 @@ public class NeutronPortsNorthbound { @QueryParam("fields") List fields ) { INeutronPortCRUD portInterface = getNeutronInterfaces(false, false).getPortInterface(); if (!portInterface.portExists(portUUID)) { - throw new ResourceNotFoundException(UUID_NO_EXIST); + throw new ResourceNotFoundException(uuidNoExist(RESOURCE_NAME)); } if (fields.size() > 0) { NeutronPort ans = portInterface.getPort(portUUID); @@ -207,74 +194,13 @@ public class NeutronPortsNorthbound { //@TypeHint(OpenStackPorts.class) @StatusCodes({ @ResponseCode(code = HttpURLConnection.HTTP_CREATED, condition = "Created"), - @ResponseCode(code = HttpURLConnection.HTTP_BAD_REQUEST, condition = "Bad Request"), - @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"), - @ResponseCode(code = HttpURLConnection.HTTP_FORBIDDEN, condition = "Forbidden"), - @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"), - @ResponseCode(code = HttpURLConnection.HTTP_CONFLICT, condition = "Conflict"), - @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"), - @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "MAC generation failure"), @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") }) public Response createPorts(final NeutronPortRequest input) { NeutronCRUDInterfaces interfaces = getNeutronInterfaces(true, true); INeutronPortCRUD portInterface = interfaces.getPortInterface(); - INeutronNetworkCRUD networkInterface = interfaces.getNetworkInterface(); - INeutronSubnetCRUD subnetInterface = interfaces.getSubnetInterface(); if (input.isSingleton()) { NeutronPort singleton = input.getSingleton(); - /* - * the port must be part of an existing network, must not already exist, - * have a valid MAC and the MAC not be in use - */ - if (singleton.getNetworkUUID() == null) { - throw new BadRequestException("network UUID musy be specified"); - } - if (portInterface.portExists(singleton.getID())) { - throw new BadRequestException(UUID_EXISTS); - } - if (!networkInterface.networkExists(singleton.getNetworkUUID())) { - throw new ResourceNotFoundException("network UUID does not exist."); - } - if (singleton.getMacAddress() == null || - !singleton.getMacAddress().matches(MAC_REGEX)) { - throw new BadRequestException("MAC address not properly formatted"); - } - if (portInterface.macInUse(singleton.getMacAddress())) { - throw new ResourceConflictException("MAC Address is in use."); - } - /* - * if fixed IPs are specified, each one has to have an existing subnet ID - * that is in the same scoping network as the port. In addition, if an IP - * address is specified it has to be a valid address for the subnet and not - * already in use - */ - List fixedIPs = singleton.getFixedIPs(); - if (fixedIPs != null && fixedIPs.size() > 0) { - Iterator fixedIPIterator = fixedIPs.iterator(); - while (fixedIPIterator.hasNext()) { - Neutron_IPs ip = fixedIPIterator.next(); - if (ip.getSubnetUUID() == null) { - throw new BadRequestException("subnet UUID not specified"); - } - NeutronSubnet subnet = subnetInterface.getSubnet(ip.getSubnetUUID()); - if (subnet == null) { - throw new BadRequestException("subnet UUID must exist"); - } - if (!singleton.getNetworkUUID().equalsIgnoreCase(subnet.getNetworkUUID())) { - throw new BadRequestException(NET_UUID_MATCH); - } - if (ip.getIpAddress() != null) { - if (!subnet.isValidIP(ip.getIpAddress())) { - throw new BadRequestException("IP address is not valid"); - } - if (subnet.isIPInUse(ip.getIpAddress())) { - throw new ResourceConflictException("IP address is in use."); - } - } - } - } - Object[] instances = NeutronUtil.getInstances(INeutronPortAware.class, this); if (instances != null) { if (instances.length > 0) { @@ -301,82 +227,9 @@ public class NeutronPortsNorthbound { } } } else { - List bulk = input.getBulk(); - Iterator i = bulk.iterator(); - HashMap testMap = new HashMap(); Object[] instances = NeutronUtil.getInstances(INeutronPortAware.class, this); - while (i.hasNext()) { - NeutronPort test = i.next(); - - /* - * the port must be part of an existing network, must not already exist, - * have a valid MAC and the MAC not be in use. Further the bulk request - * can't already contain a new port with the same UUID - */ - if (portInterface.portExists(test.getID())) { - throw new BadRequestException(UUID_EXISTS); - } - if (testMap.containsKey(test.getID())) { - throw new BadRequestException(UUID_EXISTS); - } - for (NeutronPort check : testMap.values()) { - if (test.getMacAddress().equalsIgnoreCase(check.getMacAddress())) { - throw new ResourceConflictException("MAC address already allocated"); - } - for (Neutron_IPs test_fixedIP : test.getFixedIPs()) { - for (Neutron_IPs check_fixedIP : check.getFixedIPs()) { - if (test_fixedIP.getSubnetUUID().equals(check_fixedIP.getSubnetUUID())) { - if (test_fixedIP.getIpAddress().equals(check_fixedIP.getIpAddress())) { - throw new ResourceConflictException("IP address already allocated"); - } - } - } - } - } - testMap.put(test.getID(), test); - if (!networkInterface.networkExists(test.getNetworkUUID())) { - throw new ResourceNotFoundException("network UUID does not exist."); - } - if (!test.getMacAddress().matches(MAC_REGEX)) { - throw new BadRequestException("MAC address not properly formatted"); - } - if (portInterface.macInUse(test.getMacAddress())) { - throw new ResourceConflictException("MAC address in use"); - } + for (NeutronPort test : input.getBulk()) { - /* - * if fixed IPs are specified, each one has to have an existing subnet ID - * that is in the same scoping network as the port. In addition, if an IP - * address is specified it has to be a valid address for the subnet and not - * already in use (or be the gateway IP address of the subnet) - */ - List fixedIPs = test.getFixedIPs(); - if (fixedIPs != null && fixedIPs.size() > 0) { - Iterator fixedIPIterator = fixedIPs.iterator(); - while (fixedIPIterator.hasNext()) { - Neutron_IPs ip = fixedIPIterator.next(); - if (ip.getSubnetUUID() == null) { - throw new BadRequestException("subnet UUID must be specified"); - } - if (!subnetInterface.subnetExists(ip.getSubnetUUID())) { - throw new BadRequestException("subnet UUID doesn't exists"); - } - NeutronSubnet subnet = subnetInterface.getSubnet(ip.getSubnetUUID()); - if (!test.getNetworkUUID().equalsIgnoreCase(subnet.getNetworkUUID())) { - throw new BadRequestException(NET_UUID_MATCH); - } - if (ip.getIpAddress() != null) { - if (!subnet.isValidIP(ip.getIpAddress())) { - throw new BadRequestException("ip address not valid"); - } - //TODO: need to add consideration for a fixed IP being assigned the same address as a allocated IP in the - //same bulk create - if (subnet.isIPInUse(ip.getIpAddress())) { - throw new ResourceConflictException("IP address in use"); - } - } - } - } if (instances != null) { if (instances.length > 0) { for (Object instance : instances) { @@ -395,9 +248,7 @@ public class NeutronPortsNorthbound { } //once everything has passed, then we can add to the cache - i = bulk.iterator(); - while (i.hasNext()) { - NeutronPort test = i.next(); + for (NeutronPort test : input.getBulk()) { portInterface.addPort(test); if (instances != null) { for (Object instance : instances) { @@ -420,12 +271,6 @@ public class NeutronPortsNorthbound { //@TypeHint(OpenStackPorts.class) @StatusCodes({ @ResponseCode(code = HttpURLConnection.HTTP_OK, condition = "Operation successful"), - @ResponseCode(code = HttpURLConnection.HTTP_BAD_REQUEST, condition = "Bad Request"), - @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"), - @ResponseCode(code = HttpURLConnection.HTTP_FORBIDDEN, condition = "Forbidden"), - @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"), - @ResponseCode(code = HttpURLConnection.HTTP_CONFLICT, condition = "Conflict"), - @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"), @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") }) public Response updatePort( @PathParam("portUUID") String portUUID, @@ -433,23 +278,29 @@ public class NeutronPortsNorthbound { ) { NeutronCRUDInterfaces interfaces = getNeutronInterfaces(false, true); INeutronPortCRUD portInterface = interfaces.getPortInterface(); - INeutronSubnetCRUD subnetInterface = interfaces.getSubnetInterface(); + NeutronPort original = portInterface.getPort(portUUID); - // port has to exist and only a single delta is supported - if (!portInterface.portExists(portUUID)) { - throw new ResourceNotFoundException(UUID_NO_EXIST); + /* + * note: what we would like to get is the complete object as it + * is known by neutron. Until then, patch what we *do* get + * so that we don't lose already known information + */ + + NeutronPort updatedObject = input.getSingleton(); + if (updatedObject.getID() == null) { + updatedObject.setID(portUUID); } - NeutronPort target = portInterface.getPort(portUUID); - if (!input.isSingleton()) { - throw new BadRequestException("only singleton edit suported"); + if (updatedObject.getTenantID() == null) { + updatedObject.setTenantID(original.getTenantID()); } - NeutronPort singleton = input.getSingleton(); - NeutronPort original = portInterface.getPort(portUUID); - - // deltas restricted by Neutron - if (singleton.getID() != null || singleton.getTenantID() != null || - singleton.getStatus() != null) { - throw new BadRequestException("attribute change blocked by Neutron"); + if (updatedObject.getNetworkUUID() == null) { + updatedObject.setNetworkUUID(original.getNetworkUUID()); + } + if (updatedObject.getMacAddress() == null) { + updatedObject.setMacAddress(original.getMacAddress()); + } + if (updatedObject.getFixedIPs() == null) { + updatedObject.setFixedIPs(original.getFixedIPs()); } Object[] instances = NeutronUtil.getInstances(INeutronPortAware.class, this); @@ -457,7 +308,7 @@ public class NeutronPortsNorthbound { if (instances.length > 0) { for (Object instance : instances) { INeutronPortAware service = (INeutronPortAware) instance; - int status = service.canUpdatePort(singleton, original); + int status = service.canUpdatePort(updatedObject, original); if (status < HTTP_OK_BOTTOM || status > HTTP_OK_TOP) { return Response.status(status).build(); } @@ -469,45 +320,17 @@ public class NeutronPortsNorthbound { throw new ServiceUnavailableException(NO_PROVIDER_LIST); } - // Verify the new fixed ips are valid - List fixedIPs = singleton.getFixedIPs(); - if (fixedIPs != null && fixedIPs.size() > 0) { - Iterator fixedIPIterator = fixedIPs.iterator(); - while (fixedIPIterator.hasNext()) { - Neutron_IPs ip = fixedIPIterator.next(); - if (ip.getSubnetUUID() == null) { - throw new BadRequestException("subnet UUID must be specified"); - } - if (!subnetInterface.subnetExists(ip.getSubnetUUID())) { - throw new BadRequestException("subnet UUID doesn't exist."); - } - NeutronSubnet subnet = subnetInterface.getSubnet(ip.getSubnetUUID()); - if (!target.getNetworkUUID().equalsIgnoreCase(subnet.getNetworkUUID())) { - throw new BadRequestException(NET_UUID_MATCH); - } - if (ip.getIpAddress() != null) { - if (!subnet.isValidIP(ip.getIpAddress())) { - throw new BadRequestException("invalid IP address"); - } - if (subnet.isIPInUse(ip.getIpAddress())) { - throw new ResourceConflictException("IP address in use"); - } - } - } - } - // TODO: Support change of security groups // update the port and return the modified object - portInterface.updatePort(portUUID, singleton); - NeutronPort updatedPort = portInterface.getPort(portUUID); + portInterface.updatePort(portUUID, updatedObject); if (instances != null) { for (Object instance : instances) { INeutronPortAware service = (INeutronPortAware) instance; - service.neutronPortUpdated(updatedPort); + service.neutronPortUpdated(updatedObject); } } return Response.status(HttpURLConnection.HTTP_OK).entity( - new NeutronPortRequest(updatedPort)).build(); + new NeutronPortRequest(updatedObject)).build(); } @@ -518,24 +341,11 @@ public class NeutronPortsNorthbound { @DELETE @StatusCodes({ @ResponseCode(code = HttpURLConnection.HTTP_NO_CONTENT, condition = "No Content"), - @ResponseCode(code = HttpURLConnection.HTTP_UNAUTHORIZED, condition = "Unauthorized"), - @ResponseCode(code = HttpURLConnection.HTTP_FORBIDDEN, condition = "Forbidden"), - @ResponseCode(code = HttpURLConnection.HTTP_NOT_FOUND, condition = "Not Found"), - @ResponseCode(code = HttpURLConnection.HTTP_NOT_IMPLEMENTED, condition = "Not Implemented"), @ResponseCode(code = HttpURLConnection.HTTP_UNAVAILABLE, condition = "No providers available") }) public Response deletePort( @PathParam("portUUID") String portUUID) { INeutronPortCRUD portInterface = getNeutronInterfaces(false, false).getPortInterface(); - // port has to exist and not be owned by anyone. then it can be removed from the cache - if (!portInterface.portExists(portUUID)) { - throw new ResourceNotFoundException(UUID_NO_EXIST); - } - NeutronPort port = portInterface.getPort(portUUID); - if (port.getDeviceID() != null || - port.getDeviceOwner() != null) { - Response.status(HttpURLConnection.HTTP_FORBIDDEN).build(); - } NeutronPort singleton = portInterface.getPort(portUUID); Object[] instances = NeutronUtil.getInstances(INeutronPortAware.class, this); if (instances != null) {