Springboot-based SLI-API 49/101849/9
authorSmokowski, Kevin (ks6305) <kevin.smokowski@att.com>
Mon, 3 Feb 2020 16:02:18 +0000 (16:02 +0000)
committerDan Timoney <dtimoney@att.com>
Fri, 21 Feb 2020 19:01:50 +0000 (14:01 -0500)
Implement SLI-API RESTCONF in springboot

Change-Id: I8b9b07e3b1aeb4a5adac977307c6f95c905ea038
Issue-ID: CCSDK-2096
Signed-off-by: Dan Timoney <dtimoney@att.com>
25 files changed:
.gitignore
features/ccsdk-sli/pom.xml
sli/pom.xml
sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/recording/FileRecorder.java [moved from sli/recording/src/main/java/org/onap/ccsdk/sli/core/sli/recording/FileRecorder.java with 100% similarity]
sli/provider-base/src/main/java/org/onap/ccsdk/sli/core/sli/recording/Slf4jRecorder.java [moved from sli/recording/src/main/java/org/onap/ccsdk/sli/core/sli/recording/Slf4jRecorder.java with 100% similarity]
sli/provider-base/src/test/java/org/onap/ccsdk/sli/core/sli/recording/TestFileRecorder.java [moved from sli/recording/src/test/java/org/onap/ccsdk/sli/core/sli/recording/TestFileRecorder.java with 100% similarity]
sli/provider-base/src/test/java/org/onap/ccsdk/sli/core/sli/recording/TestSlf4jRecorder.java [moved from sli/recording/src/test/java/org/onap/ccsdk/sli/core/sli/recording/TestSlf4jRecorder.java with 100% similarity]
sli/provider/src/main/resources/OSGI-INF/blueprint/sli-blueprint.xml
sli/provider/src/main/resources/org/opendaylight/blueprint/sli-blueprint.xml
sli/recording/pom.xml [deleted file]
sli/recording/src/main/resources/OSGI-INF/blueprint/recording-blueprint.xml [deleted file]
sli/recording/src/main/resources/org/opendaylight/blueprint/recording-blueprint.xml [deleted file]
sliapi/.gitignore
sliapi/model/src/main/resources/sli-api.20161110.yaml [new file with mode: 0644]
sliapi/pom.xml
sliapi/springboot/.swagger-codegen-ignore [new file with mode: 0644]
sliapi/springboot/README.md [new file with mode: 0644]
sliapi/springboot/pom.xml [new file with mode: 0644]
sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/ExecuteGraphController.java [new file with mode: 0644]
sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/RestconfApiController.java [new file with mode: 0644]
sliapi/springboot/src/main/resources/application.properties [new file with mode: 0644]
sliapi/springboot/src/main/resources/graph.versions [new file with mode: 0644]
sliapi/springboot/src/main/resources/sli_healthcheck.xml [new file with mode: 0644]
sliapi/springboot/src/main/resources/svclogic.properties [moved from sli/recording/src/main/resources/svclogic.properties with 83% similarity]
utils/provider/src/main/java/org/onap/ccsdk/sli/core/utils/JREFileResolver.java

index 92a91c2..610f890 100755 (executable)
@@ -18,6 +18,7 @@ target
 target-ide
 MANIFEST.MF
 **/yang-gen-sal
+*.interp
 sli/model/src/main/java
 
 ## Misc Ignores (OS specific etc) ##
index 87fa657..14c8231 100644 (file)
                        <version>${project.version}</version>
                </dependency>
 
-               <dependency>
-                       <groupId>org.onap.ccsdk.sli.core</groupId>
-                       <artifactId>sli-recording</artifactId>
-                       <version>${project.version}</version>
-               </dependency>
-
                <dependency>
                        <groupId>org.onap.ccsdk.sli.core</groupId>
                        <artifactId>dblib-provider</artifactId>
index 4f758a2..7363f5b 100755 (executable)
@@ -25,7 +25,6 @@
         <module>model</module>
         <module>common</module>
         <module>provider</module>
-        <module>recording</module>
         <module>installer</module>
     </modules>
 </project>
