import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import java.util.Set;
+import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
import org.opendaylight.controller.sal.connect.util.RemoteDeviceId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
* Asynchronous (Binding-aware) adapter over datastore subtree for netconf device.
*
* All data changes are submitted to an ExecutorService to avoid Thread blocking while sal is waiting for schema.
+ *
+ * @deprecated Data is pushed into Topology instead if Inventory model
*/
@Deprecated
final class NetconfDeviceDatastoreAdapter implements AutoCloseable {
private static final Logger logger = LoggerFactory.getLogger(NetconfDeviceDatastoreAdapter.class);
private final RemoteDeviceId id;
- private final DataBroker dataService;
+ private final BindingTransactionChain txChain;
NetconfDeviceDatastoreAdapter(final RemoteDeviceId deviceId, final DataBroker dataService) {
this.id = Preconditions.checkNotNull(deviceId);
- this.dataService = Preconditions.checkNotNull(dataService);
+ this.txChain = Preconditions.checkNotNull(dataService).createTransactionChain(new TransactionChainListener() {
+ @Override
+ public void onTransactionChainFailed(TransactionChain<?, ?> chain, AsyncTransaction<?, ?> transaction, Throwable cause) {
+ logger.error("{}: TransactionChain({}) {} FAILED!", id, chain, transaction.getIdentifier(), cause);
+ throw new IllegalStateException(id + " TransactionChain(" + chain + ") not committed correctly", cause);
+ }
+
+ @Override
+ public void onTransactionChainSuccessful(TransactionChain<?, ?> chain) {
+ logger.trace("{}: TransactionChain({}) {} SUCCESSFUL", id, chain);
+ }
+ });
initDeviceData();
}
final org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node data = buildDataForDeviceState(
up, capabilities, id);
- final ReadWriteTransaction transaction = dataService.newReadWriteTransaction();
+ final ReadWriteTransaction transaction = txChain.newReadWriteTransaction();
logger.trace("{}: Update device state transaction {} merging operational data started.", id, transaction.getIdentifier());
transaction.put(LogicalDatastoreType.OPERATIONAL, id.getBindingPath(), data);
logger.trace("{}: Update device state transaction {} merging operational data ended.", id, transaction.getIdentifier());
}
private void removeDeviceConfigAndState() {
- final WriteTransaction transaction = dataService.newWriteOnlyTransaction();
+ final WriteTransaction transaction = txChain.newWriteOnlyTransaction();
logger.trace("{}: Close device state transaction {} removing all data started.", id, transaction.getIdentifier());
transaction.delete(LogicalDatastoreType.CONFIGURATION, id.getBindingPath());
transaction.delete(LogicalDatastoreType.OPERATIONAL, id.getBindingPath());
}
private void initDeviceData() {
- final WriteTransaction transaction = dataService.newWriteOnlyTransaction();
+ final WriteTransaction transaction = txChain.newWriteOnlyTransaction();
createNodesListIfNotPresent(transaction);
@Override
public void close() throws Exception {
removeDeviceConfigAndState();
+ txChain.close();
}
public static org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node buildDataForDeviceState(