Restapi-call-node: Support for Empty Container {} in JSON 15/129915/5
authorSingal, Kapil (ks220y) <ks220y@att.com>
Wed, 13 Jul 2022 21:05:40 +0000 (17:05 -0400)
committerSingal, Kapil (ks220y) <ks220y@att.com>
Thu, 14 Jul 2022 14:11:39 +0000 (10:11 -0400)
Issue-ID: CCSDK-3718
Signed-off-by: Singal, Kapil (ks220y) <ks220y@att.com>
Change-Id: If3c030f3de78d21f1ab0bcdebc234b7697871314

plugins/restapi-call-node/provider/src/main/java/org/onap/ccsdk/sli/plugins/restapicall/RestapiCallNode.java
plugins/restapi-call-node/provider/src/main/java/org/onap/ccsdk/sli/plugins/restapicall/XmlJsonUtil.java
plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/TestRestapiCallNode.java
plugins/restapi-call-node/provider/src/test/org/onap/ccsdk/sli/plugins/restapicall/TestRestapiCallNode.java [deleted file]
plugins/restapi-call-node/provider/src/test/resources/testEmptyValueNContainer.json [new file with mode: 0644]

index 4236055..2064dc8 100755 (executable)
@@ -641,6 +641,8 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
 
         if (format == Format.JSON) {
             req = XmlJsonUtil.removeLastCommaJson(req);
+            // Use 'EMPTY_CONTAINER' as keyword within template to have an empty container placeholder.
+            req = req.replaceAll("EMPTY_CONTAINER", "{}");
         }
 
         long t2 = System.currentTimeMillis();
@@ -803,7 +805,7 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
                 URL proxyUrl = new URL(p.proxyUrl);
                 HttpUrlConnectorProvider cp = new HttpUrlConnectorProvider();
                 config.connectorProvider(cp);