index d88cf33..fb3ab9a 100644 (file)
         </interfaces>
     </service>
 
+    <bean id="fileRecorder" class="org.onap.ccsdk.sli.core.sli.recording.FileRecorder" />
+    <!-- Implementation name was chosen over interface name due to the fact that this Service
+         was previously registered using the implementation name rather than the interface name.
+         To ensure backwards compatibility with abstractions polling the Service Registry for the
+         fileRecorder, the implementation name was chosen here. -->
+    <service ref="fileRecorder" interface="org.onap.ccsdk.sli.core.sli.recording.FileRecorder" />
+
+    <bean id="slf4jRecorder" class="org.onap.ccsdk.sli.core.sli.recording.Slf4jRecorder" />
+    <!-- Implementation name was chosen over interface name due to the fact that this Service
+         was previously registered using the implementation name rather than the interface name.
+         To ensure backwards compatibility with abstractions polling the Service Registry for the
+         slf4jRecorder, the implementation name was chosen here. -->
+    <service ref="slf4jRecorder" interface="org.onap.ccsdk.sli.core.sli.recording.Slf4jRecorder" />
+
 </blueprint>
index d88cf33..fb3ab9a 100644 (file)
         </interfaces>
     </service>
 
+    <bean id="fileRecorder" class="org.onap.ccsdk.sli.core.sli.recording.FileRecorder" />
+    <!-- Implementation name was chosen over interface name due to the fact that this Service
+         was previously registered using the implementation name rather than the interface name.
+         To ensure backwards compatibility with abstractions polling the Service Registry for the
+         fileRecorder, the implementation name was chosen here. -->
+    <service ref="fileRecorder" interface="org.onap.ccsdk.sli.core.sli.recording.FileRecorder" />
+
+    <bean id="slf4jRecorder" class="org.onap.ccsdk.sli.core.sli.recording.Slf4jRecorder" />
+    <!-- Implementation name was chosen over interface name due to the fact that this Service
+         was previously registered using the implementation name rather than the interface name.
+         To ensure backwards compatibility with abstractions polling the Service Registry for the
+         slf4jRecorder, the implementation name was chosen here. -->
+    <service ref="slf4jRecorder" interface="org.onap.ccsdk.sli.core.sli.recording.Slf4jRecorder" />
+
 </blueprint>
