API changes in RequestCtx and DeviceCtx 71/17071/7
authorMartin Bobak <mbobak@cisco.com>
Tue, 24 Mar 2015 13:57:58 +0000 (14:57 +0100)
committerMartin Bobak <mbobak@cisco.com>
Thu, 26 Mar 2015 17:10:38 +0000 (18:10 +0100)
Change-Id: Id671b7782cdc2133b3c108416fa8d7def03d3670
Signed-off-by: Martin Bobak <mbobak@cisco.com>
openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/DeviceContext.java
openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/device/RequestContext.java
openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/rpc/RpcContext.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/device/DeviceContextImpl.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/rpc/RequestContextImpl.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/rpc/RpcContextImpl.java

index c5148e425eb75cfb1165acd41d80ae60c51282e7..18c70bb0a0f32cc8c390edefed936b8f2b1e42fa 100644 (file)
@@ -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();
+
+    <T extends DataObject> Future<RpcResult<T>> sendRequest(DataObject dataObject);
+
 }
 
index 99791a2a8c7235c74987e49245dc88f525fa7303..f09a49ce1dc57a95d463e2051f6a157b220059b0 100644 (file)
@@ -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;
  * <p/>
  * Created by Martin Bobak <mbobak@cisco.com> on 25.2.2015.
  */
-public interface RequestContext {
+public interface RequestContext extends AutoCloseable {
 
-    <T extends DataObject> Future<RpcResult<T>> createRequestFuture(DataObject dataObject);
+    <T extends DataObject> SettableFuture<RpcResult<T>> createRequestFuture();
 
-    void requestSucceeded();
-    void requestFailed(String exception);
+    void close();
 }
index f651a73a1fac69cdb2fb408bcb79ea2880a543a0..14c76bd579e92f1a3eb771fb4211e49757a838e3 100644 (file)
@@ -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 {
 
     <S extends RpcService> void registerRpcServiceImplementation(Class<S> 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
      */
-    <T extends DataObject> Future<RpcResult<T>> addNewRequest(DataObject data);
+    <T extends DataObject> SettableFuture<RpcResult<T>> 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
+     */
+    <T extends DataObject> RequestContext createRequestContext();
+
 }
index d2a900b9e8883e9611b9ef92062edc5408240934..a8814c7d14a0af9645da9aee1b2daa7f56524e95 100644 (file)
@@ -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 <T extends DataObject> Future<RpcResult<T>> sendRequest(final DataObject dataObject) {
+        return null;
+    }
+
 
 }
index 806b7310226c382794ce961d9a34aebd4f4b2a26..c2a5e4113e8b4023ac2e312252f75f03214a21d5 100644 (file)
@@ -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<T extends DataObject> 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<RpcResult<T>> createRequestFuture(final DataObject dataObject) {
+    public SettableFuture<RpcResult<T>> 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);
     }
 }
index 1d100cf4854d735018330bae0659092d0bd7c244..b32356cdbb560167dddb7a5cc852d22c20a22b79 100644 (file)
@@ -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 <T extends DataObject> Future<RpcResult<T>> addNewRequest(final DataObject data) {
-        final Future<RpcResult<T>> rpcResultFuture;
-        final RequestContext requestContext = new RequestContextImpl(this);
+    public <T extends DataObject> SettableFuture<RpcResult<T>> storeOrFail(RequestContext requestContext) {
+        final SettableFuture<RpcResult<T>> rpcResultFuture = requestContext.createRequestFuture();
 
         if (synchronizedRequestsList.size() < maxRequestsPerDevice) {
             synchronizedRequestsList.add(requestContext);
-            rpcResultFuture = requestContext.createRequestFuture(data);
-
-            ListenableFuture<RpcResult<Void>> resultFutureFromDevice = sendRequestToDevice(data);
-            Futures.addCallback(resultFutureFromDevice, new FutureCallback<Object>() {
-                @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.<T>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<RpcResult<Void>> 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 <T extends DataObject> RequestContext createRequestContext() {
+        return new RequestContextImpl<T>(this);
+    }
+
     public boolean isRequestContextCapacityEmpty() {
         return requestContexts.size() <= maxRequestsPerDevice;
     }