Bug 1112, Bug 629: Migrated toaster to use BindingDataBroker 68/8168/9
authorTony Tkacik <ttkacik@cisco.com>
Wed, 25 Jun 2014 15:47:36 +0000 (17:47 +0200)
committerTony Tkacik <ttkacik@cisco.com>
Tue, 1 Jul 2014 07:11:27 +0000 (07:11 +0000)
Migrated toaster example from using DataProviderService
(Hydrogen APIs) to use new BindingDataBroker service.
Patchset did not introduce any other changes,
only the minimal required set of changes,
in order to illustrate steps needed to migrate API.

 - toaster-provider-impl.yang - Changed dependency definition
 - controller.xml - Changed configuration in test
 - 03-toaster.xml - Changed configuration in distribution
 - ToasterProviderModule.java and OpendaylightToaster.java
 - OpendaylightToaster - updated to use BindingDataBroker

Change-Id: Iff0e2877b1061d10000a1e68c8ab5504cfb6c81c
Signed-off-by: Tony Tkacik <ttkacik@cisco.com>
opendaylight/distribution/opendaylight/src/main/resources/configuration/initial/03-toaster-sample.xml
opendaylight/md-sal/samples/toaster-it/src/test/resources/controller.xml
opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/config/yang/config/toaster_provider/impl/ToasterProviderModule.java
opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/sample/toaster/provider/OpendaylightToaster.java
opendaylight/md-sal/samples/toaster-provider/src/main/yang/toaster-provider-impl.yang

index 502bdebca26588cfc481793a0abd69731b6d708b..3958e185605e155f8b4b092e927ff5e8a679cbd1 100644 (file)
@@ -23,7 +23,7 @@
                     </rpc-registry>
 
                     <data-broker>
-                        <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-data-broker</type>
+                        <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-async-data-broker</type>
                         <name>binding-data-broker</name>
                     </data-broker>
                     
index 57581d100d619064dcb5831c5ea8e590d7670872..4cce64dcd329a9404d9273a24d45dd253db08dad 100644 (file)
@@ -99,7 +99,7 @@
                             </rpc-registry>
 
                             <data-broker>
-                              <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-data-broker</type>
+                              <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-async-data-broker</type>
                               <name>binding-data-broker</name>
                             </data-broker>
 
index bd8e89fd7a5ab99ddb1246a167d0b142f446a07f..388c78eaaf6365c77241c17cae04848680882624 100644 (file)
@@ -9,9 +9,11 @@
 */
 package org.opendaylight.controller.config.yang.config.toaster_provider.impl;
 
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
-import org.opendaylight.controller.sal.binding.api.data.DataChangeListener;
-import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
 import org.opendaylight.controller.sample.toaster.provider.OpendaylightToaster;
 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToasterService;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
@@ -21,23 +23,26 @@ import org.slf4j.LoggerFactory;
 /**
 *
 */
-public final class ToasterProviderModule extends org.opendaylight.controller.config.yang.config.toaster_provider.impl.AbstractToasterProviderModule
- {
+public final class ToasterProviderModule extends
       org.opendaylight.controller.config.yang.config.toaster_provider.impl.AbstractToasterProviderModule {
     private static final Logger log = LoggerFactory.getLogger(ToasterProviderModule.class);
 
-    public ToasterProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+    public ToasterProviderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier,
+            final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
         super(identifier, dependencyResolver);
     }
 
-    public ToasterProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
-            ToasterProviderModule oldModule, java.lang.AutoCloseable oldInstance) {
+    public ToasterProviderModule(final org.opendaylight.controller.config.api.ModuleIdentifier identifier,
+            final org.opendaylight.controller.config.api.DependencyResolver dependencyResolver,
+            final ToasterProviderModule oldModule, final java.lang.AutoCloseable oldInstance) {
 
         super(identifier, dependencyResolver, oldModule, oldInstance);
     }
 
     @Override
     protected void customValidation() {
-        // No need to validate dependencies, since all dependencies have mandatory true flag in yang
+        // No need to validate dependencies, since all dependencies have
+        // mandatory true flag in yang
         // config-subsystem will perform the validation for dependencies
     }
 
@@ -48,11 +53,12 @@ public final class ToasterProviderModule extends org.opendaylight.controller.con
         // Register to md-sal
         opendaylightToaster.setNotificationProvider(getNotificationServiceDependency());
 
-        DataProviderService dataBrokerService = getDataBrokerDependency();
+        DataBroker dataBrokerService = getDataBrokerDependency();
         opendaylightToaster.setDataProvider(dataBrokerService);
 
-        final ListenerRegistration<DataChangeListener> dataChangeListenerRegistration =
-                dataBrokerService.registerDataChangeListener( OpendaylightToaster.TOASTER_IID, opendaylightToaster );
+        final ListenerRegistration<DataChangeListener> dataChangeListenerRegistration = dataBrokerService
+                .registerDataChangeListener(LogicalDatastoreType.CONFIGURATION, OpendaylightToaster.TOASTER_IID,
+                        opendaylightToaster, DataChangeScope.SUBTREE);
 
         final BindingAwareBroker.RpcRegistration<ToasterService> rpcRegistration = getRpcRegistryDependency()
                 .addRpcImplementation(ToasterService.class, opendaylightToaster);
index 2ecd7e7b684fe8bdafd6af17527cbb21daeee83f..ec352e8f510dad03911be2ad2eeb0ec6a5c44542 100644 (file)
@@ -17,29 +17,30 @@ import java.util.concurrent.Future;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.opendaylight.controller.config.yang.config.toaster_provider.impl.ToasterProviderRuntimeMXBean;
-import org.opendaylight.controller.md.sal.common.api.data.DataChangeEvent;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
-import org.opendaylight.controller.sal.binding.api.data.DataBrokerService;
-import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
 import org.opendaylight.controller.sal.common.util.RpcErrors;
 import org.opendaylight.controller.sal.common.util.Rpcs;
 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.DisplayString;
 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.MakeToastInput;
+import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.RestockToasterInput;
 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.Toaster;
 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.Toaster.ToasterStatus;
-import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.RestockToasterInput;
 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToasterBuilder;
 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToasterOutOfBreadBuilder;
 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToasterRestocked;
 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToasterRestockedBuilder;
 import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.ToasterService;
-import org.opendaylight.controller.sal.binding.api.data.DataChangeListener;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcError;
+import org.opendaylight.yangtools.yang.common.RpcError.ErrorSeverity;
 import org.opendaylight.yangtools.yang.common.RpcError.ErrorType;
 import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.common.RpcError.ErrorSeverity;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -56,7 +57,7 @@ public class OpendaylightToaster implements ToasterService, ToasterProviderRunti
     private static final DisplayString TOASTER_MODEL_NUMBER = new DisplayString("Model 1 - Binding Aware");
 
     private NotificationProviderService notificationProvider;
-    private DataBrokerService dataProvider;
+    private DataBroker dataProvider;
 
     private final ExecutorService executor;
 
@@ -76,11 +77,11 @@ public class OpendaylightToaster implements ToasterService, ToasterProviderRunti
         executor = Executors.newFixedThreadPool(1);
     }
 