diff --git a/sli/recording/pom.xml b/sli/recording/pom.xml
deleted file mode 100755 (executable)
index 3a5afd9..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-<?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.parent</groupId>
-               <artifactId>binding-parent</artifactId>
-               <version>1.5.2-SNAPSHOT</version>
-               <relativePath/>
-       </parent>
-
-       <groupId>org.onap.ccsdk.sli.core</groupId>
-       <artifactId>sli-recording</artifactId>
-       <version>0.7.1-SNAPSHOT</version>
-       <packaging>bundle</packaging>
-
-       <name>ccsdk-sli-core :: sli :: ${project.artifactId}</name>
-       <description>SLI Recording is an OSGi bundle that implements recording service for the service logic record node.</description>
-
-       <dependencies>
-               <dependency>
-                       <groupId>org.onap.ccsdk.sli.core</groupId>
-                       <artifactId>sli-common</artifactId>
-                       <version>${project.version}</version>
-                       <scope>compile</scope>
-               </dependency>
-               <dependency>
-                       <groupId>org.slf4j</groupId>
-                       <artifactId>slf4j-api</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>commons-lang</groupId>
-                       <artifactId>commons-lang</artifactId>
-                       <scope>compile</scope>
-               </dependency>
-               <!-- Testing Dependencies -->
-               <dependency>
-                       <groupId>junit</groupId>
-                       <artifactId>junit</artifactId>
-                       <scope>test</scope>
-               </dependency>
-               <dependency>
-                       <groupId>org.mockito</groupId>
-                       <artifactId>mockito-core</artifactId>
-                       <scope>test</scope>
-               </dependency>
-       </dependencies>
-</project>
diff --git a/sli/recording/src/main/resources/OSGI-INF/blueprint/recording-blueprint.xml b/sli/recording/src/main/resources/OSGI-INF/blueprint/recording-blueprint.xml
deleted file mode 100644 (file)
index 6786b95..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
-           xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
-           odl:use-default-for-reference-types="true">
-
-    <bean id="fileRecorder" class="org.onap.ccsdk.sli.core.sli.recording.FileRecorder" />
-    <!-- Implementation name was chosen over interface name due to the fact that this Service
-         was previously registered using the implementation name rather than the interface name.
-         To ensure backwards compatibility with abstractions polling the Service Registry for the
-         fileRecorder, the implementation name was chosen here. -->
-    <service ref="fileRecorder" interface="org.onap.ccsdk.sli.core.sli.recording.FileRecorder" />
-
-    <bean id="slf4jRecorder" class="org.onap.ccsdk.sli.core.sli.recording.Slf4jRecorder" />
-    <!-- Implementation name was chosen over interface name due to the fact that this Service
-         was previously registered using the implementation name rather than the interface name.
-         To ensure backwards compatibility with abstractions polling the Service Registry for the
-         slf4jRecorder, the implementation name was chosen here. -->
-    <service ref="slf4jRecorder" interface="org.onap.ccsdk.sli.core.sli.recording.Slf4jRecorder" />
-
-</blueprint>
\ No newline at end of file
diff --git a/sli/recording/src/main/resources/org/opendaylight/blueprint/recording-blueprint.xml b/sli/recording/src/main/resources/org/opendaylight/blueprint/recording-blueprint.xml
deleted file mode 100644 (file)
index 6786b95..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
-           xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
-           odl:use-default-for-reference-types="true">
-
-    <bean id="fileRecorder" class="org.onap.ccsdk.sli.core.sli.recording.FileRecorder" />
-    <!-- Implementation name was chosen over interface name due to the fact that this Service
-         was previously registered using the implementation name rather than the interface name.
-         To ensure backwards compatibility with abstractions polling the Service Registry for the
-         fileRecorder, the implementation name was chosen here. -->
-    <service ref="fileRecorder" interface="org.onap.ccsdk.sli.core.sli.recording.FileRecorder" />
-
-    <bean id="slf4jRecorder" class="org.onap.ccsdk.sli.core.sli.recording.Slf4jRecorder" />
-    <!-- Implementation name was chosen over interface name due to the fact that this Service
-         was previously registered using the implementation name rather than the interface name.
-         To ensure backwards compatibility with abstractions polling the Service Registry for the
-         slf4jRecorder, the implementation name was chosen here. -->
-    <service ref="slf4jRecorder" interface="org.onap.ccsdk.sli.core.sli.recording.Slf4jRecorder" />
-
-</blueprint>
\ No newline at end of file
index b73caf3..1558a77 100755 (executable)
@@ -29,6 +29,10 @@ out/
 .DS_STORE
 .metadata
 
+## Derby files
+sdnctl
+derby.log
+
 ## Folders which contain auto generated source code ##
 yang-gen-config
 yang-gen-sal
