hotfix Bug 3226 - unable to configure flows 22/20522/2
authorVaclav Demcak <vdemcak@cisco.com>
Fri, 15 May 2015 14:24:37 +0000 (16:24 +0200)
committerVaclav Demcak <vaclav.demcak@pantheon.sk>
Fri, 15 May 2015 15:40:56 +0000 (15:40 +0000)
* 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 <vdemcak@cisco.com>
opendaylight/md-sal/sal-rest-connector/src/main/java/org/opendaylight/controller/sal/restconf/impl/RestconfImpl.java
opendaylight/md-sal/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestPutConfigTest.java
opendaylight/md-sal/sal-rest-connector/src/test/resources/test-config-data/yang1/test-interface.yang

index 9f3a83eafcc5ae6a15aa04c979e0f1fdbdc9cbcf..67ecf56ba443d5bff64cae5f7c69af0cd8968bca 100644 (file)
@@ -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() +
index 0df6a46311038f3e59396279d0fa5dc5ddc5e216..634b63c8fe20585db74e24163a85bc80c37edc78 100644 (file)
@@ -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);
index 7594143922317b9b5df762a037acd7e5eca830cb..d0699e2e04305f7964a1ae6f471e2fcb820420cb 100644 (file)
@@ -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;
             }