-    public void setNotificationProvider(NotificationProviderService salService) {
+    public void setNotificationProvider(final NotificationProviderService salService) {
         this.notificationProvider = salService;
     }
 
-    public void setDataProvider(DataBrokerService salDataProvider) {
+    public void setDataProvider(final DataBroker salDataProvider) {
         this.dataProvider = salDataProvider;
         updateStatus();
     }
@@ -94,9 +95,9 @@ public class OpendaylightToaster implements ToasterService, ToasterProviderRunti
         executor.shutdown();
 
         if (dataProvider != null) {
-            final DataModificationTransaction t = dataProvider.beginTransaction();
-            t.removeOperationalData(TOASTER_IID);
-            t.commit().get();
+            WriteTransaction t = dataProvider.newWriteOnlyTransaction();
+            t.delete(LogicalDatastoreType.OPERATIONAL,TOASTER_IID);
+            t.commit().get(); // FIXME: This call should not be blocking.
         }
     }
 
@@ -118,8 +119,8 @@ public class OpendaylightToaster implements ToasterService, ToasterProviderRunti
      * Implemented from the DataChangeListener interface.
      */
     @Override
-    public void onDataChanged( DataChangeEvent<InstanceIdentifier<?>, DataObject> change ) {
-        DataObject dataObject = change.getUpdatedConfigurationData().get( TOASTER_IID );
+    public void onDataChanged( final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change ) {
+        DataObject dataObject = change.getUpdatedSubtree();
         if( dataObject instanceof Toaster )
         {
             Toaster toaster = (Toaster) dataObject;
@@ -150,7 +151,7 @@ public class OpendaylightToaster implements ToasterService, ToasterProviderRunti
      * RestConf RPC call implemented from the ToasterService interface.
      */
     @Override
-    public Future<RpcResult<Void>> makeToast(MakeToastInput input) {
+    public Future<RpcResult<Void>> makeToast(final MakeToastInput input) {
         LOG.info("makeToast: " + input);
 
         synchronized (taskLock) {
@@ -191,7 +192,7 @@ public class OpendaylightToaster implements ToasterService, ToasterProviderRunti
      * ToasterRestocked notification.
      */
     @Override
-    public Future<RpcResult<java.lang.Void>> restockToaster(RestockToasterInput input) {
+    public Future<RpcResult<java.lang.Void>> restockToaster(final RestockToasterInput input) {
         LOG.info( "restockToaster: " + input );
 
         synchronized( taskLock ) {
@@ -226,12 +227,11 @@ public class OpendaylightToaster implements ToasterService, ToasterProviderRunti
 
     private void updateStatus() {
         if (dataProvider != null) {
-            final DataModificationTransaction t = dataProvider.beginTransaction();
-            t.removeOperationalData(TOASTER_IID);
-            t.putOperationalData(TOASTER_IID, buildToaster());
+            WriteTransaction tx = dataProvider.newWriteOnlyTransaction();
+            tx.put(LogicalDatastoreType.OPERATIONAL,TOASTER_IID, buildToaster());
 
             try {
-                t.commit().get();
+                tx.commit().get();
             } catch (InterruptedException | ExecutionException e) {
                 LOG.warn("Failed to update toaster status, operational otherwise", e);
             }
@@ -249,7 +249,7 @@ public class OpendaylightToaster implements ToasterService, ToasterProviderRunti
 
         final MakeToastInput toastRequest;
 
-        public MakeToastTask(MakeToastInput toast) {
+        public MakeToastTask(final MakeToastInput toast) {
             toastRequest = toast;
         }
 
index d6de5cfd17136d625a205b0b77122b2143c803fc..8de0c98c63e98f136ac91c98b1792fb040e0be63 100644 (file)
@@ -53,7 +53,7 @@ module toaster-provider-impl {
                 uses config:service-ref {
                     refine type {
                         mandatory false;
-                        config:required-identity mdsal:binding-data-broker;
+                        config:required-identity mdsal:binding-async-data-broker;
                     }
                 }
             }