X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Finventory-manager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fmd%2Finventory%2Fmanager%2FNodeChangeCommiter.java;h=b14bfd429c4d8ee8121cabc00f70e69ff34e3113;hb=d6f1e7790157461553b26ec82d246e68b62aad6b;hp=1b031990ab9f6808aed11c265e0672614559f4c2;hpb=28f20ee0cdbbb586ea2ffcd5982138e98f5307e3;p=controller.git diff --git a/opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/NodeChangeCommiter.java b/opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/NodeChangeCommiter.java index 1b031990ab..b14bfd429c 100644 --- a/opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/NodeChangeCommiter.java +++ b/opendaylight/md-sal/inventory-manager/src/main/java/org/opendaylight/controller/md/inventory/manager/NodeChangeCommiter.java @@ -7,13 +7,20 @@ */ package org.opendaylight.controller.md.inventory.manager; +import com.google.common.base.Optional; import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.CheckedFuture; +import com.google.common.util.concurrent.FutureCallback; +import com.google.common.util.concurrent.Futures; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorUpdated; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeUpdated; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorRemoved; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorUpdated; @@ -25,8 +32,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.No import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey; +import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder; import org.slf4j.Logger; @@ -73,7 +79,7 @@ class NodeChangeCommiter implements OpendaylightInventoryListener { InstanceIdentifier value = (InstanceIdentifier) ref.getValue(); LOG.debug("updating node connector : {}.", value); NodeConnector build = data.build(); - tx.put(LogicalDatastoreType.OPERATIONAL, value, build); + tx.merge(LogicalDatastoreType.OPERATIONAL, value, build, true); } }); } @@ -100,20 +106,55 @@ class NodeChangeCommiter implements OpendaylightInventoryListener { LOG.debug("Node updated notification received."); manager.enqueue(new InventoryOperation() { @Override - public void applyOperation(final ReadWriteTransaction tx) { + public void applyOperation(ReadWriteTransaction tx) { final NodeRef ref = node.getNodeRef(); - final NodeBuilder nodeBuilder = new NodeBuilder(node); - nodeBuilder.setKey(new NodeKey(node.getId())); - - final FlowCapableNode augment = InventoryMapping.toInventoryAugment(flowNode); - nodeBuilder.addAugmentation(FlowCapableNode.class, augment); - @SuppressWarnings("unchecked") InstanceIdentifierBuilder builder = ((InstanceIdentifier) ref.getValue()).builder(); InstanceIdentifierBuilder augmentation = builder.augmentation(FlowCapableNode.class); final InstanceIdentifier path = augmentation.build(); + CheckedFuture readFuture = tx.read(LogicalDatastoreType.OPERATIONAL, path); + Futures.addCallback(readFuture, new FutureCallback>() { + @Override + public void onSuccess(Optional optional) { + enqueueWriteNodeDataTx(node, flowNode, path); + if (!optional.isPresent()) { + enqueuePutTable0Tx(ref); + } + } + + @Override + public void onFailure(Throwable throwable) { + LOG.debug(String.format("Can't retrieve node data for node %s. Writing node data with table0.", node)); + enqueueWriteNodeDataTx(node, flowNode, path); + enqueuePutTable0Tx(ref); + } + }); + } + }); + } + + private void enqueueWriteNodeDataTx(final NodeUpdated node, final FlowCapableNodeUpdated flowNode, final InstanceIdentifier path) { + manager.enqueue(new InventoryOperation() { + @Override + public void applyOperation(final ReadWriteTransaction tx) { + final FlowCapableNode augment = InventoryMapping.toInventoryAugment(flowNode); LOG.debug("updating node :{} ", path); - tx.put(LogicalDatastoreType.OPERATIONAL, path, augment); + tx.merge(LogicalDatastoreType.OPERATIONAL, path, augment, true); + } + }); + } + + private void enqueuePutTable0Tx(final NodeRef ref) { + manager.enqueue(new InventoryOperation() { + @Override + public void applyOperation(ReadWriteTransaction tx) { + final TableKey tKey = new TableKey((short) 0); + final InstanceIdentifier tableIdentifier = + ((InstanceIdentifier) ref.getValue()).augmentation(FlowCapableNode.class).child(Table.class, new TableKey(tKey)); + TableBuilder tableBuilder = new TableBuilder(); + Table table0 = tableBuilder.setId((short) 0).build(); + LOG.debug("writing table :{} ", tableIdentifier); + tx.put(LogicalDatastoreType.OPERATIONAL, tableIdentifier, table0, true); } }); }