From: Tony Tkacik Date: Wed, 14 May 2014 10:16:45 +0000 (+0000) Subject: Merge "BUG 1001 Failing test - RestGetOperationTest.getStreamsTest" X-Git-Tag: autorelease-tag-v20140601202136_82eb3f9~91 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=b2d51144854503513151435f164510ef0dd47b1f;hp=c5b57b3f5784c8e185c54dd370b2392a0cc83b19 Merge "BUG 1001 Failing test - RestGetOperationTest.getStreamsTest" --- diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/config/yang/md/sal/connector/netconf/NetconfConnectorModule.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/config/yang/md/sal/connector/netconf/NetconfConnectorModule.java index 7bf8ee860d..de3c18db69 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/config/yang/md/sal/connector/netconf/NetconfConnectorModule.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/config/yang/md/sal/connector/netconf/NetconfConnectorModule.java @@ -23,11 +23,14 @@ import org.opendaylight.controller.netconf.client.NetconfClientDispatcher; import org.opendaylight.controller.netconf.client.NetconfClientDispatcherImpl; import org.opendaylight.controller.netconf.client.conf.NetconfClientConfiguration; import org.opendaylight.controller.netconf.client.conf.NetconfClientConfigurationBuilder; +import org.opendaylight.controller.netconf.client.conf.NetconfReconnectingClientConfiguration; +import org.opendaylight.controller.netconf.client.conf.NetconfReconnectingClientConfigurationBuilder; import org.opendaylight.controller.netconf.util.handler.ssh.authentication.LoginPassword; import org.opendaylight.controller.sal.binding.api.data.DataProviderService; import org.opendaylight.controller.sal.connect.netconf.NetconfDevice; import org.opendaylight.controller.sal.connect.netconf.NetconfDeviceListener; import org.opendaylight.protocol.framework.ReconnectStrategy; +import org.opendaylight.protocol.framework.ReconnectStrategyFactory; import org.opendaylight.protocol.framework.TimedReconnectStrategy; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; @@ -141,12 +144,12 @@ public final class NetconfConnectorModule extends org.opendaylight.controller.co this.bundleContext = bundleContext; } - public NetconfClientConfiguration getClientConfig(final NetconfDevice device) { + public NetconfReconnectingClientConfiguration getClientConfig(final NetconfDevice device) { InetSocketAddress socketAddress = getSocketAddress(); ReconnectStrategy strategy = getReconnectStrategy(); long clientConnectionTimeoutMillis = getConnectionTimeoutMillis(); - return NetconfClientConfigurationBuilder.create() + return NetconfReconnectingClientConfigurationBuilder.create() .withAddress(socketAddress) .withConnectionTimeoutMillis(clientConnectionTimeoutMillis) .withReconnectStrategy(strategy) @@ -155,6 +158,12 @@ public final class NetconfConnectorModule extends org.opendaylight.controller.co .withProtocol(getTcpOnly() ? NetconfClientConfiguration.NetconfClientProtocol.TCP : NetconfClientConfiguration.NetconfClientProtocol.SSH) + .withConnectStrategyFactory(new ReconnectStrategyFactory() { + @Override + public ReconnectStrategy createReconnectStrategy() { + return getReconnectStrategy(); + } + }) .build(); } @@ -166,7 +175,7 @@ public final class NetconfConnectorModule extends org.opendaylight.controller.co logger.trace("Setting {} on {} to infinity", maxConnectionAttemptsJmxAttribute, this); connectionAttempts = null; } - double sleepFactor = 1.0; + double sleepFactor = 1.5; int minSleep = 1000; Long maxSleep = null; Long deadline = null; diff --git a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfDevice.java b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfDevice.java index 54242cf26d..94beaed0df 100644 --- a/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfDevice.java +++ b/opendaylight/md-sal/sal-netconf-connector/src/main/java/org/opendaylight/controller/sal/connect/netconf/NetconfDevice.java @@ -40,6 +40,7 @@ import org.opendaylight.controller.md.sal.common.api.data.DataModification; import org.opendaylight.controller.md.sal.common.api.data.DataReader; import org.opendaylight.controller.netconf.client.NetconfClientDispatcher; import org.opendaylight.controller.netconf.client.conf.NetconfClientConfiguration; +import org.opendaylight.controller.netconf.client.conf.NetconfReconnectingClientConfiguration; import org.opendaylight.controller.sal.binding.api.data.DataProviderService; import org.opendaylight.controller.sal.core.api.Broker.ProviderSession; import org.opendaylight.controller.sal.core.api.Broker.RpcRegistration; @@ -126,7 +127,7 @@ public class NetconfDevice implements Provider, // private boolean rollbackSupported; - private NetconfClientConfiguration clientConfig; + private NetconfReconnectingClientConfiguration clientConfig; private volatile DataProviderService dataProviderService; public NetconfDevice(String name) { @@ -146,7 +147,7 @@ public class NetconfDevice implements Provider, // logger.info("Starting NETCONF Client {} for address {}", name, socketAddress); - dispatcher.createClient(clientConfig); + dispatcher.createReconnectingClient(clientConfig); } Optional getSchemaContext() { @@ -491,7 +492,7 @@ public class NetconfDevice implements Provider, // this.dispatcher = dispatcher; } - public void setClientConfig(final NetconfClientConfiguration clientConfig) { + public void setClientConfig(final NetconfReconnectingClientConfiguration clientConfig) { this.clientConfig = clientConfig; } diff --git a/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronNetworksNorthbound.java b/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronNetworksNorthbound.java index d7437c831d..52c3337e40 100644 --- a/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronNetworksNorthbound.java +++ b/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronNetworksNorthbound.java @@ -9,12 +9,15 @@ package org.opendaylight.controller.networkconfig.neutron.northbound; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; 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; @@ -22,7 +25,9 @@ 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.UriInfo; import javax.ws.rs.core.Response; import org.codehaus.enunciate.jaxrs.ResponseCode; @@ -60,6 +65,9 @@ import org.opendaylight.controller.sal.utils.ServiceHelper; @Path("/networks") public class NeutronNetworksNorthbound { + @Context + UriInfo uriInfo; + private NeutronNetwork extractFields(NeutronNetwork o, List fields) { return o.extractFields(fields); } @@ -72,7 +80,7 @@ public class NeutronNetworksNorthbound { //@TypeHint(OpenStackNetworks.class) @StatusCodes({ @ResponseCode(code = 200, condition = "Operation successful"), - @ResponseCode(code = 401, condition = "Unauthorized") }) + @ResponseCode(code = 401, condition = "Unauthorized")}) public Response listNetworks( // return fields @QueryParam("fields") List fields, @@ -88,9 +96,9 @@ public class NeutronNetworksNorthbound { @QueryParam("provider_physical_network") String queryProviderPhysicalNetwork, @QueryParam("provider_segmentation_id") String queryProviderSegmentationID, // pagination - @QueryParam("limit") String limit, + @QueryParam("limit") Integer limit, @QueryParam("marker") String marker, - @QueryParam("page_reverse") String pageReverse + @DefaultValue("false") @QueryParam("page_reverse") Boolean pageReverse // sorting not supported ) { INeutronNetworkCRUD networkInterface = NeutronCRUDInterfaces.getINeutronNetworkCRUD( this); @@ -130,9 +138,94 @@ public class NeutronNetworksNorthbound { } } } - //TODO: apply pagination to results - return Response.status(200).entity( - new NeutronNetworkRequest(ans)).build(); + + Comparator neutronNetworkComparator = new Comparator() { + @Override + public int compare(NeutronNetwork o1, NeutronNetwork o2) { + return o1.getID().compareTo(o2.getID()); + } + }; + + Collections.sort(ans, neutronNetworkComparator); + + if (limit != null && ans.size() > 1) { + List links = new ArrayList<>(); + Integer startPos = null; + String startMarker; + String endMarker; + Boolean firstPage = false; + Boolean lastPage = false; + + if (marker == null) { + startPos = 0; + } + + else { + + NeutronNetwork markerNetwork = new NeutronNetwork(); + markerNetwork.setNetworkUUID(marker); + + startPos = Collections.binarySearch(ans, markerNetwork, neutronNetworkComparator); + + if (!pageReverse){ + startPos = startPos + 1; + } + else { + startPos = startPos - limit; + } + + } + + if (startPos == null) { + throw new ResourceNotFoundException("UUID for marker:" + marker + " could not be found"); + } + + if (startPos == 0){ + firstPage = true; + } + + if (startPos + limit >= ans.size()) { + ans = ans.subList(startPos, ans.size()); + startMarker = ans.get(0).getID(); + endMarker = ans.get(ans.size() - 1).getID(); + lastPage = true; + } + else if (startPos < 0) { + if (startPos + limit > 0) { + ans = ans.subList(0, startPos + limit); + startMarker = ans.get(0).getID(); + endMarker = ans.get(ans.size() - 1).getID(); + firstPage = true; + } + else { + throw new BadRequestException("Requested page is out of bounds. Please check the supplied limit and marker"); + } + } + else { + ans = ans.subList(startPos, startPos + limit); + startMarker = ans.get(0).getID(); + endMarker = ans.get(limit-1).getID(); + } + + if (!lastPage) { + NeutronPageLink next = new NeutronPageLink(); + next.setRef("next"); + next.setHref(uriInfo.getAbsolutePath().toString() + "?limit=" + limit.toString() + "&marker=" + endMarker); + links.add(next); + } + + if (!firstPage) { + NeutronPageLink previous = new NeutronPageLink(); + previous.setRef("previous"); + previous.setHref(uriInfo.getAbsolutePath().toString() + "?limit=" + limit.toString() + "&marker=" + startMarker + "&page_reverse=True"); + links.add(previous); + } + + return Response.status(200).entity(new PaginatedNeutronNetworkRequest(ans, links)).build(); + } + + return Response.status(200).entity(new NeutronNetworkRequest(ans)).build(); + } /** diff --git a/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronPageLink.java b/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronPageLink.java new file mode 100644 index 0000000000..f65d7f694b --- /dev/null +++ b/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronPageLink.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2014 Hewlett-Packard Development Company L.P + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + * + * Authors : Dave Tucker + */ + +package org.opendaylight.controller.networkconfig.neutron.northbound; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement +@XmlAccessorType(XmlAccessType.NONE) + +public class NeutronPageLink { + + @XmlElement(name="ref") + String ref; + + @XmlElement (name="href") + String href; + + public String getRef() { + return ref; + } + + public void setRef(String ref) { + this.ref = ref; + } + + public String getHref() { + return href; + } + + public void setHref(String href) { + this.href = href; + } +} \ No newline at end of file diff --git a/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/PaginatedNeutronNetworkRequest.java b/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/PaginatedNeutronNetworkRequest.java new file mode 100644 index 0000000000..c050661329 --- /dev/null +++ b/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/PaginatedNeutronNetworkRequest.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2014 Hewlett-Packard Development Company L.P + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + * + * Authors : Dave Tucker + */ + +package org.opendaylight.controller.networkconfig.neutron.northbound; + +import org.opendaylight.controller.networkconfig.neutron.NeutronNetwork; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import java.util.List; + +@XmlRootElement +@XmlAccessorType(XmlAccessType.NONE) + +public class PaginatedNeutronNetworkRequest { + + @XmlElement (name="networks") + List networks; + + @XmlElement (name="network_links") + List networkLinks; + + public PaginatedNeutronNetworkRequest() { + } + + public PaginatedNeutronNetworkRequest(List networks, List networkLinks) { + this.networks = networks; + this.networkLinks = networkLinks; + } + + public List getNetworks() { + return networks; + } + + public void setNetworks(List networks) { + this.networks = networks; + } + + public List getNetworkLinks() { + return networkLinks; + } + + public void setNetworkLinks(List networkLinks) { + this.networkLinks = networkLinks; + } +}