[CCSDK-6] Populate seed code 07/6007/7
authorDan Timoney <dtimoney@att.com>
Wed, 19 Jul 2017 00:35:53 +0000 (20:35 -0400)
committerDan Timoney <dtimoney@att.com>
Tue, 1 Aug 2017 15:35:12 +0000 (11:35 -0400)
Add seed code for sli/plugins repository
Changed groupId to org.onap.ccsdk.sli.plugins
Updated to compile against CCSDK version of SLI

Change-Id: Ib392530ea79b8544087692964bd65179896aa595
Signed-off-by: Dan Timoney <dtimoney@att.com>
61 files changed:
.gitignore [new file with mode: 0755]
LICENSE.txt [new file with mode: 0644]
README.md [new file with mode: 0644]
example-settings.xml [new file with mode: 0644]
jenkins-settings.xml [new file with mode: 0644]
pom.xml [new file with mode: 0755]
properties-node/.gitignore [new file with mode: 0755]
properties-node/features/pom.xml [new file with mode: 0755]
properties-node/features/src/main/resources/features.xml [new file with mode: 0644]
properties-node/installer/pom.xml [new file with mode: 0755]
properties-node/installer/src/assembly/assemble_installer_zip.xml [new file with mode: 0644]
properties-node/installer/src/assembly/assemble_mvnrepo_zip.xml [new file with mode: 0644]
properties-node/installer/src/main/resources/scripts/install-feature.sh [new file with mode: 0644]
properties-node/pom.xml [new file with mode: 0755]
properties-node/provider/pom.xml [new file with mode: 0755]
properties-node/provider/src/main/java/org/openecomp/sdnc/prop/PropertiesNode.java [new file with mode: 0644]
properties-node/provider/src/main/resources/META-INF/spring/properties-node-context.xml [new file with mode: 0644]
properties-node/provider/src/main/resources/META-INF/spring/properties-node-osgi-context.xml [new file with mode: 0644]
restapi-call-node/.gitignore [new file with mode: 0755]
restapi-call-node/features/pom.xml [new file with mode: 0755]
restapi-call-node/features/src/main/resources/features.xml [new file with mode: 0644]
restapi-call-node/installer/pom.xml [new file with mode: 0755]
restapi-call-node/installer/src/assembly/assemble_installer_zip.xml [new file with mode: 0644]
restapi-call-node/installer/src/assembly/assemble_mvnrepo_zip.xml [new file with mode: 0644]
restapi-call-node/installer/src/main/resources/scripts/install-feature.sh [new file with mode: 0644]
restapi-call-node/pom.xml [new file with mode: 0755]
restapi-call-node/provider/pom.xml [new file with mode: 0755]
restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/Format.java [new file with mode: 0644]
restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/HttpMethod.java [new file with mode: 0644]
restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/HttpResponse.java [new file with mode: 0644]
restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/JsonParser.java [new file with mode: 0644]
restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/Parameters.java [new file with mode: 0644]
restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/RestapiCallNode.java [new file with mode: 0644]
restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/RetryException.java [new file with mode: 0644]
restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/RetryPolicy.java [new file with mode: 0644]
restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/RetryPolicyStore.java [new file with mode: 0644]
restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/XmlJsonUtil.java [new file with mode: 0644]
restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/XmlParser.java [new file with mode: 0644]
restapi-call-node/provider/src/main/resources/META-INF/spring/restapi-call-node-context.xml [new file with mode: 0644]
restapi-call-node/provider/src/main/resources/META-INF/spring/restapi-call-node-osgi-context.xml [new file with mode: 0644]
restapi-call-node/provider/src/main/resources/default-ueb-message.json [new file with mode: 0644]
restapi-call-node/provider/src/main/resources/get-multicast-data.json [new file with mode: 0644]
restapi-call-node/provider/src/main/resources/northbound-api-template.json [new file with mode: 0644]
restapi-call-node/provider/src/main/resources/northbound-api-template.xml [new file with mode: 0644]
restapi-call-node/provider/src/main/resources/service-configuration-notification-northbound-template.json [new file with mode: 0644]
restapi-call-node/provider/src/main/resources/update-vpe-data-with-apply-group.json [new file with mode: 0644]
restapi-call-node/provider/src/main/resources/vnf-information-update.json [new file with mode: 0644]
restapi-call-node/provider/src/main/resources/vpn-allocation-request.json [new file with mode: 0644]
restapi-call-node/provider/src/main/resources/vpn-information-update.json [new file with mode: 0644]
restapi-call-node/provider/src/main/resources/vrf-service-configuration-information-template.json [new file with mode: 0644]
restapi-call-node/provider/src/main/resources/vrf-update-vlan-status-template.json [new file with mode: 0644]
restapi-call-node/provider/src/main/resources/vrf-update.json [new file with mode: 0644]
restapi-call-node/provider/src/test/java/jtest/org/openecomp/sdnc/restapicall/TestJsonParser.java [new file with mode: 0644]
restapi-call-node/provider/src/test/java/jtest/org/openecomp/sdnc/restapicall/TestRestapiCallNode.java [new file with mode: 0644]
restapi-call-node/provider/src/test/java/jtest/org/openecomp/sdnc/restapicall/TestXmlJsonUtil.java [new file with mode: 0644]
restapi-call-node/provider/src/test/java/jtest/org/openecomp/sdnc/restapicall/TestXmlParser.java [new file with mode: 0644]
restapi-call-node/provider/src/test/resources/test-template.json [new file with mode: 0644]
restapi-call-node/provider/src/test/resources/test.json [new file with mode: 0644]
restapi-call-node/provider/src/test/resources/test.xml [new file with mode: 0644]
restapi-call-node/provider/src/test/resources/test3.xml [new file with mode: 0644]
version.properties [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100755 (executable)
index 0000000..fabe495
--- /dev/null
@@ -0,0 +1,38 @@
+#####standard .git ignore entries#####
+
+## IDE Specific Files ##
+org.eclipse.core.resources.prefs
+.classpath
+.project
+.settings
+.idea
+.externalToolBuilders
+.checkstyle
+maven-eclipse.xml
+workspace
+
+## Compilation Files ##
+*.class
+**/target
+target
+target-ide
+MANIFEST.MF
+
+## Misc Ignores (OS specific etc) ##
+bin/
+dist
+*~
+*.ipr
+*.iml
+*.iws
+classes
+out/
+.DS_STORE
+.metadata
+provider/src/main/java/META-INF/
+provider/src/main/java/inventory/
+
+# BlackDuck generated file
+sdnc-plugins_bdio.jsonld
+blackDuckHubProjectName.txt
+blackDuckHubProjectVersionName.txt
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644 (file)
index 0000000..3ea5081
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * ============LICENSE_START==========================================
+ * ===================================================================
+ * Copyright © 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============================================
+ *
+ * ECOMP and OpenECOMP are trademarks
+ * and service marks of AT&T Intellectual Property.
+ *
+ */
diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..4e733ca
--- /dev/null
+++ b/README.md
@@ -0,0 +1,9 @@
+This source repository contains the code for the SDN Controller plugins.
+
+To compile this code:
+
+1. Make sure your local Maven settings file ($HOME/.m2/settings.xml) contains references to the OpenECOMP repositories and OpenDaylight repositories.  See example-settings.xml for an example.
+
+2. To compile, run "mvn clean install".
+
+
diff --git a/example-settings.xml b/example-settings.xml
new file mode 100644 (file)
index 0000000..2e7ce64
--- /dev/null
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=2 tabstop=2: -->
+<!--
+ Copyright (c) 2014, 2015 Cisco Systems, Inc. and others.  All rights reserved.
+
+ This program and the accompanying materials are made available under the
+ terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ and is available at http://www.eclipse.org/legal/epl-v10.html
+-->
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
+
+  <profiles>
+    <profile>
+      <id>openecomp-release</id>
+      <repositories>
+        <repository>
+          <id>openecomp-release</id>
+          <name>openecomp-release</name>
+          <url>https://ecomp-nexus:8443/repository/maven-releases/</url>
+          <releases>
+            <enabled>true</enabled>
+            <updatePolicy>never</updatePolicy>
+          </releases>
+          <snapshots>
+            <enabled>false</enabled>
+          </snapshots>
+        </repository>
+      </repositories>
+      <pluginRepositories>
+        <pluginRepository>
+          <id>openecomp-release</id>
+          <name>openecomp-release</name>
+          <url>https://ecomp-nexus:8443/repository/maven-releases/</url>
+          <releases>
+            <enabled>true</enabled>
+            <updatePolicy>never</updatePolicy>
+          </releases>
+          <snapshots>
+            <enabled>false</enabled>
+          </snapshots>
+        </pluginRepository>
+      </pluginRepositories>
+    </profile>
+
+    <profile>
+      <id>openecomp-snapshots</id>
+      <repositories>
+        <repository>
+          <id>openecomp-snapshot</id>
+          <name>openecomp-snapshot</name>
+          <url>https://ecomp-nexus:8443/repository/maven-snapshots/</url>
+          <releases>
+            <enabled>false</enabled>
+          </releases>
+          <snapshots>
+            <enabled>true</enabled>
+          </snapshots>
+        </repository>
+      </repositories>
+      <pluginRepositories>
+        <pluginRepository>
+          <id>openecomp-snapshot</id>
+          <name>openecomp-snapshot</name>
+          <url>https://ecomp-nexus:8443/repository/maven-snapshots/</url>
+          <releases>
+            <enabled>false</enabled>
+          </releases>
+          <snapshots>
+            <enabled>true</enabled>
+          </snapshots>
+        </pluginRepository>
+      </pluginRepositories>
+    </profile>
+    <profile>
+      <id>opendaylight-release</id>
+      <repositories>
+        <repository>
+          <id>opendaylight-mirror</id>
+          <name>opendaylight-mirror</name>
+          <url>https://nexus.opendaylight.org/content/repositories/public/</url>
+          <releases>
+            <enabled>true</enabled>
+            <updatePolicy>never</updatePolicy>
+          </releases>
+          <snapshots>
+            <enabled>false</enabled>
+          </snapshots>
+        </repository>
+      </repositories>
+      <pluginRepositories>
+        <pluginRepository>
+          <id>opendaylight-mirror</id>
+          <name>opendaylight-mirror</name>
+          <url>https://nexus.opendaylight.org/content/repositories/public/</url>
+          <releases>
+            <enabled>true</enabled>
+            <updatePolicy>never</updatePolicy>
+          </releases>
+          <snapshots>
+            <enabled>false</enabled>
+          </snapshots>
+        </pluginRepository>
+      </pluginRepositories>
+    </profile>
+
+    <profile>
+      <id>opendaylight-snapshots</id>
+      <repositories>
+        <repository>
+          <id>opendaylight-snapshot</id>
+          <name>opendaylight-snapshot</name>
+          <url>https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url>
+          <releases>
+            <enabled>false</enabled>
+          </releases>
+          <snapshots>
+            <enabled>true</enabled>
+          </snapshots>
+        </repository>
+      </repositories>
+      <pluginRepositories>
+        <pluginRepository>
+          <id>opendaylight-snapshot</id>
+          <name>opendaylight-snapshot</name>
+          <url>https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url>
+          <releases>
+            <enabled>false</enabled>
+          </releases>
+          <snapshots>
+            <enabled>true</enabled>
+          </snapshots>
+        </pluginRepository>
+      </pluginRepositories>
+    </profile>
+  </profiles>
+
+  <activeProfiles>
+    <activeProfile>openecomp-release</activeProfile>
+    <activeProfile>openecomp-snapshots</activeProfile>
+    <activeProfile>opendaylight-release</activeProfile>
+    <activeProfile>opendaylight-snapshots</activeProfile>
+  </activeProfiles>
+
+  <servers>
+   <server>
+    <id>nexus</id>
+    <username>USERNAME</username>
+    <password>PASSWORD</password>
+   </server>
+   <server> 
+    <id>openecomp-release</id> 
+    <username>USERNAME</username> 
+    <password>PASSWORD</password> 
+   </server> 
+   <server> 
+    <id>openecomp-snapshot</id> 
+         <username>USERNAME</username> 
+    <password>PASSWORD</password> 
+   </server> 
+  </servers>
+</settings>
diff --git a/jenkins-settings.xml b/jenkins-settings.xml
new file mode 100644 (file)
index 0000000..344994f
--- /dev/null
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=2 tabstop=2: -->
+<!--
+ Copyright (c) 2014, 2015 Cisco Systems, Inc. and others.  All rights reserved.
+
+ This program and the accompanying materials are made available under the
+ terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ and is available at http://www.eclipse.org/legal/epl-v10.html
+-->
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
+
+  <profiles>
+    <profile>
+      <id>openecomp-release</id>
+      <repositories>
+        <repository>
+          <id>openecomp-release</id>
+          <name>openecomp-release</name>
+          <url>https://ecomp-nexus:8443/repository/maven-releases/</url>
+          <releases>
+            <enabled>true</enabled>
+            <updatePolicy>never</updatePolicy>
+          </releases>
+          <snapshots>
+            <enabled>false</enabled>
+          </snapshots>
+        </repository>
+      </repositories>
+      <pluginRepositories>
+        <pluginRepository>
+          <id>openecomp-release</id>
+          <name>openecomp-release</name>
+          <url>https://ecomp-nexus:8443/repository/maven-releases/</url>
+          <releases>
+            <enabled>true</enabled>
+            <updatePolicy>never</updatePolicy>
+          </releases>
+          <snapshots>
+            <enabled>false</enabled>
+          </snapshots>
+        </pluginRepository>
+      </pluginRepositories>
+    </profile>
+
+    <profile>
+      <id>openecomp-snapshots</id>
+      <repositories>
+        <repository>
+          <id>openecomp-snapshot</id>
+          <name>openecomp-snapshot</name>
+          <url>https://ecomp-nexus:8443/repository/maven-snapshots/</url>
+          <releases>
+            <enabled>false</enabled>
+          </releases>
+          <snapshots>
+            <enabled>true</enabled>
+          </snapshots>
+        </repository>
+      </repositories>
+      <pluginRepositories>
+        <pluginRepository>
+          <id>openecomp-snapshot</id>
+          <name>openecomp-snapshot</name>
+          <url>https://ecomp-nexus:8443/repository/maven-snapshots/</url>
+          <releases>
+            <enabled>false</enabled>
+          </releases>
+          <snapshots>
+            <enabled>true</enabled>
+          </snapshots>
+        </pluginRepository>
+      </pluginRepositories>
+    </profile>
+    <profile>
+      <id>opendaylight-release</id>
+      <repositories>
+        <repository>
+          <id>opendaylight-mirror</id>
+          <name>opendaylight-mirror</name>
+          <url>https://nexus.opendaylight.org/content/repositories/public/</url>
+          <releases>
+            <enabled>true</enabled>
+            <updatePolicy>never</updatePolicy>
+          </releases>
+          <snapshots>
+            <enabled>false</enabled>
+          </snapshots>
+        </repository>
+      </repositories>
+      <pluginRepositories>
+        <pluginRepository>
+          <id>opendaylight-mirror</id>
+          <name>opendaylight-mirror</name>
+          <url>https://nexus.opendaylight.org/content/repositories/public/</url>
+          <releases>
+            <enabled>true</enabled>
+            <updatePolicy>never</updatePolicy>
+          </releases>
+          <snapshots>
+            <enabled>false</enabled>
+          </snapshots>
+        </pluginRepository>
+      </pluginRepositories>
+    </profile>
+
+    <profile>
+      <id>opendaylight-snapshots</id>
+      <repositories>
+        <repository>
+          <id>opendaylight-snapshot</id>
+          <name>opendaylight-snapshot</name>
+          <url>https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url>
+          <releases>
+            <enabled>false</enabled>
+          </releases>
+          <snapshots>
+            <enabled>true</enabled>
+          </snapshots>
+        </repository>
+      </repositories>
+      <pluginRepositories>
+        <pluginRepository>
+          <id>opendaylight-snapshot</id>
+          <name>opendaylight-snapshot</name>
+          <url>https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url>
+          <releases>
+            <enabled>false</enabled>
+          </releases>
+          <snapshots>
+            <enabled>true</enabled>
+          </snapshots>
+        </pluginRepository>
+      </pluginRepositories>
+    </profile>
+  </profiles>
+
+  <activeProfiles>
+    <activeProfile>openecomp-release</activeProfile>
+    <activeProfile>openecomp-snapshots</activeProfile>
+    <activeProfile>opendaylight-release</activeProfile>
+    <activeProfile>opendaylight-snapshots</activeProfile>
+  </activeProfiles>
+
+  <servers>
+   <server>
+    <id>nexus</id>
+    <username>${ecomp.nexus.user}</username>
+    <password>${ecomp.nexus.password}</password>
+   </server>
+   <server> 
+    <id>openecomp-release</id> 
+    <username>${ecomp.nexus.user}</username> 
+    <password>${ecomp.nexus.password}</password> 
+   </server> 
+   <server> 
+    <id>openecomp-snapshot</id> 
+         <username>${ecomp.nexus.user}</username> 
+    <password>${ecomp.nexus.password}</password> 
+   </server> 
+   <server>
+       <id>sdnc-javadoc</id>
+       <username>${ecomp.nexus.user}</username>
+       <password>${ecomp.nexus.password}</password>
+   </server>
+  </servers>
+</settings>
diff --git a/pom.xml b/pom.xml
new file mode 100755 (executable)
index 0000000..96436f7
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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/maven-v4_0_0.xsd">
+
+       <parent>
+               <groupId>org.onap.ccsdk.parent</groupId>
+               <artifactId>odlparent-boron-sr3</artifactId>
+               <version>0.0.1-SNAPSHOT</version>
+       </parent>
+
+       <modelVersion>4.0.0</modelVersion>
+       <packaging>pom</packaging>
+       <groupId>org.onap.ccsdk.sli.plugins</groupId>
+       <artifactId>sdnc-plugins</artifactId>
+
+       <name>SDN-C Java Plugins</name>
+       <url>https://wiki.openecomp.org</url>
+       <description>The SDN-C core components contains the SLI, dblib and root pom</description>
+
+
+       <issueManagement>
+               <system>JIRA</system>
+               <url>https://jira.openecomp.org/</url>
+       </issueManagement>
+
+
+       <scm>
+               <connection>scm:git:ssh://git@${openecomp.git.host}/sdnc-plugins.git</connection>
+               <developerConnection>scm:git:ssh://${openecomp.git.host}:${openecomp.git.port}/${openecomp.git.project}/sdnc-iplugins.git</developerConnection>
+               <url>${openecomp.git.protocol}://${openecomp.git.host}/projects/${openecomp.git.project}/repos/sdnc-plugins/browse</url>
+               <tag>HEAD</tag>
+       </scm>
+
+       <ciManagement>
+               <system>Jenkins</system>
+               <url>https://jenkins.openecomp.org</url>
+       </ciManagement>
+
+
+       <distributionManagement>
+               <site>
+                       <id>sdnc-javadoc</id>
+                       <url>dav:https://${openecomp.nexus.host}/content/sites/site/org/onap/sdnc/plugins/${project.artifactId}/${project.version}</url>
+               </site>
+       </distributionManagement>
+
+       <profiles>
+               <profile>
+                       <id>blackduck</id>
+                       <activation>
+                               <property>
+                                       <name>blackduck-scan</name>
+                               </property>
+                       </activation>
+                       <build>
+                                       <plugins>
+                                               <plugin>
+                                                       <groupId>com.blackducksoftware.integration</groupId>
+                                                       <artifactId>hub-maven-plugin</artifactId>
+                                                       <version>1.4.0</version>
+                                                       <inherited>false</inherited>
+                                                       <configuration>
+                                                               <hubProjectName>${project.name}</hubProjectName>
+                                                               <outputDirectory>${project.basedir}</outputDirectory>
+                                                       </configuration>
+                                                       <executions>
+                                                               <execution>
+                                                                       <id>create-bdio-file</id>
+                                                                       <phase>package</phase>
+                                                                       <goals>
+                                                                               <goal>createHubOutput</goal>
+                                                                       </goals>
+                                                               </execution>
+                                                       </executions>
+                                               </plugin>
+                                       </plugins>
+
+
+                       </build>
+
+               </profile>
+
+       </profiles>
+       <build>
+               <plugins>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-surefire-plugin</artifactId>
+                               <version>2.17</version>
+                               <configuration>
+                                       <skipTests>true</skipTests>
+                               </configuration>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.sonatype.plugins</groupId>
+                               <artifactId>nexus-staging-maven-plugin</artifactId>
+                               <version>1.6.7</version>
+                               <extensions>true</extensions>
+                               <configuration>
+                                       <nexusUrl>https://${openecomp.nexus.host}</nexusUrl>
+                                       <stagingProfileId>${openecomp.nexus.staging.profile-id}</stagingProfileId>
+                                       <serverId>${openecomp.nexus.staging.server-id}</serverId>
+                               </configuration>
+                       </plugin>
+               </plugins>
+
+       </build>
+       <modules>
+               <module>properties-node</module>
+               <module>restapi-call-node</module>
+       </modules>
+       <organization>
+               <name>AT&amp;T</name>
+       </organization>
+       <version>0.0.1-SNAPSHOT</version>
+
+
+</project>
diff --git a/properties-node/.gitignore b/properties-node/.gitignore
new file mode 100755 (executable)
index 0000000..b73caf3
--- /dev/null
@@ -0,0 +1,34 @@
+#####standard .git ignore entries#####
+
+## IDE Specific Files ##
+org.eclipse.core.resources.prefs
+.classpath
+.project
+.settings
+.idea
+.externalToolBuilders
+maven-eclipse.xml
+workspace
+
+## Compilation Files ##
+*.class
+**/target
+target
+target-ide
+MANIFEST.MF
+
+## Misc Ignores (OS specific etc) ##
+bin/
+dist
+*~
+*.ipr
+*.iml
+*.iws
+classes
+out/
+.DS_STORE
+.metadata
+
+## Folders which contain auto generated source code ##
+yang-gen-config
+yang-gen-sal
diff --git a/properties-node/features/pom.xml b/properties-node/features/pom.xml
new file mode 100755 (executable)
index 0000000..159ac47
--- /dev/null
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<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">\r
+       <modelVersion>4.0.0</modelVersion>\r
+       <parent>\r
+               <artifactId>properties-node</artifactId>\r
+               <groupId>org.onap.ccsdk.sli.plugins</groupId>\r
+               <version>0.0.1-SNAPSHOT</version>\r
+       </parent>\r
+       <groupId>org.onap.ccsdk.sli.plugins</groupId>\r
+       <version>0.0.1-SNAPSHOT</version>\r
+       <artifactId>properties-node-features</artifactId>\r
+       <name>Properties Node - Features</name>\r
+\r
+       <packaging>jar</packaging>\r
+\r
+       <dependencies>\r
+\r
+               <dependency>\r
+                       <groupId>org.onap.ccsdk.sli.plugins</groupId>\r
+                       <artifactId>properties-node-provider</artifactId>\r
+                       <version>${project.version}</version>\r
+               </dependency>\r
+\r
+               <dependency>\r
+                       <groupId>commons-lang</groupId>\r
+                       <artifactId>commons-lang</artifactId>\r
+                       <version>2.6</version>\r
+                       <scope>compile</scope>\r
+               </dependency>\r
+\r
+               <dependency>\r
+                       <groupId>org.opendaylight.mdsal</groupId>\r
+                       <artifactId>features-mdsal</artifactId>\r
+                       <version>${odl.mdsal.features.version}</version>\r
+                       <classifier>features</classifier>\r
+                       <type>xml</type>\r
+\r
+                       <scope>runtime</scope>\r
+               </dependency>\r
+\r
+\r
+               <!-- dependency for opendaylight-karaf-empty for use by testing -->\r
+               <dependency>\r
+                       <groupId>org.opendaylight.controller</groupId>\r
+                       <artifactId>opendaylight-karaf-empty</artifactId>\r
+                       <version>${odl.karaf.empty.distro.version}</version>\r
+                       <type>zip</type>\r
+               </dependency>\r
+\r
+\r
+               <dependency>\r
+                       <!-- Required for launching the feature tests -->\r
+                       <groupId>org.opendaylight.odlparent</groupId>\r
+                       <artifactId>features-test</artifactId>\r
+                       <version>${odl.commons.opendaylight.version}</version>\r
+                       <scope>test</scope>\r
+               </dependency>\r
+\r
+               <dependency>\r
+                       <groupId>org.opendaylight.yangtools</groupId>\r
+                       <artifactId>features-yangtools</artifactId>\r
+                       <version>${odl.yangtools.version}</version>\r
+                       <classifier>features</classifier>\r
+                       <type>xml</type>\r
+                       <scope>runtime</scope>\r
+               </dependency>\r
+       </dependencies>\r
+\r
+       <build>\r
+               <resources>\r
+                       <resource>\r
+                               <filtering>true</filtering>\r
+                               <directory>src/main/resources</directory>\r
+                       </resource>\r
+               </resources>\r
+               <plugins>\r
+                       <plugin>\r
+                               <groupId>org.apache.maven.plugins</groupId>\r
+                               <artifactId>maven-resources-plugin</artifactId>\r
+                               <executions>\r
+                                       <execution>\r
+                                               <id>filter</id>\r
+                                               <goals>\r
+                                                       <goal>resources</goal>\r
+                                               </goals>\r
+                                               <phase>generate-resources</phase>\r
+                                       </execution>\r
+                               </executions>\r
+                       </plugin>\r
+                                       <!-- launches the feature test, which validates that your karaf feature\r
+                                       can be installed inside of a karaf container. It doesn't validate that your\r
+                                       functionality works correctly, just that you have all of the dependent bundles\r
+                                       defined correctly.\r
+                       <plugin>\r
+\r
+                               <groupId>org.apache.maven.plugins</groupId>\r
+                               <artifactId>maven-surefire-plugin</artifactId>\r
+                               <version>2.16</version>\r
+                               <configuration>\r
+                                       <systemPropertyVariables>\r
+                                               <karaf.distro.groupId>org.opendaylight.controller</karaf.distro.groupId>\r
+                                               <karaf.distro.artifactId>opendaylight-karaf-empty</karaf.distro.artifactId>\r
+                                               <karaf.distro.version>${odl.karaf.empty.distro.version}</karaf.distro.version>\r
+                                       </systemPropertyVariables>\r
+                                       <dependenciesToScan>\r
+                                               <dependency>org.opendaylight.yangtools:features-test</dependency>\r
+                                       </dependenciesToScan>\r
+                               </configuration>\r
+                       </plugin>\r
+                       -->\r
+                       <plugin>\r
+                               <groupId>org.codehaus.mojo</groupId>\r
+                               <artifactId>build-helper-maven-plugin</artifactId>\r
+                               <executions>\r
+                                       <execution>\r
+                                               <id>attach-artifacts</id>\r
+                                               <goals>\r
+                                                       <goal>attach-artifact</goal>\r
+                                               </goals>\r
+                                               <phase>package</phase>\r
+                                               <configuration>\r
+                                                       <artifacts>\r
+                                                               <artifact>\r
+                                                                       <file>${project.build.directory}/classes/${features.file}</file>\r
+                                                                       <type>xml</type>\r
+                                                                       <classifier>features</classifier>\r
+                                                               </artifact>\r
+                                                       </artifacts>\r
+                                               </configuration>\r
+                                       </execution>\r
+                               </executions>\r
+                       </plugin>\r
+               </plugins>\r
+       </build>\r
+</project>\r
diff --git a/properties-node/features/src/main/resources/features.xml b/properties-node/features/src/main/resources/features.xml
new file mode 100644 (file)
index 0000000..e89b333
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 ONAP 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=========================================================
+  -->
+
+
+<features name="sdnc-properties-node-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.2.0"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0">
+
+       <repository>mvn:org.opendaylight.mdsal/features-mdsal/${odl.mdsal.features.version}/xml/features</repository>
+
+       <feature name='sdnc-properties-node' description="sdnc-properties-node"
+               version='${project.version}'>
+               <feature version="${sdnctl.sli.version}">sdnc-sli</feature>
+               <feature>spring</feature>
+               <feature>spring-dm</feature>
+               <bundle>mvn:org.openecomp.sdnc.plugins/properties-node-provider/${project.version}
+               </bundle>
+       </feature>
+
+</features>
diff --git a/properties-node/installer/pom.xml b/properties-node/installer/pom.xml
new file mode 100755 (executable)
index 0000000..5749a9b
--- /dev/null
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+               <artifactId>properties-node</artifactId>
+               <groupId>org.onap.ccsdk.sli.plugins</groupId>
+               <version>0.0.1-SNAPSHOT</version>
+       </parent>
+       <artifactId>properties-node-installer</artifactId>
+       <name>Properties node - Karaf  Installer</name>
+       <packaging>pom</packaging>
+
+       <properties>
+               <application.name>sdnc-properties-node</application.name>
+               <features.boot>sdnc-properties-node</features.boot>
+               <features.repositories>mvn:org.onap.ccsdk.sli.plugins/properties-node-features/${project.version}/xml/features</features.repositories>
+               <include.transitive.dependencies>false</include.transitive.dependencies>
+       </properties>
+
+       <dependencies>
+
+               <dependency>
+                       <groupId>org.onap.ccsdk.sli.plugins</groupId>
+                       <artifactId>properties-node-features</artifactId>
+                       <version>${project.version}</version>
+                       <classifier>features</classifier>
+                       <type>xml</type>
+                       <exclusions>
+                               <exclusion>
+                                       <groupId>*</groupId>
+                                       <artifactId>*</artifactId>
+                               </exclusion>
+                       </exclusions>
+               </dependency>
+
+               <dependency>
+                       <groupId>org.onap.ccsdk.sli.plugins</groupId>
+                       <artifactId>properties-node-provider</artifactId>
+                       <version>${project.version}</version>
+               </dependency>
+
+       </dependencies>
+
+       <build>
+               <plugins>
+                       <plugin>
+                               <artifactId>maven-assembly-plugin</artifactId>
+                               <version>2.6</version>
+                               <executions>
+                                       <execution>
+                                               <id>maven-repo-zip</id>
+                                               <goals>
+                                                       <goal>single</goal>
+                                               </goals>
+                                               <phase>package</phase>
+                                               <configuration>
+                                                       <attach>false</attach>
+                                                       <finalName>stage/${application.name}-${project.version}</finalName>
+                                                       <descriptors>
+                                                               <descriptor>src/assembly/assemble_mvnrepo_zip.xml</descriptor>
+                                                       </descriptors>
+                                                       <appendAssemblyId>false</appendAssemblyId>
+                                               </configuration>
+                                       </execution>
+                                       <execution>
+                                               <id>installer-zip</id>
+                                               <goals>
+                                                       <goal>single</goal>
+                                               </goals>
+                                               <phase>package</phase>
+                                               <configuration>
+                                                       <attach>true</attach>
+                                                       <finalName>${application.name}-${project.version}-installer</finalName>
+                                                       <descriptors>
+                                                               <descriptor>src/assembly/assemble_installer_zip.xml</descriptor>
+                                                       </descriptors>
+                                                       <appendAssemblyId>false</appendAssemblyId>
+                                               </configuration>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-dependency-plugin</artifactId>
+                               <executions>
+                                       <execution>
+                                               <id>copy-dependencies</id>
+                                               <goals>
+                                                       <goal>copy-dependencies</goal>
+                                               </goals>
+                                               <phase>prepare-package</phase>
+                                               <configuration>
+                                                       <transitive>false</transitive>
+                                                       <outputDirectory>${project.build.directory}/assembly/system</outputDirectory>
+                                                       <overWriteReleases>false</overWriteReleases>
+                                                       <overWriteSnapshots>true</overWriteSnapshots>
+                                                       <overWriteIfNewer>true</overWriteIfNewer>
+                                                       <useRepositoryLayout>true</useRepositoryLayout>
+                                                       <addParentPoms>false</addParentPoms>
+                                                       <copyPom>false</copyPom>
+                                                       <includeGroupIds>org.onap.ccsdk.sli</includeGroupIds>
+                                                       <excludeArtifactIds>sli-common,sli-provider,dblib-provider</excludeArtifactIds>
+                                                       <scope>provided</scope>
+                                               </configuration>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                       <plugin>
+                               <artifactId>maven-resources-plugin</artifactId>
+                               <version>2.6</version>
+                               <executions>
+                                       <execution>
+                                               <id>copy-version</id>
+                                               <goals>
+                                                       <goal>copy-resources</goal>
+                                               </goals><!-- here the phase you need -->
+                                               <phase>validate</phase>
+                                               <configuration>
+                                                       <outputDirectory>${basedir}/target/stage</outputDirectory>
+                                                       <resources>
+                                                               <resource>
+                                                                       <directory>src/main/resources/scripts</directory>
+                                                                       <includes>
+                                                                               <include>install-feature.sh</include>
+                                                                       </includes>
+                                                                       <filtering>true</filtering>
+                                                               </resource>
+                                                       </resources>
+                                               </configuration>
+                                       </execution>
+
+                               </executions>
+                       </plugin>
+
+               </plugins>
+       </build>
+
+</project>
diff --git a/properties-node/installer/src/assembly/assemble_installer_zip.xml b/properties-node/installer/src/assembly/assemble_installer_zip.xml
new file mode 100644 (file)
index 0000000..e278872
--- /dev/null
@@ -0,0 +1,59 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 ONAP 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=========================================================
+  -->
+
+<!-- Defines how we build the .zip file which is our distribution. -->
+
+<assembly
+       xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+       <id>installer_zip</id>
+       <formats>
+               <format>zip</format>
+       </formats>
+
+       <!--  we want "system" and related files right at the root level
+                 as this file is suppose to be unzip on top of a karaf
+                 distro. -->
+       <includeBaseDirectory>false</includeBaseDirectory>
+
+       <fileSets>
+               <fileSet>
+                       <directory>target/stage/</directory>
+                       <outputDirectory>${application.name}</outputDirectory>
+                       <fileMode>755</fileMode>
+                       <includes>
+                               <include>*.sh</include>
+                       </includes>
+               </fileSet>
+               <fileSet>
+                       <directory>target/stage/</directory>
+                       <outputDirectory>${application.name}</outputDirectory>
+                       <fileMode>644</fileMode>
+                       <excludes>
+                               <exclude>*.sh</exclude>
+                       </excludes>
+               </fileSet>
+       </fileSets>
+
+
+
+</assembly>
diff --git a/properties-node/installer/src/assembly/assemble_mvnrepo_zip.xml b/properties-node/installer/src/assembly/assemble_mvnrepo_zip.xml
new file mode 100644 (file)
index 0000000..1edacdb
--- /dev/null
@@ -0,0 +1,49 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 ONAP 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=========================================================
+  -->
+
+<!-- Defines how we build the .zip file which is our distribution. -->
+
+<assembly
+       xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+       <id>mvnrepo_zip</id>
+       <formats>
+               <format>zip</format>
+       </formats>
+
+       <!--  we want "system" and related files right at the root level
+                 as this file is suppose to be unzip on top of a karaf
+                 distro. -->
+       <includeBaseDirectory>false</includeBaseDirectory>
+
+       <fileSets>
+               <fileSet>
+                       <directory>target/assembly/</directory>
+                       <outputDirectory>.</outputDirectory>
+                       <excludes>
+                       </excludes>
+               </fileSet>
+       </fileSets>
+
+
+
+</assembly>
diff --git a/properties-node/installer/src/main/resources/scripts/install-feature.sh b/properties-node/installer/src/main/resources/scripts/install-feature.sh
new file mode 100644 (file)
index 0000000..9a47d22
--- /dev/null
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+###
+# ============LICENSE_START=======================================================
+# openECOMP : SDN-C
+# ================================================================================
+# Copyright (C) 2017 ONAP 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=========================================================
+###
+
+ODL_HOME=${ODL_HOME:-/opt/opendaylight/current}
+ODL_KARAF_CLIENT=${ODL_KARAF_CLIENT:-${ODL_HOME}/bin/client}
+ODL_KARAF_CLIENT_OPTS=${ODL_KARAF_CLIENT_OPTS:-"-u karaf"}
+INSTALLERDIR=$(dirname $0)
+
+REPOZIP=${INSTALLERDIR}/${features.boot}-${project.version}.zip
+
+if [ -f ${REPOZIP} ]
+then
+       unzip -d ${ODL_HOME} ${REPOZIP}
+else
+       echo "ERROR : repo zip ($REPOZIP) not found"
+       exit 1
+fi
+
+${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:repo-add ${features.repositories}
+${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:install ${features.boot}
diff --git a/properties-node/pom.xml b/properties-node/pom.xml
new file mode 100755 (executable)
index 0000000..8d6af7c
--- /dev/null
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<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/maven-v4_0_0.xsd">\r
+       <parent>\r
+               <groupId>org.onap.ccsdk.sli.plugins</groupId>\r
+               <artifactId>sdnc-plugins</artifactId>\r
+               <version>0.0.1-SNAPSHOT</version>\r
+       </parent>\r
+\r
+       <modelVersion>4.0.0</modelVersion>\r
+       <packaging>pom</packaging>\r
+\r
+       <groupId>org.onap.ccsdk.sli.plugins</groupId>\r
+       <artifactId>properties-node</artifactId>\r
+       <version>0.0.1-SNAPSHOT</version>\r
+\r
+       <name>Properties Node</name>\r
+       <description>This is an implementation of DG Execute Node that reads property file and\r
+       puts the properties in the DG context</description>\r
+\r
+       <dependencyManagement>\r
+               <dependencies>\r
+                       <dependency>\r
+                               <groupId>org.onap.ccsdk.sli.plugins</groupId>\r
+                               <artifactId>properties-node-features</artifactId>\r
+                               <classifier>features</classifier>\r
+                               <type>xml</type>\r
+                               <version>${project.version}</version>\r
+                       </dependency>\r
+                       <dependency>\r
+                               <groupId>org.onap.ccsdk.sli.plugins</groupId>\r
+                               <artifactId>properties-node-provider</artifactId>\r
+                               <version>${project.version}</version>\r
+                       </dependency>\r
+               </dependencies>\r
+       </dependencyManagement>\r
+\r
+       <modules>\r
+               <module>provider</module>\r
+               <module>features</module>\r
+               <module>installer</module>\r
+       </modules>\r
+</project>\r
+\r
diff --git a/properties-node/provider/pom.xml b/properties-node/provider/pom.xml
new file mode 100755 (executable)
index 0000000..43369ad
--- /dev/null
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<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">\r
+       <modelVersion>4.0.0</modelVersion>\r
+       <parent>\r
+               <groupId>org.onap.ccsdk.sli.plugins</groupId>\r
+               <artifactId>properties-node</artifactId>\r
+               <version>0.0.1-SNAPSHOT</version>\r
+       </parent>\r
+       <groupId>org.onap.ccsdk.sli.plugins</groupId>\r
+       <version>0.0.1-SNAPSHOT</version>\r
+       <artifactId>properties-node-provider</artifactId>\r
+       <packaging>bundle</packaging>\r
+       <name>Properties Node - Provider</name>\r
+       <url>http://maven.apache.org</url>\r
+       <properties>\r
+               <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r
+       </properties>\r
+       <dependencies>\r
+               <dependency>\r
+                       <groupId>junit</groupId>\r
+                       <artifactId>junit</artifactId>\r
+                       <scope>test</scope>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>org.springframework</groupId>\r
+                       <artifactId>spring-test</artifactId>\r
+                       <version>${spring.version}</version>\r
+                       <scope>test</scope>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>org.onap.ccsdk.sli.core</groupId>\r
+                       <artifactId>sli-common</artifactId>\r
+                       <version>${sdnctl.sli.version}</version>\r
+                       <scope>compile</scope>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>org.onap.ccsdk.sli.core</groupId>\r
+                       <artifactId>sli-provider</artifactId>\r
+                       <version>${sdnctl.sli.version}</version>\r
+                       <scope>compile</scope>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>org.slf4j</groupId>\r
+                       <artifactId>slf4j-api</artifactId>\r
+                       <version>${slf4j.version}</version>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>org.slf4j</groupId>\r
+                       <artifactId>jcl-over-slf4j</artifactId>\r
+                       <version>${slf4j.version}</version>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>org.springframework</groupId>\r
+                       <artifactId>spring-beans</artifactId>\r
+                       <version>${spring.version}</version>\r
+               </dependency>\r
+               <dependency>\r
+                       <groupId>org.springframework</groupId>\r
+                       <artifactId>spring-context</artifactId>\r
+                       <version>${spring.version}</version>\r
+               </dependency>\r
+       </dependencies>\r
+\r
+       <build>\r
+               <plugins>\r
+\r
+\r
+\r
+                       <plugin>\r
+                               <groupId>org.apache.felix</groupId>\r
+                               <artifactId>maven-bundle-plugin</artifactId>\r
+                               <extensions>true</extensions>\r
+                               <configuration>\r
+                                       <instructions>\r
+                                               <Bundle-SymbolicName>org.onap.ccsdk.sli.prop</Bundle-SymbolicName>\r
+                                               <Export-Package>org.onap.ccsdk.sli.prop</Export-Package>\r
+                                               <Import-Package>*</Import-Package>\r
+                                       </instructions>\r
+\r
+\r
+                               </configuration>\r
+\r
+                       </plugin>\r
+\r
+\r
+               </plugins>\r
+\r
+       </build>\r
+</project>\r
diff --git a/properties-node/provider/src/main/java/org/openecomp/sdnc/prop/PropertiesNode.java b/properties-node/provider/src/main/java/org/openecomp/sdnc/prop/PropertiesNode.java
new file mode 100644 (file)
index 0000000..9856b19
--- /dev/null
@@ -0,0 +1,97 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 ONAP 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.openecomp.sdnc.prop;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+import java.util.Properties;
+
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PropertiesNode implements SvcLogicJavaPlugin {
+
+       private static final Logger log = LoggerFactory.getLogger(PropertiesNode.class);
+
+       public void readProperties(Map<String, String> paramMap, SvcLogicContext ctx) throws SvcLogicException {
+               String fileName = parseParam(paramMap, "fileName", true, null);
+               String contextPrefix = parseParam(paramMap, "contextPrefix", false, null);
+
+               try {
+                       Properties pp = new Properties();
+                       InputStream in = new FileInputStream(fileName);
+                       pp.load(in);
+                       for (Object key : pp.keySet()) {
+                               String pfx = contextPrefix != null ? contextPrefix + '.' : "";
+                               String name = (String) key;
+                               String value = pp.getProperty(name);
+                               if (value != null && value.trim().length() > 0) {
+                                       ctx.setAttribute(pfx + name, value.trim());
+                                       log.info("+++ " + pfx + name + ": [" + value + "]");
+                               }
+                       }
+               } catch (IOException e) {
+                       throw new SvcLogicException("Cannot read property file: " + fileName + ": " + e.getMessage(), e);
+               }
+       }
+
+       private String parseParam(Map<String, String> paramMap, String name, boolean required, String def)
+               throws SvcLogicException {
+               String s = paramMap.get(name);
+
+               if (s == null || s.trim().length() == 0) {
+                       if (!required)
+                               return def;
+                       throw new SvcLogicException("Parameter " + name + " is required in PropertiesNode");
+               }
+
+               s = s.trim();
+               String value = "";
+               int i = 0;
+               int i1 = s.indexOf('%');
+               while (i1 >= 0) {
+                       int i2 = s.indexOf('%', i1 + 1);
+                       if (i2 < 0)
+                               throw new SvcLogicException("Cannot parse parameter " + name + ": " + s + ": no matching %");
+
+                       String varName = s.substring(i1 + 1, i2);
+                       String varValue = System.getenv(varName);
+                       if (varValue == null)
+                               varValue = "";
+
+                       value += s.substring(i, i1);
+                       value += varValue;
+
+                       i = i2 + 1;
+                       i1 = s.indexOf('%', i);
+               }
+               value += s.substring(i);
+
+               log.info("Parameter " + name + ": " + value);
+               return value;
+       }
+}
diff --git a/properties-node/provider/src/main/resources/META-INF/spring/properties-node-context.xml b/properties-node/provider/src/main/resources/META-INF/spring/properties-node-context.xml
new file mode 100644 (file)
index 0000000..a53ea14
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 ONAP 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=========================================================
+  -->
+
+<beans xmlns="http://www.springframework.org/schema/beans"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:context="http://www.springframework.org/schema/context"
+    xsi:schemaLocation="http://www.springframework.org/schema/beans
+        http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+       <bean id="propertiesNode" class="org.openecomp.sdnc.prop.PropertiesNode">
+       </bean>
+
+</beans>
diff --git a/properties-node/provider/src/main/resources/META-INF/spring/properties-node-osgi-context.xml b/properties-node/provider/src/main/resources/META-INF/spring/properties-node-osgi-context.xml
new file mode 100644 (file)
index 0000000..7d74fd4
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 ONAP 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=========================================================
+  -->
+
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+       xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+       <service ref="propertiesNode" interface="org.openecomp.sdnc.prop.PropertiesNode" />
+
+</beans:beans>
diff --git a/restapi-call-node/.gitignore b/restapi-call-node/.gitignore
new file mode 100755 (executable)
index 0000000..b73caf3
--- /dev/null
@@ -0,0 +1,34 @@
+#####standard .git ignore entries#####
+
+## IDE Specific Files ##
+org.eclipse.core.resources.prefs
+.classpath
+.project
+.settings
+.idea
+.externalToolBuilders
+maven-eclipse.xml
+workspace
+
+## Compilation Files ##
+*.class
+**/target
+target
+target-ide
+MANIFEST.MF
+
+## Misc Ignores (OS specific etc) ##
+bin/
+dist
+*~
+*.ipr
+*.iml
+*.iws
+classes
+out/
+.DS_STORE
+.metadata
+
+## Folders which contain auto generated source code ##
+yang-gen-config
+yang-gen-sal
diff --git a/restapi-call-node/features/pom.xml b/restapi-call-node/features/pom.xml
new file mode 100755 (executable)
index 0000000..cf94733
--- /dev/null
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+               <artifactId>restapi-call-node</artifactId>
+               <groupId>org.onap.ccsdk.sli.plugins</groupId>
+               <version>0.0.1-SNAPSHOT</version>
+       </parent>
+       <groupId>org.onap.ccsdk.sli.plugins</groupId>
+       <version>0.0.1-SNAPSHOT</version>
+       <artifactId>restapi-call-node-features</artifactId>
+       <name>RESTAPI Call Node - Features</name>
+
+       <packaging>jar</packaging>
+
+       <dependencies>
+
+               <dependency>
+                       <groupId>org.onap.ccsdk.sli.plugins</groupId>
+                       <artifactId>restapi-call-node-provider</artifactId>
+                       <version>${project.version}</version>
+               </dependency>
+
+               <dependency>
+                       <groupId>commons-lang</groupId>
+                       <artifactId>commons-lang</artifactId>
+                       <version>2.6</version>
+                       <scope>compile</scope>
+               </dependency>
+
+               <dependency>
+                       <groupId>org.opendaylight.mdsal</groupId>
+                       <artifactId>features-mdsal</artifactId>
+                       <version>${odl.mdsal.features.version}</version>
+                       <classifier>features</classifier>
+                       <type>xml</type>
+
+                       <scope>runtime</scope>
+               </dependency>
+
+
+               <!-- dependency for opendaylight-karaf-empty for use by testing -->
+               <dependency>
+                       <groupId>org.opendaylight.controller</groupId>
+                       <artifactId>opendaylight-karaf-empty</artifactId>
+                       <version>${odl.karaf.empty.distro.version}</version>
+                       <type>zip</type>
+               </dependency>
+
+
+               <dependency>
+                       <!-- Required for launching the feature tests -->
+                       <groupId>org.opendaylight.odlparent</groupId>
+                       <artifactId>features-test</artifactId>
+                       <version>${odl.commons.opendaylight.version}</version>
+                       <scope>test</scope>
+               </dependency>
+
+               <dependency>
+                       <groupId>org.opendaylight.yangtools</groupId>
+                       <artifactId>features-yangtools</artifactId>
+                       <version>${odl.yangtools.version}</version>
+                       <classifier>features</classifier>
+                       <type>xml</type>
+                       <scope>runtime</scope>
+               </dependency>
+       </dependencies>
+
+       <build>
+               <resources>
+                       <resource>
+                               <filtering>true</filtering>
+                               <directory>src/main/resources</directory>
+                       </resource>
+               </resources>
+               <plugins>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-resources-plugin</artifactId>
+                               <executions>
+                                       <execution>
+                                               <id>filter</id>
+                                               <goals>
+                                                       <goal>resources</goal>
+                                               </goals>
+                                               <phase>generate-resources</phase>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                                       <!-- launches the feature test, which validates that your karaf feature
+                                       can be installed inside of a karaf container. It doesn't validate that your
+                                       functionality works correctly, just that you have all of the dependent bundles
+                                       defined correctly.
+                       <plugin>
+
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-surefire-plugin</artifactId>
+                               <version>2.16</version>
+                               <configuration>
+                                       <systemPropertyVariables>
+                                               <karaf.distro.groupId>org.opendaylight.controller</karaf.distro.groupId>
+                                               <karaf.distro.artifactId>opendaylight-karaf-empty</karaf.distro.artifactId>
+                                               <karaf.distro.version>${odl.karaf.empty.distro.version}</karaf.distro.version>
+                                       </systemPropertyVariables>
+                                       <dependenciesToScan>
+                                               <dependency>org.opendaylight.yangtools:features-test</dependency>
+                                       </dependenciesToScan>
+                               </configuration>
+                       </plugin>
+                       -->
+                       <plugin>
+                               <groupId>org.codehaus.mojo</groupId>
+                               <artifactId>build-helper-maven-plugin</artifactId>
+                               <executions>
+                                       <execution>
+                                               <id>attach-artifacts</id>
+                                               <goals>
+                                                       <goal>attach-artifact</goal>
+                                               </goals>
+                                               <phase>package</phase>
+                                               <configuration>
+                                                       <artifacts>
+                                                               <artifact>
+                                                                       <file>${project.build.directory}/classes/${features.file}</file>
+                                                                       <type>xml</type>
+                                                                       <classifier>features</classifier>
+                                                               </artifact>
+                                                       </artifacts>
+                                               </configuration>
+                                       </execution>
+                               </executions>
+                       </plugin>
+               </plugins>
+       </build>
+</project>
diff --git a/restapi-call-node/features/src/main/resources/features.xml b/restapi-call-node/features/src/main/resources/features.xml
new file mode 100644 (file)
index 0000000..648e6f7
--- /dev/null
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 ONAP 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=========================================================
+  -->
+
+
+<features name="sdnc-restapi-call-node-${project.version}"
+       xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0">
+
+       <repository>mvn:org.opendaylight.mdsal/features-mdsal/${odl.mdsal.features.version}/xml/features</repository>
+
+       <feature name='sdnc-restapi-call-node' description="sdnc-restapi-call-node"
+               version='${project.version}'>
+               <feature version="${sdnctl.sli.version}">sdnc-sli</feature>
+               <feature>spring</feature>
+               <feature>spring-dm</feature>
+               <bundle>mvn:com.sun.jersey/jersey-client/${jersey.version}</bundle>
+               <bundle>mvn:org.codehaus.jettison/jettison/${jettison.version}</bundle>
+               <bundle>mvn:org.openecomp.sdnc.plugins/restapi-call-node-provider/${project.version}</bundle>
+       </feature>
+
+</features>
diff --git a/restapi-call-node/installer/pom.xml b/restapi-call-node/installer/pom.xml
new file mode 100755 (executable)
index 0000000..db0aae6
--- /dev/null
@@ -0,0 +1,139 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+               <artifactId>restapi-call-node</artifactId>
+               <groupId>org.onap.ccsdk.sli.plugins</groupId>
+               <version>0.0.1-SNAPSHOT</version>
+       </parent>
+       <artifactId>restapi-call-node-installer</artifactId>
+       <name>Properties node - Karaf  Installer</name>
+       <packaging>pom</packaging>
+
+       <properties>
+               <application.name>sdnc-restapi-call-node</application.name>
+               <features.boot>sdnc-restapi-call-node</features.boot>
+               <features.repositories>mvn:org.onap.ccsdk.sli.plugins/restapi-call-node-features/${project.version}/xml/features</features.repositories>
+               <include.transitive.dependencies>false</include.transitive.dependencies>
+       </properties>
+
+       <dependencies>
+
+               <dependency>
+                       <groupId>org.onap.ccsdk.sli.plugins</groupId>
+                       <artifactId>restapi-call-node-features</artifactId>
+                       <version>${project.version}</version>
+                       <classifier>features</classifier>
+                       <type>xml</type>
+                       <exclusions>
+                               <exclusion>
+                                       <groupId>*</groupId>
+                                       <artifactId>*</artifactId>
+                               </exclusion>
+                       </exclusions>
+               </dependency>
+
+               <dependency>
+                       <groupId>org.onap.ccsdk.sli.plugins</groupId>
+                       <artifactId>restapi-call-node-provider</artifactId>
+                       <version>${project.version}</version>
+               </dependency>
+
+       </dependencies>
+
+       <build>
+               <plugins>
+                       <plugin>
+                               <artifactId>maven-assembly-plugin</artifactId>
+                               <version>2.6</version>
+                               <executions>
+                                       <execution>
+                                               <id>maven-repo-zip</id>
+                                               <goals>
+                                                       <goal>single</goal>
+                                               </goals>
+                                               <phase>package</phase>
+                                               <configuration>
+                                                       <attach>false</attach>
+                                                       <finalName>stage/${application.name}-${project.version}</finalName>
+                                                       <descriptors>
+                                                               <descriptor>src/assembly/assemble_mvnrepo_zip.xml</descriptor>
+                                                       </descriptors>
+                                                       <appendAssemblyId>false</appendAssemblyId>
+                                               </configuration>
+                                       </execution>
+                                       <execution>
+                                               <id>installer-zip</id>
+                                               <goals>
+                                                       <goal>single</goal>
+                                               </goals>
+                                               <phase>package</phase>
+                                               <configuration>
+                                                       <attach>true</attach>
+                                                       <finalName>${application.name}-${project.version}-installer</finalName>
+                                                       <descriptors>
+                                                               <descriptor>src/assembly/assemble_installer_zip.xml</descriptor>
+                                                       </descriptors>
+                                                       <appendAssemblyId>false</appendAssemblyId>
+                                               </configuration>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                       <plugin>
+                               <groupId>org.apache.maven.plugins</groupId>
+                               <artifactId>maven-dependency-plugin</artifactId>
+                               <executions>
+                                       <execution>
+                                               <id>copy-dependencies</id>
+                                               <goals>
+                                                       <goal>copy-dependencies</goal>
+                                               </goals>
+                                               <phase>prepare-package</phase>
+                                               <configuration>
+                                                       <transitive>false</transitive>
+                                                       <outputDirectory>${project.build.directory}/assembly/system</outputDirectory>
+                                                       <overWriteReleases>false</overWriteReleases>
+                                                       <overWriteSnapshots>true</overWriteSnapshots>
+                                                       <overWriteIfNewer>true</overWriteIfNewer>
+                                                       <useRepositoryLayout>true</useRepositoryLayout>
+                                                       <addParentPoms>false</addParentPoms>
+                                                       <copyPom>false</copyPom>
+                                                       <includeGroupIds>org.onap.ccsdk.sli</includeGroupIds>
+                                                       <excludeArtifactIds>sli-common,sli-provider,dblib-provider</excludeArtifactIds>
+                                                       <scope>provided</scope>
+                                               </configuration>
+                                       </execution>
+                               </executions>
+                       </plugin>
+                       <plugin>
+                               <artifactId>maven-resources-plugin</artifactId>
+                               <version>2.6</version>
+                               <executions>
+                                       <execution>
+                                               <id>copy-version</id>
+                                               <goals>
+                                                       <goal>copy-resources</goal>
+                                               </goals><!-- here the phase you need -->
+                                               <phase>validate</phase>
+                                               <configuration>
+                                                       <outputDirectory>${basedir}/target/stage</outputDirectory>
+                                                       <resources>
+                                                               <resource>
+                                                                       <directory>src/main/resources/scripts</directory>
+                                                                       <includes>
+                                                                               <include>install-feature.sh</include>
+                                                                       </includes>
+                                                                       <filtering>true</filtering>
+                                                               </resource>
+                                                       </resources>
+                                               </configuration>
+                                       </execution>
+
+                               </executions>
+                       </plugin>
+
+               </plugins>
+       </build>
+
+</project>
diff --git a/restapi-call-node/installer/src/assembly/assemble_installer_zip.xml b/restapi-call-node/installer/src/assembly/assemble_installer_zip.xml
new file mode 100644 (file)
index 0000000..e278872
--- /dev/null
@@ -0,0 +1,59 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 ONAP 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=========================================================
+  -->
+
+<!-- Defines how we build the .zip file which is our distribution. -->
+
+<assembly
+       xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+       <id>installer_zip</id>
+       <formats>
+               <format>zip</format>
+       </formats>
+
+       <!--  we want "system" and related files right at the root level
+                 as this file is suppose to be unzip on top of a karaf
+                 distro. -->
+       <includeBaseDirectory>false</includeBaseDirectory>
+
+       <fileSets>
+               <fileSet>
+                       <directory>target/stage/</directory>
+                       <outputDirectory>${application.name}</outputDirectory>
+                       <fileMode>755</fileMode>
+                       <includes>
+                               <include>*.sh</include>
+                       </includes>
+               </fileSet>
+               <fileSet>
+                       <directory>target/stage/</directory>
+                       <outputDirectory>${application.name}</outputDirectory>
+                       <fileMode>644</fileMode>
+                       <excludes>
+                               <exclude>*.sh</exclude>
+                       </excludes>
+               </fileSet>
+       </fileSets>
+
+
+
+</assembly>
diff --git a/restapi-call-node/installer/src/assembly/assemble_mvnrepo_zip.xml b/restapi-call-node/installer/src/assembly/assemble_mvnrepo_zip.xml
new file mode 100644 (file)
index 0000000..1edacdb
--- /dev/null
@@ -0,0 +1,49 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 ONAP 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=========================================================
+  -->
+
+<!-- Defines how we build the .zip file which is our distribution. -->
+
+<assembly
+       xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+       <id>mvnrepo_zip</id>
+       <formats>
+               <format>zip</format>
+       </formats>
+
+       <!--  we want "system" and related files right at the root level
+                 as this file is suppose to be unzip on top of a karaf
+                 distro. -->
+       <includeBaseDirectory>false</includeBaseDirectory>
+
+       <fileSets>
+               <fileSet>
+                       <directory>target/assembly/</directory>
+                       <outputDirectory>.</outputDirectory>
+                       <excludes>
+                       </excludes>
+               </fileSet>
+       </fileSets>
+
+
+
+</assembly>
diff --git a/restapi-call-node/installer/src/main/resources/scripts/install-feature.sh b/restapi-call-node/installer/src/main/resources/scripts/install-feature.sh
new file mode 100644 (file)
index 0000000..9a47d22
--- /dev/null
@@ -0,0 +1,40 @@
+#!/bin/bash
+
+###
+# ============LICENSE_START=======================================================
+# openECOMP : SDN-C
+# ================================================================================
+# Copyright (C) 2017 ONAP 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=========================================================
+###
+
+ODL_HOME=${ODL_HOME:-/opt/opendaylight/current}
+ODL_KARAF_CLIENT=${ODL_KARAF_CLIENT:-${ODL_HOME}/bin/client}
+ODL_KARAF_CLIENT_OPTS=${ODL_KARAF_CLIENT_OPTS:-"-u karaf"}
+INSTALLERDIR=$(dirname $0)
+
+REPOZIP=${INSTALLERDIR}/${features.boot}-${project.version}.zip
+
+if [ -f ${REPOZIP} ]
+then
+       unzip -d ${ODL_HOME} ${REPOZIP}
+else
+       echo "ERROR : repo zip ($REPOZIP) not found"
+       exit 1
+fi
+
+${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:repo-add ${features.repositories}
+${ODL_KARAF_CLIENT} ${ODL_KARAF_CLIENT_OPTS} feature:install ${features.boot}
diff --git a/restapi-call-node/pom.xml b/restapi-call-node/pom.xml
new file mode 100755 (executable)
index 0000000..86a27bb
--- /dev/null
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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/maven-v4_0_0.xsd">
+       <parent>
+               <groupId>org.onap.ccsdk.sli.plugins</groupId>
+               <artifactId>sdnc-plugins</artifactId>
+               <version>0.0.1-SNAPSHOT</version>
+       </parent>
+
+       <modelVersion>4.0.0</modelVersion>
+       <packaging>pom</packaging>
+
+       <groupId>org.onap.ccsdk.sli.plugins</groupId>
+       <artifactId>restapi-call-node</artifactId>
+       <version>0.0.1-SNAPSHOT</version>
+
+       <name>RESTAPI Call Node</name>
+       <description>This is an implementation of DG Execute Node that makes a call to an external REST API</description>
+
+       <dependencyManagement>
+               <dependencies>
+                       <dependency>
+                               <groupId>org.onap.ccsdk.sli.plugins</groupId>
+                               <artifactId>restapi-call-node-features</artifactId>
+                               <classifier>features</classifier>
+                               <type>xml</type>
+                               <version>${project.version}</version>
+                       </dependency>
+                       <dependency>
+                               <groupId>org.onap.ccsdk.sli.plugins</groupId>
+                               <artifactId>restapi-call-node-provider</artifactId>
+                               <version>${project.version}</version>
+                       </dependency>
+               </dependencies>
+       </dependencyManagement>
+
+       <modules>
+               <module>provider</module>
+               <module>features</module>
+               <module>installer</module>
+       </modules>
+</project>
+
diff --git a/restapi-call-node/provider/pom.xml b/restapi-call-node/provider/pom.xml
new file mode 100755 (executable)
index 0000000..f864c29
--- /dev/null
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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>0.0.1-SNAPSHOT</version>
+       </parent>
+       <groupId>org.onap.ccsdk.sli.plugins</groupId>
+       <artifactId>restapi-call-node-provider</artifactId>
+       <version>0.0.1-SNAPSHOT</version>
+       <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>${spring.version}</version>
+                       <scope>test</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.onap.ccsdk.sli.core</groupId>
+                       <artifactId>sli-common</artifactId>
+                       <version>${sdnctl.sli.version}</version>
+                       <scope>compile</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.onap.ccsdk.sli.core</groupId>
+                       <artifactId>sli-provider</artifactId>
+                       <version>${sdnctl.sli.version}</version>
+                       <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>${spring.version}</version>
+               </dependency>
+               <dependency>
+                       <groupId>org.springframework</groupId>
+                       <artifactId>spring-context</artifactId>
+                       <version>${spring.version}</version>
+               </dependency>
+               <dependency>
+                       <groupId>com.sun.jersey</groupId>
+                       <artifactId>jersey-client</artifactId>
+                       <version>${jersey.version}</version>
+                       <scope>provided</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.codehaus.jettison</groupId>
+                       <artifactId>jettison</artifactId>
+                       <version>${jettison.version}</version>
+                       <scope>provided</scope>
+               </dependency>
+       </dependencies>
+
+       <build>
+               <plugins>
+
+
+
+                       <plugin>
+                               <groupId>org.apache.felix</groupId>
+                               <artifactId>maven-bundle-plugin</artifactId>
+                               <extensions>true</extensions>
+                               <configuration>
+                                       <instructions>
+                                               <Bundle-SymbolicName>org.onap.ccsdk.sli.restapicall</Bundle-SymbolicName>
+                                               <Export-Package>org.openecomp.sdnc.restapicall</Export-Package>
+                                               <Import-Package>*</Import-Package>
+                                       </instructions>
+
+
+                               </configuration>
+
+                       </plugin>
+
+
+               </plugins>
+
+       </build>
+</project>
diff --git a/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/Format.java b/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/Format.java
new file mode 100644 (file)
index 0000000..5208625
--- /dev/null
@@ -0,0 +1,36 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 ONAP 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.openecomp.sdnc.restapicall;
+
+public enum Format {
+    JSON, XML;
+
+    public static Format fromString(String s) {
+        if (s == null)
+            return null;
+        if (s.equalsIgnoreCase("json"))
+            return JSON;
+        if (s.equalsIgnoreCase("xml"))
+            return XML;
+        throw new IllegalArgumentException("Invalid value for format: " + s);
+    }
+}
diff --git a/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/HttpMethod.java b/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/HttpMethod.java
new file mode 100644 (file)
index 0000000..059074b
--- /dev/null
@@ -0,0 +1,42 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 ONAP 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.openecomp.sdnc.restapicall;
+
+public enum HttpMethod {
+    GET, POST, PUT, DELETE, PATCH;
+
+    public static HttpMethod fromString(String s) {
+        if (s == null)
+            return null;
+        if (s.equalsIgnoreCase("get"))
+            return GET;
+        if (s.equalsIgnoreCase("post"))
+            return POST;
+        if (s.equalsIgnoreCase("put"))
+            return PUT;
+        if (s.equalsIgnoreCase("delete"))
+            return DELETE;
+        if (s.equalsIgnoreCase("patch"))
+            return PATCH;
+        throw new IllegalArgumentException("Invalid value for HTTP Method: " + s);
+    }
+}
diff --git a/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/HttpResponse.java b/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/HttpResponse.java
new file mode 100644 (file)
index 0000000..761e426
--- /dev/null
@@ -0,0 +1,31 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 ONAP 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.openecomp.sdnc.restapicall;
+
+import javax.ws.rs.core.MultivaluedMap;
+
+public class HttpResponse {
+    public int code;
+    public String message;
+    public String body;
+    public MultivaluedMap<String, String> headers;
+}
diff --git a/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/JsonParser.java b/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/JsonParser.java
new file mode 100644 (file)
index 0000000..27e9a82
--- /dev/null
@@ -0,0 +1,85 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 ONAP 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.openecomp.sdnc.restapicall;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.codehaus.jettison.json.JSONArray;
+import org.codehaus.jettison.json.JSONException;
+import org.codehaus.jettison.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class JsonParser {
+
+       private static final Logger log = LoggerFactory.getLogger(JsonParser.class);
+
+       @SuppressWarnings("unchecked")
+       public static Map<String, String> convertToProperties(String s) throws JSONException {
+               JSONObject json = new JSONObject(s);
+
+               Map<String, Object> wm = new HashMap<String, Object>();
+               Iterator<String> ii = json.keys();
+               while (ii.hasNext()) {
+                       String key1 = ii.next();
+                       wm.put(key1, json.get(key1));
+               }
+
+               Map<String, String> mm = new HashMap<String, String>();
+
+               while (!wm.isEmpty())
+                       for (String key : new ArrayList<>(wm.keySet())) {
+                               Object o = wm.get(key);
+                               wm.remove(key);
+
+                               if (o instanceof Boolean || o instanceof Number || o instanceof String) {
+                                       mm.put(key, o.toString());
+
+                                       log.info("Added property: " + key + ": " + o.toString());
+                               }
+
+                               else if (o instanceof JSONObject) {
+                                       JSONObject jo = (JSONObject) o;
+                                       Iterator<String> i = jo.keys();
+                                       while (i.hasNext()) {
+                                               String key1 = i.next();
+                                               wm.put(key + "." + key1, jo.get(key1));
+                                       }
+                               }
+
+                               else if (o instanceof JSONArray) {
+                                       JSONArray ja = (JSONArray) o;
+                                       mm.put(key + "_length", String.valueOf(ja.length()));
+
+                                       log.info("Added property: " + key + "_length" + ": " + String.valueOf(ja.length()));
+
+                                       for (int i = 0; i < ja.length(); i++)
+                                               wm.put(key + '[' + i + ']', ja.get(i));
+                               }
+                       }
+
+               return mm;
+       }
+}
diff --git a/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/Parameters.java b/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/Parameters.java
new file mode 100644 (file)
index 0000000..0cba4e6
--- /dev/null
@@ -0,0 +1,46 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 ONAP 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.openecomp.sdnc.restapicall;
+
+import java.util.Set;
+
+public class Parameters {
+    public String templateFileName;
+    public String restapiUrl;
+    public String restapiUser;
+    public String restapiPassword;
+    public Format format;
+    public String contentType;
+    public HttpMethod httpMethod;
+    public String responsePrefix;
+    public Set<String> listNameList;
+    public boolean skipSending;
+    public boolean convertResponse;
+    public String keyStoreFileName;
+    public String keyStorePassword;
+    public String trustStoreFileName;
+    public String trustStorePassword;
+    public boolean ssl;
+    public String customHttpHeaders;
+    public String partner;
+    public Boolean dumpHeaders;
+}
diff --git a/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/RestapiCallNode.java b/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/RestapiCallNode.java
new file mode 100644 (file)
index 0000000..b759848
--- /dev/null
@@ -0,0 +1,759 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 ONAP 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.openecomp.sdnc.restapicall;
+
+import java.io.FileInputStream;
+import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.security.KeyStore;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.ws.rs.core.EntityTag;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.core.UriBuilder;
+
+import org.apache.commons.lang3.StringUtils;
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+import org.onap.ccsdk.sli.core.sli.SvcLogicJavaPlugin;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
+import com.sun.jersey.api.client.config.ClientConfig;
+import com.sun.jersey.api.client.config.DefaultClientConfig;
+import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
+import com.sun.jersey.client.urlconnection.HTTPSProperties;
+
+public class RestapiCallNode implements SvcLogicJavaPlugin {
+
+       private static final Logger log = LoggerFactory.getLogger(RestapiCallNode.class);
+
+       private String uebServers;
+       private String defaultUebTemplateFileName = "/opt/bvc/restapi/templates/default-ueb-message.json";
+       protected RetryPolicyStore retryPolicyStore;
+
+       protected RetryPolicyStore getRetryPolicyStore() {
+               return retryPolicyStore;
+       }
+
+       public void setRetryPolicyStore(RetryPolicyStore retryPolicyStore) {
+               this.retryPolicyStore = retryPolicyStore;
+       }
+
+       public RestapiCallNode() {
+
+       }
+
+        /**
+     * Allows Directed Graphs  the ability to interact with REST APIs.
+     * @param parameters HashMap<String,String> of parameters passed by the DG to this function
+     * <table border="1">
+     *  <thead><th>parameter</th><th>Mandatory/Optional</th><th>description</th><th>example values</th></thead>
+     *  <tbody>
+     *      <tr><td>templateFileName</td><td>Optional</td><td>full path to template file that can be used to build a request</td><td>/sdncopt/bvc/restapi/templates/vnf_service-configuration-operation_minimal.json</td></tr>
+     *      <tr><td>restapiUrl</td><td>Mandatory</td><td>url to send the request to</td><td>https://sdncodl:8543/restconf/operations/L3VNF-API:create-update-vnf-request</td></tr>
+     *      <tr><td>restapiUser</td><td>Optional</td><td>user name to use for http basic authentication</td><td>sdnc_ws</td></tr>
+     *      <tr><td>restapiPassword</td><td>Optional</td><td>unencrypted password to use for http basic authentication</td><td>plain_password</td></tr>
+     *      <tr><td>contentType</td><td>Optional</td><td>http content type to set in the http header</td><td>usually application/json or application/xml</td></tr>
+     *      <tr><td>format</td><td>Optional</td><td>should match request body format</td><td>json or xml</td></tr>
+     *      <tr><td>httpMethod</td><td>Optional</td><td>http method to use when sending the request</td><td>get post put delete patch</td></tr>
+     *      <tr><td>responsePrefix</td><td>Optional</td><td>location the response will be written to in context memory</td><td>tmp.restapi.result</td></tr>
+     *      <tr><td>listName[i]</td><td>Optional</td><td>Used for processing XML responses with repeating elements.</td>vpn-information.vrf-details<td></td></tr>
+     *      <tr><td>skipSending</td><td>Optional</td><td></td><td>true or false</td></tr>
+     *      <tr><td>convertResponse </td><td>Optional</td><td>whether the response should be converted</td><td>true or false</td></tr>
+     *      <tr><td>customHttpHeaders</td><td>Optional</td><td>a list additional http headers to be passed in, follow the format in the example</td><td>X-CSI-MessageId=messageId,headerFieldName=headerFieldValue</td></tr>
+     *      <tr><td>dumpHeaders</td><td>Optional</td><td>when true writes http header content to context memory</td><td>true or false</td></tr>
+     *      <tr><td>partner</td><td>Optional</td><td>needed for DME2 calls</td><td>dme2proxy</td></tr>
+     *  </tbody>
+     * </table>
+     * @param ctx Reference to context memory
+     * @throws SvcLogicException
+     * @since 11.0.2
+     * @see String#split(String, int)
+     */
+       public void sendRequest(Map<String, String> paramMap, SvcLogicContext ctx) throws SvcLogicException {
+               sendRequest(paramMap, ctx, null);
+       }
+
+       public void sendRequest(Map<String, String> paramMap, SvcLogicContext ctx, Integer retryCount)
+               throws SvcLogicException {
+
+               RetryPolicy retryPolicy = null;
+               HttpResponse r = null;
+               try {
+                       Parameters p = getParameters(paramMap);
+                       if (p.partner != null) {
+                               retryPolicy = retryPolicyStore.getRetryPolicy(p.partner);
+                       }
+                       String pp = p.responsePrefix != null ? p.responsePrefix + '.' : "";
+
+                       String req = null;
+                       if (p.templateFileName != null) {
+                               String reqTemplate = readFile(p.templateFileName);
+                               req = buildXmlJsonRequest(ctx, reqTemplate, p.format);
+                       }
+                       r = sendHttpRequest(req, p);
+                       setResponseStatus(ctx, p.responsePrefix, r);
+
+                       if (p.dumpHeaders && r.headers != null) {
+                for (Entry<String, List<String>> a : r.headers.entrySet()) {
+                    ctx.setAttribute(pp + "header." + a.getKey(), StringUtils.join(a.getValue(), ","));
+                }
+            }
+
+                       if (r.body != null && r.body.trim().length() > 0) {
+                               ctx.setAttribute(pp + "httpResponse", r.body);
+
+                               if (p.convertResponse) {
+                                       Map<String, String> mm = null;
+                                       if (p.format == Format.XML)
+                                               mm = XmlParser.convertToProperties(r.body, p.listNameList);
+                                       else if (p.format == Format.JSON)
+                                               mm = JsonParser.convertToProperties(r.body);
+
+                                       if (mm != null)
+                                               for (String key : mm.keySet())
+                                                       ctx.setAttribute(pp + key, mm.get(key));
+                               }
+                       }
+               } catch (Exception e) {
+                       boolean shouldRetry = false;
+                       if (e.getCause() instanceof java.net.SocketException) {
+                               shouldRetry = true;
+                       }
+
+                       log.error("Error sending the request: " + e.getMessage(), e);
+                       String prefix = parseParam(paramMap, "responsePrefix", false, null);
+                       if (retryPolicy == null || shouldRetry == false) {
+                               setFailureResponseStatus(ctx, prefix, e.getMessage(), r);
+                       } else {
+                               if (retryCount == null) {
+                                       retryCount = 0;
+                               }
+                               String retryMessage = retryCount + " attempts were made out of " + retryPolicy.getMaximumRetries() +
+                                       " maximum retries.";
+                               log.debug(retryMessage);
+                               try {
+                                       retryCount = retryCount + 1;
+                                       if (retryCount < retryPolicy.getMaximumRetries() + 1) {
+                                               URI uri = new URI(paramMap.get("restapiUrl"));
+                                               String hostname = uri.getHost();
+                                               String retryString = retryPolicy.getNextHostName((uri.toString()));
+                                               URI uriTwo = new URI(retryString);
+                                               URI retryUri = UriBuilder.fromUri(uri).host(uriTwo.getHost()).port(uriTwo.getPort()).scheme(
+                                                       uriTwo.getScheme()).build();
+                                               paramMap.put("restapiUrl", retryUri.toString());
+                                               log.debug("URL was set to " + retryUri.toString());
+                                               log.debug("Failed to communicate with host " + hostname +
+                                                       ". Request will be re-attempted using the host " + retryString + ".");
+                                               log.debug("This is retry attempt " + retryCount + " out of " + retryPolicy.getMaximumRetries());
+                                               sendRequest(paramMap, ctx, retryCount);
+                                       } else {
+                                               log.debug("Maximum retries reached, calling setFailureResponseStatus.");
+                                               setFailureResponseStatus(ctx, prefix, e.getMessage(), r);
+                                       }
+                               } catch (Exception ex) {
+                                       log.error("Could not attempt retry.", ex);
+                                       String retryErrorMessage =
+                                               "Retry attempt has failed. No further retry shall be attempted, calling setFailureResponseStatus.";
+                                       setFailureResponseStatus(ctx, prefix, retryErrorMessage, r);
+                               }
+                       }
+               }
+
+               if (r != null && r.code >= 300)
+                       throw new SvcLogicException(String.valueOf(r.code) + ": " + r.message);
+       }
+
+       protected Parameters getParameters(Map<String, String> paramMap) throws SvcLogicException {
+               Parameters p = new Parameters();
+               p.templateFileName = parseParam(paramMap, "templateFileName", false, null);
+               p.restapiUrl = parseParam(paramMap, "restapiUrl", true, null);
+               p.restapiUser = parseParam(paramMap, "restapiUser", false, null);
+               p.restapiPassword = parseParam(paramMap, "restapiPassword", false, null);
+               p.contentType = parseParam(paramMap, "contentType", false, null);
+               p.format = Format.fromString(parseParam(paramMap, "format", false, "json"));
+               p.httpMethod = HttpMethod.fromString(parseParam(paramMap, "httpMethod", false, "post"));
+               p.responsePrefix = parseParam(paramMap, "responsePrefix", false, null);
+               p.listNameList = getListNameList(paramMap);
+               String skipSendingStr = paramMap.get("skipSending");
+               p.skipSending = skipSendingStr != null && skipSendingStr.equalsIgnoreCase("true");
+               p.convertResponse = Boolean.valueOf(parseParam(paramMap, "convertResponse", false, "true"));
+               p.trustStoreFileName = parseParam(paramMap, "trustStoreFileName", false, null);
+               p.trustStorePassword = parseParam(paramMap, "trustStorePassword", false, null);
+               p.keyStoreFileName = parseParam(paramMap, "keyStoreFileName", false, null);
+               p.keyStorePassword = parseParam(paramMap, "keyStorePassword", false, null);
+               p.ssl = p.trustStoreFileName != null && p.trustStorePassword != null && p.keyStoreFileName != null &&
+                       p.keyStorePassword != null;
+               p.customHttpHeaders = parseParam(paramMap, "customHttpHeaders", false, null);
+               p.partner = parseParam(paramMap, "partner", false, null);
+           p.dumpHeaders = Boolean.valueOf(parseParam(paramMap, "dumpHeaders", false, null));
+               return p;
+       }
+
+       protected Set<String> getListNameList(Map<String, String> paramMap) {
+               Set<String> ll = new HashSet<String>();
+               for (String key : paramMap.keySet())
+                       if (key.startsWith("listName"))
+                               ll.add(paramMap.get(key));
+               return ll;
+       }
+
+       protected String parseParam(Map<String, String> paramMap, String name, boolean required, String def)
+               throws SvcLogicException {
+               String s = paramMap.get(name);
+
+               if (s == null || s.trim().length() == 0) {
+                       if (!required)
+                               return def;
+                       throw new SvcLogicException("Parameter " + name + " is required in RestapiCallNode");
+               }
+
+               s = s.trim();
+               String value = "";
+               int i = 0;
+               int i1 = s.indexOf('%');
+               while (i1 >= 0) {
+                       int i2 = s.indexOf('%', i1 + 1);
+                       if (i2 < 0)
+                               break;
+
+                       String varName = s.substring(i1 + 1, i2);
+                       String varValue = System.getenv(varName);
+                       if (varValue == null)
+                               varValue = "%" + varName + "%";
+
+                       value += s.substring(i, i1);
+                       value += varValue;
+
+                       i = i2 + 1;
+                       i1 = s.indexOf('%', i);
+               }
+               value += s.substring(i);
+
+               log.info("Parameter " + name + ": [" + value + "]");
+               return value;
+       }
+
+       protected String buildXmlJsonRequest(SvcLogicContext ctx, String template, Format format) {
+               log.info("Building " + format + " started");
+               long t1 = System.currentTimeMillis();
+
+               template = expandRepeats(ctx, template, 1);
+
+               Map<String, String> mm = new HashMap<>();
+               for (String s : ctx.getAttributeKeySet())
+                       mm.put(s, ctx.getAttribute(s));
+
+               StringBuilder ss = new StringBuilder();
+               int i = 0;
+               while (i < template.length()) {
+                       int i1 = template.indexOf("${", i);
+                       if (i1 < 0) {
+                               ss.append(template.substring(i));
+                               break;
+                       }
+
+                       int i2 = template.indexOf('}', i1 + 2);
+                       if (i2 < 0)
+                               throw new RuntimeException("Template error: Matching } not found");
+
+                       String var1 = template.substring(i1 + 2, i2);
+                       String value1 = format == Format.XML ? XmlJsonUtil.getXml(mm, var1) : XmlJsonUtil.getJson(mm, var1);
+                       // log.info(" " + var1 + ": " + value1);
+                       if (value1 == null || value1.trim().length() == 0) {
+                               // delete the whole element (line)
+                               int i3 = template.lastIndexOf('\n', i1);
+                               if (i3 < 0)
+                                       i3 = 0;
+                               int i4 = template.indexOf('\n', i1);
+                               if (i4 < 0)
+                                       i4 = template.length();
+
+                               if (i < i3)
+                                       ss.append(template.substring(i, i3));
+                               i = i4;
+                       } else {
+                               ss.append(template.substring(i, i1)).append(value1);
+                               i = i2 + 1;
+                       }
+               }
+
+               String req = format == Format.XML
+                       ? XmlJsonUtil.removeEmptyStructXml(ss.toString()) : XmlJsonUtil.removeEmptyStructJson(ss.toString());
+
+               if (format == Format.JSON)
+                       req = XmlJsonUtil.removeLastCommaJson(req);
+
+               long t2 = System.currentTimeMillis();
+               log.info("Building " + format + " completed. Time: " + (t2 - t1));
+
+               return req;
+       }
+
+       protected String expandRepeats(SvcLogicContext ctx, String template, int level) {
+               StringBuilder newTemplate = new StringBuilder();
+               int k = 0;
+               while (k < template.length()) {
+                       int i1 = template.indexOf("${repeat:", k);
+                       if (i1 < 0) {
+                               newTemplate.append(template.substring(k));
+                               break;
+                       }
+
+                       int i2 = template.indexOf(':', i1 + 9);
+                       if (i2 < 0)
+                               throw new RuntimeException(
+                                       "Template error: Context variable name followed by : is required after repeat");
+
+                       // Find the closing }, store in i3
+                       int nn = 1;
+                       int i3 = -1;
+                       int i = i2;
+                       while (nn > 0 && i < template.length()) {
+                               i3 = template.indexOf('}', i);
+                               if (i3 < 0)
+                                       throw new RuntimeException("Template error: Matching } not found");
+                               int i32 = template.indexOf('{', i);
+                               if (i32 >= 0 && i32 < i3) {
+                                       nn++;
+                                       i = i32 + 1;
+                               } else {
+                                       nn--;
+                                       i = i3 + 1;
+                               }
+                       }
+
+                       String var1 = template.substring(i1 + 9, i2);
+                       String value1 = ctx.getAttribute(var1);
+                       log.info("     " + var1 + ": " + value1);
+                       int n = 0;
+                       try {
+                               n = Integer.parseInt(value1);
+                       } catch (Exception e) {
+                               n = 0;
+                       }
+
+                       newTemplate.append(template.substring(k, i1));
+
+                       String rpt = template.substring(i2 + 1, i3);
+
+                       for (int ii = 0; ii < n; ii++) {
+                               String ss = rpt.replaceAll("\\[\\$\\{" + level + "\\}\\]", "[" + ii + "]");
+                               if (ii == n - 1 && ss.trim().endsWith(",")) {
+                                       int i4 = ss.lastIndexOf(',');
+                                       if (i4 > 0)
+                                               ss = ss.substring(0, i4) + ss.substring(i4 + 1);
+                               }
+                               newTemplate.append(ss);
+                       }
+
+                       k = i3 + 1;
+               }
+
+               if (k == 0)
+                       return newTemplate.toString();
+
+               return expandRepeats(ctx, newTemplate.toString(), level + 1);
+       }
+
+       protected String readFile(String fileName) throws Exception {
+               byte[] encoded = Files.readAllBytes(Paths.get(fileName));
+               return new String(encoded, "UTF-8");
+       }
+
+       protected HttpResponse sendHttpRequest(String request, Parameters p) throws Exception {
+               ClientConfig config = new DefaultClientConfig();
+               SSLContext ssl = null;
+               if (p.ssl && p.restapiUrl.startsWith("https"))
+                       ssl = createSSLContext(p);
+               if (ssl != null) {
+                       HostnameVerifier hostnameVerifier = new HostnameVerifier() {
+
+                               @Override
+                               public boolean verify(String hostname, SSLSession session) {
+                                       return true;
+                               }
+                       };
+
+                       config.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,
+                               new HTTPSProperties(hostnameVerifier, ssl));
+               }
+
+               logProperties(config.getProperties());
+
+               Client client = Client.create(config);
+               client.setConnectTimeout(5000);
+               if (p.restapiUser != null)
+                       client.addFilter(new HTTPBasicAuthFilter(p.restapiUser, p.restapiPassword));
+               WebResource webResource = client.resource(p.restapiUrl);
+
+               log.info("Sending request:");
+               log.info(request);
+               long t1 = System.currentTimeMillis();
+
+               HttpResponse r = new HttpResponse();
+               r.code = 200;
+
+               if (!p.skipSending) {
+                       String tt = p.format == Format.XML ? "application/xml" : "application/json";
+                       String tt1 = tt + ";charset=UTF-8";
+                       if (p.contentType != null) {
+                               tt = p.contentType;
+                               tt1 = p.contentType;
+                       }
+
+                       WebResource.Builder webResourceBuilder = webResource.accept(tt).type(tt1);
+
+            if (p.customHttpHeaders != null && p.customHttpHeaders.length() > 0) {
+                String[] keyValuePairs = p.customHttpHeaders.split(",");
+                for (String singlePair : keyValuePairs) {
+                    int equalPosition = singlePair.indexOf('=');
+                    webResourceBuilder.header(singlePair.substring(0, equalPosition), singlePair.substring(equalPosition + 1, singlePair.length()));
+                }
+            }
+
+            webResourceBuilder.header("X-ECOMP-RequestID",org.slf4j.MDC.get("X-ECOMP-RequestID"));
+
+                       ClientResponse response = webResourceBuilder.method(p.httpMethod.toString(), ClientResponse.class, request);
+
+                       r.code = response.getStatus();
+                       r.headers = response.getHeaders();
+                       EntityTag etag = response.getEntityTag();
+                       if (etag != null)
+                               r.message = etag.getValue();
+                       if (response.hasEntity() && r.code != 204)
+                               r.body = response.getEntity(String.class);
+               }
+
+               long t2 = System.currentTimeMillis();
+               log.info("Response received. Time: " + (t2 - t1));
+               log.info("HTTP response code: " + r.code);
+               log.info("HTTP response message: " + r.message);
+               logHeaders(r.headers);
+               log.info("HTTP response: " + r.body);
+
+               return r;
+       }
+
+       protected SSLContext createSSLContext(Parameters p) {
+               try {
+                       System.setProperty("jsse.enableSNIExtension", "false");
+                       System.setProperty("javax.net.ssl.trustStore", p.trustStoreFileName);
+                       System.setProperty("javax.net.ssl.trustStorePassword", p.trustStorePassword);
+
+                       HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
+
+                               @Override
+                               public boolean verify(String string, SSLSession ssls) {
+                                       return true;
+                               }
+                       });
+
+                       KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
+                       FileInputStream in = new FileInputStream(p.keyStoreFileName);
+                       KeyStore ks = KeyStore.getInstance("PKCS12");
+                       char[] pwd = p.keyStorePassword.toCharArray();
+                       ks.load(in, pwd);
+                       kmf.init(ks, pwd);
+
+                       SSLContext ctx = SSLContext.getInstance("TLS");
+                       ctx.init(kmf.getKeyManagers(), null, null);
+                       return ctx;
+               } catch (Exception e) {
+                       log.error("Error creating SSLContext: " + e.getMessage(), e);
+               }
+               return null;
+       }
+
+       protected void setFailureResponseStatus(SvcLogicContext ctx, String prefix, String errorMessage, HttpResponse r) {
+               r = new HttpResponse();
+               r.code = 500;
+               r.message = errorMessage;
+               String pp = prefix != null ? prefix + '.' : "";
+               ctx.setAttribute(pp + "response-code", String.valueOf(r.code));
+               ctx.setAttribute(pp + "response-message", r.message);
+       }
+
+       protected void setResponseStatus(SvcLogicContext ctx, String prefix, HttpResponse r) {
+               String pp = prefix != null ? prefix + '.' : "";
+               ctx.setAttribute(pp + "response-code", String.valueOf(r.code));
+               ctx.setAttribute(pp + "response-message", r.message);
+       }
+
+       public void sendFile(Map<String, String> paramMap, SvcLogicContext ctx) throws SvcLogicException {
+               HttpResponse r = null;
+               try {
+                       FileParam p = getFileParameters(paramMap);
+                       byte[] data = Files.readAllBytes(Paths.get(p.fileName));
+
+                       r = sendHttpData(data, p);
+                       setResponseStatus(ctx, p.responsePrefix, r);
+
+               } catch (Exception e) {
+                       log.error("Error sending the request: " + e.getMessage(), e);
+
+                       r = new HttpResponse();
+                       r.code = 500;
+                       r.message = e.getMessage();
+                       String prefix = parseParam(paramMap, "responsePrefix", false, null);
+                       setResponseStatus(ctx, prefix, r);
+               }
+
+               if (r != null && r.code >= 300)
+                       throw new SvcLogicException(String.valueOf(r.code) + ": " + r.message);
+       }
+
+       private static class FileParam {
+
+               public String fileName;
+               public String url;
+               public String user;
+               public String password;
+               public HttpMethod httpMethod;
+               public String responsePrefix;
+               public boolean skipSending;
+       }
+
+       private FileParam getFileParameters(Map<String, String> paramMap) throws SvcLogicException {
+               FileParam p = new FileParam();
+               p.fileName = parseParam(paramMap, "fileName", true, null);
+               p.url = parseParam(paramMap, "url", true, null);
+               p.user = parseParam(paramMap, "user", false, null);
+               p.password = parseParam(paramMap, "password", false, null);
+               p.httpMethod = HttpMethod.fromString(parseParam(paramMap, "httpMethod", false, "post"));
+               p.responsePrefix = parseParam(paramMap, "responsePrefix", false, null);
+               String skipSendingStr = paramMap.get("skipSending");
+               p.skipSending = skipSendingStr != null && skipSendingStr.equalsIgnoreCase("true");
+               return p;
+       }
+
+       protected HttpResponse sendHttpData(byte[] data, FileParam p) {
+               Client client = Client.create();
+               client.setConnectTimeout(5000);
+               client.setFollowRedirects(true);
+               if (p.user != null)
+                       client.addFilter(new HTTPBasicAuthFilter(p.user, p.password));
+               WebResource webResource = client.resource(p.url);
+
+               log.info("Sending file");
+               long t1 = System.currentTimeMillis();
+
+               HttpResponse r = new HttpResponse();
+               r.code = 200;
+
+               if (!p.skipSending) {
+                       String tt = "application/octet-stream";
+
+                       ClientResponse response = null;
+                       if (p.httpMethod == HttpMethod.POST)
+                               response = webResource.accept(tt).type(tt).post(ClientResponse.class, data);
+                       else if (p.httpMethod == HttpMethod.PUT)
+                               response = webResource.accept(tt).type(tt).put(ClientResponse.class, data);
+
+                       r.code = response.getStatus();
+                       r.headers = response.getHeaders();
+                       EntityTag etag = response.getEntityTag();
+                       if (etag != null)
+                               r.message = etag.getValue();
+                       if (response.hasEntity() && r.code != 204)
+                               r.body = response.getEntity(String.class);
+
+                       if (r.code == 301) {
+                               String newUrl = response.getHeaders().getFirst("Location");
+
+                               log.info("Got response code 301. Sending same request to URL: " + newUrl);
+
+                               webResource = client.resource(newUrl);
+
+                               if (p.httpMethod == HttpMethod.POST)
+                                       response = webResource.accept(tt).type(tt).post(ClientResponse.class, data);
+                               else if (p.httpMethod == HttpMethod.PUT)
+                                       response = webResource.accept(tt).type(tt).put(ClientResponse.class, data);
+
+                               r.code = response.getStatus();
+                               etag = response.getEntityTag();
+                               if (etag != null)
+                                       r.message = etag.getValue();
+                               if (response.hasEntity() && r.code != 204)
+                                       r.body = response.getEntity(String.class);
+                       }
+               }
+
+               long t2 = System.currentTimeMillis();
+               log.info("Response received. Time: " + (t2 - t1));
+               log.info("HTTP response code: " + r.code);
+               log.info("HTTP response message: " + r.message);
+               logHeaders(r.headers);
+               log.info("HTTP response: " + r.body);
+
+               return r;
+       }
+
+       public void postMessageOnUeb(Map<String, String> paramMap, SvcLogicContext ctx) throws SvcLogicException {
+               HttpResponse r = null;
+               try {
+                       UebParam p = getUebParameters(paramMap);
+
+                       String pp = p.responsePrefix != null ? p.responsePrefix + '.' : "";
+
+                       String req = null;
+
+                       if (p.templateFileName == null) {
+                               log.info("No template file name specified. Using default UEB template: " + defaultUebTemplateFileName);
+                               p.templateFileName = defaultUebTemplateFileName;
+                       }
+
+                       String reqTemplate = readFile(p.templateFileName);
+                       reqTemplate = reqTemplate.replaceAll("rootVarName", p.rootVarName);
+                       req = buildXmlJsonRequest(ctx, reqTemplate, Format.JSON);
+
+                       r = postOnUeb(req, p);
+                       setResponseStatus(ctx, p.responsePrefix, r);
+                       if (r.body != null)
+                               ctx.setAttribute(pp + "httpResponse", r.body);
+
+               } catch (Exception e) {
+                       log.error("Error sending the request: " + e.getMessage(), e);
+
+                       r = new HttpResponse();
+                       r.code = 500;
+                       r.message = e.getMessage();
+                       String prefix = parseParam(paramMap, "responsePrefix", false, null);
+                       setResponseStatus(ctx, prefix, r);
+               }
+
+               if (r != null && r.code >= 300)
+                       throw new SvcLogicException(String.valueOf(r.code) + ": " + r.message);
+       }
+
+       private static class UebParam {
+
+               public String topic;
+               public String templateFileName;
+               public String rootVarName;
+               public String responsePrefix;
+               public boolean skipSending;
+       }
+
+       private UebParam getUebParameters(Map<String, String> paramMap) throws SvcLogicException {
+               UebParam p = new UebParam();
+               p.topic = parseParam(paramMap, "topic", true, null);
+               p.templateFileName = parseParam(paramMap, "templateFileName", false, null);
+               p.rootVarName = parseParam(paramMap, "rootVarName", false, null);
+               p.responsePrefix = parseParam(paramMap, "responsePrefix", false, null);
+               String skipSendingStr = paramMap.get("skipSending");
+               p.skipSending = skipSendingStr != null && skipSendingStr.equalsIgnoreCase("true");
+               return p;
+       }
+
+       protected HttpResponse postOnUeb(String request, UebParam p) throws Exception {
+               String[] urls = uebServers.split(" ");
+               for (int i = 0; i < urls.length; i++) {
+                       if (!urls[i].endsWith("/"))
+                               urls[i] += "/";
+                       urls[i] += "events/" + p.topic;
+               }
+
+               Client client = Client.create();
+               client.setConnectTimeout(5000);
+               WebResource webResource = client.resource(urls[0]);
+
+               log.info("UEB URL: " + urls[0]);
+               log.info("Sending request:");
+               log.info(request);
+               long t1 = System.currentTimeMillis();
+
+               HttpResponse r = new HttpResponse();
+               r.code = 200;
+
+               if (!p.skipSending) {
+                       String tt = "application/json";
+                       String tt1 = tt + ";charset=UTF-8";
+
+                       ClientResponse response = webResource.accept(tt).type(tt1).post(ClientResponse.class, request);
+
+                       r.code = response.getStatus();
+                       r.headers = response.getHeaders();
+                       if (response.hasEntity())
+                               r.body = response.getEntity(String.class);
+               }
+
+               long t2 = System.currentTimeMillis();
+               log.info("Response received. Time: " + (t2 - t1));
+               log.info("HTTP response code: " + r.code);
+               logHeaders(r.headers);
+               log.info("HTTP response:\n" + r.body);
+
+               return r;
+       }
+
+       protected void logProperties(Map<String, Object> mm) {
+               List<String> ll = new ArrayList<>();
+               for (Object o : mm.keySet())
+                       ll.add((String) o);
+               Collections.sort(ll);
+
+               log.info("Properties:");
+               for (String name : ll)
+                       log.info("--- " + name + ": " + String.valueOf(mm.get(name)));
+       }
+
+       protected void logHeaders(MultivaluedMap<String, String> mm) {
+               log.info("HTTP response headers:");
+
+               if (mm == null)
+                       return;
+
+               List<String> ll = new ArrayList<>();
+               for (Object o : mm.keySet())
+                       ll.add((String) o);
+               Collections.sort(ll);
+
+               for (String name : ll)
+                       log.info("--- " + name + ": " + String.valueOf(mm.get(name)));
+       }
+
+       public void setUebServers(String uebServers) {
+               this.uebServers = uebServers;
+       }
+
+       public void setDefaultUebTemplateFileName(String defaultUebTemplateFileName) {
+               this.defaultUebTemplateFileName = defaultUebTemplateFileName;
+       }
+}
diff --git a/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/RetryException.java b/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/RetryException.java
new file mode 100644 (file)
index 0000000..bf6ccc0
--- /dev/null
@@ -0,0 +1,30 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 ONAP 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.openecomp.sdnc.restapicall;
+
+public class RetryException extends Exception {
+
+    public RetryException(String message) {
+        super(message);
+    }
+
+}
diff --git a/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/RetryPolicy.java b/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/RetryPolicy.java
new file mode 100644 (file)
index 0000000..2a27a1d
--- /dev/null
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 ONAP 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.openecomp.sdnc.restapicall;
+
+public class RetryPolicy {
+    private String[] hostnames;
+    private Integer maximumRetries;  
+
+    public Integer getMaximumRetries() {
+        return maximumRetries;
+    }
+    
+    public String getNextHostName(String uri) throws RetryException {
+        Integer position = null;
+
+        for (int i = 0; i < hostnames.length; i++) {
+            if (uri.contains(hostnames[i])) {
+                position = i;
+                break;
+            }
+        }
+
+        if(position == null){
+            throw new RetryException("No match found for the provided uri[" + uri + "] so the next host name could not be retreived");
+        }
+        position++;
+
+        if (position > hostnames.length - 1) {
+            position = 0;
+        }
+        return hostnames[position];
+    }
+
+    public RetryPolicy(String[] hostnames, Integer maximumRetries){
+        this.hostnames = hostnames;
+        this.maximumRetries = maximumRetries;
+    }
+    
+
+}
diff --git a/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/RetryPolicyStore.java b/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/RetryPolicyStore.java
new file mode 100644 (file)
index 0000000..baf60d2
--- /dev/null
@@ -0,0 +1,54 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 ONAP 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.openecomp.sdnc.restapicall;
+
+import java.util.HashMap;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RetryPolicyStore {
+    private static final Logger log = LoggerFactory.getLogger(RetryPolicyStore.class);
+
+    HashMap<String, RetryPolicy> retryPolicies;
+    public String proxyServers;
+
+    public String getProxyServers() {
+        return proxyServers;
+    }
+
+    public void setProxyServers(String admServers) {
+        this.proxyServers = admServers;
+        String[] adminServersArray = admServers.split(",");
+        RetryPolicy adminPortalRetry = new RetryPolicy(adminServersArray, adminServersArray.length);
+        retryPolicies.put("dme2proxy", adminPortalRetry);
+    }
+
+    public RetryPolicyStore() {
+        retryPolicies = new HashMap<String, RetryPolicy>();
+    }
+    
+    public RetryPolicy getRetryPolicy(String policyName) {
+        return (this.retryPolicies.get(policyName));
+    }
+
+}
diff --git a/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/XmlJsonUtil.java b/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/XmlJsonUtil.java
new file mode 100644 (file)
index 0000000..66bf08b
--- /dev/null
@@ -0,0 +1,372 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 ONAP 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.openecomp.sdnc.restapicall;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class XmlJsonUtil {
+
+       private static final Logger log = LoggerFactory.getLogger(XmlJsonUtil.class);
+
+       public static String getXml(Map<String, String> varmap, String var) {
+               boolean escape = true;
+               if (var.startsWith("'")) {
+                       var = var.substring(1);
+                       escape = false;
+               }
+
+               Object o = createStructure(varmap, var);
+               return generateXml(o, 0, escape);
+       }
+
+       public static String getJson(Map<String, String> varmap, String var) {
+               boolean escape = true;
+               if (var.startsWith("'")) {
+                       var = var.substring(1);
+                       escape = false;
+               }
+
+               Object o = createStructure(varmap, var);
+               return generateJson(o, escape);
+       }
+
+       private static Object createStructure(Map<String, String> flatmap, String var) {
+               if (flatmap.containsKey(var)) {
+                       if (var.endsWith("_length") || var.endsWith("].key"))
+                               return null;
+                       return flatmap.get(var);
+               }
+
+               Map<String, Object> mm = new HashMap<>();
+               for (String k : flatmap.keySet())
+                       if (k.startsWith(var + ".")) {
+                               int i1 = k.indexOf('.', var.length() + 1);
+                               int i2 = k.indexOf('[', var.length() + 1);
+                               int i3 = k.length();
+                               if (i1 > 0 && i1 < i3)
+                                       i3 = i1;
+                               if (i2 > 0 && i2 < i3)
+                                       i3 = i2;
+                               String k1 = k.substring(var.length() + 1, i3);
+                               String var1 = k.substring(0, i3);
+                               if (!mm.containsKey(k1)) {
+                                       Object str = createStructure(flatmap, var1);
+                                       if (str != null && (!(str instanceof String) || ((String) str).trim().length() > 0))
+                                               mm.put(k1, str);
+                               }
+                       }
+               if (!mm.isEmpty())
+                       return mm;
+
+               boolean arrayFound = false;
+               for (String k : flatmap.keySet())
+                       if (k.startsWith(var + "[")) {
+                               arrayFound = true;
+                               break;
+                       }
+
+               if (arrayFound) {
+                       List<Object> ll = new ArrayList<>();
+
+                       int length = Integer.MAX_VALUE;
+                       String lengthStr = flatmap.get(var + "_length");
+                       if (lengthStr != null) {
+                               try {
+                                       length = Integer.parseInt(lengthStr);
+                               } catch (Exception e) {
+                                       log.warn("Invalid number for " + var + "_length:" + lengthStr);
+                               }
+                       }
+
+                       for (int i = 0; i < length; i++) {
+                               Object v = createStructure(flatmap, var + '[' + i + ']');
+                               if (v == null)
+                                       break;
+                               ll.add(v);
+                       }
+
+                       if (!ll.isEmpty())
+                               return ll;
+               }
+
+               return null;
+       }
+
+       @SuppressWarnings("unchecked")
+       private static String generateXml(Object o, int indent, boolean escape) {
+               if (o == null)
+                       return null;
+
+               if (o instanceof String)
+                       return escape ? escapeXml((String) o) : (String) o;;
+
+               if (o instanceof Map) {
+                       StringBuilder ss = new StringBuilder();
+                       Map<String, Object> mm = (Map<String, Object>) o;
+                       for (String k : mm.keySet()) {
+                               Object v = mm.get(k);
+                               if (v instanceof String) {
+                                       String s = escape ? escapeXml((String) v) : (String) v;
+                                       ss.append(pad(indent)).append('<').append(k).append('>');
+                                       ss.append(s);
+                                       ss.append("</").append(k).append('>').append('\n');
+                               } else if (v instanceof Map) {
+                                       ss.append(pad(indent)).append('<').append(k).append('>').append('\n');
+                                       ss.append(generateXml(v, indent + 1, escape));
+                                       ss.append(pad(indent)).append("</").append(k).append('>').append('\n');
+                               } else if (v instanceof List) {
+                                       List<Object> ll = (List<Object>) v;
+                                       for (Object o1 : ll) {
+                                               ss.append(pad(indent)).append('<').append(k).append('>').append('\n');
+                                               ss.append(generateXml(o1, indent + 1, escape));
+                                               ss.append(pad(indent)).append("</").append(k).append('>').append('\n');
+                                       }
+                               }
+                       }
+                       return ss.toString();
+               }
+
+               return null;
+       }
+
+       private static String generateJson(Object o, boolean escape) {
+               if (o == null)
+                       return null;
+
+               StringBuilder ss = new StringBuilder();
+               generateJson(ss, o, 0, false, escape);
+               return ss.toString();
+       }
+
+       @SuppressWarnings("unchecked")
+       private static void generateJson(StringBuilder ss, Object o, int indent, boolean padFirst, boolean escape) {
+               if (o instanceof String) {
+                       String s = escape ? escapeJson((String) o) : (String) o;
+                       if (padFirst)
+                               ss.append(pad(indent));
+                       ss.append('"').append(s).append('"');
+                       return;
+               }
+
+               if (o instanceof Map) {
+                       Map<String, Object> mm = (Map<String, Object>) o;
+
+                       if (padFirst)
+                               ss.append(pad(indent));
+                       ss.append("{\n");
+
+                       boolean first = true;
+                       for (String k : mm.keySet()) {
+                               if (!first)
+                                       ss.append(",\n");
+                               first = false;
+
+                               Object v = mm.get(k);
+                               ss.append(pad(indent + 1)).append('"').append(k).append("\": ");
+                               generateJson(ss, v, indent + 1, false, escape);
+                       }
+
+                       ss.append("\n");
+                       ss.append(pad(indent)).append('}');
+
+                       return;
+               }
+
+               if (o instanceof List) {
+                       List<Object> ll = (List<Object>) o;
+
+                       if (padFirst)
+                               ss.append(pad(indent));
+                       ss.append("[\n");
+
+                       boolean first = true;
+                       for (Object o1 : ll) {
+                               if (!first)
+                                       ss.append(",\n");
+                               first = false;
+
+                               generateJson(ss, o1, indent + 1, true, escape);
+                       }
+
+                       ss.append("\n");
+                       ss.append(pad(indent)).append(']');
+               }
+       }
+
+       public static String removeLastCommaJson(String s) {
+               StringBuilder sb = new StringBuilder();
+               int k = 0;
+               int start = 0;
+               while (k < s.length()) {
+                       int i11 = s.indexOf('}', k);
+                       int i12 = s.indexOf(']', k);
+                       int i1 = -1;
+                       if (i11 < 0)
+                               i1 = i12;
+                       else if (i12 < 0)
+                               i1 = i11;
+                       else
+                               i1 = i11 < i12 ? i11 : i12;
+                       if (i1 < 0)
+                               break;
+
+                       int i2 = s.lastIndexOf(',', i1);
+                       if (i2 < 0) {
+                               k = i1 + 1;
+                               continue;
+                       }
+
+                       String between = s.substring(i2 + 1, i1);
+                       if (between.trim().length() > 0) {
+                               k = i1 + 1;
+                               continue;
+                       }
+
+                       sb.append(s.substring(start, i2));
+                       start = i2 + 1;
+                       k = i1 + 1;
+               }
+
+               sb.append(s.substring(start, s.length()));
+
+               return sb.toString();
+       }
+
+       public static String removeEmptyStructJson(String s) {
+               int k = 0;
+               while (k < s.length()) {
+                       boolean curly = true;
+                       int i11 = s.indexOf('{', k);
+                       int i12 = s.indexOf('[', k);
+                       int i1 = -1;
+                       if (i11 < 0) {
+                               i1 = i12;
+                               curly = false;
+                       } else if (i12 < 0)
+                               i1 = i11;
+                       else
+                               if (i11 < i12)
+                                       i1 = i11;
+                               else {
+                                       i1 = i12;
+                                       curly = false;
+                               }
+
+                       if (i1 >= 0) {
+                               int i2 = curly ? s.indexOf('}', i1) : s.indexOf(']', i1);
+                               if (i2 > 0) {
+                                       String value = s.substring(i1 + 1, i2);
+                                       if (value.trim().length() == 0) {
+                                               int i4 = s.lastIndexOf('\n', i1);
+                                               if (i4 < 0)
+                                                       i4 = 0;
+                                               int i5 = s.indexOf('\n', i2);
+                                               if (i5 < 0)
+                                                       i5 = s.length();
+
+                                               s = s.substring(0, i4) + s.substring(i5);
+                                               k = 0;
+                                       } else
+                                               k = i1 + 1;
+                               } else
+                                       break;
+                       } else
+                               break;
+               }
+
+               return s;
+       }
+
+       public static String removeEmptyStructXml(String s) {
+               int k = 0;
+               while (k < s.length()) {
+                       int i1 = s.indexOf('<', k);
+                       if (i1 < 0 || i1 == s.length() - 1)
+                               break;
+
+                       char c1 = s.charAt(i1 + 1);
+                       if (c1 == '?' || c1 == '!') {
+                               k = i1 + 2;
+                               continue;
+                       }
+
+                       int i2 = s.indexOf('>', i1);
+                       if (i2 < 0) {
+                               k = i1 + 1;
+                               continue;
+                       }
+
+                       String closingTag = "</" + s.substring(i1 + 1, i2 + 1);
+                       int i3 = s.indexOf(closingTag, i2 + 1);
+                       if (i3 < 0) {
+                               k = i2 + 1;
+                               continue;
+                       }
+
+                       String value = s.substring(i2 + 1, i3);
+                       if (value.trim().length() > 0) {
+                               k = i2 + 1;
+                               continue;
+                       }
+
+                       int i4 = s.lastIndexOf('\n', i1);
+                       if (i4 < 0)
+                               i4 = 0;
+                       int i5 = s.indexOf('\n', i3);
+                       if (i5 < 0)
+                               i5 = s.length();
+
+                       s = s.substring(0, i4) + s.substring(i5);
+                       k = 0;
+               }
+
+               return s;
+       }
+
+       private static String escapeXml(String v) {
+               String s = v.replaceAll("&", "&amp;");
+               s = s.replaceAll("<", "&lt;");
+               s = s.replaceAll("'", "&apos;");
+               s = s.replaceAll("\"", "&quot;");
+               s = s.replaceAll(">", "&gt;");
+               return s;
+       }
+
+       private static String escapeJson(String v) {
+               String s = v.replaceAll("\\\\", "\\\\\\\\");
+               s = s.replaceAll("\"", "\\\\\"");
+               return s;
+       }
+
+       private static String pad(int n) {
+               String s = "";
+               for (int i = 0; i < n; i++)
+                       s += '\t';
+               return s;
+       }
+}
diff --git a/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/XmlParser.java b/restapi-call-node/provider/src/main/java/org/openecomp/sdnc/restapicall/XmlParser.java
new file mode 100644 (file)
index 0000000..e90a44f
--- /dev/null
@@ -0,0 +1,160 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 ONAP 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.openecomp.sdnc.restapicall;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+public class XmlParser {
+
+       private static final Logger log = LoggerFactory.getLogger(XmlParser.class);
+
+       public static Map<String, String> convertToProperties(String s, Set<String> listNameList) {
+               Handler handler = new Handler(listNameList);
+               try {
+                       SAXParserFactory factory = SAXParserFactory.newInstance();
+                       SAXParser saxParser = factory.newSAXParser();
+                       InputStream in = new ByteArrayInputStream(s.getBytes());
+                       saxParser.parse(in, handler);
+               } catch (Exception e) {
+                       e.printStackTrace();
+               }
+
+               return handler.getProperties();
+       }
+
+       private static class Handler extends DefaultHandler {
+
+               private Set<String> listNameList;
+
+               private Map<String, String> properties = new HashMap<>();
+
+               public Map<String, String> getProperties() {
+                       return properties;
+               }
+
+               public Handler(Set<String> listNameList) {
+                       super();
+                       this.listNameList = listNameList;
+                       if (this.listNameList == null)
+                               this.listNameList = new HashSet<String>();
+               }
+
+               String currentName = "";
+               String currentValue = "";
+
+               @Override
+               public void startElement(String uri, String localName, String qName, Attributes attributes)
+                       throws SAXException {
+                       super.startElement(uri, localName, qName, attributes);
+
+                       String name = localName;
+                       if (name == null || name.trim().length() == 0)
+                               name = qName;
+                       int i2 = name.indexOf(':');
+                       if (i2 >= 0)
+                               name = name.substring(i2 + 1);
+
+                       if (currentName.length() > 0)
+                               currentName += '.';
+                       currentName += name;
+
+                       String listName = removeIndexes(currentName);
+
+                       if (listNameList.contains(listName)) {
+                               int len = getInt(properties, currentName + "_length");
+                               properties.put(currentName + "_length", String.valueOf(len + 1));
+                               currentName += "[" + len + "]";
+                       }
+               }
+
+               @Override
+               public void endElement(String uri, String localName, String qName) throws SAXException {
+                       super.endElement(uri, localName, qName);
+
+                       String name = localName;
+                       if (name == null || name.trim().length() == 0)
+                               name = qName;
+                       int i2 = name.indexOf(':');
+                       if (i2 >= 0)
+                               name = name.substring(i2 + 1);
+
+                       if (currentValue.trim().length() > 0) {
+                               currentValue = currentValue.trim();
+                               properties.put(currentName, currentValue);
+
+                               log.info("Added property: " + currentName + ": " + currentValue);
+
+                               currentValue = "";
+                       }
+
+                       int i1 = currentName.lastIndexOf("." + name);
+                       if (i1 <= 0)
+                               currentName = "";
+                       else
+                               currentName = currentName.substring(0, i1);
+               }
+
+               @Override
+               public void characters(char[] ch, int start, int length) throws SAXException {
+                       super.characters(ch, start, length);
+
+                       String value = new String(ch, start, length);
+                       currentValue += value;
+               }
+
+               private static int getInt(Map<String, String> mm, String name) {
+                       String s = mm.get(name);
+                       if (s == null)
+                               return 0;
+                       return Integer.parseInt(s);
+               }
+
+               private String removeIndexes(String currentName) {
+                       String s = "";
+                       boolean add = true;
+                       for (int i = 0; i < currentName.length(); i++) {
+                               char c = currentName.charAt(i);
+                               if (c == '[')
+                                       add = false;
+                               else if (c == ']')
+                                       add = true;
+                               else if (add)
+                                       s += c;
+                       }
+                       return s;
+               }
+       }
+}
diff --git a/restapi-call-node/provider/src/main/resources/META-INF/spring/restapi-call-node-context.xml b/restapi-call-node/provider/src/main/resources/META-INF/spring/restapi-call-node-context.xml
new file mode 100644 (file)
index 0000000..a7b1a89
--- /dev/null
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 ONAP 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=========================================================
+  -->
+
+<beans xmlns="http://www.springframework.org/schema/beans"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.springframework.org/schema/beans
+        http://www.springframework.org/schema/beans/spring-beans.xsd">
+        
+       <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+               <property name="locations">
+            <list>
+                <value>file:${SDNC_CONFIG_DIR}/ueb.properties</value>
+                <value>file:${SDNC_CONFIG_DIR}/dme2.properties</value>
+            </list>
+        </property> 
+               <property name="ignoreResourceNotFound" value="true" />
+               <property name="ignoreUnresolvablePlaceholders" value="true" />
+       </bean>
+
+       <!-- context:property-placeholder location="file:${SDNC_CONFIG_DIR}/ueb.properties" /-->
+
+       <bean id="restapiCallNode" class="org.openecomp.sdnc.restapicall.RestapiCallNode">
+               <property name="uebServers" value="${servers}" />
+               <property name="retryPolicyStore" ref="retryPolicyStore"/>
+       </bean>
+
+       <bean id="retryPolicyStore" class="org.openecomp.sdnc.restapicall.RetryPolicyStore">
+               <property name="proxyServers" value="${proxyUrl}" />
+       </bean>
+</beans>
diff --git a/restapi-call-node/provider/src/main/resources/META-INF/spring/restapi-call-node-osgi-context.xml b/restapi-call-node/provider/src/main/resources/META-INF/spring/restapi-call-node-osgi-context.xml
new file mode 100644 (file)
index 0000000..09e3de7
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 ONAP 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=========================================================
+  -->
+
+<beans:beans xmlns="http://www.springframework.org/schema/osgi"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
+       xsi:schemaLocation="http://www.springframework.org/schema/osgi  
+       http://www.springframework.org/schema/osgi/spring-osgi.xsd
+       http://www.springframework.org/schema/beans   
+       http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+       <service ref="restapiCallNode" interface="org.openecomp.sdnc.restapicall.RestapiCallNode" />
+
+</beans:beans>
diff --git a/restapi-call-node/provider/src/main/resources/default-ueb-message.json b/restapi-call-node/provider/src/main/resources/default-ueb-message.json
new file mode 100644 (file)
index 0000000..4b1aa03
--- /dev/null
@@ -0,0 +1,32 @@
+/*-
+ * ============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=========================================================
+ */
+
+{
+       "event":{
+               "header":{
+                       "eventSource":"sdn-c"
+               },
+               "body":
+
+${rootVarName}
+
+       }
+}
diff --git a/restapi-call-node/provider/src/main/resources/get-multicast-data.json b/restapi-call-node/provider/src/main/resources/get-multicast-data.json
new file mode 100644 (file)
index 0000000..f6155ee
--- /dev/null
@@ -0,0 +1,34 @@
+/*-
+ * ============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=========================================================
+ */
+
+{
+  "input": {
+    "sdnc-request-header": {
+      "svc-request-id": ${connection-details-notification-input.configuration-response-common.svc-request-id},
+      "svc-action": "updatemulticastvpn"
+    },
+    "service-information": {
+      "service-type": "AVPN",
+      "service-instance-id": ${tmp.ete-vpn-key}
+    }
+  }
+}
+
diff --git a/restapi-call-node/provider/src/main/resources/northbound-api-template.json b/restapi-call-node/provider/src/main/resources/northbound-api-template.json
new file mode 100644 (file)
index 0000000..d48c41c
--- /dev/null
@@ -0,0 +1,43 @@
+/*-
+ * ============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=========================================================
+ */
+
+{ 
+"input": 
+            { 
+                       "sdnc-request-header":{
+                               "svc-request-id":       ${service-topology-operation-input.sdnc-request-header.svc-request-id},
+                               "svc-notification-url": ${service-topology-operation-input.sdnc-request-header.svc-notification-url}
+                       },
+                       "request-information":{
+                               "request-id":   ${service-topology-operation-input.request-information.request-id},
+                               "request-action":       ${service-topology-operation-input.request-information.request-action},
+                               "request-sub-action":   ${service-topology-operation-input.request-information.request-sub-action},
+                               "source":       ${service-topology-operation-input.request-information.source},
+                               "notification-url":     ${service-topology-operation-input.request-information.notification-url}
+                       },
+                       "service-information":{
+                               "service-type": ${service-topology-operation-input.service-information.service-type},
+                               "service-instance-id":  ${service-topology-operation-input.service-information.service-instance-id},
+                               "subscriber-name":      ${service-topology-operation-input.service-information.subscriber-name},
+                               "subscriber-global-id": ${service-topology-operation-input.service-information.subscriber-global-id}
+                       }
+}
+            
diff --git a/restapi-call-node/provider/src/main/resources/northbound-api-template.xml b/restapi-call-node/provider/src/main/resources/northbound-api-template.xml
new file mode 100644 (file)
index 0000000..03530a7
--- /dev/null
@@ -0,0 +1,43 @@
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 ONAP 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=========================================================
+  -->
+
+   <input xmlns="${northbound-xmlNS}">
+     <${northbound-Container}>
+      <request-information>
+         <notification-url>${service-topology-operation-input.request-information.notification-url}</notification-url>
+         <request-action>${service-topology-operation-input.request-information.request-action}</request-action>
+         <request-id>${service-topology-operation-input.request-information.request-id}</request-id>
+         <request-sub-action>${service-topology-operation-input.request-information.request-sub-action}</request-sub-action>
+         <source>${service-topology-operation-input.request-information.source}</source>
+      </request-information>
+      <sdnc-request-header>
+         <svc-notification-url>${service-topology-operation-input.sdnc-request-header.svc-notification-url}</svc-notification-url>
+         <svc-request-id>${service-topology-operation-input.sdnc-request-header.svc-request-id}</svc-request-id>
+      </sdnc-request-header>
+      <service-information>
+         <service-instance-id>${service-topology-operation-input.service-information.service-instance-id}</service-instance-id>
+         <service-type>${service-topology-operation-input.service-information.service-type}</service-type>
+         <subscriber-global-id>${service-topology-operation-input.service-information.subscriber-global-id}</subscriber-global-id>
+         <subscriber-name>${service-topology-operation-input.service-information.subscriber-name}</subscriber-name>
+       </service-information>
+        ${'northbound-anyData}
+    </${northbound-Container}>
+   </input>
diff --git a/restapi-call-node/provider/src/main/resources/service-configuration-notification-northbound-template.json b/restapi-call-node/provider/src/main/resources/service-configuration-notification-northbound-template.json
new file mode 100644 (file)
index 0000000..0cb7d0b
--- /dev/null
@@ -0,0 +1,44 @@
+/*-
+ * ============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=========================================================
+ */
+
+{
+  "input": {
+    "svc-request-id": ${service-configuration-notification-input.svc-request-id},
+    "response-code": ${service-configuration-notification-input.response-code},
+    "response-message": ${service-configuration-notification-input.response-message},
+    "ack-final-indicator": ${service-configuration-notification-input.ack-final-indicator},
+    "service-information": {
+      "service-type": ${service-data.service-information.service-type},
+      "service-instance-id": ${service-data.service-information.service-instance-id},
+      "subscriber-name": ${service-data.service-information.subscriber-name},
+      "subscriber-global-id": ${service-data.service-information.subscriber-global-id}
+    },
+    "response-parameters": [
+        ${repeat:service-configuration-notification-input.response-parameters_length:
+           {
+            "sequence-number": ${service-configuration-notification-input.response-parameters[${1}].sequence-number},
+            "tag-name": ${service-configuration-notification-input.response-parameters[${1}].tag-name},
+            "tag-value": ${service-configuration-notification-input.response-parameters[${1}].tag-value}
+           }
+        }
+    ]
+  }
+}
diff --git a/restapi-call-node/provider/src/main/resources/update-vpe-data-with-apply-group.json b/restapi-call-node/provider/src/main/resources/update-vpe-data-with-apply-group.json
new file mode 100644 (file)
index 0000000..a82a6b4
--- /dev/null
@@ -0,0 +1,53 @@
+/*-
+ * ============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=========================================================
+ */
+
+{
+  "vrf-export-details": [
+  ${repeat:restapi-result.ApplyGroupResponse.ApplyGroupResponseData[0].VrfDetails.VrfExport_length:
+    {
+      "vrf-export": ${restapi-result.ApplyGroupResponse.ApplyGroupResponseData[0].VrfDetails.VrfExport[${1}]}
+    }
+    }
+  ],
+  "vrf-import-details": [
+  ${repeat:restapi-result.ApplyGroupResponse.ApplyGroupResponseData[0].VrfDetails.VrfImport_length:
+    {
+      "vrf-import": ${restapi-result.ApplyGroupResponse.ApplyGroupResponseData[0].VrfDetails.VrfImport[${1}]}
+    }
+    }
+  ],
+  "apply-group-template": [
+  ${repeat:restapi-result.ApplyGroupResponse.ApplyGroupResponseData[0].VrfDetails.ApplyGroup_length:
+    {
+      "apply-group": ${restapi-result.ApplyGroupResponse.ApplyGroupResponseData[0].VrfDetails.ApplyGroup[${1}].ApplyGroup}
+    }
+    }
+  ],
+  "community-list": [
+  ${repeat:restapi-result.ApplyGroupResponse.ApplyGroupResponseData[0].VrfDetails.CommunityList_length:
+    {
+      "member": ${restapi-result.ApplyGroupResponse.ApplyGroupResponseData[0].VrfDetails.CommunityList[${1}].member},
+      "name": ${restapi-result.ApplyGroupResponse.ApplyGroupResponseData[0].VrfDetails.CommunityList[${1}].name}
+    }
+    }
+  ]
+}
+
diff --git a/restapi-call-node/provider/src/main/resources/vnf-information-update.json b/restapi-call-node/provider/src/main/resources/vnf-information-update.json
new file mode 100644 (file)
index 0000000..425f0f3
--- /dev/null
@@ -0,0 +1,24 @@
+/*-
+ * ============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=========================================================
+ */
+
+{
+"generic-vnf-service" :${vnf-service.generic-vnf-service}
+}
diff --git a/restapi-call-node/provider/src/main/resources/vpn-allocation-request.json b/restapi-call-node/provider/src/main/resources/vpn-allocation-request.json
new file mode 100644 (file)
index 0000000..6c84274
--- /dev/null
@@ -0,0 +1,36 @@
+/*-
+ * ============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=========================================================
+ */
+
+{
+  "AllocateVpnResourcesRequest": {
+    "message-id": "${service-data.oper-status.modify-timestamp}",
+    "service-instance-id": "${service-data.service-information.service-instance-id}",
+    "vrf-request-type": {
+      "vpn-id": "${service-data.avpn-logicalchannel-information.vpn-id}",
+      "vpn-service": "${service-data.service-information.service-type}",
+      "e2e-vpn-id": "${service-data.avpn-logicalchannel-information.e2e-vpn-id}",
+      "vpe-name": "${service-data.avpn-logicalchannel-information.evc-endpoint-information.vpe-name}",
+      "asn": "${service-data.avpn-logicalchannel-information.carrier-asn}",
+      "route-group-name": "${service-data.avpn-logicalchannel-information.bgp-options.neighbor-address-information.route-group-name}",
+      "hub-or-spoke": "${service-data.avpn-logicalchannel-information.hub-or-spoke}"
+    }
+  }
+}
diff --git a/restapi-call-node/provider/src/main/resources/vpn-information-update.json b/restapi-call-node/provider/src/main/resources/vpn-information-update.json
new file mode 100644 (file)
index 0000000..7977066
--- /dev/null
@@ -0,0 +1,24 @@
+/*-
+ * ============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=========================================================
+ */
+
+{ 
+"vpn-information" :${vpe-vpn-service.vpn-information} 
+}
diff --git a/restapi-call-node/provider/src/main/resources/vrf-service-configuration-information-template.json b/restapi-call-node/provider/src/main/resources/vrf-service-configuration-information-template.json
new file mode 100644 (file)
index 0000000..f7e8432
--- /dev/null
@@ -0,0 +1,37 @@
+/*-
+ * ============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=========================================================
+ */
+
+{
+  "input": {
+  
+    "e2e-vpn-key": ${service-data.avpn-logicalchannel-information.e2e-vpn-id},
+    "logical-channel-id": ${service-data.service-information.service-instance-id},
+    "vpe-name": ${service-data.avpn-logicalchannel-information.evc-endpoint-information.vpe-name},
+    "rpc-action": ${tmp.rpc-action},
+    
+    "vpn-information": ${vpe-vpn-service.vpn-information},
+    "vrf-details": ${vpe-vpn-service.vpn-information.vrf-details},
+    "vrf-vlan-resources": {
+      "logical-channel-id": ${service-data.service-information.service-instance-id},
+      "logical-channel-status": ${tmp.logical-channel-status}
+    }
+  }
+}
diff --git a/restapi-call-node/provider/src/main/resources/vrf-update-vlan-status-template.json b/restapi-call-node/provider/src/main/resources/vrf-update-vlan-status-template.json
new file mode 100644 (file)
index 0000000..7a6cab3
--- /dev/null
@@ -0,0 +1,33 @@
+/*-
+ * ============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=========================================================
+ */
+
+{
+  "input": {
+    "e2e-vpn-key": ${service-data.avpn-logicalchannel-information.e2e-vpn-id},
+    "logical-channel-id": ${service-data.service-information.service-instance-id},
+    "vpe-name": ${service-data.avpn-logicalchannel-information.evc-endpoint-information.vpe-name},
+    "rpc-action": ${tmp.rpc-action},
+    "vrf-vlan-resources": {
+      "logical-channel-id": ${service-data.service-information.service-instance-id},
+      "logical-channel-status": ${tmp.logical-channel-status}
+    }
+  }
+}
diff --git a/restapi-call-node/provider/src/main/resources/vrf-update.json b/restapi-call-node/provider/src/main/resources/vrf-update.json
new file mode 100644 (file)
index 0000000..778e4b2
--- /dev/null
@@ -0,0 +1,77 @@
+/*-
+ * ============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=========================================================
+ */
+
+{
+  "vpn-vame": ${allocate-vpn-resource-notification-input.vpn-data[0].vpn-name},
+  "vpn-id": ${allocate-vpn-resource-notification-input.vpn-data[0].vpn-id},
+  "vrf-details": [
+  ${repeat:allocate-vpn-resource-notification-input.vpn-data[0].vrf-information_length:
+    {
+      "vrf-export-details": [
+      ${repeat:allocate-vpn-resource-notification-input.vpn-data[0].vrf-information[${1}].vrf-export-details_length:
+        {
+          "vrf-export": ${allocate-vpn-resource-notification-input.vpn-data[0].vrf-information[${1}].vrf-export-details[${2}].vrf-export}
+        }
+        }
+      ],
+      "vrf-name": ${allocate-vpn-resource-notification-input.vpn-data[0].vrf-information[${1}].vrf-name},
+      "vpe-name": ${allocate-vpn-resource-notification-input.vpn-data[0].vrf-information[${1}].vpe-name},
+      "vrf-import-details": [
+      ${repeat:allocate-vpn-resource-notification-input.vpn-data[0].vrf-information[${1}].vrf-import-details_length:
+        {
+          "vrf-import": ${allocate-vpn-resource-notification-input.vpn-data[0].vrf-information[${1}].vrf-import-details[${2}].vrf-import}
+        }
+        }
+      ],
+      "apply-group-template": [
+      ${repeat:allocate-vpn-resource-notification-input.vpn-data[0].vrf-information[${1}].apply-group-template_length:
+        {
+          "apply-group": ${allocate-vpn-resource-notification-input.vpn-data[0].vrf-information[${1}].apply-group-template[${2}].apply-group}
+        }
+        }
+      ],
+      "community-list": [
+      ${repeat:allocate-vpn-resource-notification-input.vpn-data[0].vrf-information[${1}].community-list_length:
+        {
+          "member": ${allocate-vpn-resource-notification-input.vpn-data[0].vrf-information[${1}].community-list[${2}].name},
+          "name": ${allocate-vpn-resource-notification-input.vpn-data[0].vrf-information[${1}].community-list[${2}].member}
+        }
+        }
+      ],
+      "router-distinguisher": ${allocate-vpn-resource-notification-input.vpn-data[0].vrf-information[${1}].router-distinguisher}
+    }
+    }
+  ],
+  "spoke-routes": {
+    "route-target": ${allocate-vpn-resource-notification-input.vpn-data[0].spoke-route-target.route-target}
+  },
+  
+   "route-target-details": [
+  ${repeat:allocate-vpn-resource-notification-input.vpn-data[0].route-target-details_length:
+    {
+     "route-target": ${allocate-vpn-resource-notification-input.vpn-data[0].route-target-details[${1}].route-target},
+     "route-target-type": ${allocate-vpn-resource-notification-input.vpn-data[0].route-target-details[${1}].route-target-type}
+    }
+    }
+  ],
+  
+  "e2e-vpn-key": ${allocate-vpn-resource-notification-input.vpn-data[0].e2e-vpn-id}
+}
diff --git a/restapi-call-node/provider/src/test/java/jtest/org/openecomp/sdnc/restapicall/TestJsonParser.java b/restapi-call-node/provider/src/test/java/jtest/org/openecomp/sdnc/restapicall/TestJsonParser.java
new file mode 100644 (file)
index 0000000..16fa685
--- /dev/null
@@ -0,0 +1,65 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 ONAP 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 jtest.org.openecomp.sdnc.restapicall;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.junit.Test;
+import org.openecomp.sdnc.restapicall.JsonParser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TestJsonParser {
+
+       private static final Logger log = LoggerFactory.getLogger(TestJsonParser.class);
+
+       @Test
+       public void test() throws Exception {
+               BufferedReader in = new BufferedReader(new InputStreamReader(ClassLoader.getSystemResourceAsStream("test.json")));
+               String ss = "";
+               String line = null;
+               while ((line = in.readLine()) != null)
+                       ss += line + '\n';
+
+               Map<String, String> mm = JsonParser.convertToProperties(ss);
+
+               logProperties(mm);
+
+               in.close();
+       }
+
+       private void logProperties(Map<String, String> mm) {
+               List<String> ll = new ArrayList<>();
+               for (Object o : mm.keySet())
+                       ll.add((String) o);
+               Collections.sort(ll);
+
+               log.info("Properties:");
+               for (String name : ll)
+                       log.info("--- " + name + ": " + mm.get(name));
+       }
+}
diff --git a/restapi-call-node/provider/src/test/java/jtest/org/openecomp/sdnc/restapicall/TestRestapiCallNode.java b/restapi-call-node/provider/src/test/java/jtest/org/openecomp/sdnc/restapicall/TestRestapiCallNode.java
new file mode 100644 (file)
index 0000000..e0e58ad
--- /dev/null
@@ -0,0 +1,92 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 ONAP 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 jtest.org.openecomp.sdnc.restapicall;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Test;
+import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
+import org.openecomp.sdnc.restapicall.RestapiCallNode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TestRestapiCallNode {
+
+       private static final Logger log = LoggerFactory.getLogger(TestRestapiCallNode.class);
+
+
+       @Test
+       public void testDelete() throws Exception {
+               SvcLogicContext ctx = new SvcLogicContext();
+
+               Map<String, String> p = new HashMap<String, String>();
+               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 Exception {
+               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<String, String>();
+               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);
+       }
+}
diff --git a/restapi-call-node/provider/src/test/java/jtest/org/openecomp/sdnc/restapicall/TestXmlJsonUtil.java b/restapi-call-node/provider/src/test/java/jtest/org/openecomp/sdnc/restapicall/TestXmlJsonUtil.java
new file mode 100644 (file)
index 0000000..dbcf98a
--- /dev/null
@@ -0,0 +1,215 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 ONAP 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 jtest.org.openecomp.sdnc.restapicall;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openecomp.sdnc.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);
+    }
+
+    @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(xmlin);
+        log.info(xmlout);
+
+        Assert.assertEquals(xmloutexpected, xmlout);
+    }
+}
diff --git a/restapi-call-node/provider/src/test/java/jtest/org/openecomp/sdnc/restapicall/TestXmlParser.java b/restapi-call-node/provider/src/test/java/jtest/org/openecomp/sdnc/restapicall/TestXmlParser.java
new file mode 100644 (file)
index 0000000..980eded
--- /dev/null
@@ -0,0 +1,75 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * openECOMP : SDN-C
+ * ================================================================================
+ * Copyright (C) 2017 ONAP 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 jtest.org.openecomp.sdnc.restapicall;
+
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Test;
+import org.openecomp.sdnc.restapicall.XmlParser;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TestXmlParser {
+
+       private static final Logger log = LoggerFactory.getLogger(TestXmlParser.class);
+
+       @Test
+       public void test() throws Exception {
+               BufferedReader in = new BufferedReader(new InputStreamReader(ClassLoader.getSystemResourceAsStream("test3.xml")));
+               String ss = "";
+               String line = null;
+               while ((line = in.readLine()) != null)
+                       ss += line + '\n';
+
+               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(ss, listNameList);
+
+               logProperties(mm);
+
+               in.close();
+       }
+
+       private void logProperties(Map<String, String> mm) {
+               List<String> ll = new ArrayList<>();
+               for (Object o : mm.keySet())
+                       ll.add((String) o);
+               Collections.sort(ll);
+
+               log.info("Properties:");
+               for (String name : ll)
+                       log.info("--- " + name + ": " + mm.get(name));
+       }
+}
diff --git a/restapi-call-node/provider/src/test/resources/test-template.json b/restapi-call-node/provider/src/test/resources/test-template.json
new file mode 100644 (file)
index 0000000..4adc663
--- /dev/null
@@ -0,0 +1,57 @@
+/*-
+ * ============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=========================================================
+ */
+
+{
+  "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}
+    },
+   }
+   ]
+}
diff --git a/restapi-call-node/provider/src/test/resources/test.json b/restapi-call-node/provider/src/test/resources/test.json
new file mode 100644 (file)
index 0000000..885e660
--- /dev/null
@@ -0,0 +1,48 @@
+/*-
+ * ============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=========================================================
+ */
+
+{
+       "equipment-data": [
+               {
+                       "server-count": "4",
+                       "max-server-speed": "1600000",
+                       "number-primary-servers": "2",
+                       "equipment-id": "Server1",
+                       "server-model": "Unknown",
+                       "server-id": "Server1"
+               }
+       ],
+       "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/restapi-call-node/provider/src/test/resources/test.xml b/restapi-call-node/provider/src/test/resources/test.xml
new file mode 100644 (file)
index 0000000..76205dd
--- /dev/null
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 ONAP 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.openecomp.sdnctl</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.openecomp.sdnctl</groupId>
+                       <artifactId>sli-common</artifactId>
+                       <scope>compile</scope>
+               </dependency>
+               <dependency>
+                       <groupId>org.openecomp.sdnctl</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>commons-codec</groupId>
+                       <artifactId>commons-codec</artifactId>
+               </dependency>
+       </dependencies>
+
+       <build>
+               <plugins>
+                       <plugin>
+                               <groupId>com.brocade.developer</groupId>
+                               <artifactId>providermodule-plugin</artifactId>
+                               <configuration>
+                                       <packageId>org.openecomp.sdnctl</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.openecomp.sdnc.restapicall</Bundle-SymbolicName>
+                                               <Export-Package>org.openecomp.sdnc.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/restapi-call-node/provider/src/test/resources/test3.xml b/restapi-call-node/provider/src/test/resources/test3.xml
new file mode 100644 (file)
index 0000000..2bf3be3
--- /dev/null
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+  ============LICENSE_START=======================================================
+  openECOMP : SDN-C
+  ================================================================================
+  Copyright (C) 2017 ONAP 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://openecomp.org/vpn/schema/v1"
+       xmlns:ns2="http://openecomp.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/version.properties b/version.properties
new file mode 100644 (file)
index 0000000..2565466
--- /dev/null
@@ -0,0 +1,16 @@
+###########################################################
+# Versioning variables
+# Note that these variables cannot be structured (e.g. : version.release or version.snapshot etc... )
+# because they are used in Jenkins, whose plug-in doesn't support
+
+# Comment
+
+release_name=1
+sprint_number=1
+feature_revision=2
+
+base_version=${release_name}.${sprint_number}.${feature_revision}
+
+release_version=${base_version}
+snapshot_version=${base_version}-SNAPSHOT
+