diff --git a/sliapi/model/src/main/resources/sli-api.20161110.yaml b/sliapi/model/src/main/resources/sli-api.20161110.yaml
new file mode 100644 (file)
index 0000000..db60aa1
--- /dev/null
@@ -0,0 +1,271 @@
+---
+swagger: '2.0'
+info:
+  version: 1.0.0
+  title: "SLI API"
+basePath: '/restconf'
+schemes:
+  - http
+  - https
+paths:
+  '/restconf/config/SLI-API:test-results':
+    delete:
+      produces:
+        - application/json
+        - application/xml
+      responses:
+        '200':
+          description: No response was specified
+      description: Test results
+      operationId: delete-test-results
+    get:
+      produces:
+        - application/json
+        - application/xml
+      responses:
+        '200':
+          description: No response was specified
+          schema:
+            $ref: '#/definitions/test-results'
+      description: Test results
+      operationId: get-test-results
+    post:
+      consumes:
+        - application/json
+        - application/xml
+      produces:
+        - application/json
+        - application/xml
+      parameters:
+        - in: body
+          name: testResults
+          required: false
+          schema:
+            $ref: '#/definitions/test-results'
+      responses:
+        '200':
+          description: No response was specified
+          schema:
+            $ref: '#/definitions/test-results'
+      description: Test results
+      operationId: post-test-results
+    put:
+      consumes:
+        - application/json
+        - application/xml
+      produces:
+        - application/json
+        - application/xml
+      parameters:
+        - in: body
+          name: testResults
+          required: false
+          schema:
+            $ref: '#/definitions/test-results'
+      responses:
+        '200':
+          description: No response was specified
+          schema:
+            $ref: '#/definitions/test-results'
+      description: Test results
+      operationId: put-test-results
+
+  '/restconf/config/SLI-API:test-results/test-result/{test-identifier}':
+    delete:
+      produces:
+        - application/json
+        - application/xml
+      parameters:
+        - in: path
+          name: test-identifier
+          required: true
+          type: string
+      responses:
+        '200':
+          description: No response was specified
+      operationId: delete-test-result
+    get:
+      produces:
+        - application/json
+        - application/xml
+      parameters:
+        - in: path
+          name: test-identifier
+          required: true
+          type: string
+      responses:
+        '200':
+          description: No response was specified
+          schema:
+            $ref: '#/definitions/test-result'
+      operationId: get-test-result
+    put:
+      consumes:
+        - application/json
+        - application/xml
+      produces:
+        - application/json
+        - application/xml
+      parameters:
+        - in: path
+          name: test-identifier
+          required: true
+          type: string
+        - in: body
+          name: testResult
+          required: false
+          schema:
+            $ref: '#/definitions/test-result'
+      responses:
+        '200':
+          description: No response was specified
+          schema:
+            $ref: '#/definitions/test-result'
+      operationId: PUT-test-result
+
+  '/restconf/operational/SLI-API:test-results':
+    get:
+      produces:
+        - application/json
+        - application/xml
+      responses:
+        '200':
+          description: No response was specified
+          schema:
+            $ref: '#/definitions/test-results'
+      description: Test results
+      operationId: GET-test-results
+  '/restconf/operations/SLI-API:execute-graph':
+    post:
+      consumes:
+        - application/json
+        - application/xml
+      produces:
+        - application/json
+        - application/xml
+      parameters:
+        - in: body
+          name: executeGraphInput
+          required: false
+          schema:
+            $ref: '#/definitions/execute-graph-input'
+      responses:
+        '200':
+          description: No response was specified
+          schema:
+            $ref: '#/definitions/response-fields'
+      description: ' Method to add a new parameter.'
+      operationId: execute-graph
+  '/restconf/operations/SLI-API:healthcheck':
+    post:
+      consumes:
+        - application/json
+        - application/xml
+      produces:
+        - application/json
+        - application/xml
+#      parameters:
+#        - in: body
+#          name: healthcheckInput
+#          required: false
+#          schema:
+#            $ref: '#/definitions/healthcheck-input'
+      responses:
+        '200':
+          description: No response was specified
+          schema:
+            $ref: '#/definitions/response-fields'
+      operationId: healthcheck
+  '/restconf/operations/SLI-API:vlbcheck':
+    post:
+      consumes:
+        - application/json
+        - application/xml
+      produces:
+        - application/json
+        - application/xml
+      parameters:
+        - in: body
+          name: vlbcheckInput
+          required: false
+          schema:
+            $ref: '#/definitions/vlbcheck-input'
+      responses:
+        '200':
+          description: No response was specified
+          schema:
+            $ref: '#/definitions/response-fields'
+      operationId: vlbcheck
+
+definitions:
+  parameter-setting:
+    type: object
+    properties:
+      parameter-name:
+        type: string
+      int-value:
+        type: integer
+      string-value:
+        type: string
+      boolean-value:
+        type: boolean
+
+  response-fields:
+    type: object
+    properties:
+      response-code:
+        type: string
+      ack-final-indicator:
+        type: string
+      response-message:
+        type: string
+      context-memory-json:
+        type: string
+
+  test-results:
+    type: object
+    properties:
+      test-results:
+        type: array
+        items:
+          $ref: '#/definitions/test-result'
+
+  test-result:
+    type: object
+    properties:
+      test-identifier:
+        type: string
+      results:
+        type: array
+        items:
+          type: string
+
+  execute-graph-input:
+    properties:
+      'mode':
+        type: string
+      'module-name':
+        type: string
+      'rpc-name':
+        type: string
+      'sli-parameter':
+        items:
+          $ref: '#/definitions/parameter-setting'
+        type: array
+    type: object
+
+  healthcheck-input:
+    properties:
+      'dummy':
+        type: string
+
+
+  vlbcheck-input:
+    properties:
+      'dummy':
+        type: string
+
+
+
+  unique_empty_identifier: {}
+
index 1d568a4..c8bc164 100755 (executable)
@@ -19,6 +19,7 @@
        <modules>
                <module>model</module>
                <module>provider</module>