-                final Proxy proxy = 
+                final Proxy proxy =
                     new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyUrl.getHost(), proxyUrl.getPort()));
 
                 cp.connectionFactory(new ConnectionFactory() {
@@ -822,12 +824,12 @@ public class RestapiCallNode implements SvcLogicJavaPlugin {
             ssl = createSSLContext(p);
         }
 
-        ClientBuilder builder = 
+        ClientBuilder builder =
             ClientBuilder.newBuilder().hostnameVerifier(new AcceptIpAddressHostNameVerifier());
 
-        if (ssl != null) { 
+        if (ssl != null) {
             HttpsURLConnection.setDefaultSSLSocketFactory(ssl.getSocketFactory());
-            builder = builder.sslContext(ssl);  
+            builder = builder.sslContext(ssl);
         }
         if (config != null) {
             builder = builder.withConfig(config);
index d6ef746..a4407c0 100644 (file)
@@ -443,7 +443,6 @@ public final class XmlJsonUtil {
                             i5 = s.length();
                         }
 
-
                         /*If template mandates empty construct to be present, those should not be removed.*/
                         if (template != null && template.contains(s.substring(i4))) {
                             k = i1 + 1;
index 595fc1d..758b30d 100755 (executable)
@@ -29,6 +29,7 @@ import static org.junit.Assert.assertTrue;
 
 import java.util.HashMap;
 import java.util.Map;
+
 import org.codehaus.jettison.json.JSONObject;
 import org.junit.Before;
 import org.junit.Test;
@@ -213,7 +214,6 @@ public class TestRestapiCallNode {
         rcn.sendRequest(p, ctx);
     }
 
-
     @Test(expected = SvcLogicException.class)
     public void testWithInvalidURI() throws SvcLogicException {
         SvcLogicContext ctx = new SvcLogicContext();
@@ -339,7 +339,7 @@ public class TestRestapiCallNode {
         Map<String, String> p = new HashMap<>();
         //p.put("templateFileName", "src/test/resources/l3smvpntemplate.json");
         p.put("restapiUrl", "http://ipwan:18002/restconf/data/huawei-ac-net-l3vpn-svc:l3vpn-svc-cfg/vpn-services"
-            + "/vpnservice=10000000-0000-0000-0000-000000000001");
+                + "/vpnservice=10000000-0000-0000-0000-000000000001");
         p.put("restapiUser", "admin");
         p.put("restapiPassword", "admin123");
         p.put("format", "json");
@@ -425,7 +425,6 @@ public class TestRestapiCallNode {
         rcn.sendRequest(p, ctx);
     }
 
-
     @Test
     public void testDeleteNoneAsContentType() throws SvcLogicException {
         SvcLogicContext ctx = new SvcLogicContext();
@@ -461,81 +460,82 @@ public class TestRestapiCallNode {
         RestapiCallNode rcn = new RestapiCallNode();
         rcn.sendRequest(p, ctx);
     }
+
     /*
      * {
-  "partnerOne": {
-    "url": "http://localhost:7001"                                                                                                                                                             4 http://uebsb93kcdc.it.att.com:3904",
-    "test": "/metrics"
-  },
-  "partnerTwo": {
-    "url": "http://localhost:7002",
-    "user": "controller_user",
-    "password": "P@ssword",
-    "test": "/metrics"
-  },
-  "partnerThree": {
-    "url": "http://localhost:7003",
-    "user": "controller_admin"
-  }
-}
+      "partnerOne": {
+        "url": "http://localhost:7001"                                                                                                                                                             4 http://uebsb93kcdc.it.att.com:3904",
+        "test": "/metrics"
+      },
+      "partnerTwo": {
+        "url": "http://localhost:7002",
+        "user": "controller_user",
+        "password": "P@ssword",
+        "test": "/metrics"
+      },
+      "partnerThree": {
+        "url": "http://localhost:7003",
+        "user": "controller_admin"
+      }
+    }
      */
     @Test
-    public void testPartners() throws Exception{
-       String partnerTwoKey = "partnerTwo";
-       String partnerTwoUsername = "controller_user";
-       String partnerTwoPassword = "P@ssword";
+    public void testPartners() throws Exception {
+        String partnerTwoKey = "partnerTwo";
+        String partnerTwoUsername = "controller_user";
+        String partnerTwoPassword = "P@ssword";
 
-       System.setProperty("SDNC_CONFIG_DIR", "src/test/resources");
+        System.setProperty("SDNC_CONFIG_DIR", "src/test/resources");
         RestapiCallNode rcn = new RestapiCallNode();
         assertNull(rcn.partnerStore.get("partnerOne"));
         PartnerDetails details = rcn.partnerStore.get(partnerTwoKey);
-        assertEquals(partnerTwoUsername,details.username);
-        assertEquals(partnerTwoPassword,details.password);
+        assertEquals(partnerTwoUsername, details.username);
+        assertEquals(partnerTwoPassword, details.password);
         assertNull(rcn.partnerStore.get("partnerThree"));
 
         //In this scenario the caller expects username, password and url to be picked up from the partners json
         Map<String, String> paramMap = new HashMap<>();
         paramMap.put("partner", partnerTwoKey);
-       rcn.handlePartner(paramMap );
-        assertEquals(partnerTwoUsername,paramMap.get(RestapiCallNode.restapiUserKey));
-        assertEquals(partnerTwoPassword,paramMap.get(RestapiCallNode.restapiPasswordKey));
-        assertEquals("http://localhost:7002",paramMap.get(RestapiCallNode.restapiUrlString));
+        rcn.handlePartner(paramMap);
+        assertEquals(partnerTwoUsername, paramMap.get(RestapiCallNode.restapiUserKey));
+        assertEquals(partnerTwoPassword, paramMap.get(RestapiCallNode.restapiPasswordKey));
+        assertEquals("http://localhost:7002", paramMap.get(RestapiCallNode.restapiUrlString));
 
         //In this scenario the caller expects username, password and url to be picked up from the partners json
         //the provided suffix will be appended to the default url from the partners json
         paramMap = new HashMap<>();
         paramMap.put("partner", partnerTwoKey);
         paramMap.put("restapiUrlSuffix", "/networking/v1/instance/3");
-       rcn.handlePartner(paramMap);
-       Parameters p = new Parameters();
-       RestapiCallNode.getParameters(paramMap, p);
-        assertEquals(partnerTwoUsername,p.restapiUser);
-        assertEquals(partnerTwoPassword,p.restapiPassword);
-        assertEquals("http://localhost:7002/networking/v1/instance/3",p.restapiUrl);
+        rcn.handlePartner(paramMap);
+        Parameters p = new Parameters();
+        RestapiCallNode.getParameters(paramMap, p);
+        assertEquals(partnerTwoUsername, p.restapiUser);
+        assertEquals(partnerTwoPassword, p.restapiPassword);
+        assertEquals("http://localhost:7002/networking/v1/instance/3", p.restapiUrl);
     }
 
     @Test
     public void retryPolicyBean() throws Exception {
-       Integer retries = 3;
-       String first = "http://localhost:7001";
-       String second = "http://localhost:7001";
-
-       RetryPolicy p = new RetryPolicy(new String[] {first,second}, retries);
-       assertEquals(retries,p.getMaximumRetries());
-       assertNotNull(p.getRetryMessage());
-       String next = p.getNextHostName();
-       assertEquals(second,next);
-       assertEquals(1,p.getRetryCount());
-       next = p.getNextHostName();
-       assertEquals(first,next);
-       assertEquals(2,p.getRetryCount());
+        Integer retries = 3;
+        String first = "http://localhost:7001";
+        String second = "http://localhost:7001";
+
+        RetryPolicy p = new RetryPolicy(new String[] {first, second}, retries);
+        assertEquals(retries, p.getMaximumRetries());
+        assertNotNull(p.getRetryMessage());
+        String next = p.getNextHostName();
+        assertEquals(second, next);
+        assertEquals(1, p.getRetryCount());
+        next = p.getNextHostName();
+        assertEquals(first, next);
+        assertEquals(2, p.getRetryCount());
     }
 
     @Test
     public void testEmbeddedJsonTemplate() throws Exception {
         SvcLogicContext ctx = new SvcLogicContext();
        String complexObj = "{\"image_name\":\"Ubuntu 14.04\",\"service-instance-id\":\"1\",\"vnf-model-customization-uuid\":\"2f\",\"vnf-id\":\"3b\"}";
-       ctx.setAttribute("reqId", "1235");
+        ctx.setAttribute("reqId", "1235");
         ctx.setAttribute("subReqId", "054243");
         ctx.setAttribute("actionName", "CREATE");
         ctx.setAttribute("myPrefix", "2016-09-09 16:30:35.0");
@@ -565,30 +565,30 @@ public class TestRestapiCallNode {
         //This will throw a JSONException and fail the test case if rest api call node doesn't form valid JSON
         assertNotNull(new JSONObject(request));
     }
-    
+
     @Test
-    public void testGetMultipleUrls() throws Exception{
+    public void testGetMultipleUrls() throws Exception {
        String[] urls =  RestapiCallNode.getMultipleUrls("http://localhost:8008/rest/restconf/data/abc:def/abc:action=Create,deviceType=Banana,https://localhost:8008/rest/restconf/data/abc:def/abc:action=Create,deviceType=Potato");
-       assertEquals("http://localhost:8008/rest/restconf/data/abc:def/abc:action=Create,deviceType=Banana",urls[0]);
-       assertEquals("https://localhost:8008/rest/restconf/data/abc:def/abc:action=Create,deviceType=Potato",urls[1]);
-
-       urls =  RestapiCallNode.getMultipleUrls("https://wiki.onap.org/,http://localhost:7001/,http://wiki.onap.org/");
-       assertEquals("https://wiki.onap.org/",urls[0]);
-       assertEquals("http://localhost:7001/",urls[1]);
-       assertEquals("http://wiki.onap.org/",urls[2]);
-       
+        assertEquals("http://localhost:8008/rest/restconf/data/abc:def/abc:action=Create,deviceType=Banana", urls[0]);
+        assertEquals("https://localhost:8008/rest/restconf/data/abc:def/abc:action=Create,deviceType=Potato", urls[1]);
+
+        urls = RestapiCallNode.getMultipleUrls("https://wiki.onap.org/,http://localhost:7001/,http://wiki.onap.org/");
+        assertEquals("https://wiki.onap.org/", urls[0]);
+        assertEquals("http://localhost:7001/", urls[1]);
+        assertEquals("http://wiki.onap.org/", urls[2]);
+
        urls =  RestapiCallNode.getMultipleUrls("https://wiki.onap.org/test=4,5,6,http://localhost:7001/test=1,2,3,http://wiki.onap.org/test=7,8,9,10");
-       assertEquals("https://wiki.onap.org/test=4,5,6",urls[0]);
-       assertEquals("http://localhost:7001/test=1,2,3",urls[1]);
-       assertEquals("http://wiki.onap.org/test=7,8,9,10",urls[2]);
+        assertEquals("https://wiki.onap.org/test=4,5,6", urls[0]);
+        assertEquals("http://localhost:7001/test=1,2,3", urls[1]);
+        assertEquals("http://wiki.onap.org/test=7,8,9,10", urls[2]);
 
-       urls =  RestapiCallNode.getMultipleUrls("https://wiki.onap.org/,https://readthedocs.org/projects/onap/");
-       assertEquals("https://wiki.onap.org/",urls[0]);
-       assertEquals("https://readthedocs.org/projects/onap/",urls[1]);
+        urls = RestapiCallNode.getMultipleUrls("https://wiki.onap.org/,https://readthedocs.org/projects/onap/");
+        assertEquals("https://wiki.onap.org/", urls[0]);
+        assertEquals("https://readthedocs.org/projects/onap/", urls[1]);
     }
-    
+
     @Test
-    public void testContainsMultipleUrls() throws Exception{
+    public void testContainsMultipleUrls() throws Exception {
         assertFalse(RestapiCallNode.containsMultipleUrls("https://wiki.onap.org/"));
         assertFalse(RestapiCallNode.containsMultipleUrls("http://wiki.onap.org/"));
         assertFalse(RestapiCallNode.containsMultipleUrls("http://localhost:8008/rest/restconf/data/abc:def/abc:action=Create,deviceType=Banana"));
@@ -602,58 +602,53 @@ public class TestRestapiCallNode {
     }
 
     @Test
-    public void testKeepEmptyValue() throws Exception {
-        log.info("================= Testing keeping empty values =======================");
-
-        String template = "{\n" +
-            "   \"name1\": \"value1\",\n" +
-            "   \"name2\": ${empty},\n" +
-            "   \"name3\": ${~empty},\n" +
-            "   \"name4\": {\n" +
-            "       \"name41\": \"value41\",\n" +
-            "       \"name42\": ${~empty},\n" +
-            "       \"name43\": ${~not_empty}\n" +
-            "   },\n" +
-            "   \"name5\": {\n"+
-            "       \"name51\": ${~empty},\n"+
-            "       \"name52\": ${empty}\n"+
-            "   },\n" +
-            "   \"name6\": {\n"+
-            "       \"name61\": ${empty},\n"+
-            "       \"name62\": ${empty}\n"+
-            "   },\n" +
-            "   \"name7\": \"${\"not_empty}\",\n" +
-            "   \"name8\": \"${~\"not_empty}\",\n" +
-            "   \"name9\": \"${\"empty}\",\n" +
-            "   \"name10\": \"${~\"empty}\"\n" +
-            "}";
-
-        String expect = "{\n" +
-            "   \"name1\": \"value1\",\n" +
-            "   \"name3\": \"\",\n" +
-            "   \"name4\": {\n" +
-            "       \"name41\": \"value41\",\n" +
-            "       \"name42\": \"\",\n" +
-            "       \"name43\": \"some value\"\n" +
-            "   },\n" +
-            "   \"name5\": {\n" +
-            "       \"name51\": \"\"\n" +
-            "   },\n" +
-            "   \"name7\": \"some value\",\n" +
-            "   \"name8\": \"some value\",\n" +
-            "   \"name10\": \"\"\n" +
-            "}";
+    public void testKeepEmptyValueOrContainer() throws Exception {
+        log.info("================= Testing keeping empty value or container =======================");
+
+        String expect = "{\n"
+                + "  \"name1\": \"value1\",\n"
+                + "  \"name3\": \"\",\n"
+                + "  \"name4\": {\n"
+                + "    \"name41\": \"value41\",\n"
+                + "    \"name42\": \"\",\n"
+                + "    \"name43\": \"some value\"\n"
+                + "  },\n"
+                + "  \"name5\": {\n"
+                + "    \"name51\": \"\"\n"
+                + "  },\n"
+                + "  \"name7\": \"some value\",\n"
+                + "  \"name8\": \"some value\",\n"
+                + "  \"name10\": \"\",\n"
+                + "  \"list\": [\n"
+                + "    \n"
+                + "    {\n"
+                + "      \"test1\": \"123\",\n"
+                + "      \"container2\": {},\n"
+                + "      \"container3\": {}\n"
+                + "    },\n"
+                + "  \n"
+                + "    {\n"
+                + "      \"test1\": \"456\",\n"
+                + "      \"container2\": {},\n"
+                + "      \"container3\": {}\n"
+                + "    }\n"
+                + "  ]\n"
+                + "}\n";
 
         SvcLogicContext ctx = new SvcLogicContext();
         ctx.setAttribute("empty", "");
         ctx.setAttribute("not_empty", "some value");
-        
+        ctx.setAttribute("tmp.list_length", "2");
+        ctx.setAttribute("tmp.list[0]", "123");
+        ctx.setAttribute("tmp.list[1]", "456");
+
         RestapiCallNode rcn = new RestapiCallNode();
-        String req = rcn.buildXmlJsonRequest(ctx, template, Format.JSON);
-        
+        String req = rcn.buildXmlJsonRequest(ctx, rcn.readFile("src/test/resources/testEmptyValueNContainer.json"), Format.JSON);
+
         log.info("Result:\n" + req);
         log.info("==================================================================");
 
         assertEquals(expect, req);
     }
+
 }
diff --git a/plugins/restapi-call-node/provider/src/test/org/onap/ccsdk/sli/plugins/restapicall/TestRestapiCallNode.java b/plugins/restapi-call-node/provider/src/test/org/onap/ccsdk/sli/plugins/restapicall/TestRestapiCallNode.java
deleted file mode 100755 (executable)
index a130d43..0000000
+++ /dev/null
@@ -1,531 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * openECOMP : SDN-C
- * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights
- * reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.ccsdk.sli.plugins.restapicall;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-import java.util.HashMap;
-import java.util.Map;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.contrib.java.lang.system.EnvironmentVariables;
-import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
-import org.onap.ccsdk.sli.core.sli.SvcLogicException;
-import org.onap.ccsdk.sli.plugins.restapicall.RestapiCallNode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class TestRestapiCallNode {
-
-    @SuppressWarnings("unused")
-    private static final Logger log = LoggerFactory.getLogger(TestRestapiCallNode.class);
-    @Rule
-    public EnvironmentVariables environmentVariables = new EnvironmentVariables();
-    
-
-
-    @Test
-    public void testDelete() throws SvcLogicException {
-        SvcLogicContext ctx = new SvcLogicContext();
-
-        Map<String, String> p = new HashMap<>();
-        p.put("restapiUrl", "https://echo.getpostman.com/delete");
-        p.put("restapiUser", "user1");
-        p.put("restapiPassword", "pwd1");
-        p.put("httpMethod", "delete");
-        p.put("skipSending", "true");
-
-        RestapiCallNode rcn = new RestapiCallNode();
-        rcn.sendRequest(p, ctx);
-    }
-
-    @Test
-    public void testDeleteWithPayload() throws SvcLogicException {
-        SvcLogicContext ctx = new SvcLogicContext();
-
-        ctx.setAttribute("prop.name", "site1");
-
-        Map<String, String> p = new HashMap<>();
-        p.put("templateFileName", "src/test/resources/sdwan-site.json");
-        p.put("restapiUrl", "https://echo.getpostman.com/delete");
-        p.put("restapiUser", "user1");
-        p.put("restapiPassword", "pwd1");
-        p.put("httpMethod", "delete");
-        p.put("skipSending", "true");
-
-        RestapiCallNode rcn = new RestapiCallNode();
-        rcn.sendRequest(p, ctx);
-    }
-
-    @Test
-    public void testJsonTemplate() throws SvcLogicException {
-        SvcLogicContext ctx = new SvcLogicContext();
-        ctx.setAttribute("tmp.sdn-circuit-req-row_length", "3");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].source-uid", "APIDOC-123");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].action", "delete");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-timestamp", "2016-09-09 16:30:35.0");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-status", "New");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].processing-status", "New");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].service-clfi", "testClfi1");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].clci", "clci");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[1].source-uid", "APIDOC-123");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[1].action", "delete");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[1].request-timestamp", "2016-09-09 16:30:35.0");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[1].request-status", "New");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[1].processing-status", "New");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[1].service-clfi", "testClfi1");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[1].clci", "clci");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[2].source-uid", "APIDOC-123");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[2].action", "delete");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[2].request-timestamp", "2016-09-09 16:30:35.0");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[2].request-status", "New");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[2].processing-status", "New");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[2].service-clfi", "testClfi1");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[2].clci", "clci");
-
-        Map<String, String> p = new HashMap<>();
-        p.put("templateFileName", "src/test/resources/test-template.json");
-        p.put("restapiUrl", "http://echo.getpostman.com");
-        p.put("restapiUser", "user1");
-        p.put("restapiPassword", "abc123");
-        p.put("format", "json");
-        p.put("httpMethod", "post");
-        p.put("responsePrefix", "response");
-        p.put("skipSending", "true");
-
-        RestapiCallNode rcn = new RestapiCallNode();
-        rcn.sendRequest(p, ctx);
-    }
-
-    @Test
-    public void testInvalidRepeatTimes() throws SvcLogicException {
-        SvcLogicContext ctx = new SvcLogicContext();
-        ctx.setAttribute("tmp.sdn-circuit-req-row_length", "a");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].source-uid", "APIDOC-123");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].action", "delete");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-timestamp", "2016-09-09 16:30:35.0");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-status", "New");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].processing-status", "New");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].service-clfi", "testClfi1");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].clci", "clci");
-
-        Map<String, String> p = new HashMap<>();
-        p.put("templateFileName", "src/test/resources/test-template.json");
-        p.put("restapiUrl", "http://echo.getpostman.com");
-        p.put("restapiUser", "user1");
-        p.put("restapiPassword", "abc123");
-        p.put("format", "json");
-        p.put("httpMethod", "post");
-        p.put("responsePrefix", "response");
-        p.put("skipSending", "true");
-
-        RestapiCallNode rcn = new RestapiCallNode();
-        rcn.sendRequest(p, ctx);
-    }
-
-    @Test(expected = SvcLogicException.class)
-    public void testInvalidTemplatePath() throws SvcLogicException {
-        SvcLogicContext ctx = new SvcLogicContext();
-        ctx.setAttribute("tmp.sdn-circuit-req-row_length", "1");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].source-uid", "APIDOC-123");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].action", "delete");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-timestamp", "2016-09-09 16:30:35.0");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-status", "New");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].processing-status", "New");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].service-clfi", "testClfi1");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].clci", "clci");
-
-        Map<String, String> p = new HashMap<>();
-        p.put("templateFileName", "src/test/resourcess/test-template.json");
-        p.put("restapiUrl", "http://echo.getpostman.com");
-        p.put("restapiUser", "user1");
-        p.put("restapiPassword", "abc123");
-        p.put("format", "json");
-        p.put("httpMethod", "post");
-        p.put("responsePrefix", "response");
-        p.put("skipSending", "true");
-
-        RestapiCallNode rcn = new RestapiCallNode();
-        rcn.sendRequest(p, ctx);
-    }
-
-    @Test(expected = SvcLogicException.class)
-    public void testWithoutSkipSending() throws SvcLogicException {
-        SvcLogicContext ctx = new SvcLogicContext();
-        ctx.setAttribute("tmp.sdn-circuit-req-row_length", "1");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].source-uid", "APIDOC-123");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].action", "delete");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-timestamp", "2016-09-09 16:30:35.0");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-status", "New");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].processing-status", "New");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].service-clfi", "testClfi1");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].clci", "clci");
-
-        Map<String, String> p = new HashMap<>();
-        p.put("templateFileName", "src/test/resources/test-template.json");
-        p.put("restapiUrl", "http://echo.getpostman.com");
-        p.put("restapiUser", "user1");
-        p.put("restapiPassword", "abc123");
-        p.put("format", "json");
-        p.put("httpMethod", "post");
-        p.put("responsePrefix", "response");
-        p.put("skipSending", "false");
-
-        RestapiCallNode rcn = new RestapiCallNode();
-        rcn.sendRequest(p, ctx);
-    }
-
-
-    @Test(expected = SvcLogicException.class)
-    public void testWithInvalidURI() throws SvcLogicException {
-        SvcLogicContext ctx = new SvcLogicContext();
-        ctx.setAttribute("tmp.sdn-circuit-req-row_length", "1");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].source-uid", "APIDOC-123");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].action", "delete");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-timestamp", "2016-09-09 16:30:35.0");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].request-status", "New");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].processing-status", "New");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].service-clfi", "testClfi1");
-        ctx.setAttribute("tmp.sdn-circuit-req-row[0].clci", "clci");
-
-        Map<String, String> p = new HashMap<>();
-        p.put("templateFileName", "src/test/resources/test-template.json");
-        p.put("restapiUrl", "http://echo.  getpostman.com");
-        p.put("restapiUser", "user1");
-        p.put("restapiPassword", "abc123");
-        p.put("format", "json");
-        p.put("httpMethod", "post");
-        p.put("responsePrefix", "response");
-        p.put("skipSending", "false");
-
-        RestapiCallNode rcn = new RestapiCallNode();
-        rcn.sendRequest(p, ctx);
-    }
-
-    @Test
-    public void testVpnJsonTemplate() throws SvcLogicException {
-        SvcLogicContext ctx = new SvcLogicContext();
-        ctx.setAttribute("prop.l3vpn.name", "10000000-0000-0000-0000-000000000001");
-        ctx.setAttribute("prop.l3vpn.topology", "point_to_point");
-
-        Map<String, String> p = new HashMap<>();
-        p.put("templateFileName", "src/test/resources/l3smvpntemplate.json");
-        p.put("restapiUrl", "http://ipwan:18002/restconf/data/huawei-ac-net-l3vpn-svc:l3vpn-svc-cfg/vpn-services");
-        p.put("restapiUser", "admin");
-        p.put("restapiPassword", "admin123");
-        p.put("format", "json");
-        p.put("httpMethod", "post");
-        p.put("responsePrefix", "restapi-result");
-        p.put("skipSending", "true");
-
-        RestapiCallNode rcn = new RestapiCallNode();
-        rcn.sendRequest(p, ctx);
-    }
-
-    @Test
-    public void testSiteJsonTemplate() throws SvcLogicException {
-        SvcLogicContext ctx = new SvcLogicContext();
-        ctx.setAttribute("prop.l3vpn.name", "10000000-0000-0000-0000-000000000001");
-        ctx.setAttribute("prop.l3vpn.topology", "point_to_point");
-
-        ctx.setAttribute("prop.l3vpn.site1_name", "10000000-0000-0000-0000-000000000002");
-        ctx.setAttribute("prop.l3vpn.vpn-policy1-id", "10000000-0000-0000-0000-000000000003");
-        ctx.setAttribute("prop.l3vpn.entry1-id", "1");
-        ctx.setAttribute("prop.l3vpn.sna1_name", "10000000-0000-0000-0000-000000000004");
-        ctx.setAttribute("prop.l3vpn.pe1_id", "a8098c1a-f86e-11da-bd1a-00112444be1e");
-        ctx.setAttribute("prop.l3vpn.ac1_id", "a8098c1a-f86e-11da-bd1a-00112444be1b");
-        ctx.setAttribute("prop.l3vpn.ac1-peer-ip", "192.168.1.1");
-        ctx.setAttribute("prop.l3vpn.ac1-ip", "192.168.1.2");
-        ctx.setAttribute("prop.l3vpn.sna1_svlan", "100");
-        ctx.setAttribute("prop.l3vpn.ac1_protocol", "static");
-        ctx.setAttribute("prop.l3vpn.sna1-route.ip-prefix", "192.168.1.1/24");
-        ctx.setAttribute("prop.l3vpn.sna1-route.next-hop", "192.168.1.4");
-
-        ctx.setAttribute("prop.l3vpn.site2_name", "10000000-0000-0000-0000-000000000005");
-        ctx.setAttribute("prop.l3vpn.vpn-policy2-id", "10000000-0000-0000-0000-000000000006");
-        ctx.setAttribute("prop.l3vpn.entry2-id", "1");
-        ctx.setAttribute("prop.l3vpn.sna2_name", "10000000-0000-0000-0000-000000000007");
-        ctx.setAttribute("prop.l3vpn.pe2_id", "a8098c1a-f86e-11da-bd1a-00112444be1a");
-        ctx.setAttribute("prop.l3vpn.ac2_id", "a8098c1a-f86e-11da-bd1a-00112444be1c");
-        ctx.setAttribute("prop.l3vpn.ac2-peer-ip", "192.168.1.6");
-        ctx.setAttribute("prop.l3vpn.ac2-ip", "192.168.1.5");
-        ctx.setAttribute("prop.l3vpn.sna2_svlan", "200");
-        ctx.setAttribute("prop.l3vpn.ac2_protocol", "bgp");
-        ctx.setAttribute("prop.l3vpn.peer2-ip", "192.168.1.7");
-        ctx.setAttribute("prop.l3vpn.ac2_protocol_bgp_as", "200");
-
-        Map<String, String> p = new HashMap<>();
-        p.put("templateFileName", "src/test/resources/l3smsitetemplate.json");
-        p.put("restapiUrl", "http://ipwan:18002/restconf/data/huawei-ac-net-l3vpn-svc:l3vpn-svc-cfg/sites");
-        p.put("restapiUser", "admin");
-        p.put("restapiPassword", "admin123");
-        p.put("format", "json");
-        p.put("httpMethod", "post");
-        p.put("responsePrefix", "restapi-result");
-        p.put("skipSending", "true");
-
-        RestapiCallNode rcn = new RestapiCallNode();
-        rcn.sendRequest(p, ctx);
-    }
-
-    @Test
-    public void testVrfJsonTemplate() throws SvcLogicException {
-        SvcLogicContext ctx = new SvcLogicContext();
-        ctx.setAttribute("prop.l3vpn.vrf1-id", "10000000-0000-0000-0000-000000000007");
-        ctx.setAttribute("prop.l3vpn.vpn-policy1-id", "10000000-0000-0000-0000-000000000003");
-        ctx.setAttribute("prop.l3vpn.pe1_id", "a8098c1a-f86e-11da-bd1a-00112444be1e");
-        ctx.setAttribute("prop.l3vpn.vrf2-id", "10000000-0000-0000-0000-000000000009");
-        ctx.setAttribute("prop.l3vpn.vpn-policy2-id", "10000000-0000-0000-0000-000000000006");
-        ctx.setAttribute("prop.l3vpn.pe2_id", "a8098c1a-f86e-11da-bd1a-00112444be1a");
-
-        Map<String, String> p = new HashMap<>();
-        p.put("templateFileName", "src/test/resources/l3smvrftemplate.json");
-        p.put("restapiUrl", "http://ipwan:18002/restconf/data/huawei-ac-net-l3vpn-svc:l3vpn-svc-cfg/vrf-attributes");
-        p.put("restapiUser", "admin");
-        p.put("restapiPassword", "admin123");
-        p.put("format", "json");
-        p.put("httpMethod", "post");
-        p.put("responsePrefix", "restapi-result");
-        p.put("skipSending", "true");
-
-        RestapiCallNode rcn = new RestapiCallNode();
-        rcn.sendRequest(p, ctx);
-    }
-
-    @Test
-    public void testDeleteVpnJsonTemplate() throws SvcLogicException {
-        SvcLogicContext ctx = new SvcLogicContext();
-        ctx.setAttribute("prop.l3vpn.name", "10000000-0000-0000-0000-000000000001");
-        ctx.setAttribute("prop.l3vpn.topology", "point_to_point");
-
-        Map<String, String> p = new HashMap<>();
-        //p.put("templateFileName", "src/test/resources/l3smvpntemplate.json");
-        p.put("restapiUrl", "http://ipwan:18002/restconf/data/huawei-ac-net-l3vpn-svc:l3vpn-svc-cfg/vpn-services"
-            + "/vpnservice=10000000-0000-0000-0000-000000000001");
-        p.put("restapiUser", "admin");
-        p.put("restapiPassword", "admin123");
-        p.put("format", "json");
-        p.put("httpMethod", "delete");
-        p.put("responsePrefix", "restapi-result");
-        p.put("skipSending", "true");
-
-        RestapiCallNode rcn = new RestapiCallNode();
-        rcn.sendRequest(p, ctx);
-    }
-
-    @Test
-    public void testL2DciTemplate() throws SvcLogicException {
-        SvcLogicContext ctx = new SvcLogicContext();
-        ctx.setAttribute("prop.dci-connects.id", "Id1");
-        ctx.setAttribute("prop.dci-connects.name", "Name1");
-        ctx.setAttribute("prop.dci-connects.local_networks[0]", "NetId1");
-        ctx.setAttribute("prop.dci-connects.local_networks[1]", "NetId2");
-        ctx.setAttribute("prop.dci-connects.evpn_irts[0]", "100:1");
-        ctx.setAttribute("prop.dci-connects.evpn_erts[0]", "100:2");
-        ctx.setAttribute("prop.dci-connects.evpn_irts[1]", "200:1");
-        ctx.setAttribute("prop.dci-connects.evpn_erts[1]", "200:2");
-        ctx.setAttribute("prop.dci-connects.vni", "1");
-
-        Map<String, String> p = new HashMap<>();
-        p.put("templateFileName", "src/test/resources/l2-dci-connects-template.json");
-        p.put("restapiUrl", "http://echo.getpostman.com");
-        p.put("restapiUser", "user1");
-        p.put("restapiPassword", "abc123");
-        p.put("format", "json");
-        p.put("httpMethod", "post");
-        p.put("responsePrefix", "response");
-        p.put("skipSending", "true");
-
-        RestapiCallNode rcn = new RestapiCallNode();
-        rcn.sendRequest(p, ctx);
-    }
-
-    @Test
-    public void testL3DciTemplate() throws SvcLogicException {
-        SvcLogicContext ctx = new SvcLogicContext();
-        ctx.setAttribute("prop.dci-connects.id", "Id1");
-        ctx.setAttribute("prop.dci-connects.name", "Name1");
-        ctx.setAttribute("prop.dci-connects.local_networks_length", "2");
-        ctx.setAttribute("prop.dci-connects.local_networks[0]", "NetId1");
-        ctx.setAttribute("prop.dci-connects.local_networks[1]", "NetId2");
-        ctx.setAttribute("prop.dci-connects.evpn_irts[0]", "100:1");
-        ctx.setAttribute("prop.dci-connects.evpn_erts[0]", "100:2");
-        ctx.setAttribute("prop.dci-connects.evpn_irts[1]", "200:1");
-        ctx.setAttribute("prop.dci-connects.evpn_erts[1]", "200:2");
-        ctx.setAttribute("prop.dci-connects.vni", "1");
-
-        Map<String, String> p = new HashMap<>();
-        p.put("templateFileName", "src/test/resources/l3-dci-connects-template.json");
-        p.put("restapiUrl", "http://echo.getpostman.com");
-        p.put("restapiUser", "user1");
-        p.put("restapiPassword", "abc123");
-        p.put("format", "json");
-        p.put("httpMethod", "post");
-        p.put("responsePrefix", "response");
-        p.put("skipSending", "true");
-
-        RestapiCallNode rcn = new RestapiCallNode();
-        rcn.sendRequest(p, ctx);
-
-    }
-
-    @Test
-    public void testControllerTokenTemplate() throws SvcLogicException {
-        SvcLogicContext ctx = new SvcLogicContext();
-        ctx.setAttribute("prop.sdncRestApi.thirdpartySdnc.user", "admin");
-        ctx.setAttribute("prop.sdncRestApi.thirdpartySdnc.password", "admin123");
-
-        Map<String, String> p = new HashMap<>();
-        p.put("templateFileName", "src/test/resources/actokentemplate.json");
-        p.put("restapiUrl", "https://ipwan:18002/controller/v2/tokens");
-        p.put("format", "json");
-        p.put("httpMethod", "post");
-        p.put("responsePrefix", "restapi-result");
-        p.put("skipSending", "true");
-
-        RestapiCallNode rcn = new RestapiCallNode();
-        rcn.sendRequest(p, ctx);
-    }
-
-
-    @Test
-    public void testDeleteNoneAsContentType() throws SvcLogicException {
-        SvcLogicContext ctx = new SvcLogicContext();
-
-        Map<String, String> p = new HashMap<>();
-        p.put("restapiUrl", "https://echo.getpostman.com/delete");
-        p.put("restapiUser", "user1");
-        p.put("restapiPassword", "pwd1");
-        p.put("httpMethod", "delete");
-        p.put("format", "none");
-        p.put("skipSending", "true");
-
-        RestapiCallNode rcn = new RestapiCallNode();
-        rcn.sendRequest(p, ctx);
-    }
-
-    @Test
-    public void testPostNoneAsContentType() throws SvcLogicException {
-        SvcLogicContext ctx = new SvcLogicContext();
-        ctx.setAttribute("prop.l3vpn.name", "10000000-0000-0000-0000-000000000001");
-        ctx.setAttribute("prop.l3vpn.topology", "point_to_point");
-
-        Map<String, String> p = new HashMap<>();
-        p.put("templateFileName", "src/test/resources/l3smvpntemplate.json");
-        p.put("restapiUrl", "http://ipwan:18002/restconf/data/huawei-ac-net-l3vpn-svc:l3vpn-svc-cfg/vpn-services");
-        p.put("restapiUser", "admin");
-        p.put("restapiPassword", "admin123");
-        p.put("format", "none");
-        p.put("httpMethod", "post");
-        p.put("responsePrefix", "restapi-result");
-        p.put("skipSending", "true");
-
-        RestapiCallNode rcn = new RestapiCallNode();
-        rcn.sendRequest(p, ctx);
-    }
-    /*
-     * {
-  "partnerOne": {
-    "url": "http://localhost:7001"                                                                                                                                                             4 http://uebsb93kcdc.it.att.com:3904",
-    "test": "/metrics"
-  },
-  "partnerTwo": {
-    "url": "http://localhost:7002",
-    "user": "controller_user",
-    "password": "P@ssword",
-    "test": "/metrics"
-  },
-  "partnerThree": {
-    "url": "http://localhost:7003",
-    "user": "controller_admin"
-  }
-}
-     */
-    @Test
-    public void testPartners() throws Exception{
-
-        environmentVariables.set("deployer_pass", "sdncp-123");
-        assertEquals("sdncp-123", System.getenv("deployer_pass"));
-
-        String partnerTwoKey = "partnerTwo";
-        String partnerTwoUsername = "controller_user";
-        String partnerTwoPassword = "P@ssword";
-
-        System.setProperty("SDNC_CONFIG_DIR", "src/test/resources");
-        RestapiCallNode rcn = new RestapiCallNode();
-        assertNull(rcn.partnerStore.get("partnerOne"));
-        PartnerDetails details = rcn.partnerStore.get(partnerTwoKey);
-        assertEquals(partnerTwoUsername,details.username);
-        assertEquals(partnerTwoPassword,details.password);
-        assertNull(rcn.partnerStore.get("partnerThree"));
-        
-        //In this scenario the caller expects username, password and url to be picked up from the partners json
-        Map<String, String> paramMap = new HashMap<String,String>();
-        paramMap.put("partner", partnerTwoKey);
-        rcn.handlePartner(paramMap );
-        assertEquals(partnerTwoUsername,paramMap.get(rcn.restapiUserKey));
-        assertEquals(partnerTwoPassword,paramMap.get(rcn.restapiPasswordKey));
-        assertEquals("http://localhost:7002",paramMap.get(rcn.restapiUrlString));
-
-        //In this scenario the caller expects username, password and url to be picked up from the partners json
-        //the provided suffix will be appended to the default url from the partners json
-        paramMap = new HashMap<String,String>();
-        paramMap.put("partner", partnerTwoKey);
-        paramMap.put("restapiUrlSuffix", "/networking/v1/instance/3");
-        rcn.handlePartner(paramMap);
-        p = new Parameters();
-        RestapiCallNode.getParameters(paramMap, p);
-        assertEquals(partnerTwoUsername,p.restapiUser);
-        assertEquals(partnerTwoPassword,p.restapiPassword);
-        assertEquals("http://localhost:7002/networking/v1/instance/3",p.restapiUrl);
-
-        paramMap = new HashMap<String, String>();
-        paramMap.put("partner","partnerFour" );
-        paramMap.put("httpMethod", "delete");
-        paramMap.put("skipSending", "true");
-        rcn.handlePartner(paramMap);
-        Parameters p = new Parameters();
-        RestapiCallNode.getParameters(paramMap, p);
-        assertEquals(p.restapiPassword, "sdncp-123");
-        assertEquals(p.restapiUser, "m30402@sdncp.att.com");
-        assertEquals(p.restapiUrl, "http://localhost:7004");
-    }
-    
-    @Test
-    public void retryPolicyBean() throws Exception {
-    Integer retries = 3;
-    String first = "http://localhost:7001";
-    String second = "http://localhost:7001";
-    
-    RetryPolicy p = new RetryPolicy(new String[] {first,second}, retries);
-    assertEquals(retries,p.getMaximumRetries());
-    assertNotNull(p.getRetryMessage());
-    String next = p.getNextHostName();
-    assertEquals(second,next);
-    assertEquals(1,p.getRetryCount());
-    next = p.getNextHostName();
-    assertEquals(first,next);
-    assertEquals(2,p.getRetryCount());
-    }
-}
diff --git a/plugins/restapi-call-node/provider/src/test/resources/testEmptyValueNContainer.json b/plugins/restapi-call-node/provider/src/test/resources/testEmptyValueNContainer.json
new file mode 100644 (file)
index 0000000..b444e0e
--- /dev/null
@@ -0,0 +1,24 @@
+{
+  "name1": "value1",
+  "name3": "",
+  "name4": {
+    "name41": "value41",
+    "name42": "",
+    "name43": "some value"
+  },
+  "name5": {
+    "name51": ""
+  },
+  "name7": "some value",
+  "name8": "some value",
+  "name10": "",
+  "list": [
+    ${repeat:tmp.list_length:
+    {
+      "test1": ${tmp.list[${1}]},
+      "container1": {},
+      "container2": EMPTY_CONTAINER,
+      "container3": EMPTY_CONTAINER
+    },
+  }]
+}