From 7ff26dc32c812b10a928fdd30a77b557ee9e2844 Mon Sep 17 00:00:00 2001 From: Tony Tkacik Date: Wed, 25 Jun 2014 17:47:36 +0200 Subject: [PATCH] Bug 1112, Bug 629: Migrated toaster to use BindingDataBroker 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 --- .../initial/03-toaster-sample.xml | 2 +- .../src/test/resources/controller.xml | 2 +- .../impl/ToasterProviderModule.java | 28 ++++++++----- .../toaster/provider/OpendaylightToaster.java | 42 +++++++++---------- .../src/main/yang/toaster-provider-impl.yang | 2 +- 5 files changed, 41 insertions(+), 35 deletions(-) diff --git a/opendaylight/distribution/opendaylight/src/main/resources/configuration/initial/03-toaster-sample.xml b/opendaylight/distribution/opendaylight/src/main/resources/configuration/initial/03-toaster-sample.xml index 502bdebca2..3958e18560 100644 --- a/opendaylight/distribution/opendaylight/src/main/resources/configuration/initial/03-toaster-sample.xml +++ b/opendaylight/distribution/opendaylight/src/main/resources/configuration/initial/03-toaster-sample.xml @@ -23,7 +23,7 @@ - binding:binding-data-broker + binding:binding-async-data-broker binding-data-broker diff --git a/opendaylight/md-sal/samples/toaster-it/src/test/resources/controller.xml b/opendaylight/md-sal/samples/toaster-it/src/test/resources/controller.xml index 57581d100d..4cce64dcd3 100644 --- a/opendaylight/md-sal/samples/toaster-it/src/test/resources/controller.xml +++ b/opendaylight/md-sal/samples/toaster-it/src/test/resources/controller.xml @@ -99,7 +99,7 @@ - binding:binding-data-broker + binding:binding-async-data-broker binding-data-broker diff --git a/opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/config/yang/config/toaster_provider/impl/ToasterProviderModule.java b/opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/config/yang/config/toaster_provider/impl/ToasterProviderModule.java index bd8e89fd7a..388c78eaaf 100644 --- a/opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/config/yang/config/toaster_provider/impl/ToasterProviderModule.java +++ b/opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/config/yang/config/toaster_provider/impl/ToasterProviderModule.java @@ -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 dataChangeListenerRegistration = - dataBrokerService.registerDataChangeListener( OpendaylightToaster.TOASTER_IID, opendaylightToaster ); + final ListenerRegistration dataChangeListenerRegistration = dataBrokerService + .registerDataChangeListener(LogicalDatastoreType.CONFIGURATION, OpendaylightToaster.TOASTER_IID, + opendaylightToaster, DataChangeScope.SUBTREE); final BindingAwareBroker.RpcRegistration rpcRegistration = getRpcRegistryDependency() .addRpcImplementation(ToasterService.class, opendaylightToaster); diff --git a/opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/sample/toaster/provider/OpendaylightToaster.java b/opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/sample/toaster/provider/OpendaylightToaster.java index 2ecd7e7b68..ec352e8f51 100644 --- a/opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/sample/toaster/provider/OpendaylightToaster.java +++ b/opendaylight/md-sal/samples/toaster-provider/src/main/java/org/opendaylight/controller/sample/toaster/provider/OpendaylightToaster.java @@ -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, DataObject> change ) { - DataObject dataObject = change.getUpdatedConfigurationData().get( TOASTER_IID ); + public void onDataChanged( final AsyncDataChangeEvent, 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> makeToast(MakeToastInput input) { + public Future> 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> restockToaster(RestockToasterInput input) { + public Future> 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; } diff --git a/opendaylight/md-sal/samples/toaster-provider/src/main/yang/toaster-provider-impl.yang b/opendaylight/md-sal/samples/toaster-provider/src/main/yang/toaster-provider-impl.yang index d6de5cfd17..8de0c98c63 100644 --- a/opendaylight/md-sal/samples/toaster-provider/src/main/yang/toaster-provider-impl.yang +++ b/opendaylight/md-sal/samples/toaster-provider/src/main/yang/toaster-provider-impl.yang @@ -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; } } } -- 2.36.6