From 0319e44734fb4f201f01d166d456a51d3d25410b Mon Sep 17 00:00:00 2001 From: Vaclav Demcak Date: Fri, 15 May 2015 16:24:37 +0200 Subject: [PATCH 1/1] hotfix Bug 3226 - unable to configure flows * NormalizedNodeContainer has NodeIdentifierWithPredicates which has to contain the map of all node keys * (new codecs [xml,json] don't populate Attributes) Change-Id: I5befc6d8ad5a63a04c11ad9102610be9508df672 Signed-off-by: Vaclav Demcak (cherry picked from commit f00c40b510b85a0adbc407ba745a606bb4910a09) --- .../sal/restconf/impl/RestconfImpl.java | 5 +--- .../restconf/impl/test/RestPutConfigTest.java | 28 +++++++++++++------ .../yang1/test-interface.yang | 8 ++++++ 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/RestconfImpl.java b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/RestconfImpl.java index 9f3a83eafc..67ecf56ba4 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/RestconfImpl.java +++ b/opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/RestconfImpl.java @@ -774,10 +774,7 @@ public class RestconfImpl implements RestconfService { RestconfValidationUtils.checkDocumentedError(uriKeyValue != null, ErrorType.PROTOCOL, ErrorTag.DATA_MISSING, "Missing key " + keyDefinition + " in URI."); - final Object dataKeyValue = payload.getAttributeValue(keyDefinition); - RestconfValidationUtils.checkDocumentedError(dataKeyValue != null, ErrorType.PROTOCOL, ErrorTag.DATA_MISSING, - "Missing key " + keyDefinition.getLocalName() + " in the message body."); - + final Object dataKeyValue = payload.getIdentifier().getKeyValues().get(keyDefinition); if ( ! uriKeyValue.equals(dataKeyValue)) { final String errMsg = "The value '" + uriKeyValue + "' for key '" + keyDefinition.getLocalName() + diff --git a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestPutConfigTest.java b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestPutConfigTest.java index 0df6a46311..634b63c8fe 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestPutConfigTest.java +++ b/opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestPutConfigTest.java @@ -13,7 +13,6 @@ import com.google.common.util.concurrent.Futures; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; @@ -27,6 +26,7 @@ import org.opendaylight.controller.sal.restconf.impl.RestconfDocumentedException import org.opendaylight.controller.sal.restconf.impl.RestconfImpl; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.model.api.SchemaContext; @@ -66,8 +66,10 @@ public class RestPutConfigTest { final InstanceIdentifierContext iiCx = controllerCx.toInstanceIdentifier(identifier); final MapEntryNode data = Mockito.mock(MapEntryNode.class); final QName qName = QName.create("urn:ietf:params:xml:ns:yang:test-interface", "2014-07-01", "interface"); + final QName qNameKey = QName.create("urn:ietf:params:xml:ns:yang:test-interface", "2014-07-01", "name"); + final NodeIdentifierWithPredicates identWithPredicates = new NodeIdentifierWithPredicates(qName, qNameKey, "key"); Mockito.when(data.getNodeType()).thenReturn(qName); - Mockito.when(data.getAttributeValue(Matchers.any(QName.class))).thenReturn("key"); + Mockito.when(data.getIdentifier()).thenReturn(identWithPredicates); final NormalizedNodeContext payload = new NormalizedNodeContext(iiCx, data); mockingBrokerPut(iiCx.getInstanceIdentifier(), data); @@ -75,14 +77,16 @@ public class RestPutConfigTest { restconfService.updateConfigurationData(identifier, payload); } - @Test(expected=RestconfDocumentedException.class) - public void testPutConfigDataNull() { - final String identifier = "test-interface:interfaces/interface/key"; + @Test + public void testPutConfigDataCheckOnlyLastElement() { + final String identifier = "test-interface:interfaces/interface/key/sub-interface/subkey"; final InstanceIdentifierContext iiCx = controllerCx.toInstanceIdentifier(identifier); final MapEntryNode data = Mockito.mock(MapEntryNode.class); - final QName qName = QName.create("urn:ietf:params:xml:ns:yang:test-interface", "2014-07-01", "interface"); + final QName qName = QName.create("urn:ietf:params:xml:ns:yang:test-interface", "2014-07-01", "sub-interface"); + final QName qNameSubKey = QName.create("urn:ietf:params:xml:ns:yang:test-interface", "2014-07-01", "sub-name"); + final NodeIdentifierWithPredicates identWithPredicates = new NodeIdentifierWithPredicates(qName, qNameSubKey, "subkey"); Mockito.when(data.getNodeType()).thenReturn(qName); - Mockito.when(data.getAttributeValue(Matchers.any(QName.class))).thenReturn(null); + Mockito.when(data.getIdentifier()).thenReturn(identWithPredicates); final NormalizedNodeContext payload = new NormalizedNodeContext(iiCx, data); mockingBrokerPut(iiCx.getInstanceIdentifier(), data); @@ -90,14 +94,22 @@ public class RestPutConfigTest { restconfService.updateConfigurationData(identifier, payload); } + @Test(expected=RestconfDocumentedException.class) + public void testPutConfigDataMissingUriKey() { + final String identifier = "test-interface:interfaces/interface"; + controllerCx.toInstanceIdentifier(identifier); + } + @Test(expected=RestconfDocumentedException.class) public void testPutConfigDataDiferentKey() { final String identifier = "test-interface:interfaces/interface/key"; final InstanceIdentifierContext iiCx = controllerCx.toInstanceIdentifier(identifier); final MapEntryNode data = Mockito.mock(MapEntryNode.class); final QName qName = QName.create("urn:ietf:params:xml:ns:yang:test-interface", "2014-07-01", "interface"); + final QName qNameKey = QName.create("urn:ietf:params:xml:ns:yang:test-interface", "2014-07-01", "name"); + final NodeIdentifierWithPredicates identWithPredicates = new NodeIdentifierWithPredicates(qName, qNameKey, "notSameKey"); Mockito.when(data.getNodeType()).thenReturn(qName); - Mockito.when(data.getAttributeValue(Matchers.any(QName.class))).thenReturn("notSameKey"); + Mockito.when(data.getIdentifier()).thenReturn(identWithPredicates); final NormalizedNodeContext payload = new NormalizedNodeContext(iiCx, data); mockingBrokerPut(iiCx.getInstanceIdentifier(), data); diff --git a/opendaylight/md-sal/sal-rest-connector/src/test/resources/test-config-data/yang1/test-interface.yang b/opendaylight/md-sal/sal-rest-connector/src/test/resources/test-config-data/yang1/test-interface.yang index 7594143922..d0699e2e04 100644 --- a/opendaylight/md-sal/sal-rest-connector/src/test/resources/test-config-data/yang1/test-interface.yang +++ b/opendaylight/md-sal/sal-rest-connector/src/test/resources/test-config-data/yang1/test-interface.yang @@ -27,6 +27,14 @@ module test-interface { list interface { key "name"; + list sub-interface { + key "sub-name"; + + leaf sub-name { + type string; + } + } + leaf name { type string; } -- 2.36.6