+               <module>springboot</module>
                <module>installer</module>
        </modules>
 
diff --git a/sliapi/springboot/.swagger-codegen-ignore b/sliapi/springboot/.swagger-codegen-ignore
new file mode 100644 (file)
index 0000000..d14d7b9
--- /dev/null
@@ -0,0 +1 @@
+**/RestconfApiController.java
diff --git a/sliapi/springboot/README.md b/sliapi/springboot/README.md
new file mode 100644 (file)
index 0000000..5737072
--- /dev/null
@@ -0,0 +1,10 @@
+This directory contains a demo springboot implementation of the SLI-API healthcheck method.
+
+To start this server, run:
+
+java -jar -DserviceLogicDirectory=src/main/resources target/sliapi-springboot-{version}.jar
+
+This will start a servlet on port 8080.  To test to that servlet, post a blank
+message to that port:
+
+curl http://127.0.0.1:8080/SLI-API:healthcheck -X POST -H "Content-Type: application/json"
\ No newline at end of file
diff --git a/sliapi/springboot/pom.xml b/sliapi/springboot/pom.xml
new file mode 100644 (file)
index 0000000..be6bb62
--- /dev/null
@@ -0,0 +1,100 @@
+<?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.parent</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>1.5.2-SNAPSHOT</version>
+    </parent>
+
+    <groupId>org.onap.ccsdk.sli.core</groupId>
+    <artifactId>sliapi-springboot</artifactId>
+    <version>0.7.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>sliapi-springboot</name>
+
+    <dependencies>
+        <dependency>
+            <groupId>io.swagger</groupId>
+            <artifactId>swagger-annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>sli-provider</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.derby</groupId>
+            <artifactId>derby</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>io.swagger</groupId>
+                <artifactId>swagger-codegen-maven-plugin</artifactId>
+                <version>2.3.1</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                        <configuration>
+                            <inputSpec>${project.basedir}/../model/src/main/resources/sli-api.20161110.yaml</inputSpec>
+                            <language>spring</language>
+                            <apiPackage>org.onap.ccsdk.sli.core.sliapi.springboot</apiPackage>
+                            <modelPackage>org.onap.ccsdk.sli.core.sliapi.model</modelPackage>
+                            <invokerPackage>org.onap.ccsdk.sli.core.sliapi.springboot</invokerPackage>
+                            <generateApis>true</generateApis>
+                            <generateApiTests>true</generateApiTests>
+                            <ignoreFileOverride>${project.basedir}/.swagger-codegen-ignore</ignoreFileOverride>
+                            <withXml>true</withXml>
+                            <configOptions>
+                                <java8>true</java8>
+                                <springBootVersion>2.2.4-RELEASE</springBootVersion>
+                            </configOptions>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/ExecuteGraphController.java b/sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/ExecuteGraphController.java
new file mode 100644 (file)
index 0000000..6c02410
--- /dev/null
@@ -0,0 +1,110 @@
+package org.onap.ccsdk.sli.core.sliapi.springboot;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
+
+import com.google.gson.*;
+import org.onap.ccsdk.sli.core.sli.SvcLogicException;
+import org.onap.ccsdk.sli.core.sli.SvcLogicLoader;
+import org.onap.ccsdk.sli.core.sli.provider.SvcLogicClassResolver;
+import org.onap.ccsdk.sli.core.sli.provider.SvcLogicPropertiesProviderImpl;
+import org.onap.ccsdk.sli.core.sli.provider.SvcLogicService;
+import org.onap.ccsdk.sli.core.sli.provider.SvcLogicServiceImpl;
+import org.onap.ccsdk.sli.core.sli.provider.base.InMemorySvcLogicStore;
+import org.onap.ccsdk.sli.core.sli.provider.base.SvcLogicResolver;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+
+@Controller
+@EnableAutoConfiguration
+public class ExecuteGraphController {
+    static SvcLogicService svc;
+    private static final Logger LOGGER = LoggerFactory.getLogger(ExecuteGraphController.class);
+
+    @RequestMapping(value = "/executeGraph", method = RequestMethod.POST)
+    @ResponseBody
+    public HashMap<String, String> executeGraph(@RequestBody String input) {
+        LOGGER.error("In request");
+        LOGGER.error(input);
+
+        HashMap<String, String> hash = new HashMap<String, String>();
+        Properties parms = new Properties();
+
+        hash.put("status", "success");
+        JsonObject jsonInput = new Gson().fromJson(input, JsonObject.class);
+        JsonObject passthroughObj = jsonInput.get("input").getAsJsonObject();
+
+        writeResponseToCtx(passthroughObj.toString(), parms, "input");
+
+        JsonObject inputObject = jsonInput.get("graphDetails").getAsJsonObject();
+        try {
+            // Any of these can throw a nullpointer exception
+            String calledModule = inputObject.get("module").getAsString();
+            String calledRpc = inputObject.get("rpc").getAsString();
+            String modeStr = inputObject.get("mode").getAsString();
+            // execute should only throw a SvcLogicException
+            Properties respProps = svc.execute(calledModule, calledRpc, null, modeStr, parms);
+            for (Entry<Object, Object> prop : respProps.entrySet()) {
+                hash.put((String) prop.getKey(), (String) prop.getValue());
+            }
+        } catch (NullPointerException npe) {
+            HashMap<String, String> errorHash = new HashMap<String, String>();
+            errorHash.put("error-message", "check that you populated module, rpc and or mode correctly.");
+            return errorHash;
+        } catch (SvcLogicException e) {
+            HashMap<String, String> errorHash = new HashMap<String, String>();
+            errorHash.put("status", "failure");
+            errorHash.put("message", e.getMessage());
+            return errorHash;
+        }
+        return hash;
+    }
+
+    public static void writeResponseToCtx(String resp, Properties ctx, String prefix) {
+        JsonParser jp = new JsonParser();
+        JsonElement element = jp.parse(resp);
+        writeJsonObject(element.getAsJsonObject(), ctx, prefix + ".");
+    }
+
+    public static void writeJsonObject(JsonObject obj, Properties ctx, String root) {
+        for (Entry<String, JsonElement> entry : obj.entrySet()) {
+            if (entry.getValue().isJsonObject()) {
+                writeJsonObject(entry.getValue().getAsJsonObject(), ctx, root + entry.getKey() + ".");
+            } else if (entry.getValue().isJsonArray()) {
+                JsonArray array = entry.getValue().getAsJsonArray();
+                ctx.put(root + entry.getKey() + "_length", String.valueOf(array.size()));
+                Integer arrayIdx = 0;
+                for (JsonElement element : array) {
+                    if (element.isJsonObject()) {
+                        writeJsonObject(element.getAsJsonObject(), ctx, root + entry.getKey() + "[" + arrayIdx + "].");
+                    }
+                    arrayIdx++;
+                }
+            } else {
+                ctx.put(root + entry.getKey(), entry.getValue().getAsString());
+            }
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        InMemorySvcLogicStore store = new InMemorySvcLogicStore();
+        SvcLogicLoader loader = new SvcLogicLoader(System.getProperty("serviceLogicDirectory"), store);
+
+        loader.loadAndActivate();
+        SvcLogicResolver resolver = new SvcLogicClassResolver();
+
+
+        svc = new SvcLogicServiceImpl(new SvcLogicPropertiesProviderImpl(), resolver);
+        SpringApplication.run(ExecuteGraphController.class, args);
+    }
+}
diff --git a/sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/RestconfApiController.java b/sliapi/springboot/src/main/java/org/onap/ccsdk/sli/core/sliapi/springboot/RestconfApiController.java
new file mode 100644 (file)
index 0000000..1c22da4
--- /dev/null
@@ -0,0 +1,126 @@
+package org.onap.ccsdk.sli.core.sliapi.springboot;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.*;
+import org.onap.ccsdk.sli.core.sli.*;
+import org.onap.ccsdk.sli.core.sli.provider.SvcLogicClassResolver;
+import org.onap.ccsdk.sli.core.sli.provider.SvcLogicPropertiesProviderImpl;
+import org.onap.ccsdk.sli.core.sli.provider.SvcLogicService;
+import org.onap.ccsdk.sli.core.sli.provider.SvcLogicServiceImpl;
+import org.onap.ccsdk.sli.core.sli.provider.base.InMemorySvcLogicStore;
+import org.onap.ccsdk.sli.core.sli.provider.base.SvcLogicPropertiesProvider;
+import org.onap.ccsdk.sli.core.sli.provider.base.SvcLogicResolver;
+import org.onap.ccsdk.sli.core.sliapi.model.ExecuteGraphInput;
+import org.onap.ccsdk.sli.core.sliapi.model.HealthcheckInput;
+import org.onap.ccsdk.sli.core.sliapi.model.ResponseFields;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Controller;
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Properties;
+
+@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-02-20T12:50:11.207-05:00")
+
+@Controller
+public class RestconfApiController implements RestconfApi {
+
+    private final ObjectMapper objectMapper;
+
+    private final HttpServletRequest request;
+
+    private static SvcLogicService svc;
+    Logger log = LoggerFactory.getLogger(RestconfApiController.class);
+
+    @org.springframework.beans.factory.annotation.Autowired
+    public RestconfApiController(ObjectMapper objectMapper, HttpServletRequest request) {
+        this.objectMapper = objectMapper;
+        this.request = request;
+
+        SvcLogicPropertiesProvider propProvider = new SvcLogicPropertiesProviderImpl();
+        SvcLogicStore store = null;
+        try {
+            store = SvcLogicStoreFactory.getSvcLogicStore(propProvider.getProperties());
+        } catch (SvcLogicException e) {
+            log.error("Cannot create SvcLogicStore", e);
+            return;
+        }
+
+        String serviceLogicDirectory = System.getProperty("serviceLogicDirectory");
+        System.out.println("serviceLogicDirectory is "+serviceLogicDirectory);
+        SvcLogicLoader loader = new SvcLogicLoader(serviceLogicDirectory, store);
+
+        try {
+            loader.loadAndActivate();
+        } catch (IOException e) {
+            log.error("Cannot load directed graphs", e);
+        }
+        SvcLogicResolver resolver = new SvcLogicClassResolver();
+
+
+        try {
+            svc = new SvcLogicServiceImpl(new SvcLogicPropertiesProviderImpl(), resolver);
+        } catch (SvcLogicException e) {
+            log.error("Cannot execute directed graph", e);
+        }
+    }
+
+    @Override
+    public ResponseEntity<ResponseFields> healthcheck() {
+        SvcLogicContext ctx = new SvcLogicContext();
+        ResponseFields resp = new ResponseFields();
+
+
+        try {
+
+            log.info("Calling SLI-API:healthcheck DG");
+            Properties inputProps = new Properties();
+            Properties respProps = svc.execute("sli", "healthcheck" , null, "sync", inputProps);
+            if (respProps == null) {
+                log.info("DG execution returned no properties!");
+            } else {
+                log.info("DG execution returned properties");
+                for (String key: respProps.stringPropertyNames()) {
+                    log.info("DG returned property "+key+" = "+respProps.getProperty(key));
+                }
+            }
+            resp.setAckFinalIndicator(respProps.getProperty("ack-final-indicator", "Y"));
+            resp.setResponseCode(respProps.getProperty("error-code", "200"));
+            resp.setResponseMessage(respProps.getProperty("error-message", "Success"));
+
+            return(new ResponseEntity<>(resp, HttpStatus.OK));
+        }
+        catch (Exception e) {
+            resp.setAckFinalIndicator("true");
+            resp.setResponseCode("500");
+            resp.setResponseMessage(e.getMessage());
+            log.error("Error calling healthcheck directed graph", e);
+
+        }
+
+        return(new ResponseEntity<>(resp, HttpStatus.INTERNAL_SERVER_ERROR));
+
+    }
+
+    @Override
+    public Optional<ObjectMapper> getObjectMapper() {
+        return Optional.ofNullable(objectMapper);
+    }
+
+    @Override
+    public Optional<HttpServletRequest> getRequest() {
+        return Optional.ofNullable(request);
+    }
+
+
+
+
+
+}
diff --git a/sliapi/springboot/src/main/resources/application.properties b/sliapi/springboot/src/main/resources/application.properties
new file mode 100644 (file)
index 0000000..6218d11
--- /dev/null
@@ -0,0 +1,8 @@
+springfox.documentation.swagger.v2.path=/api-docs
+server.contextPath=/restconf
+server.port=8080
+spring.jackson.date-format=org.onap.ccsdk.sli.core.sliapi.springboot.RFC3339DateFormat
+spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
+spring.datasource.url=jdbc:derby:sdnctl;create=true
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.DerbyTenSevenDialect
+spring.jpa.hibernate.ddl-auto=update
\ No newline at end of file
diff --git a/sliapi/springboot/src/main/resources/graph.versions b/sliapi/springboot/src/main/resources/graph.versions
new file mode 100644 (file)
index 0000000..9c53eb2
--- /dev/null
@@ -0,0 +1 @@
+sli healthcheck 0.7.0 sync
diff --git a/sliapi/springboot/src/main/resources/sli_healthcheck.xml b/sliapi/springboot/src/main/resources/sli_healthcheck.xml
new file mode 100644 (file)
index 0000000..bc8e2f7
--- /dev/null
@@ -0,0 +1,27 @@
+<!--
+  ============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=========================================================
+  -->
+
+<service-logic xmlns="http://www.onap.org/sdnc/svclogic"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.onap.org/sdnc/svclogic ./svclogic.xsd" module='sli' version='0.7.0'><method rpc='healthcheck' mode='sync'>
+<set>
+<parameter name='error-code' value='200' />
+<parameter name='error-message' value='SDN-C is healthy'/>
+<parameter name='ack-final' value='Y'/>
+</set></method></service-logic>
@@ -8,9 +8,9 @@
 # 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.
@@ -20,7 +20,8 @@
 ###
 
 org.onap.ccsdk.sli.dbtype = jdbc
-org.onap.ccsdk.sli.jdbc.url = jdbc:mysql://dbhost:3306/sdnctl
+org.onap.ccsdk.sli.jdbc.url=jdbc:derby:memory:sdnctl;create=true
+org.onap.ccsdk.sli.jdbc.driver=org.apache.derby.jdbc.EmbeddedDriver
 org.onap.ccsdk.sli.jdbc.database = sdnctl
-org.onap.ccsdk.sli.jdbc.user = sdnctl
-org.onap.ccsdk.sli.jdbc.password = gamma
+org.onap.ccsdk.sli.jdbc.user = test
+org.onap.ccsdk.sli.jdbc.password = test
index cc164d0..9ae094f 100755 (executable)
@@ -55,7 +55,14 @@ public class JREFileResolver implements PropertiesFileResolver {
     @Override
     public Optional<File> resolveFile(final String filename) {
 
-        final Bundle bundle = FrameworkUtil.getBundle(this.clazz);
+        final Bundle bundle;
+
+        try {
+            bundle = FrameworkUtil.getBundle(this.clazz);
+        } catch (NoClassDefFoundError e) {
+            return Optional.empty();
+        }
+
         final File dataFile;
 
 
@@ -82,9 +89,13 @@ public class JREFileResolver implements PropertiesFileResolver {
             }
 
             return Optional.of(dataFile);
-        } catch(final Exception e) {
+        } catch (NoClassDefFoundError e) {
+            return Optional.empty();
+        }
+        catch(final Exception e) {
             return Optional.empty();
         }
+
     }
 
     @Override