From: Martin Bobak Date: Tue, 24 Mar 2015 13:57:58 +0000 (+0100) Subject: API changes in RequestCtx and DeviceCtx X-Git-Tag: release/lithium~620 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=8e8dd79eb3d6a52c6ed6f414f04a3b3f3317cbc8;p=openflowplugin.git API changes in RequestCtx and DeviceCtx Change-Id: Id671b7782cdc2133b3c108416fa8d7def03d3670 Signed-off-by: Martin Bobak --- diff --git a/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/DeviceContext.java b/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/DeviceContext.java index c5148e425e..18c70bb0a0 100644 --- a/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/DeviceContext.java +++ b/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/DeviceContext.java @@ -13,7 +13,10 @@ import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext import org.opendaylight.openflowplugin.api.openflow.device.handlers.MessageHandler; import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableFeatures; import java.math.BigInteger; +import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.common.RpcResult; import java.util.Collection; +import java.util.concurrent.Future; /** * The central entity of OFP is the Device Context, which encapsulate the logical state of a switch @@ -91,5 +94,9 @@ public interface DeviceContext extends MessageHandler { */ ConnectionContext getAuxiliaryConnectiobContexts(BigInteger cookie); + Xid getNextXid(); + + Future> sendRequest(DataObject dataObject); + } diff --git a/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/RequestContext.java b/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/RequestContext.java index 99791a2a8c..f09a49ce1d 100644 --- a/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/RequestContext.java +++ b/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/RequestContext.java @@ -8,9 +8,9 @@ package org.opendaylight.openflowplugin.api.openflow.device; +import com.google.common.util.concurrent.SettableFuture; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.common.RpcResult; -import java.util.concurrent.Future; /** * Request context handles all requests on device. Number of requests is limited by request quota. When this quota is @@ -18,10 +18,9 @@ import java.util.concurrent.Future; *

* Created by Martin Bobak on 25.2.2015. */ -public interface RequestContext { +public interface RequestContext extends AutoCloseable { - Future> createRequestFuture(DataObject dataObject); + SettableFuture> createRequestFuture(); - void requestSucceeded(); - void requestFailed(String exception); + void close(); } diff --git a/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/rpc/RpcContext.java b/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/rpc/RpcContext.java index f651a73a1f..14c76bd579 100644 --- a/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/rpc/RpcContext.java +++ b/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/rpc/RpcContext.java @@ -7,6 +7,8 @@ */ package org.opendaylight.openflowplugin.api.openflow.rpc; +import com.google.common.util.concurrent.SettableFuture; +import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.RpcService; @@ -24,13 +26,13 @@ public interface RpcContext extends AutoCloseable { void registerRpcServiceImplementation(Class serviceClass, S serviceInstance); - /* + /** * Method adds request to request queue which has limited quota. After number of requests exceeds quota limit - * {@link org.opendaylight.openflowplugin.api.openflow.device.exception.RequestQuotaExceededException} is thrown. + * future will be done immediately and will contain information about exceeded request quota. * * @param data */ - Future> addNewRequest(DataObject data); + SettableFuture> storeOrFail(RequestContext data); /** * Method for setting request quota value. When the Request Context quota is exceeded, incoming RPCs fail @@ -41,4 +43,17 @@ public interface RpcContext extends AutoCloseable { void setRequestContextQuota(int maxRequestsPerDevice); void forgetRequestContext(RequestContext requestContext); + + /** + * Method provides device context. + * @return + */ + DeviceContext getDeviceContext(); + + /** + * Method returns new request context for current request. + * @return + */ + RequestContext createRequestContext(); + } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImpl.java index d2a900b9e8..a8814c7d14 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImpl.java @@ -12,11 +12,14 @@ import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; import org.opendaylight.openflowplugin.api.openflow.device.DeviceState; import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; +import org.opendaylight.openflowplugin.api.openflow.device.Xid; import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableFeatures; import org.opendaylight.yangtools.yang.binding.ChildOf; import org.opendaylight.yangtools.yang.binding.DataObject; +import org.opendaylight.yangtools.yang.common.RpcResult; import java.math.BigInteger; import java.util.Collection; +import java.util.concurrent.Future; /** * @@ -75,5 +78,15 @@ public class DeviceContextImpl implements DeviceContext { return null; } + @Override + public Xid getNextXid() { + return null; + } + + @Override + public Future> sendRequest(final DataObject dataObject) { + return null; + } + } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/rpc/RequestContextImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/rpc/RequestContextImpl.java index 806b731022..c2a5e4113e 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/rpc/RequestContextImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/rpc/RequestContextImpl.java @@ -8,7 +8,6 @@ package org.opendaylight.openflowplugin.impl.rpc; import com.google.common.util.concurrent.SettableFuture; -import java.util.concurrent.Future; import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.rpc.RpcContext; import org.opendaylight.yangtools.yang.binding.DataObject; @@ -26,38 +25,14 @@ public class RequestContextImpl implements RequestContext this.rpcContext = rpcContext; } - /* - * (non-Javadoc) - * - * @see - * org.opendaylight.openflowplugin.api.openflow.device.RequestContext#createRequestFuture(org.opendaylight.yangtools - * .yang.binding.DataObject) - */ @Override - public Future> createRequestFuture(final DataObject dataObject) { + public SettableFuture> createRequestFuture() { rpcResultFuture = SettableFuture.create(); return rpcResultFuture; } - /* - * (non-Javadoc) - * - * @see org.opendaylight.openflowplugin.api.openflow.device.RequestContext#requestSucceeded() - */ @Override - public void requestSucceeded() { - // TODO Auto-generated method stub - - } - - /* - * (non-Javadoc) - * - * @see org.opendaylight.openflowplugin.api.openflow.device.RequestContext#requestFailed(java.lang.String) - */ - @Override - public void requestFailed(final String exception) { - // TODO Auto-generated method stub - + public void close() { + rpcContext.forgetRequestContext(this); } } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/rpc/RpcContextImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/rpc/RpcContextImpl.java index 1d100cf485..b32356cdbb 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/rpc/RpcContextImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/rpc/RpcContextImpl.java @@ -7,9 +7,7 @@ */ package org.opendaylight.openflowplugin.impl.rpc; -import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; +import com.google.common.util.concurrent.SettableFuture; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.RoutedRpcRegistration; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; @@ -23,7 +21,6 @@ import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.concurrent.Future; public class RpcContextImpl implements RpcContext { @@ -53,39 +50,18 @@ public class RpcContextImpl implements RpcContext { } @Override - public Future> addNewRequest(final DataObject data) { - final Future> rpcResultFuture; - final RequestContext requestContext = new RequestContextImpl(this); + public SettableFuture> storeOrFail(RequestContext requestContext) { + final SettableFuture> rpcResultFuture = requestContext.createRequestFuture(); if (synchronizedRequestsList.size() < maxRequestsPerDevice) { synchronizedRequestsList.add(requestContext); - rpcResultFuture = requestContext.createRequestFuture(data); - - ListenableFuture> resultFutureFromDevice = sendRequestToDevice(data); - Futures.addCallback(resultFutureFromDevice, new FutureCallback() { - @Override - public void onSuccess(final Object o) { - requestContext.requestSucceeded(); - } - - @Override - public void onFailure(final Throwable throwable) { - requestContext.requestFailed(throwable.getCause().getMessage()); - } - }); } else { - rpcResultFuture = Futures.immediateFuture(RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, "", "Request queue full.").build()); + RpcResult rpcResult = RpcResultBuilder.failed().withError(RpcError.ErrorType.APPLICATION, "", "Device's request queue is full.").build(); + rpcResultFuture.set(rpcResult); } - - return rpcResultFuture; } - private ListenableFuture> sendRequestToDevice(final DataObject data) { - //TODO : send data to device - return null; - } - /** * Unregisters all services. @@ -112,6 +88,16 @@ public class RpcContextImpl implements RpcContext { requestContexts.remove(requestContext); } + @Override + public DeviceContext getDeviceContext() { + return deviceContext; + } + + @Override + public RequestContext createRequestContext() { + return new RequestContextImpl(this); + } + public boolean isRequestContextCapacityEmpty() { return requestContexts.size() <= maxRequestsPerDevice; }