From: Tony Tkacik Date: Tue, 7 Jan 2014 13:00:32 +0000 (+0100) Subject: Bug 267: Fixed augmentation read from configuration store X-Git-Tag: jenkins-controller-bulk-release-prepare-only-2-1~135 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=92b863639542beb0dcb04879426bc8ca58179fbd Bug 267: Fixed augmentation read from configuration store - Fixed missing support of direct read of augmentation from configuration store. - Added regresion unit test, which test storing Node with FlowCapableNode augmentation and reading it directly via InstanceIdentifier pointing to the augmentation. Change-Id: I31c1f14d09e8c6f22720d50d25b7c6c457f37c8b Signed-off-by: Tony Tkacik --- diff --git a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentConnector.java b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentConnector.java index daa3914cf7..0a769921d8 100644 --- a/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentConnector.java +++ b/opendaylight/md-sal/sal-binding-broker/src/main/java/org/opendaylight/controller/sal/binding/impl/connect/dom/BindingIndependentConnector.java @@ -115,32 +115,32 @@ public class BindingIndependentConnector implements // public DataObject readOperationalData(InstanceIdentifier path) { try { org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath = mappingService.toDataDom(path); - CompositeNode result = biDataService.readOperationalData(biPath); - Class targetType = path.getTargetType(); - - if (Augmentation.class.isAssignableFrom(targetType)) { - path = mappingService.fromDataDom(biPath); - Class> augmentType = (Class>) targetType; - DataObject parentTo = mappingService.dataObjectFromDataDom(path, result); - if (parentTo instanceof Augmentable) { - return (DataObject) ((Augmentable) parentTo).getAugmentation(augmentType); - } - - } - return mappingService.dataObjectFromDataDom(path, result); - + return potentialAugmentationRead(path,biPath,result); } catch (DeserializationException e) { throw new IllegalStateException(e); } } + private DataObject potentialAugmentationRead(InstanceIdentifier path, org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath, CompositeNode result) throws DeserializationException { + Class targetType = path.getTargetType(); + if (Augmentation.class.isAssignableFrom(targetType)) { + path = mappingService.fromDataDom(biPath); + Class> augmentType = (Class>) targetType; + DataObject parentTo = mappingService.dataObjectFromDataDom(path, result); + if (parentTo instanceof Augmentable) { + return (DataObject) ((Augmentable) parentTo).getAugmentation(augmentType); + } + } + return mappingService.dataObjectFromDataDom(path, result); + } + @Override public DataObject readConfigurationData(InstanceIdentifier path) { try { org.opendaylight.yangtools.yang.data.api.InstanceIdentifier biPath = mappingService.toDataDom(path); CompositeNode result = biDataService.readConfigurationData(biPath); - return mappingService.dataObjectFromDataDom(path, result); + return potentialAugmentationRead(path,biPath,result); } catch (DeserializationException e) { throw new IllegalStateException(e); } diff --git a/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/bugfix/PutAugmentationTest.java b/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/bugfix/PutAugmentationTest.java index 96d0361b1d..d9b16af469 100644 --- a/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/bugfix/PutAugmentationTest.java +++ b/opendaylight/md-sal/sal-binding-dom-it/src/test/java/org/opendaylight/controller/sal/binding/test/bugfix/PutAugmentationTest.java @@ -12,6 +12,8 @@ import org.opendaylight.controller.sal.binding.api.data.DataChangeListener; import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.SupportedActions; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.SupportedActionsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.supported.actions.ActionType; @@ -130,8 +132,60 @@ public class PutAugmentationTest extends AbstractDataServiceTest implements Data assertBindingIndependentVersion(NODE_INSTANCE_ID_BI); testNodeRemove(); } + + @Test + public void putNodeWithAugmentation() throws Exception { + + NodeBuilder nodeBuilder = new NodeBuilder(); + nodeBuilder.setId(new NodeId(NODE_ID)); + nodeBuilder.setKey(NODE_KEY); + FlowCapableNodeBuilder fnub = new FlowCapableNodeBuilder(); + fnub.setHardware("Hardware Foo"); + fnub.setManufacturer("Manufacturer Foo"); + fnub.setSerialNumber("Serial Foo"); + fnub.setDescription("Description Foo"); + fnub.setSoftware("JUnit emulated"); + FlowCapableNode fnu = fnub.build(); + + nodeBuilder.addAugmentation(FlowCapableNode.class, fnu); + DataModificationTransaction baseTransaction = baDataService.beginTransaction(); + baseTransaction.putOperationalData(NODE_INSTANCE_ID_BA, nodeBuilder.build()); + RpcResult result = baseTransaction.commit().get(); + assertEquals(TransactionStatus.COMMITED, result.getResult()); + + FlowCapableNode readedAugmentation = (FlowCapableNode) baDataService.readOperationalData(InstanceIdentifier.builder(NODE_INSTANCE_ID_BA).augmentation(FlowCapableNode.class).toInstance()); + assertNotNull(readedAugmentation); + assertEquals(fnu.getHardware(), readedAugmentation.getHardware()); + + testPutNodeConnectorWithAugmentation(); + testNodeRemove(); + } + private void testPutNodeConnectorWithAugmentation() throws Exception { + NodeConnectorKey ncKey = new NodeConnectorKey(new NodeConnectorId("test:0:0")); + InstanceIdentifier ncPath = InstanceIdentifier.builder(NODE_INSTANCE_ID_BA) + .child(NodeConnector.class, ncKey).toInstance(); + InstanceIdentifier ncAugmentPath = InstanceIdentifier.builder(ncPath) + .augmentation(FlowCapableNodeConnector.class).toInstance(); + + NodeConnectorBuilder nc = new NodeConnectorBuilder(); + nc.setKey(ncKey); + + FlowCapableNodeConnectorBuilder fncb = new FlowCapableNodeConnectorBuilder(); + fncb.setName("Baz"); + nc.addAugmentation(FlowCapableNodeConnector.class, fncb.build()); + + DataModificationTransaction baseTransaction = baDataService.beginTransaction(); + baseTransaction.putOperationalData(ncPath, nc.build()); + RpcResult result = baseTransaction.commit().get(); + assertEquals(TransactionStatus.COMMITED, result.getResult()); + + FlowCapableNodeConnector readedAugmentation = (FlowCapableNodeConnector) baDataService.readOperationalData(ncAugmentPath); + assertNotNull(readedAugmentation); + assertEquals(fncb.getName(), readedAugmentation.getName()); + } + private void testNodeRemove() throws Exception { DataModificationTransaction transaction = baDataService.beginTransaction(); transaction.removeOperationalData(NODE_INSTANCE_ID_BA);