summaryrefslogtreecommitdiffstats
path: root/plugins/restapi-call-node/provider/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/restapi-call-node/provider/src/test')
-rw-r--r--plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/MockCookieAuthServer.java40
-rw-r--r--plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/MultipartServerMock.java44
-rw-r--r--plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/TestJsonParser.java259
-rwxr-xr-xplugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/TestRestapiCallNode.java604
-rw-r--r--plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/TestXmlJsonUtil.java321
-rw-r--r--plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/TestXmlParser.java121
-rwxr-xr-xplugins/restapi-call-node/provider/src/test/org/onap/ccsdk/sli/plugins/restapicall/TestRestapiCallNode.java531
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/1dArray.json8
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/2dArray.json4
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/3dArray.json5
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/ArrayMenu.json41
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/EmbeddedEscapedJson.json16
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/EscapedJson.json1
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/ObjectMenu.json43
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/Widget.json27
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/actokentemplate.json4
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/invalidlength.xml49
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/l2-dci-connects-template.json11
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/l3-dci-connects-template.json14
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/l3smsitetemplate.json162
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/l3smvpntemplate.json10
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/l3smvrftemplate.json14
-rwxr-xr-xplugins/restapi-call-node/provider/src/test/resources/partners.json22
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/sdwan-site.json10
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/sdwan-vpn-topology.json23
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/test-template.json37
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/test.json30
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/test.xml182
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/test3.xml82
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/testEmbeddedTemplate.json20
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/testMultiLineEmbeddedTemplate.json20
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/test_file.txt5
-rw-r--r--plugins/restapi-call-node/provider/src/test/resources/ueb.properties6
33 files changed, 2766 insertions, 0 deletions
diff --git a/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/MockCookieAuthServer.java b/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/MockCookieAuthServer.java
new file mode 100644
index 000000000..7e1e0d505
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/MockCookieAuthServer.java
@@ -0,0 +1,40 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - CCSDK
+ * ================================================================================
+ * Copyright (C) 2019 Huawei Technologies Co., Ltd. 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 javax.ws.rs.Consumes;
+import javax.ws.rs.Produces;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.NewCookie;
+import javax.ws.rs.core.Response;
+
+@Path("get-cookie")
+public class MockCookieAuthServer {
+ @GET
+ @Path("cookie")
+ @Produces(MediaType.APPLICATION_JSON)
+ @Consumes(MediaType.APPLICATION_JSON)
+ public Response getCookie() {
+ return Response.status(200).entity("success").cookie(new NewCookie("cookieResponse", "cookieValueInReturn")).build();
+ }
+}
diff --git a/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/MultipartServerMock.java b/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/MultipartServerMock.java
new file mode 100644
index 000000000..00b5c324d
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/MultipartServerMock.java
@@ -0,0 +1,44 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - CCSDK
+ * ================================================================================
+ * Copyright (C) 2019 Huawei Technologies Co., Ltd. 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 org.glassfish.jersey.media.multipart.FormDataContentDisposition;
+import org.glassfish.jersey.media.multipart.FormDataParam;
+
+import javax.ws.rs.Consumes;
+
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.io.InputStream;
+
+@Path("file-upload")
+public class MultipartServerMock {
+
+ @POST
+ @Path("upload")
+ @Consumes(MediaType.MULTIPART_FORM_DATA)
+ public Response uploadFile(
+ @FormDataParam("file") InputStream inputStream,
+ @FormDataParam("file") FormDataContentDisposition fileDetail) {
+ return Response.status(200).entity(fileDetail.getFileName()).build();
+ }
+}
diff --git a/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/TestJsonParser.java b/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/TestJsonParser.java
new file mode 100644
index 000000000..cdffd4576
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/TestJsonParser.java
@@ -0,0 +1,259 @@
+/*-
+ * ============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 java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Map;
+import org.junit.Test;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+
+public class TestJsonParser {
+
+ @Test
+ public void test() throws SvcLogicException, IOException {
+ String path = "src/test/resources/test.json";
+ String content = new String(Files.readAllBytes(Paths.get(path)));
+ Map<String, String> mm = JsonParser.convertToProperties(content);
+ assertEquals("Server1", mm.get("equipment-data[0].equipment-id"));
+ assertEquals("1600000", mm.get("equipment-data[0].max-server-speed"));
+ assertEquals("2", mm.get("equipment-data[0].number-primary-servers"));
+ assertEquals("4", mm.get("equipment-data[0].server-count"));
+ assertEquals("Server1", mm.get("equipment-data[0].server-id"));
+ assertEquals("Unknown", mm.get("equipment-data[0].server-model"));
+ assertEquals("Test-Value", mm.get("equipment-data[0].test-node.test-inner-node"));
+ assertEquals("1", mm.get("equipment-data_length"));
+ assertEquals("The provisioned access bandwidth is at or exceeds 50% of the total server capacity.",
+ mm.get("message"));
+ assertEquals("VCE-Cust", mm.get("resource-rule.endpoint-position"));
+ assertEquals("Server", mm.get("resource-rule.equipment-level"));
+ assertEquals("max-server-speed * number-primary-servers", mm.get("resource-rule.hard-limit-expression"));
+ assertEquals("Bandwidth", mm.get("resource-rule.resource-name"));
+ assertEquals("DUMMY", mm.get("resource-rule.service-model"));
+ assertEquals("0.6 * max-server-speed * number-primary-servers", mm.get("resource-rule.soft-limit-expression"));
+ assertEquals("1605000", mm.get("resource-state.last-added"));
+ assertEquals("1920000", mm.get("resource-state.limit-value"));
+ assertEquals("1600000", mm.get("resource-state.threshold-value"));
+ assertEquals("1605000", mm.get("resource-state.used"));
+ }
+
+ @Test(expected = NullPointerException.class)
+ public void testNullString() throws SvcLogicException {
+ JsonParser.convertToProperties(null);
+ }
+
+ @Test
+ public void testJsonStringToCtxToplevelArray() throws Exception {
+ String path = "src/test/resources/ArrayMenu.json";
+ String content = new String(Files.readAllBytes(Paths.get(path)));
+ Map<String, String> mm = JsonParser.convertToProperties(content);
+
+ assertEquals("1000", mm.get("[0].calories"));
+ assertEquals("1", mm.get("[0].id"));
+ assertEquals("plain", mm.get("[0].name"));
+ assertEquals("pizza", mm.get("[0].type"));
+ assertEquals("true", mm.get("[0].vegetarian"));
+ assertEquals("2000", mm.get("[1].calories"));
+ assertEquals("2", mm.get("[1].id"));
+ assertEquals("Tuesday Special", mm.get("[1].name"));
+ assertEquals("1", mm.get("[1].topping[0].id"));
+ assertEquals("onion", mm.get("[1].topping[0].name"));
+ assertEquals("2", mm.get("[1].topping[1].id"));
+ assertEquals("pepperoni", mm.get("[1].topping[1].name"));
+ assertEquals("2", mm.get("[1].topping_length"));
+ assertEquals("pizza", mm.get("[1].type"));
+ assertEquals("false", mm.get("[1].vegetarian"));
+ assertEquals("1500", mm.get("[2].calories"));
+ assertEquals("3", mm.get("[2].id"));
+ assertEquals("House Special", mm.get("[2].name"));
+ assertEquals("3", mm.get("[2].topping[0].id"));
+ assertEquals("basil", mm.get("[2].topping[0].name"));
+ assertEquals("4", mm.get("[2].topping[1].id"));
+ assertEquals("fresh mozzarella", mm.get("[2].topping[1].name"));
+ assertEquals("5", mm.get("[2].topping[2].id"));
+ assertEquals("tomato", mm.get("[2].topping[2].name"));
+ assertEquals("3", mm.get("[2].topping_length"));
+ assertEquals("pizza", mm.get("[2].type"));
+ assertEquals("true", mm.get("[2].vegetarian"));
+ assertEquals("3", mm.get("_length"));
+ }
+
+ @Test
+ public void testJsonStringToCtx() throws Exception {
+ String path = "src/test/resources/ObjectMenu.json";
+ String content = new String(Files.readAllBytes(Paths.get(path)));
+ Map<String, String> mm = JsonParser.convertToProperties(content);
+ assertEquals("1000", mm.get("menu[0].calories"));
+ assertEquals("1", mm.get("menu[0].id"));
+ assertEquals("plain", mm.get("menu[0].name"));
+ assertEquals("pizza", mm.get("menu[0].type"));
+ assertEquals("true", mm.get("menu[0].vegetarian"));
+ assertEquals("2000", mm.get("menu[1].calories"));
+ assertEquals("2", mm.get("menu[1].id"));
+ assertEquals("Tuesday Special", mm.get("menu[1].name"));
+ assertEquals("1", mm.get("menu[1].topping[0].id"));
+ assertEquals("onion", mm.get("menu[1].topping[0].name"));
+ assertEquals("2", mm.get("menu[1].topping[1].id"));
+ assertEquals("pepperoni", mm.get("menu[1].topping[1].name"));
+ assertEquals("2", mm.get("menu[1].topping_length"));
+ assertEquals("pizza", mm.get("menu[1].type"));
+ assertEquals("false", mm.get("menu[1].vegetarian"));
+ assertEquals("1500", mm.get("menu[2].calories"));
+ assertEquals("3", mm.get("menu[2].id"));
+ assertEquals("House Special", mm.get("menu[2].name"));
+ assertEquals("3", mm.get("menu[2].topping[0].id"));
+ assertEquals("basil", mm.get("menu[2].topping[0].name"));
+ assertEquals("4", mm.get("menu[2].topping[1].id"));
+ assertEquals("fresh mozzarella", mm.get("menu[2].topping[1].name"));
+ assertEquals("5", mm.get("menu[2].topping[2].id"));
+ assertEquals("tomato", mm.get("menu[2].topping[2].name"));
+ assertEquals("3", mm.get("menu[2].topping_length"));
+ assertEquals("pizza", mm.get("menu[2].type"));
+ assertEquals("true", mm.get("menu[2].vegetarian"));
+ assertEquals("3", mm.get("menu_length"));
+ }
+
+ @Test
+ public void test1dJsonStringToCtx() throws Exception {
+ String path = "src/test/resources/1dArray.json";
+ String content = new String(Files.readAllBytes(Paths.get(path)));
+ Map<String, String> mm = JsonParser.convertToProperties(content);
+
+ System.out.println(mm);
+ assertEquals("6", mm.get("_length"));
+ assertEquals("apple", mm.get("[0]"));
+ assertEquals("orange", mm.get("[1]"));
+ assertEquals("banana", mm.get("[2]"));
+ assertEquals("squash", mm.get("[3]"));
+ assertEquals("broccoli", mm.get("[4]"));
+ assertEquals("cauliflower", mm.get("[5]"));
+ }
+
+ @Test
+ public void test2dJsonStringToCtx() throws Exception {
+ String path = "src/test/resources/2dArray.json";
+ String content = new String(Files.readAllBytes(Paths.get(path)));
+ Map<String, String> mm = JsonParser.convertToProperties(content);
+
+ // code will crash before these tests
+ assertEquals("apple", mm.get("[0][0]"));
+ assertEquals("orange", mm.get("[0][1]"));
+ assertEquals("banana", mm.get("[0][2]"));
+ assertEquals("3", mm.get("[0]_length"));
+
+ assertEquals("squash", mm.get("[1][0]"));
+ assertEquals("broccoli", mm.get("[1][1]"));
+ assertEquals("cauliflower", mm.get("[1][2]"));
+ assertEquals("3", mm.get("[1]_length"));
+ assertEquals("2", mm.get("_length"));
+ }
+
+ @Test
+ public void test3dJsonStringToCtx() throws Exception {
+ String path = "src/test/resources/3dArray.json";
+ String content = new String(Files.readAllBytes(Paths.get(path)));
+ Map<String, String> mm = JsonParser.convertToProperties(content);
+
+ assertEquals("3", mm.get("_length"));
+ assertEquals("1", mm.get("[0]_length"));
+ assertEquals("3", mm.get("[0][0]_length"));
+
+ assertEquals("2", mm.get("[1]_length"));
+ assertEquals("3", mm.get("[1][0]_length"));
+ assertEquals("3", mm.get("[1][1]_length"));
+
+ assertEquals("3", mm.get("[2]_length"));
+ assertEquals("3", mm.get("[2][0]_length"));
+ assertEquals("3", mm.get("[2][1]_length"));
+ assertEquals("3", mm.get("[2][2]_length"));
+
+ assertEquals("x", mm.get("[0][0][0]"));
+ assertEquals("y", mm.get("[0][0][1]"));
+ assertEquals("z", mm.get("[0][0][2]"));
+
+ assertEquals("abc", mm.get("[1][0][0]"));
+ assertEquals("def", mm.get("[1][0][1]"));
+ assertEquals("xyz", mm.get("[1][0][2]"));
+
+ assertEquals("123", mm.get("[1][1][0]"));
+ assertEquals("456", mm.get("[1][1][1]"));
+ assertEquals("789", mm.get("[1][1][2]"));
+
+ assertEquals("a", mm.get("[2][0][0]"));
+ assertEquals("b", mm.get("[2][0][1]"));
+ assertEquals("c", mm.get("[2][0][2]"));
+
+ assertEquals("d", mm.get("[2][1][0]"));
+ assertEquals("e", mm.get("[2][1][1]"));
+ assertEquals("f", mm.get("[2][1][2]"));
+
+ assertEquals("1", mm.get("[2][2][0]"));
+ assertEquals("2", mm.get("[2][2][1]"));
+ assertEquals("3", mm.get("[2][2][2]"));
+ }
+
+ @Test
+ public void testJsonWidgetStringToCtx() throws Exception {
+ String path = "src/test/resources/Widget.json";
+ String content = new String(Files.readAllBytes(Paths.get(path)));
+ Map<String, String> mm = JsonParser.convertToProperties(content);
+ assertEquals("false", mm.get("widget.debug"));
+ assertEquals("center", mm.get("widget.image.alignment"));
+ assertEquals("150", mm.get("widget.image.hOffset"));
+ assertEquals("moon", mm.get("widget.image.name"));
+ assertEquals("images/moon.png", mm.get("widget.image.src"));
+ assertEquals("150", mm.get("widget.image.vOffset"));
+ assertEquals("center", mm.get("widget.text.alignment"));
+ assertEquals("Click Me", mm.get("widget.text.data"));
+ assertEquals("350", mm.get("widget.text.hOffset"));
+ assertEquals("text1", mm.get("widget.text.name"));
+ assertEquals("21", mm.get("widget.text.size"));
+ assertEquals("bold", mm.get("widget.text.style"));
+ assertEquals("200", mm.get("widget.text.vOffset"));
+ assertEquals("300", mm.get("widget.window.height"));
+ assertEquals("main_window", mm.get("widget.window.name"));
+ assertEquals("ONAP Widget", mm.get("widget.window.title"));
+ assertEquals("200", mm.get("widget.window.width"));
+ }
+
+ @Test
+ public void testEmbeddedEscapedJsonJsonStringToCtx() throws Exception {
+ String path = "src/test/resources/EmbeddedEscapedJson.json";
+ String content = new String(Files.readAllBytes(Paths.get(path)));
+ Map<String, String> mm = JsonParser.convertToProperties(content);
+ assertEquals("escapedJsonObject", mm.get("input.parameters[0].name"));
+ assertEquals("[{\"id\":\"0.2.0.0/16\"},{\"id\":\"ge04::/64\"}]", mm.get("input.parameters[0].value"));
+ assertEquals("Hello/World", mm.get("input.parameters[1].value"));
+ assertEquals("resourceName", mm.get("input.parameters[2].name"));
+ assertEquals("The\t\"Best\"\tName", mm.get("input.parameters[2].value"));
+ assertEquals("3", mm.get("input.parameters_length"));
+
+ // Break the embedded json object into properties
+ mm = JsonParser.convertToProperties(mm.get("input.parameters[0].value"));
+ assertEquals("0.2.0.0/16", mm.get("[0].id"));
+ assertEquals("ge04::/64", mm.get("[1].id"));
+ assertEquals("2", mm.get("_length"));
+ }
+
+}
diff --git a/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/TestRestapiCallNode.java b/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/TestRestapiCallNode.java
new file mode 100755
index 000000000..a993bb946
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/TestRestapiCallNode.java
@@ -0,0 +1,604 @@
+/*-
+ * ============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.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+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;
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TestRestapiCallNode {
+
+ @SuppressWarnings("unused")
+ private static final Logger log = LoggerFactory.getLogger(TestRestapiCallNode.class);
+
+ @Before
+ public void init() {
+ System.setProperty("SDNC_CONFIG_DIR", "src/test/resources");
+ }
+
+ @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 testSendFile() throws SvcLogicException {
+ SvcLogicContext ctx = new SvcLogicContext();
+
+ Map<String, String> p = new HashMap<>();
+ p.put("fileName", "src/test/resources/test_file.txt");
+ p.put("url", "https://testurl.test");
+ p.put("user", "user");
+ p.put("password", "*******");
+ p.put("skipSending", "true"); // Set real url, user, password, when testing actual sending
+
+ RestapiCallNode rcn = new RestapiCallNode();
+ rcn.sendFile(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{
+ 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<>();
+ 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));
+
+ //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);
+ }
+
+ @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());
+ }
+
+ @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("subReqId", "054243");
+ ctx.setAttribute("actionName", "CREATE");
+ ctx.setAttribute("myPrefix", "2016-09-09 16:30:35.0");
+ ctx.setAttribute("complexObj", complexObj);
+ RestapiCallNode rcn = new RestapiCallNode();
+ String request = rcn.buildXmlJsonRequest(ctx, rcn.readFile("src/test/resources/testEmbeddedTemplate.json"), Format.JSON);
+ //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 testMultiLineEmbeddedJsonTemplate() throws Exception {
+ SvcLogicContext ctx = new SvcLogicContext();
+ String complexObj = "{\n"
+ + " \"image_name\": \"Ubuntu 14.04\",\n"
+ + " \"service-instance-id\": \"1\",\n"
+ + " \"vnf-model-customization-uuid\": \"2f\",\n"
+ + " \"vnf-id\": \"3b\"\n"
+ + "}";
+ ctx.setAttribute("reqId", "1235");
+ ctx.setAttribute("subReqId", "054243");
+ ctx.setAttribute("actionName", "CREATE");
+ ctx.setAttribute("myPrefix", "2016-09-09 16:30:35.0");
+ ctx.setAttribute("complexObj", complexObj);
+ RestapiCallNode rcn = new RestapiCallNode();
+ String request = rcn.buildXmlJsonRequest(ctx, rcn.readFile("src/test/resources/testMultiLineEmbeddedTemplate.json"), Format.JSON);
+ //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{
+ 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]);
+
+ 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]);
+
+ 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{
+ 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"));
+ assertFalse(RestapiCallNode.containsMultipleUrls("https://localhost:8008/params=1,2,3,4,5,6"));
+
+ assertTrue(RestapiCallNode.containsMultipleUrls("https://wiki.onap.org/,https://readthedocs.org/projects/onap/"));
+ assertTrue(RestapiCallNode.containsMultipleUrls("http://localhost:7001/,http://localhost:7002"));
+ assertTrue(RestapiCallNode.containsMultipleUrls("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"));
+ assertTrue(RestapiCallNode.containsMultipleUrls("https://wiki.onap.org/,http://localhost:7001/,http://wiki.onap.org/"));
+ assertTrue(RestapiCallNode.containsMultipleUrls("https://wiki.onap.org/test=4,5,6,http://localhost:7001/test=1,2,3,http://wiki.onap.org/test=7,8,9,10"));
+ }
+
+}
diff --git a/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/TestXmlJsonUtil.java b/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/TestXmlJsonUtil.java
new file mode 100644
index 000000000..ac6d3b78b
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/TestXmlJsonUtil.java
@@ -0,0 +1,321 @@
+/*-
+ * ============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 java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onap.ccsdk.sli.plugins.restapicall.XmlJsonUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class TestXmlJsonUtil {
+
+ private static final Logger log = LoggerFactory.getLogger(TestXmlJsonUtil.class);
+
+ @Test
+ public void test() {
+ Map<String, String> mm = new HashMap<>();
+ mm.put("service-data.vnf-config-parameters-list.vnf-config-parameters[0].vnf-type", "N-SBG");
+ mm.put("service-data.service-information.service-instance-id", "someinstance001");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].dns-server-ip-address", "10.11.12.13");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].escf-domain-name", "hclab.atttest.com");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].snmp-target-v3_length", "2");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].snmp-target-v3[0].snmp-target-v3-id", "1");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].snmp-target-v3[0].snmp-target-ip-address", "127.0.0.1");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].snmp-target-v3[0].snmp-security-level", "NO_AUTH_NO_PRIV");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].snmp-target-v3[1].snmp-target-v3-id", "2");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].snmp-target-v3[1].snmp-target-ip-address", "192.168.1.8");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].snmp-target-v3[1].snmp-security-level", "NO_AUTH_NO_PRIV");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].dns-ip-address-1", "2001:1890:1001:2224::1");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].dns-ip-address-2", "2001:1890:1001:2424::1");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].diameter-rf-realm-name", "uvp.els-an.att.net");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].diameter-rf-peer-ip-address", "192.168.1.66");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].bgf-controller-ip-address", "192.168.1.186");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].bgf-control-link-name", "mg3/69@192.168.1.226");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].rf-interface-nexthop-ip-address", "10.111.108.150");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].rf-mated-pair-ip-address", "10.111.108.146");
+
+ mm.put("service-data.vnf-config-parameters-list.vnf-config-parameters[0].access-net-pcscf_length", "4");
+
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].access-net-pcscf[0].network-name", "UvpbUgnAccess1");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].access-net-pcscf[0].sip-pa-termination-ip-address", "10.111.108.146");
+
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].access-net-pcscf[1].network-name", "MIS");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].access-net-pcscf[1].proactive-transcoding-profile",
+ "trinity-transcodingProfile");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].access-net-pcscf[1].next-hop-ip-address", "10.111.108.158");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].access-net-pcscf[1].subnet-mask-length", "10.111.108.154");
+
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].access-net-pcscf[2].network-name", "AVPN1");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].access-net-pcscf[2].proactive-transcoding-profile",
+ "trinity-transcodingProfile");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].access-net-pcscf[2].next-hop-ip-address", "10.111.108.166");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].access-net-pcscf[2].subnet-mask-length", "10.111.108.162");
+
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].access-net-pcscf[3].network-name", "AVPN1");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].access-net-pcscf[3].proactive-transcoding-profile",
+ "trinity-transcodingProfile");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].access-net-pcscf[3].next-hop-ip-address", "10.129.108.166");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].access-net-pcscf[3].subnet-mask-length", "10.129.108.162");
+
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].core-net-pcscf_length", "1");
+
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].core-net-pcscf[0].network-name", "Core");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].core-net-pcscf[0].next-hop-ip-address", "10.111.108.142");
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].core-net-pcscf[0].sip-pa-termination-ip-address", "10.111.108.138");
+
+ mm.put("service-data.vnf-config-parameters-list." +
+ "vnf-config-parameters[0].mated-pair-fully-qualified-domain-name",
+ "mt1nj01sbg01pyl-mt1nj01sbg02pyl.ar1ga.uvp.els-an.att.net");
+
+ mm.put("service-data.appc-request-header.svc-request-id", "SOMESERVICEREQUEST123451000");
+ mm.put("service-data.vnf-config-information.vnf-host-ip-address", "192.168.13.151");
+ mm.put("service-data.vnf-config-information.vendor", "Netconf");
+
+ mm.put("service-data.vnf-config-information.escape-test",
+ "blah blah \"xxx&nnn<>\\'\"there>blah<&''\"\"123\\\\\\'''blah blah &");
+
+ String ss = XmlJsonUtil.getXml(mm, "service-data.vnf-config-parameters-list");
+ log.info(ss);
+
+ ss = XmlJsonUtil.getXml(mm, "service-data.vnf-config-information");
+ log.info(ss);
+
+ ss = XmlJsonUtil.getJson(mm, "service-data.vnf-config-parameters-list.vnf-config-parameters");
+ log.info(ss);
+
+ ss = XmlJsonUtil.getJson(mm, "service-data.vnf-config-information");
+ log.info(ss);
+
+ ss = XmlJsonUtil.getJson(mm, "service-data.vnf-config-information.vnf-host-ip-address");
+ log.info(ss);
+
+ ss = XmlJsonUtil.getJson(mm, "\"service-data.vnf-config-information.vnf-host-ip-address");
+ log.info(ss);
+ }
+
+ public void testRemoveEmptyStructJson1() {
+ String xmlin = "{\n" +
+ " \"policyName\" : \"default-domain.ECOM_Tenant_DND.ECOM_Tenant_DND_mtn6_HngwOamNetVto." +
+ "HNGWOAMNETVTO.OAM_landing-network-role_policy_05\",\n" +
+ " \"policyConfigType\": \"MicroService\",\n" +
+ " \"ecompName\": \"SDNC\",\n" +
+ " \"configBody\": \"{\\\"service\\\": \\\"NetworkPolicy\\\"," +
+ "\\\"location\\\": \\\"Search\\\",\\\"uuid\\\": \\\"Search\\\"," +
+ "\\\"policyName\\\": \\\"default-domain.ECOM_Tenant_DND.ECOM_Tenant_DND_mtn6_HngwOamNetVto." +
+ "HNGWOAMNETVTO.OAM_landing-network-role_policy_05\\\"," +
+ "\\\"description\\\": \\\"default-domain.ECOM_Tenant_DND.ECOM_Tenant_DND_mtn6_HngwOamNetVto." +
+ "HNGWOAMNETVTO.OAM_landing-network-role_policy_05\\\",\\\"configName\\\": \\\"Search\\\"," +
+ "\\\"templateVersion\\\": \\\"1607\\\",\\\"version\\\": \\\"1.3.0.1\\\"," +
+ "\\\"priority\\\": \\\"2\\\",\\\"policyScope\\\": \\\"SDNC\\\",\\\"riskType\\\": \\\"low\\\"," +
+ "\\\"riskLevel\\\": \\\"2\\\",\\\"guard\\\": \\\"True\\\",\\\"content\\\":{ " +
+ "\\\"network-policy\\\": { \\\"display_name\\\": \\\"default-domain.ECOM_Tenant_DND." +
+ "ECOM_Tenant_DND_mtn6_HngwOamNetVto.HNGWOAMNETVTO.OAM_landing-network-role_policy_05\\\", " +
+ "\\\"fq_name\\\": [ \\\"default-domain\\\", " +
+ "\\\"ECOM_Tenant_DND\\\", \\\"default-domain." +
+ "ECOM_Tenant_DND.ECOM_Tenant_DND_mtn6_HngwOamNetVto." +
+ "HNGWOAMNETVTO.OAM_landing-network-role_policy_05\\\" ], " +
+ "\\\"id_perms\\\": { \\\"user_visible\\\": true }, " +
+ "\\\"parent_type\\\": \\\"project\\\", \\\"network_policy_entries\\\": { " +
+ "\\\"policy_rule\\\": [ { " +
+ "\\\"action_list\\\": { \\\"apply_service\\\": [ " +
+ "\\\"testfqdn\\\" ], " +
+ "\\\"gateway_name\\\": null, \\\"qos_action\\\": null, " +
+ "\\\"log\\\": false , \\\"mirror_to\\\": null, " +
+ "\\\"simple_action\\\": null }, " +
+ "\\\"ethertype\\\": null, \\\"application\\\": [], " +
+ "\\\"direction\\\": \\\"<>\\\", \\\"dst_addresses\\\": [ " +
+ "{ \\\"network_policy\\\": null, " +
+ "\\\"security_group\\\": null, " +
+ "\\\"subnet\\\": null, \\\"virtual_network\\\": " +
+ "\\\"default-domain:ECOM_Tenant_DND:ECOM_Tenant_DND_int_HngwOamNetVto." +
+ "HNGWOAMNETVTO.OAM_net_10\\\" } ], " +
+ "\\\"dst_ports\\\": [ { " +
+ "\\\"end_port\\\": -1, \\\"start_port\\\": -1 " +
+ "} ], \\\"protocol\\\": \\\"any\\\", " +
+ "\\\"src_addresses\\\": [ { " +
+ "\\\"network_policy\\\": null, " +
+ "\\\"security_group\\\": null, " +
+ "\\\"subnet\\\": null, \\\"virtual_network\\\": " +
+ "\\\"default-domain:ECOM_Tenant_DND:ECOM_Tenant_DND_int_HngwOamNetVto." +
+ "HNGWOAMNETVTO.OAM_net_9\\\" } ], " +
+ "\\\"src_ports\\\": [ { " +
+ "\\\"end_port\\\": -1, " +
+ "\\\"start_port\\\": -1 } ] } " +
+ "] } }}}\"\n" +
+ "}";
+
+ String xmloutexpected = xmlin;
+
+ String xmlout = XmlJsonUtil.removeEmptyStructJson(null, xmlin);
+ log.info(xmlout);
+
+ Assert.assertEquals(xmloutexpected, xmlout);
+ }
+
+ @Test
+ public void testRemoveEmptyStructXml() {
+ String xmlin = "" +
+ "<T1>\n" +
+ " <T2>\n" +
+ " <T3>\n" +
+ " <T4></T4>\n" +
+ " <T5> </T5>\n" +
+ " <T6>\n" +
+ " </T6>\n" +
+ " </T3>\n" +
+ " <T7>blah</T7>\n" +
+ " </T2>\n" +
+ " <T8>\n" +
+ " <T9>\n" +
+ " <T10></T10>\n" +
+ " <T11> </T11>\n" +
+ " <T12>\n" +
+ " </T12>\n" +
+ " </T9>\n" +
+ " <T13>\n" +
+ " <T14></T14>\n" +
+ " <T15> </T15>\n" +
+ " <T16>\n" +
+ " <T17></T17>\n" +
+ " </T16>\n" +
+ " </T13>\n" +
+ " <T17>\n" +
+ " </T17>\n" +
+ " </T8>\n" +
+ " <T18>blah blah</T18>\n" +
+ "</T1>\n";
+
+ String xmloutexpected = "" +
+ "<T1>\n" +
+ " <T2>\n" +
+ " <T7>blah</T7>\n" +
+ " </T2>\n" +
+ " <T18>blah blah</T18>\n" +
+ "</T1>\n";
+
+ String xmlout = XmlJsonUtil.removeEmptyStructXml(xmlin);
+ log.info(xmlout);
+
+ Assert.assertEquals(xmloutexpected, xmlout);
+ }
+
+ @Test
+ public void testRemoveEmptyStructJson() {
+ String xmlin = "{\r\n" +
+ " \"T1\":{\r\n" +
+ " \"T2\":{\r\n" +
+ " \"T3\":[\r\n" +
+ " \r\n" +
+ " ],\r\n" +
+ " \"T4\":{\r\n" +
+ " \"T12\":[\r\n" +
+ " \r\n" +
+ " ],\r\n" +
+ " \"T13\":[ ],\r\n" +
+ " \"T14\":{\r\n" +
+ " \"T15\":{\r\n" +
+ " \r\n" +
+ " },\r\n" +
+ " \"T16\":{\r\n" +
+ " \r\n" +
+ " }\r\n" +
+ " }\r\n" +
+ " },\r\n" +
+ " \"T5\":{\r\n" +
+ " \"T6\":[\r\n" +
+ " \r\n" +
+ " ],\r\n" +
+ " \"T7\":[\r\n" +
+ " \"T8\":{\r\n" +
+ " \r\n" +
+ " },\r\n" +
+ " \"T9\":{ },\r\n" +
+ " \"T10\":\"blah\",\r\n" +
+ " \"T11\":[\r\n" +
+ " \r\n" +
+ " ]\r\n" +
+ " ]\r\n" +
+ " }\r\n" +
+ " }\r\n" +
+ " }\r\n" +
+ "}\r\n" +
+ "";
+
+ String xmloutexpected = "{\r\n" +
+ " \"T1\":{\r\n" +
+ " \"T2\":{\r\n" +
+ " \"T5\":{\r\n" +
+ " \"T7\":[\r\n" +
+ " \"T10\":\"blah\",\r\n" +
+ " ]\r\n" +
+ " }\r\n" +
+ " }\r\n" +
+ " }\r\n" +
+ "}\r\n" +
+ "";
+
+ String xmlout = XmlJsonUtil.removeEmptyStructJson(null, xmlin);
+ log.info(xmlout);
+
+ Assert.assertEquals(xmloutexpected, xmlout);
+ }
+}
diff --git a/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/TestXmlParser.java b/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/TestXmlParser.java
new file mode 100644
index 000000000..76f86abc0
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/java/org/onap/ccsdk/sli/plugins/restapicall/TestXmlParser.java
@@ -0,0 +1,121 @@
+/*-
+ * ============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 java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import org.junit.Test;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+
+public class TestXmlParser {
+
+ @Test
+ public void test() throws Exception {
+ String path = "src/test/resources/test3.xml";
+ String content = new String(Files.readAllBytes(Paths.get(path)));
+ Set<String> listNameList = new HashSet<String>();
+ listNameList.add("project.dependencies.dependency");
+ listNameList.add("project.build.plugins.plugin");
+ listNameList.add("project.build.plugins.plugin.executions.execution");
+ listNameList.add("project.build.pluginManagement.plugins.plugin");
+ listNameList.add("project.build.pluginManagement." +
+ "plugins.plugin.configuration.lifecycleMappingMetadata.pluginExecutions.pluginExecution");
+
+ Map<String, String> mm = XmlParser.convertToProperties(content, listNameList);
+ assertEquals("811182", mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VpnId"));
+ assertEquals("v6", mm.get("ApplyGroupResponse.ApplyGroupResponseData.RoutingApplyGroups.Family"));
+ assertEquals("SET6_BVOIP_IN", mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfImport"));
+ assertEquals("AG_MAX_MCASTROUTES",
+ mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.ApplyGroup.ApplyGroup"));
+ assertEquals("ICOREPVC-81114561", mm.get("ApplyGroupResponse.ApplyGroupResponseData.ServiceInstanceId"));
+ assertEquals("SET_RESET_LP", mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfExport"));
+ assertEquals("21302:811182", mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfName"));
+ assertEquals("BGP4_PROTOCOL",
+ mm.get("ApplyGroupResponse.ApplyGroupResponseData.RoutingApplyGroups.RoutingProtocol"));
+ assertEquals("AG6_MAX_PREFIX",
+ mm.get("ApplyGroupResponse.ApplyGroupResponseData.RoutingApplyGroups.ApplyGroupPeer.ApplyGroup"));
+ assertEquals("VPNL811182", mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.End2EndVpnKey"));
+ assertEquals("AG6_BFD_BGP_3000",
+ mm.get("ApplyGroupResponse.ApplyGroupResponseData.RoutingApplyGroups.ApplyGroupNeighbour.ApplyGroup"));
+ assertEquals("200", mm.get("ApplyGroupResponse.response-code"));
+ assertEquals("gp6_21302:811182",
+ mm.get("ApplyGroupResponse.ApplyGroupResponseData.RoutingApplyGroups.PeerGroupName"));
+ assertEquals("Y", mm.get("ApplyGroupResponse.ack-final-indicator"));
+ assertEquals("Success", mm.get("ApplyGroupResponse.response-message"));
+ }
+
+ @Test
+ public void testValidLength() throws Exception {
+ String path = "src/test/resources/test3.xml";
+ String content = new String(Files.readAllBytes(Paths.get(path)));
+ Set<String> listNameList = new HashSet<String>();
+ listNameList.add("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfImport");
+ listNameList.add("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfExport");
+
+ Map<String, String> mm = XmlParser.convertToProperties(content, listNameList);
+ assertEquals("AG6_BFD_BGP_3000",
+ mm.get("ApplyGroupResponse.ApplyGroupResponseData.RoutingApplyGroups.ApplyGroupNeighbour.ApplyGroup"));
+ assertEquals("AG6_MAX_PREFIX",
+ mm.get("ApplyGroupResponse.ApplyGroupResponseData.RoutingApplyGroups.ApplyGroupPeer.ApplyGroup"));
+ assertEquals("v6", mm.get("ApplyGroupResponse.ApplyGroupResponseData.RoutingApplyGroups.Family"));
+ assertEquals("gp6_21302:811182",
+ mm.get("ApplyGroupResponse.ApplyGroupResponseData.RoutingApplyGroups.PeerGroupName"));
+ assertEquals("BGP4_PROTOCOL",
+ mm.get("ApplyGroupResponse.ApplyGroupResponseData.RoutingApplyGroups.RoutingProtocol"));
+ assertEquals("ICOREPVC-81114561", mm.get("ApplyGroupResponse.ApplyGroupResponseData.ServiceInstanceId"));
+ assertEquals("AG_MAX_MCASTROUTES",
+ mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.ApplyGroup.ApplyGroup"));
+ assertEquals("VPNL811182", mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.End2EndVpnKey"));
+ assertEquals("811182", mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VpnId"));
+ assertEquals("SET6_DSU", mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfExport[0]"));
+ assertEquals("SET_DSU", mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfExport[1]"));
+ assertEquals("SET6_MANAGED", mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfExport[2]"));
+ assertEquals("SET_MANAGED", mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfExport[3]"));
+ assertEquals("SET_LOVRF_COMMUNITY",
+ mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfExport[4]"));
+ assertEquals("SET_RESET_LP", mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfExport[5]"));
+ assertEquals("6", mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfExport_length"));
+ assertEquals("SET_BVOIP_IN", mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfImport[0]"));
+ assertEquals("SET6_BVOIP_IN", mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfImport[1]"));
+ assertEquals("2", mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfImport_length"));
+ assertEquals("21302:811182", mm.get("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfName"));
+ assertEquals("Y", mm.get("ApplyGroupResponse.ack-final-indicator"));
+ assertEquals("200", mm.get("ApplyGroupResponse.response-code"));
+ assertEquals("Success", mm.get("ApplyGroupResponse.response-message"));
+ }
+
+ @Test(expected = SvcLogicException.class)
+ public void testInvalidLength() throws Exception {
+ String path = "src/test/resources/invalidlength.xml";
+ String content = new String(Files.readAllBytes(Paths.get(path)));
+ Set<String> listNameList = new HashSet<String>();
+ listNameList.add("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfImport");
+ listNameList.add("ApplyGroupResponse.ApplyGroupResponseData.VrfDetails.VrfExport");
+ XmlParser.convertToProperties(content, listNameList); // throws an exception because the length in the xml is
+ // not a valid number
+ }
+
+}
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
new file mode 100755
index 000000000..a130d4390
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/org/onap/ccsdk/sli/plugins/restapicall/TestRestapiCallNode.java
@@ -0,0 +1,531 @@
+/*-
+ * ============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/1dArray.json b/plugins/restapi-call-node/provider/src/test/resources/1dArray.json
new file mode 100644
index 000000000..208fb70a6
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/1dArray.json
@@ -0,0 +1,8 @@
+[
+ "apple",
+ "orange",
+ "banana",
+ "squash",
+ "broccoli",
+ "cauliflower"
+] \ No newline at end of file
diff --git a/plugins/restapi-call-node/provider/src/test/resources/2dArray.json b/plugins/restapi-call-node/provider/src/test/resources/2dArray.json
new file mode 100644
index 000000000..b473864d8
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/2dArray.json
@@ -0,0 +1,4 @@
+[
+ ["apple", "orange", "banana"],
+ ["squash", "broccoli", "cauliflower"]
+] \ No newline at end of file
diff --git a/plugins/restapi-call-node/provider/src/test/resources/3dArray.json b/plugins/restapi-call-node/provider/src/test/resources/3dArray.json
new file mode 100644
index 000000000..3f3f4fab8
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/3dArray.json
@@ -0,0 +1,5 @@
+[
+ [["x","y","z"]],
+ [["abc","def","xyz"], [123, 456, 789]],
+ [["a","b","c"], ["d","e","f"], ["1","2","3"]]
+] \ No newline at end of file
diff --git a/plugins/restapi-call-node/provider/src/test/resources/ArrayMenu.json b/plugins/restapi-call-node/provider/src/test/resources/ArrayMenu.json
new file mode 100644
index 000000000..b12f16315
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/ArrayMenu.json
@@ -0,0 +1,41 @@
+[{
+ "id": "1",
+ "type": "pizza",
+ "name": "plain",
+ "calories": 1000,
+ "vegetarian": true
+ }, {
+ "id": "2",
+ "type": "pizza",
+ "name": "Tuesday Special",
+ "calories": 2000,
+ "vegetarian": false,
+ "topping":
+ [{
+ "id": "1",
+ "name": "onion"
+ }, {
+ "id": "2",
+ "name": "pepperoni"
+ }
+ ]
+ }, {
+ "id": "3",
+ "type": "pizza",
+ "name": "House Special",
+ "calories": 1500,
+ "vegetarian": true,
+ "topping":
+ [{
+ "id": "3",
+ "name": "basil"
+ }, {
+ "id": "4",
+ "name": "fresh mozzarella"
+ }, {
+ "id": "5",
+ "name": "tomato"
+ }
+ ]
+ }
+]
diff --git a/plugins/restapi-call-node/provider/src/test/resources/EmbeddedEscapedJson.json b/plugins/restapi-call-node/provider/src/test/resources/EmbeddedEscapedJson.json
new file mode 100644
index 000000000..dbb6d8d3a
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/EmbeddedEscapedJson.json
@@ -0,0 +1,16 @@
+{
+ "input": {
+ "parameters":
+ [{
+ "name": "escapedJsonObject",
+ "value": "[{\"id\":\"0.2.0.0\/16\"},{\"id\":\"ge04::\/64\"}]"
+ }, {
+ "name": "password",
+ "value": "Hello\/World"
+ }, {
+ "name": "resourceName",
+ "value": "The\t\"Best\"\tName"
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/plugins/restapi-call-node/provider/src/test/resources/EscapedJson.json b/plugins/restapi-call-node/provider/src/test/resources/EscapedJson.json
new file mode 100644
index 000000000..a7719e819
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/EscapedJson.json
@@ -0,0 +1 @@
+{\"widget\":{\"debug\":false,\"window\":{\"title\":\"ONAP Widget\",\"name\":\"main_window\",\"width\":200,\"height\":300},\"image\":{\"src\":\"images\/moon.png\",\"name\":\"moon\",\"hOffset\":150,\"vOffset\":150,\"alignment\":\"center\"},\"text\":{\"data\":\"Click Me\",\"size\":21,\"style\":\"bold\",\"name\":\"text1\",\"hOffset\":350,\"vOffset\":200,\"alignment\":\"center\"}}} \ No newline at end of file
diff --git a/plugins/restapi-call-node/provider/src/test/resources/ObjectMenu.json b/plugins/restapi-call-node/provider/src/test/resources/ObjectMenu.json
new file mode 100644
index 000000000..56f842d48
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/ObjectMenu.json
@@ -0,0 +1,43 @@
+{
+ "menu": [{
+ "id": "1",
+ "type": "pizza",
+ "name": "plain",
+ "calories": 1000,
+ "vegetarian": true
+ }, {
+ "id": "2",
+ "type": "pizza",
+ "name": "Tuesday Special",
+ "calories": 2000,
+ "vegetarian": false,
+ "topping":
+ [{
+ "id": "1",
+ "name": "onion"
+ }, {
+ "id": "2",
+ "name": "pepperoni"
+ }
+ ]
+ }, {
+ "id": "3",
+ "type": "pizza",
+ "name": "House Special",
+ "calories": 1500,
+ "vegetarian": true,
+ "topping":
+ [{
+ "id": "3",
+ "name": "basil"
+ }, {
+ "id": "4",
+ "name": "fresh mozzarella"
+ }, {
+ "id": "5",
+ "name": "tomato"
+ }
+ ]
+ }
+ ]
+}
diff --git a/plugins/restapi-call-node/provider/src/test/resources/Widget.json b/plugins/restapi-call-node/provider/src/test/resources/Widget.json
new file mode 100644
index 000000000..1e25282c2
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/Widget.json
@@ -0,0 +1,27 @@
+{
+ "widget": {
+ "debug": false,
+ "window": {
+ "title": "ONAP Widget",
+ "name": "main_window",
+ "width": 200,
+ "height": 300
+ },
+ "image": {
+ "src": "images/moon.png",
+ "name": "moon",
+ "hOffset": 150,
+ "vOffset": 150,
+ "alignment": "center"
+ },
+ "text": {
+ "data": "Click Me",
+ "size": 21,
+ "style": "bold",
+ "name": "text1",
+ "hOffset": 350,
+ "vOffset": 200,
+ "alignment": "center"
+ }
+ }
+} \ No newline at end of file
diff --git a/plugins/restapi-call-node/provider/src/test/resources/actokentemplate.json b/plugins/restapi-call-node/provider/src/test/resources/actokentemplate.json
new file mode 100644
index 000000000..02e62400f
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/actokentemplate.json
@@ -0,0 +1,4 @@
+{
+ "userName": ${prop.sdncRestApi.thirdpartySdnc.user},
+ "password": ${prop.sdncRestApi.thirdpartySdnc.password}
+}
diff --git a/plugins/restapi-call-node/provider/src/test/resources/invalidlength.xml b/plugins/restapi-call-node/provider/src/test/resources/invalidlength.xml
new file mode 100644
index 000000000..c086d564e
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/invalidlength.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+ ============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=========================================================
+ -->
+
+<ApplyGroupResponse xmlns="http://onap.org/vpn/schema/v1"
+ xmlns:ns2="http://onap.org/prov/vpn/schema/v2">
+ <ApplyGroupResponseData>
+ <ServiceInstanceId>ICOREPVC-81114561</ServiceInstanceId>
+ <VrfDetails>
+ <End2EndVpnKey>VPNL811182</End2EndVpnKey>
+ <VpnId>811182</VpnId>
+ <VrfName>21302:811182</VrfName>
+ <VrfImport>SET_BVOIP_IN</VrfImport>
+ <VrfImport>SET6_BVOIP_IN</VrfImport>
+ <VrfExport_length>a</VrfExport_length>
+ <VrfExport>SET6_DSU</VrfExport>
+ <VrfExport>SET_DSU</VrfExport>
+ <VrfExport>SET6_MANAGED</VrfExport>
+ <VrfExport>SET_MANAGED</VrfExport>
+ <VrfExport>SET_LOVRF_COMMUNITY</VrfExport>
+ <VrfExport>SET_RESET_LP</VrfExport>
+ <ApplyGroup>
+ <ns2:ApplyGroup>AG_MAX_MCASTROUTES</ns2:ApplyGroup>
+ </ApplyGroup>
+ </VrfDetails>
+ </ApplyGroupResponseData>
+ <response-code>200</response-code>
+ <response-message>Success</response-message>
+ <ack-final-indicator>Y</ack-final-indicator>
+</ApplyGroupResponse>
+
diff --git a/plugins/restapi-call-node/provider/src/test/resources/l2-dci-connects-template.json b/plugins/restapi-call-node/provider/src/test/resources/l2-dci-connects-template.json
new file mode 100644
index 000000000..e0896bbaa
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/l2-dci-connects-template.json
@@ -0,0 +1,11 @@
+{
+ "l2-dci-connect": {
+ "id": ${prop.dci-connects.id},
+ "name": ${prop.dci-connects.name},
+ "description": ${prop.dci-connects.description},
+ "network_id": ${prop.dci-connects.local_networks[0]},
+ "evpn_irts": ${prop.dci-connects.evpn_irts},
+ "evpn_erts": ${prop.dci-connects.evpn_erts},
+ "vni": ${prop.dci-connects.vni}
+ }
+}
diff --git a/plugins/restapi-call-node/provider/src/test/resources/l3-dci-connects-template.json b/plugins/restapi-call-node/provider/src/test/resources/l3-dci-connects-template.json
new file mode 100644
index 000000000..41df794fd
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/l3-dci-connects-template.json
@@ -0,0 +1,14 @@
+{
+ "l3-dci-connect": {
+ "id": ${prop.dci-connects.id},
+ "name": ${prop.dci-connects.name},
+ "description": ${prop.dci-connects.description},
+ "router_id": ${prop.dci-connects.router_id},
+ "firewall_enable": false,
+ "local_networks": ${prop.dci-connects.local_networks},
+ "local_network_all": false,
+ "evpn_irts": ${prop.dci-connects.evpn_irts},
+ "evpn_erts": ${prop.dci-connects.evpn_erts},
+ "l3_vni": ${prop.dci-connects.vni}
+ }
+}
diff --git a/plugins/restapi-call-node/provider/src/test/resources/l3smsitetemplate.json b/plugins/restapi-call-node/provider/src/test/resources/l3smsitetemplate.json
new file mode 100644
index 000000000..8f8156698
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/l3smsitetemplate.json
@@ -0,0 +1,162 @@
+{
+ "site":[
+ {
+ "site-id": ${prop.l3vpn.site1_name},
+ "vpn-policies": {
+ "vpn-policy": [
+ {
+ "vpn-policy-id": ${prop.l3vpn.vpn-policy1-id},
+ "entries": [
+ {
+ "id": ${prop.l3vpn.entry1-id},
+ "vpn": {
+ "vpn-id": ${prop.l3vpn.name},
+ "site-role": "huawei-ac-net-l3vpn-svc:any-to-any-role"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "site-network-accesses": {
+ "site-network-access": [
+ {
+ "site-network-access-id": ${prop.l3vpn.sna1_name},
+ "bearer": {
+ "appointed-access": {
+ "ne-id": ${prop.l3vpn.pe1_id},
+ "ltp-id": ${prop.l3vpn.ac1_id},
+ "vlan": {
+ "type": "huawei-ac-net-l3vpn-svc:vlan-dot1q",
+ "vlan-id": ${prop.l3vpn.sna1_svlan}
+ }
+ }
+ },
+ "ip-connection": {
+ "ipv4": {
+ "address-allocation-type": "huawei-ac-net-l3vpn-svc:static-address",
+ "addresses": {
+ "provider-address": ${prop.l3vpn.ac1-peer-ip},
+ "customer-address": ${prop.l3vpn.ac1-ip},
+ "mask": "24"
+ }
+ }
+ },
+ "service": {
+ "mtu": "1500"
+ },
+ "routing-protocols": {
+ "routing-protocol": [
+ {
+ "type": ${prop.l3vpn.ac1_protocol},
+ "static": {
+ "cascaded-lan-prefixes": [
+ {
+ "ipv4-lan-prefixes": [
+ {
+ "ip-prefix": ${prop.l3vpn.sna1-route.ip-prefix},
+ "next-hop": ${prop.l3vpn.sna1-route.next-hop}
+ }
+ ]
+ }
+ ]
+ }
+ "bgp": {
+ "peers": [
+ {
+ "peer-ip": ${prop.l3vpn.peer1-ip},
+ "remote-as": ${prop.l3vpn.ac1_protocol_bgp_as}
+ }
+ ]
+ }
+ }
+ }
+ ]
+ },
+ "vpn-attachment": {
+ "vpn-policy-id": ${prop.l3vpn.name}
+ }
+ }
+ ]
+ },
+ {
+ "site-id": ${prop.l3vpn.site2_name},
+ "vpn-policies": {
+ "vpn-policy": [
+ {
+ "vpn-policy-id": ${prop.l3vpn.vpn-policy2-id},
+ "entries": [
+ {
+ "id": ${prop.l3vpn.entry2-id},
+ "vpn": {
+ "vpn-id": ${prop.l3vpn.name},
+ "site-role": "huawei-ac-net-l3vpn-svc:any-to-any-role"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "site-network-accesses": {
+ "site-network-access": [
+ {
+ "site-network-access-id": ${prop.l3vpn.sna2_name},
+ "bearer": {
+ "appointed-access": {
+ "ne-id": ${prop.l3vpn.pe2_id},
+ "ltp-id": ${prop.l3vpn.ac2_id},
+ "vlan": {
+ "type": "huawei-ac-net-l3vpn-svc:vlan-dot1q",
+ "vlan-id": ${prop.l3vpn.sna2_svlan}
+ }
+ }
+ },
+ "ip-connection": {
+ "ipv4": {
+ "address-allocation-type": "huawei-ac-net-l3vpn-svc:static-address",
+ "addresses": {
+ "provider-address": ${prop.l3vpn.ac2-peer-ip},
+ "customer-address": ${prop.l3vpn.ac2-ip},
+ "mask": "24"
+ }
+ }
+ },
+ "service": {
+ "mtu": "1500"
+ },
+ "routing-protocols": {
+ "routing-protocol": [
+ {
+ "type": ${prop.l3vpn.ac2_protocol},
+ "static": {
+ "cascaded-lan-prefixes": [
+ {
+ "ipv4-lan-prefixes": [
+ {
+ "ip-prefix": ${prop.l3vpn.sna2-route.ip-prefix},
+ "next-hop": ${prop.l3vpn.sna2-route.next-hop}
+ }
+ ]
+ }
+ ]
+ }
+ "bgp": {
+ "peers": [
+ {
+ "peer-ip": ${prop.l3vpn.peer2-ip},
+ "remote-as": ${prop.l3vpn.ac2_protocol_bgp_as}
+ }
+ ]
+ }
+ }
+ ]
+ },
+ "vpn-attachment": {
+ "vpn-policy-id": ${prop.l3vpn.name}
+ }
+ }
+ ]
+ }
+ ]
+}
+
diff --git a/plugins/restapi-call-node/provider/src/test/resources/l3smvpntemplate.json b/plugins/restapi-call-node/provider/src/test/resources/l3smvpntemplate.json
new file mode 100644
index 000000000..30f30a24f
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/l3smvpntemplate.json
@@ -0,0 +1,10 @@
+{
+ "vpn-service": [
+ {
+ "vpn-id": ${prop.l3vpn.name},
+ "customer-name": "huawei",
+ "vpn-service-topology": ${prop.l3vpn.topology},
+ "route-exchange-policy": "huawei-ac-net-l3vpn-svc:vpnv4-way"
+ }
+ ]
+}
diff --git a/plugins/restapi-call-node/provider/src/test/resources/l3smvrftemplate.json b/plugins/restapi-call-node/provider/src/test/resources/l3smvrftemplate.json
new file mode 100644
index 000000000..52359a7fd
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/l3smvrftemplate.json
@@ -0,0 +1,14 @@
+{
+ "vrf-attribute": [
+ {
+ "vrf-attribute-id": ${prop.l3vpn.vrf1-id},
+ "ne-id": ${prop.l3vpn.pe1_id},
+ "vpn-policy-id": ${prop.l3vpn.vpn-policy1-id}
+ },
+ {
+ "vrf-attribute-id": ${prop.l3vpn.vrf2-id},
+ "ne-id": ${prop.l3vpn.pe2_id},
+ "vpn-policy-id": ${prop.l3vpn.vpn-policy2-id}
+ }
+ ]
+}
diff --git a/plugins/restapi-call-node/provider/src/test/resources/partners.json b/plugins/restapi-call-node/provider/src/test/resources/partners.json
new file mode 100755
index 000000000..2562d69c0
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/partners.json
@@ -0,0 +1,22 @@
+{
+ "partnerOne": {
+ "url": "http://localhost:7001",
+ "test": "/metrics"
+ },
+ "partnerTwo": {
+ "url": "http://localhost:7002",
+ "user": "controller_user",
+ "password": "P@ssword",
+ "test": "/metrics"
+ },
+ "partnerThree": {
+ "url": "http://localhost:7003",
+ "user": "controller_admin"
+ },
+ "partnerFour": {
+ "url": "http://localhost:7004",
+ "user": "m30402@sdncp.att.com",
+ "password": "${deployer_pass}",
+ "test": "/metrics"
+ }
+}
diff --git a/plugins/restapi-call-node/provider/src/test/resources/sdwan-site.json b/plugins/restapi-call-node/provider/src/test/resources/sdwan-site.json
new file mode 100644
index 000000000..238ec7642
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/sdwan-site.json
@@ -0,0 +1,10 @@
+{
+ "sites": [
+ {
+ "name": ${prop.name},
+ "controlPoints": []
+ }
+ ]
+}
+
+
diff --git a/plugins/restapi-call-node/provider/src/test/resources/sdwan-vpn-topology.json b/plugins/restapi-call-node/provider/src/test/resources/sdwan-vpn-topology.json
new file mode 100644
index 000000000..4260d2fc1
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/sdwan-vpn-topology.json
@@ -0,0 +1,23 @@
+{
+ "vpnId": ${prop.vpn1Id},
+ "areas": [
+ {
+ "name": "area1",
+ "areaType": "leaf",
+ "topologyType": ${prop.topology},
+ "siteAttachements": [${repeat:prop.siteAttachement_length:
+ {
+ "siteId": ${prop.siteAttachement[${1}].siteId},
+ "role": [${repeat:prop.siteAttachement[${1}].roles_length:
+ ${prop.siteAttachement[${1}].roles[${2}]},
+ }
+ ],
+ "workMode": "with-interconnection",
+ "sitePriority": "active",
+ "borders": "null"
+ },
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/plugins/restapi-call-node/provider/src/test/resources/test-template.json b/plugins/restapi-call-node/provider/src/test/resources/test-template.json
new file mode 100644
index 000000000..ae519a731
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/test-template.json
@@ -0,0 +1,37 @@
+{
+ "sdn-circuit-request": [
+ ${repeat:tmp.sdn-circuit-req-row_length:
+ {
+ "request-id": ${tmp.sdn-circuit-req-row[${1}].request-id},
+ "source-uid": ${tmp.sdn-circuit-req-row[${1}].source-uid},
+ "action": ${tmp.sdn-circuit-req-row[${1}].action},
+ "request-timestamp": ${tmp.sdn-circuit-req-row[${1}].request-timestamp},
+ "update-timestamp": ${tmp.sdn-circuit-req-row[${1}].update-timestamp},
+ "request-status": ${tmp.sdn-circuit-req-row[${1}].request-status},
+ "processing-status": ${tmp.sdn-circuit-req-row[${1}].processing-status},
+ "reason-code": ${tmp.sdn-circuit-req-row[${1}].reason-code},
+ "reason-message": ${tmp.sdn-circuit-req-row[${1}].reason-message},
+ "customer-code": ${tmp.sdn-circuit-req-row[${1}].customer-code},
+ "bundle-id": ${tmp.sdn-circuit-req-row[${1}].bundle-id},
+ "router-name-1": ${tmp.sdn-circuit-req-row[${1}].router-name-1},
+ "tail-clfi-1": ${tmp.sdn-circuit-req-row[${1}].tail-clfi-1},
+ "srg-1": ${tmp.sdn-circuit-req-row[${1}].srg-1},
+ "router-name-2": ${tmp.sdn-circuit-req-row[${1}].router-name-2},
+ "tail-clfi-2": ${tmp.sdn-circuit-req-row[${1}].tail-clfi-2},
+ "srg-2": ${tmp.sdn-circuit-req-row[${1}].srg-2},
+ "facility-speed": ${tmp.sdn-circuit-req-row[${1}].facility-speed},
+ "facility-speed-units": ${tmp.sdn-circuit-req-row[${1}].facility-speed-units},
+ "facility-type": ${tmp.sdn-circuit-req-row[${1}].facility-type},
+ "service-clfi": ${tmp.sdn-circuit-req-row[${1}].service-clfi},
+ "clci": ${tmp.sdn-circuit-req-row[${1}].clci},
+ "wavelength-purpose": ${tmp.sdn-circuit-req-row[${1}].wavelength-purpose},
+ "activate-setting": ${tmp.sdn-circuit-req-row[${1}].activate-setting},
+ "apply-date": ${tmp.sdn-circuit-req-row[${1}].apply-date},
+ "run-id": ${tmp.sdn-circuit-req-row[${1}].run-id},
+ "hostname": ${tmp.sdn-circuit-req-row[${1}].hostname},
+ "algo-request-reason": ${tmp.sdn-circuit-req-row[${1}].algo-request-reason}
+ "test-empty-value": ${tmp.sdn-circuit-req-row[${1}].test-empty-value}
+ },
+ }
+ ]
+}
diff --git a/plugins/restapi-call-node/provider/src/test/resources/test.json b/plugins/restapi-call-node/provider/src/test/resources/test.json
new file mode 100644
index 000000000..75155393c
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/test.json
@@ -0,0 +1,30 @@
+{
+ "equipment-data": [
+ {
+ "server-count": "4",
+ "max-server-speed": "1600000",
+ "number-primary-servers": "2",
+ "equipment-id": "Server1",
+ "server-model": "Unknown",
+ "server-id": "Server1",
+ "test-node" : {
+ "test-inner-node" : "Test-Value"
+ }
+ }
+ ],
+ "resource-state": {
+ "threshold-value": "1600000",
+ "last-added": "1605000",
+ "used": "1605000",
+ "limit-value": "1920000"
+ },
+ "resource-rule": {
+ "endpoint-position": "VCE-Cust",
+ "soft-limit-expression": "0.6 * max-server-speed * number-primary-servers",
+ "resource-name": "Bandwidth",
+ "service-model": "DUMMY",
+ "hard-limit-expression": "max-server-speed * number-primary-servers",
+ "equipment-level": "Server"
+ },
+ "message": "The provisioned access bandwidth is at or exceeds 50% of the total server capacity."
+}
diff --git a/plugins/restapi-call-node/provider/src/test/resources/test.xml b/plugins/restapi-call-node/provider/src/test/resources/test.xml
new file mode 100644
index 000000000..1974f688e
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/test.xml
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============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=========================================================
+ -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.onap.ccsdk.sli.plugins</groupId>
+ <artifactId>restapi-call-node</artifactId>
+ <version>6.0.0-SNAPSHOT</version>
+ </parent>
+ <artifactId>restapi-call-node-provider</artifactId>
+ <packaging>bundle</packaging>
+ <name>RESTAPI Call Node - Provider</name>
+ <url>http://maven.apache.org</url>
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ </properties>
+ <dependencies>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-test</artifactId>
+ <version>3.1.4.RELEASE</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.ccsdk.sli</groupId>
+ <artifactId>sli-common</artifactId>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.onap.ccsdk.sli</groupId>
+ <artifactId>sli-provider</artifactId>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>${slf4j.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>jcl-over-slf4j</artifactId>
+ <version>${slf4j.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-beans</artifactId>
+ <version>3.1.4.RELEASE</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context</artifactId>
+ <version>3.1.4.RELEASE</version>
+ </dependency>
+ <dependency>
+ <groupId>xerces</groupId>
+ <artifactId>xerces</artifactId>
+ <version>2.4.0</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-client</artifactId>
+ <version>1.17</version>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey.contribs.jersey-oauth</groupId>
+ <artifactId>oauth-signature</artifactId>
+ <version>1.17</version>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey.contribs.jersey-oauth</groupId>
+ <artifactId>oauth-client</artifactId>
+ <version>1.17</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>com.brocade.developer</groupId>
+ <artifactId>providermodule-plugin</artifactId>
+ <configuration>
+ <packageId>org.onap.ccsdk.sli.plugins</packageId>
+ <appName>restapi-call-node</appName>
+ </configuration>
+ <executions>
+ <execution>
+ <phase>process-sources</phase>
+ <goals>
+ <goal>process</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-SymbolicName>org.onap.ccsdk.sli.plugins.restapicall</Bundle-SymbolicName>
+ <Export-Package>org.onap.ccsdk.sli.plugins.restapicall</Export-Package>
+ <Import-Package>*</Import-Package>
+ </instructions>
+
+ <manifestLocation>${project.basedir}/src/main/resources/META-INF</manifestLocation>
+
+ </configuration>
+
+ </plugin>
+
+
+ </plugins>
+ <pluginManagement>
+ <plugins>
+ <!--This plugin's configuration is used to store Eclipse m2e settings
+ only. It has no influence on the Maven build itself. -->
+ <plugin>
+ <groupId>org.eclipse.m2e</groupId>
+ <artifactId>lifecycle-mapping</artifactId>
+ <version>1.0.0</version>
+ <configuration>
+ <lifecycleMappingMetadata>
+ <pluginExecutions>
+ <pluginExecution>
+ <pluginExecutionFilter>
+ <groupId>
+ com.brocade.developer
+ </groupId>
+ <artifactId>
+ providermodule-plugin
+ </artifactId>
+ <versionRange>
+ [1.2.0.100-SNAPSHOT,)
+ </versionRange>
+ <goals>
+ <goal>process</goal>
+ </goals>
+ </pluginExecutionFilter>
+ <action>
+ <ignore />
+ </action>
+ </pluginExecution>
+ </pluginExecutions>
+ </lifecycleMappingMetadata>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+</project>
diff --git a/plugins/restapi-call-node/provider/src/test/resources/test3.xml b/plugins/restapi-call-node/provider/src/test/resources/test3.xml
new file mode 100644
index 000000000..ade412681
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/test3.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+ ============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=========================================================
+ -->
+
+<ApplyGroupResponse xmlns="http://onap.org/vpn/schema/v1"
+ xmlns:ns2="http://onap.org/prov/vpn/schema/v2">
+ <ApplyGroupResponseData>
+ <ServiceInstanceId>ICOREPVC-81114561</ServiceInstanceId>
+ <VrfDetails>
+ <End2EndVpnKey>VPNL811182</End2EndVpnKey>
+ <VpnId>811182</VpnId>
+ <VrfName>21302:811182</VrfName>
+ <VrfImport>SET_BVOIP_IN</VrfImport>
+ <VrfImport>SET6_BVOIP_IN</VrfImport>
+ <VrfExport>SET6_DSU</VrfExport>
+ <VrfExport>SET_DSU</VrfExport>
+ <VrfExport>SET6_MANAGED</VrfExport>
+ <VrfExport>SET_MANAGED</VrfExport>
+ <VrfExport>SET_LOVRF_COMMUNITY</VrfExport>
+ <VrfExport>SET_RESET_LP</VrfExport>
+ <ApplyGroup>
+ <ns2:ApplyGroup>AG_MAX_MCASTROUTES</ns2:ApplyGroup>
+ </ApplyGroup>
+ </VrfDetails>
+ <RoutingApplyGroups>
+ <RoutingProtocol>BGP4_PROTOCOL</RoutingProtocol>
+ <Family>v4</Family>
+ <PeerGroupName>gp_21302:811182</PeerGroupName>
+ <ApplyGroupPeer>
+ <ns2:ApplyGroup>AG_L3VPN_EBGP</ns2:ApplyGroup>
+ </ApplyGroupPeer>
+ <ApplyGroupPeer>
+ <ns2:ApplyGroup>AG_MAX_PREFIX</ns2:ApplyGroup>
+ </ApplyGroupPeer>
+ <ApplyGroupNeighbour>
+ <ns2:ApplyGroup>AG_BGP_UNMANAGED</ns2:ApplyGroup>
+ </ApplyGroupNeighbour>
+ <ApplyGroupNeighbour>
+ <ns2:ApplyGroup>AG_BFD_BGP_3000</ns2:ApplyGroup>
+ </ApplyGroupNeighbour>
+ </RoutingApplyGroups>
+ <RoutingApplyGroups>
+ <RoutingProtocol>BGP4_PROTOCOL</RoutingProtocol>
+ <Family>v6</Family>
+ <PeerGroupName>gp6_21302:811182</PeerGroupName>
+ <ApplyGroupPeer>
+ <ns2:ApplyGroup>AG6_L3VPN_EBGP</ns2:ApplyGroup>
+ </ApplyGroupPeer>
+ <ApplyGroupPeer>
+ <ns2:ApplyGroup>AG6_MAX_PREFIX</ns2:ApplyGroup>
+ </ApplyGroupPeer>
+ <ApplyGroupNeighbour>
+ <ns2:ApplyGroup>AG6_BGP_UNMANAGED</ns2:ApplyGroup>
+ </ApplyGroupNeighbour>
+ <ApplyGroupNeighbour>
+ <ns2:ApplyGroup>AG6_BFD_BGP_3000</ns2:ApplyGroup>
+ </ApplyGroupNeighbour>
+ </RoutingApplyGroups>
+ </ApplyGroupResponseData>
+ <response-code>200</response-code>
+ <response-message>Success</response-message>
+ <ack-final-indicator>Y</ack-final-indicator>
+</ApplyGroupResponse>
+
diff --git a/plugins/restapi-call-node/provider/src/test/resources/testEmbeddedTemplate.json b/plugins/restapi-call-node/provider/src/test/resources/testEmbeddedTemplate.json
new file mode 100644
index 000000000..7f2377813
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/testEmbeddedTemplate.json
@@ -0,0 +1,20 @@
+{
+ "commonHeader": {
+ "origin": "earth",
+ "requestId": ${reqId},
+ "subRequestId": ${subReqId}
+ },
+ "actions": {
+ "actionName": ${actionName},
+ "mode": "sync"
+ },
+ "payload": {
+ "assignment-request": {
+ "prefix": [
+ ${myPrefix}
+ ],
+ "assignment-properties": ${'"complexObj}
+ }
+ }
+}
+
diff --git a/plugins/restapi-call-node/provider/src/test/resources/testMultiLineEmbeddedTemplate.json b/plugins/restapi-call-node/provider/src/test/resources/testMultiLineEmbeddedTemplate.json
new file mode 100644
index 000000000..84ae3a492
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/testMultiLineEmbeddedTemplate.json
@@ -0,0 +1,20 @@
+{
+ "commonHeader": {
+ "origin": "earth",
+ "requestId": ${reqId},
+ "subRequestId": ${subReqId}
+ },
+ "actions": {
+ "actionName": ${actionName},
+ "mode": "sync"
+ },
+ "payload": {
+ "assignment-request": {
+ "prefix": [
+ ${myPrefix}
+ ],
+ "assignment-properties": ${complexObj}
+ }
+ }
+}
+
diff --git a/plugins/restapi-call-node/provider/src/test/resources/test_file.txt b/plugins/restapi-call-node/provider/src/test/resources/test_file.txt
new file mode 100644
index 000000000..038d757dc
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/test_file.txt
@@ -0,0 +1,5 @@
+“You think your pain and your heartbreak are unprecedented in the history of the world, but then you read. It was books that taught me that the things that tormented me most were the very things that connected me with all the people who were alive, who had ever been alive.” – James Baldwin
+“When I have a little money, I buy books; and if I have any left, I buy food and clothes.” – Erasmus
+“If you only read the books that everyone else is reading, you can only think what everyone else is thinking.” – Haruki Murakami
+“You don’t have to burn books to destroy a culture. Just get people to stop reading them.” – Ray Bradbury
+“A reader lives a thousand lives before he dies, said Jojen. The man who never reads lives only one.” – George R.R. Martin
diff --git a/plugins/restapi-call-node/provider/src/test/resources/ueb.properties b/plugins/restapi-call-node/provider/src/test/resources/ueb.properties
new file mode 100644
index 000000000..96657ee1a
--- /dev/null
+++ b/plugins/restapi-call-node/provider/src/test/resources/ueb.properties
@@ -0,0 +1,6 @@
+#for other servers see http://sa2020.it.att.com:8888/sw/cambria/installs
+
+#to check connectivity http://hostname:3904/metrics
+
+servers=http://uebsb91kcdc.it.att.com:3904 http://uebsb92kcdc.it.att.com:3904 http://uebsb93kcdc.it.att.com:3904
+