Uplift from master 07/5507/5
authorPatrikBuhr <patrik.buhr@est.tech>
Tue, 26 Jan 2021 12:11:48 +0000 (13:11 +0100)
committerPatrikBuhr <patrik.buhr@est.tech>
Tue, 26 Jan 2021 14:26:39 +0000 (15:26 +0100)
Needed du to EIS API changes

Signed-off-by: PatrikBuhr <patrik.buhr@est.tech>
Issue-ID: NONRTRIC-385
Change-Id: I694eebfe5a59d46923ffea860880acfe5dc81165

14 files changed:
.releases/docker-release-portal-nonrtric-controlpanel.yaml
docs/release-notes.rst
pom.xml
webapp-backend/pom.xml
webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/EnrichmentController.java
webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/eiproducerapi/EiProducerApi.java
webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/eiproducerapi/EiProducerApiImpl.java
webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/ProducerRegistrationInfo.java [new file with mode: 0644]
webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/ProducerStatusInfo.java [new file with mode: 0644]
webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/util/JsonArrayHandler.java [new file with mode: 0644]
webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/RestApiTest.java
webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/eiproducerapi/EiProducerApiImplTest.java
webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/mock/EnrichmentControllerMockConfiguration.java
webapp-frontend/pom.xml

index 39ec485..3fb32b4 100644 (file)
@@ -7,4 +7,4 @@ project: portal
 ref: 9d99a37374c9266f3d11ff0a19c2d068571159ba
 containers:
     - name: nonrtric-controlpanel
-      version: 2.1.0
+      version: 2.1.1
index 7e1c490..79b4876 100644 (file)
@@ -30,6 +30,9 @@ Version history
 | 2020-12-03 | 2.1.0    | Henrik Andersson | Cherry Release |
 |            |          |                  |                |
 +------------+----------+------------------+----------------+
+| 2021-01-26 | 2.1.1    | Patrik Buhr      | Cherry Release |
+|            |          |                  | maintenance    |
++------------+----------+------------------+----------------+
 
 Release Data
 ============
@@ -72,4 +75,23 @@ Cherry
 |                             |                                                                |
 +-----------------------------+----------------------------------------------------------------+
 
+Cherry
+------
++-----------------------------+----------------------------------------------------------------+
+| **Project**                 | Non-RT RIC Control Panel                                       |
+|                             |                                                                |
++-----------------------------+----------------------------------------------------------------+
+| **Repo/commit-ID**          | nonrtric-controlpanel/e79f1251a9bd970816de91c8272025d6264154bd |
+|                             |                                                                |
++-----------------------------+----------------------------------------------------------------+
+| **Release designation**     | Cherry                                                         |
+|                             |                                                                |
++-----------------------------+----------------------------------------------------------------+
+| **Release date**            | 2021-01-26                                                     |
+|                             |                                                                |
++-----------------------------+----------------------------------------------------------------+
+| **Purpose of the delivery** | Updated API to the Enrichment Controller Service               |
+|                             |                                                                |
++-----------------------------+----------------------------------------------------------------+
+
 Fully supported in Firefox and Chrome. Minor issues in Safari. Not supported in Microsoft Edge and IE.
diff --git a/pom.xml b/pom.xml
index 520f46f..f19f20d 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -22,64 +22,65 @@ limitations under the License.
 <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>
-               <!-- this group Id must match LF gerrit repository -->
-               <groupId>org.springframework.boot</groupId>
-               <artifactId>spring-boot-starter-parent</artifactId>
-                <version>2.3.4.RELEASE</version>
-               <relativePath /> <!-- lookup parent from repository -->
-       </parent>
-       <groupId>org.o-ran-sc.portal.nonrtric.controlpanel</groupId>
-       <artifactId>nonrtric-controlpanel-parent</artifactId>
-       <name>Non-RT RIC Control Panel project</name>
-       <packaging>pom</packaging>
-       <version>2.1.0-SNAPSHOT</version>
-       <properties>
-               <java.version>11</java.version>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <!-- this group Id must match LF gerrit repository -->
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.3.4.RELEASE</version>
+        <relativePath />
+        <!-- lookup parent from repository -->
+    </parent>
+    <groupId>org.o-ran-sc.portal.nonrtric.controlpanel</groupId>
+    <artifactId>nonrtric-controlpanel-parent</artifactId>
+    <name>Non-RT RIC Control Panel project</name>
+    <packaging>pom</packaging>
+    <version>2.1.1-SNAPSHOT</version>
+    <properties>
+        <java.version>11</java.version>
         <sonar-maven-plugin.version>3.7.0.1746</sonar-maven-plugin.version>
-       </properties>
-       <modules>
-               <module>webapp-frontend</module>
-               <module>webapp-backend</module>
-       </modules>
-       <build>
-               <plugins>
-                       <plugin>
-                               <groupId>org.apache.maven.plugins</groupId>
-                               <artifactId>maven-compiler-plugin</artifactId>
-                               <configuration>
-                                       <source>${java.version}</source>
-                                       <target>${java.version}</target>
-                               </configuration>
-                       </plugin>
-                       <!-- Always generate a source jar -->
-                       <plugin>
-                               <groupId>org.apache.maven.plugins</groupId>
-                               <artifactId>maven-source-plugin</artifactId>
-                               <executions>
-                                       <execution>
-                                               <id>attach-sources</id>
-                                               <goals>
-                                                       <goal>jar</goal>
-                                               </goals>
-                                       </execution>
-                               </executions>
-                       </plugin>
-                       <!-- Always skip the deploy-jar-to-nexus step -->
-                       <plugin>
-                               <groupId>org.apache.maven.plugins</groupId>
-                               <artifactId>maven-deploy-plugin</artifactId>
-                               <configuration>
-                                       <skip>true</skip>
-                               </configuration>
-                       </plugin>
-                       <!-- support sonar in multi-module project -->
-                       <plugin>
-                               <groupId>org.sonarsource.scanner.maven</groupId>
-                               <artifactId>sonar-maven-plugin</artifactId>
-                               <version>${sonar-maven-plugin.version}</version>
-                       </plugin>
-               </plugins>
-       </build>
-</project>
+    </properties>
+    <modules>
+        <module>webapp-frontend</module>
+        <module>webapp-backend</module>
+    </modules>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                </configuration>
+            </plugin>
+            <!-- Always generate a source jar -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <goals>
+                            <goal>jar</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <!-- Always skip the deploy-jar-to-nexus step -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-deploy-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+            <!-- support sonar in multi-module project -->
+            <plugin>
+                <groupId>org.sonarsource.scanner.maven</groupId>
+                <artifactId>sonar-maven-plugin</artifactId>
+                <version>${sonar-maven-plugin.version}</version>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file
index e8c65e4..6541331 100644 (file)
@@ -27,7 +27,7 @@ limitations under the License.
     <parent>
         <groupId>org.o-ran-sc.portal.nonrtric.controlpanel</groupId>
         <artifactId>nonrtric-controlpanel-parent</artifactId>
-        <version>2.1.0-SNAPSHOT</version>
+        <version>2.1.1-SNAPSHOT</version>
     </parent>
     <artifactId>nonrtric-controlpanel-be</artifactId>
     <name>Non-RT RIC Control Panel Webapp backend</name>
@@ -153,23 +153,23 @@ limitations under the License.
     </dependencies>
     <build>
         <plugins>
-        <plugin>
-             <groupId>org.codehaus.mojo</groupId>
-             <artifactId>build-helper-maven-plugin</artifactId>
-             <executions>
-              <execution>
-               <id>add-source</id>
-               <phase>generate-sources</phase>
-               <goals>
-                <goal>add-source</goal>
-               </goals>
-               <configuration>
-                <sources>
-                 <source>${project.build.directory}/generated-sources/annotations/</source>
-                </sources>
-               </configuration>
-              </execution>
-             </executions>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>add-source</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>add-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>${project.build.directory}/generated-sources/annotations/</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
             </plugin>
             <plugin>
                 <groupId>org.springframework.boot</groupId>
@@ -325,4 +325,4 @@ limitations under the License.
             </plugin>
         </plugins>
     </build>
-</project>
+</project>
\ No newline at end of file
index 57019ce..5e72dee 100644 (file)
@@ -34,6 +34,8 @@ import org.oransc.portal.nonrtric.controlpanel.ControlPanelConstants;
 import org.oransc.portal.nonrtric.controlpanel.eiproducerapi.EiProducerApi;
 import org.oransc.portal.nonrtric.controlpanel.model.JobInfo;
 import org.oransc.portal.nonrtric.controlpanel.model.ProducerInfo;
+import org.oransc.portal.nonrtric.controlpanel.model.ProducerRegistrationInfo;
+import org.oransc.portal.nonrtric.controlpanel.model.ProducerStatusInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -59,8 +61,6 @@ public class EnrichmentController {
 
     private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
-    private static com.google.gson.Gson gson = new GsonBuilder().create();
-
     // Publish paths in constants so tests are easy to write
     public static final String CONTROLLER_PATH = ControlPanelConstants.ENDPOINT_PREFIX + "/enrichment";
     // Endpoints
@@ -73,6 +73,7 @@ public class EnrichmentController {
 
     // Populated by the autowired constructor
     private final EiProducerApi eiProducerApi;
+    public static com.google.gson.Gson gson = new GsonBuilder().create();
 
     @Autowired
     public EnrichmentController(final EiProducerApi eiProducerApi) {
@@ -83,7 +84,7 @@ public class EnrichmentController {
 
     @ApiOperation(value = "Get the EI job definitions for one EI producer")
     @GetMapping(EI_JOBS)
-    public ResponseEntity<List<JobInfo>> getEiJobs() {
+    public ResponseEntity<String> getEiJobs() {
         logger.debug("getEiJobs");
         ResponseEntity<String> response = this.eiProducerApi.getAllEiProducerIds();
         JsonArray bodyJson = JsonParser.parseString(response.getBody()).getAsJsonArray();
@@ -91,23 +92,18 @@ public class EnrichmentController {
         for (JsonElement producerId : bodyJson) {
             allJobs.addAll(getJobs(producerId));
         }
-        return new ResponseEntity<>(allJobs, HttpStatus.OK);
+        return new ResponseEntity<>(gson.toJson(allJobs), HttpStatus.OK);
     }
 
     private List<JobInfo> getJobs(JsonElement producerId) {
-        List<JobInfo> jobs = new ArrayList<>();
-        ResponseEntity<String> jobsResponse = this.eiProducerApi.getEiJobsForOneEiProducer(producerId.getAsString());
-        JsonArray jobsJson = JsonParser.parseString(jobsResponse.getBody()).getAsJsonArray();
-        for (JsonElement jobJson : jobsJson) {
-            JobInfo jobInfo = gson.fromJson(jobJson, JobInfo.class);
-            jobs.add(jobInfo);
-        }
-        return jobs;
+        ResponseEntity<List<JobInfo>> jobsResponse =
+            this.eiProducerApi.getEiJobsForOneEiProducer(producerId.getAsString());
+        return jobsResponse.getBody();
     }
 
     @ApiOperation(value = "Get EI producers")
     @GetMapping(EI_PRODUCERS)
-    public ResponseEntity<List<ProducerInfo>> getEiProducers() {
+    public ResponseEntity<String> getEiProducers() {
         logger.debug("getEiProducers");
         ResponseEntity<String> response = this.eiProducerApi.getAllEiProducerIds();
         JsonArray bodyJson = JsonParser.parseString(response.getBody()).getAsJsonArray();
@@ -121,23 +117,22 @@ public class EnrichmentController {
             producers.add(producerInfo);
         }
 
-        return new ResponseEntity<>(producers, HttpStatus.OK);
+        return new ResponseEntity<>(gson.toJson(producers), HttpStatus.OK);
     }
 
     private String[] getSupportedTypes(JsonElement producerId) {
-        ResponseEntity<String> producerResponse = this.eiProducerApi.getEiProducer(producerId.getAsString());
-        JsonArray supportedTypesJson = JsonParser.parseString(producerResponse.getBody()).getAsJsonObject()
-            .get("supported_ei_types").getAsJsonArray();
+        ResponseEntity<ProducerRegistrationInfo> producerResponse =
+            this.eiProducerApi.getEiProducer(producerId.getAsString());
         List<String> supportedTypes = new ArrayList<>();
-        for (JsonElement typeJson : supportedTypesJson) {
-            supportedTypes.add(typeJson.getAsJsonObject().get("ei_type_identity").getAsString());
+        for (String type : producerResponse.getBody().supportedTypeIds) {
+            supportedTypes.add(type);
         }
         return supportedTypes.toArray(new String[0]);
     }
 
     private String getProducerStatus(JsonElement producerId) {
-        ResponseEntity<String> statusResponse = this.eiProducerApi.getEiProducerStatus(producerId.getAsString());
-        return JsonParser.parseString(statusResponse.getBody()).getAsJsonObject().get("operational_state")
-            .getAsString();
+        ResponseEntity<ProducerStatusInfo> statusResponse =
+            this.eiProducerApi.getEiProducerStatus(producerId.getAsString());
+        return statusResponse.getBody().opState.toString();
     }
 }
index 943b9f9..60a3300 100644 (file)
  */
 package org.oransc.portal.nonrtric.controlpanel.eiproducerapi;
 
+import java.util.List;
+
+import org.oransc.portal.nonrtric.controlpanel.model.JobInfo;
+import org.oransc.portal.nonrtric.controlpanel.model.ProducerRegistrationInfo;
+import org.oransc.portal.nonrtric.controlpanel.model.ProducerStatusInfo;
 import org.springframework.http.ResponseEntity;
 
 public interface EiProducerApi {
 
     public ResponseEntity<String> getAllEiProducerIds();
 
-    public ResponseEntity<String> getEiProducer(String eiProducerId);
+    public ResponseEntity<ProducerRegistrationInfo> getEiProducer(String eiProducerId);
 
-    public ResponseEntity<String> getEiJobsForOneEiProducer(String eiProducerId);
+    public ResponseEntity<List<JobInfo>> getEiJobsForOneEiProducer(String eiProducerId);
 
-    public ResponseEntity<String> getEiProducerStatus(String eiProducerId);
+    public ResponseEntity<ProducerStatusInfo> getEiProducerStatus(String eiProducerId);
 
 }
index 51be42a..921d586 100644 (file)
  */
 package org.oransc.portal.nonrtric.controlpanel.eiproducerapi;
 
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonSyntaxException;
+
 import java.lang.invoke.MethodHandles;
+import java.util.List;
 
 import org.json.JSONArray;
 import org.json.JSONObject;
+import org.oransc.portal.nonrtric.controlpanel.model.JobInfo;
+import org.oransc.portal.nonrtric.controlpanel.model.ProducerRegistrationInfo;
+import org.oransc.portal.nonrtric.controlpanel.model.ProducerStatusInfo;
 import org.oransc.portal.nonrtric.controlpanel.util.AsyncRestClient;
 import org.oransc.portal.nonrtric.controlpanel.util.ErrorResponseHandler;
+import org.oransc.portal.nonrtric.controlpanel.util.JsonArrayHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -40,6 +48,7 @@ public class EiProducerApiImpl implements EiProducerApi {
     private static final String STATUS = "/status";
 
     private final AsyncRestClient webClient;
+    private static com.google.gson.Gson gson = new GsonBuilder().create();
 
     @Autowired
     public EiProducerApiImpl(
@@ -58,18 +67,25 @@ public class EiProducerApiImpl implements EiProducerApi {
     }
 
     @Override
-    public ResponseEntity<String> getEiProducer(String eiProducerId) {
-        return getResponseObject(EI_PRODUCERS + "/" + eiProducerId);
+    public ResponseEntity<ProducerRegistrationInfo> getEiProducer(String eiProducerId) throws JsonSyntaxException {
+        ResponseEntity<String> resp = getResponseObject(EI_PRODUCERS + "/" + eiProducerId);
+        ProducerRegistrationInfo info = gson.fromJson(resp.getBody(), ProducerRegistrationInfo.class);
+        return new ResponseEntity<>(info, resp.getStatusCode());
     }
 
     @Override
-    public ResponseEntity<String> getEiJobsForOneEiProducer(String eiProducerId) {
-        return getResponseArray(EI_PRODUCERS + "/" + eiProducerId + EI_JOBS);
+    public ResponseEntity<List<JobInfo>> getEiJobsForOneEiProducer(String eiProducerId)
+        throws JsonSyntaxException, IllegalStateException {
+        ResponseEntity<String> resp = getResponseArray(EI_PRODUCERS + "/" + eiProducerId + EI_JOBS);
+        List<JobInfo> jobs = JsonArrayHandler.parseJsonArray(resp.getBody(), JobInfo.class);
+        return new ResponseEntity<>(jobs, resp.getStatusCode());
     }
 
     @Override
-    public ResponseEntity<String> getEiProducerStatus(String eiProducerId) {
-        return getResponseObject(EI_PRODUCERS + "/" + eiProducerId + STATUS);
+    public ResponseEntity<ProducerStatusInfo> getEiProducerStatus(String eiProducerId) throws JsonSyntaxException {
+        ResponseEntity<String> resp = getResponseObject(EI_PRODUCERS + "/" + eiProducerId + STATUS);
+        ProducerStatusInfo status = gson.fromJson(resp.getBody(), ProducerStatusInfo.class);
+        return new ResponseEntity<>(status, resp.getStatusCode());
     }
 
     private ResponseEntity<String> getResponseArray(String url) {
diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/ProducerRegistrationInfo.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/ProducerRegistrationInfo.java
new file mode 100644 (file)
index 0000000..c6038b5
--- /dev/null
@@ -0,0 +1,64 @@
+/*-
+ * ========================LICENSE_START=================================
+ * O-RAN-SC
+ * %%
+ * Copyright (C) 2020 Nordix Foundation
+ * %%
+ * 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.oransc.portal.nonrtric.controlpanel.model;
+
+import com.google.gson.annotations.SerializedName;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Collection;
+
+import lombok.Builder;
+
+import org.immutables.gson.Gson;
+
+@Gson.TypeAdapters
+@ApiModel(value = "producer_registration_info", description = "Information for an EI producer")
+@Builder
+public class ProducerRegistrationInfo {
+
+    @Gson.TypeAdapters
+    @ApiModel(value = "producer_ei_type_registration_info", description = "Information for an EI type")
+    @Builder
+    public static class ProducerEiTypeRegistrationInfo {
+
+        @ApiModelProperty(value = "EI type identity", required = true)
+        @SerializedName("ei_type_identity")
+        public String eiTypeId;
+
+        @ApiModelProperty(value = "Json schema for the job data")
+        @SerializedName("ei_job_data_schema")
+        public Object jobDataSchema;
+    }
+
+    @ApiModelProperty(value = "Supported EI type IDs", required = true)
+    @SerializedName("supported_ei_types")
+    public Collection<String> supportedTypeIds;
+
+    @ApiModelProperty(value = "callback for EI job", required = true)
+    @SerializedName("ei_job_callback_url")
+    public String jobCallbackUrl;
+
+    @ApiModelProperty(value = "callback for producer supervision", required = true)
+    @SerializedName("ei_producer_supervision_callback_url")
+    public String producerSupervisionCallbackUrl;
+}
diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/ProducerStatusInfo.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/ProducerStatusInfo.java
new file mode 100644 (file)
index 0000000..53daebb
--- /dev/null
@@ -0,0 +1,45 @@
+/*-
+ * ========================LICENSE_START=================================
+ * O-RAN-SC
+ * %%
+ * Copyright (C) 2019 Nordix Foundation
+ * %%
+ * 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.oransc.portal.nonrtric.controlpanel.model;
+
+import com.google.gson.annotations.SerializedName;
+
+import lombok.Builder;
+
+import org.immutables.gson.Gson;
+
+@Gson.TypeAdapters
+@Builder
+public class ProducerStatusInfo {
+
+    @Gson.TypeAdapters
+    public enum OperationalState {
+        ENABLED, DISABLED
+    }
+
+    @SerializedName("operational_state")
+    public final OperationalState opState;
+
+    public ProducerStatusInfo(OperationalState state) {
+        this.opState = state;
+    }
+
+}
diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/util/JsonArrayHandler.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/util/JsonArrayHandler.java
new file mode 100644 (file)
index 0000000..7af2429
--- /dev/null
@@ -0,0 +1,24 @@
+package org.oransc.portal.nonrtric.controlpanel.util;
+
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class JsonArrayHandler {
+
+    public static com.google.gson.Gson gson = new GsonBuilder().create();
+
+    public static <T> List<T> parseJsonArray(String jsonString, Class<T> clazz) {
+        List<T> result = new ArrayList<>();
+        JsonArray jsonArr = JsonParser.parseString(jsonString).getAsJsonArray();
+        for (JsonElement jsonElement : jsonArr) {
+            T json = gson.fromJson(jsonElement.toString(), clazz);
+            result.add(json);
+        }
+        return result;
+    }
+}
index c4acad2..751b210 100644 (file)
@@ -39,8 +39,6 @@ import java.util.stream.Collectors;
 
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
-import org.oransc.portal.nonrtric.controlpanel.model.JobInfo;
-import org.oransc.portal.nonrtric.controlpanel.model.ProducerInfo;
 import org.oransc.portal.nonrtric.controlpanel.util.AsyncRestClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -86,15 +84,10 @@ class RestApiTest {
         assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK);
 
         JsonArray jobs = JsonParser.parseString(resp.getBody()).getAsJsonArray();
-        JobInfo wantedJobInfo = JobInfo.builder() //
-            .id("job1") //
-            .typeId("type1") //
-            .jobData(getStringFromFile("job-1.json")) //
-            .targetUri("http://example.com/") //
-            .owner("owner") //
-            .build();
-        assertThat(jobs).hasSize(1) //
-            .contains(gson.toJsonTree(wantedJobInfo));
+
+        assertThat(jobs).hasSize(6);
+        assertThat(resp.getBody()).contains("job2");
+        assertThat(resp.getBody()).contains("job1");
     }
 
     @Test
@@ -105,13 +98,7 @@ class RestApiTest {
 
         JsonArray producers = JsonParser.parseString(resp.getBody()).getAsJsonArray();
 
-        ProducerInfo wantedProducerInfo = ProducerInfo.builder() //
-            .id("prod-1") //
-            .types(new String[] {"type1", "type2"}) //
-            .status("ENABLED") //
-            .build();
-        assertThat(producers).hasSize(1) //
-            .contains(gson.toJsonTree(wantedProducerInfo));
+        assertThat(producers).hasSize(3);
     }
 
     private AsyncRestClient restClient() {
index a388d8b..298d92d 100644 (file)
  */
 package org.oransc.portal.nonrtric.controlpanel.eiproducerapi;
 
+import static org.junit.Assert.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import com.google.gson.GsonBuilder;
+import com.google.gson.JsonSyntaxException;
+
 import java.util.Arrays;
+import java.util.List;
 
 import org.junit.jupiter.api.Test;
+import org.oransc.portal.nonrtric.controlpanel.model.JobInfo;
+import org.oransc.portal.nonrtric.controlpanel.model.ProducerRegistrationInfo;
+import org.oransc.portal.nonrtric.controlpanel.model.ProducerStatusInfo;
 import org.oransc.portal.nonrtric.controlpanel.util.AsyncRestClient;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -38,10 +46,7 @@ class EiProducerApiImplTest {
     private static final String URL_EI_PRODUCERS = "/eiproducers";
     private static final String EI_PRODUCER_1 = "eiprod1";
     private static final String EI_PRODUCER_2 = "eiprod2";
-    private static final String EI_PRODUCER_1_INFO_VALID =
-        "{\"supported_ei_types\":[{\"ei_type_identity\":\"eitype1\",\"ei_job_data_schema\":{\"title\":\"eijob1\"}}]}";
-    private static final String EI_PRODUCER_1_INFO_INVALID =
-        "{\"supported_ei_types\":[{\"ei_type_identity\":\"eitype1\",\"ei_job_data_schema\":\"title\":\"eijob1\"}}]}";
+    private static final String EI_PRODUCER_1_INFO_VALID = "{\"supported_ei_types\":[]}";
     private static final String URL_STATUS = "/status";
     private static final String EI_PRODUCER_1_STATUS_VALID = "{\"operational_state\":\"ENABLED\"}";
     private static final String EI_PRODUCER_1_STATUS_INVALID = "\"operational_state\":\"ENABLED\"}";
@@ -53,6 +58,7 @@ class EiProducerApiImplTest {
 
     AsyncRestClient restClientMock = mock(AsyncRestClient.class);
     EiProducerApiImpl apiUnderTest = new EiProducerApiImpl(restClientMock);
+    private static com.google.gson.Gson gson = new GsonBuilder().create();
 
     private void whenGetReturnOK(String url, HttpStatus status, String body) {
         ResponseEntity<String> ret = new ResponseEntity<>(body, status);
@@ -86,27 +92,22 @@ class EiProducerApiImplTest {
     void testGetEiProducerValidJson() {
         whenGetReturnOK(URL_EI_PRODUCERS + "/" + EI_PRODUCER_1, HttpStatus.OK, EI_PRODUCER_1_INFO_VALID);
 
-        ResponseEntity<String> returnedResp = apiUnderTest.getEiProducer(EI_PRODUCER_1);
+        ResponseEntity<ProducerRegistrationInfo> returnedResp = apiUnderTest.getEiProducer(EI_PRODUCER_1);
 
         assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
-        assertEquals(EI_PRODUCER_1_INFO_VALID, returnedResp.getBody());
+        assertEquals(EI_PRODUCER_1_INFO_VALID, gson.toJson(returnedResp.getBody()));
     }
 
     @Test
-    void testGetEiProducerInvalidJson() {
-        whenGetReturnOK(URL_EI_PRODUCERS + "/" + EI_PRODUCER_1, HttpStatus.OK, EI_PRODUCER_1_INFO_INVALID);
-
-        ResponseEntity<String> returnedResp = apiUnderTest.getEiProducer(EI_PRODUCER_1);
-
-        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode());
-        assertTrue(returnedResp.getBody().contains("JSONException"));
-    }
-
-    @Test
-    void testGetEiJobsForOneEiProducerFailure() {
+    void whenGetEiJobsForOneEiProducerExceptionThrown_thenAssertionSucceeds() {
         whenGetReturnFailure(URL_EI_PRODUCERS + "/" + EI_PRODUCER_1 + URL_EI_JOBS, HttpStatus.NOT_FOUND, "");
-        ResponseEntity<String> returnedResp = apiUnderTest.getEiJobsForOneEiProducer(EI_PRODUCER_1);
-        assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode());
+        Exception exception = assertThrows(IllegalStateException.class, () -> {
+            apiUnderTest.getEiJobsForOneEiProducer(EI_PRODUCER_1);
+        });
+
+        String expectedMessage = "Not a JSON Array: null";
+        String actualMessage = exception.getMessage();
+        assertTrue(actualMessage.contains(expectedMessage));
     }
 
     @Test
@@ -115,9 +116,9 @@ class EiProducerApiImplTest {
 
         whenGetReturnOK(URL_EI_PRODUCERS + "/" + EI_PRODUCER_1 + URL_EI_JOBS, HttpStatus.OK, eiJobs);
 
-        ResponseEntity<String> returnedResp = apiUnderTest.getEiJobsForOneEiProducer(EI_PRODUCER_1);
-        assertTrue(returnedResp.getBody().contains("\"ei_job_identity\":\"eijob1\""));
-        assertTrue(returnedResp.getBody().contains("\"ei_job_identity\":\"eijob2\""));
+        ResponseEntity<List<JobInfo>> returnedResp = apiUnderTest.getEiJobsForOneEiProducer(EI_PRODUCER_1);
+        assertTrue(gson.toJson(returnedResp.getBody()).contains("\"ei_job_identity\":\"eijob1\""));
+        assertTrue(gson.toJson(returnedResp.getBody()).contains("\"ei_job_identity\":\"eijob2\""));
         assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
     }
 
@@ -125,20 +126,22 @@ class EiProducerApiImplTest {
     void testGetEiProducerStatusValidJson() {
         whenGetReturnOK(URL_EI_PRODUCERS + "/" + EI_PRODUCER_1 + URL_STATUS, HttpStatus.OK, EI_PRODUCER_1_STATUS_VALID);
 
-        ResponseEntity<String> returnedResp = apiUnderTest.getEiProducerStatus(EI_PRODUCER_1);
+        ResponseEntity<ProducerStatusInfo> returnedResp = apiUnderTest.getEiProducerStatus(EI_PRODUCER_1);
 
         assertEquals(HttpStatus.OK, returnedResp.getStatusCode());
-        assertEquals(EI_PRODUCER_1_STATUS_VALID, returnedResp.getBody());
+        assertEquals(EI_PRODUCER_1_STATUS_VALID, gson.toJson(returnedResp.getBody()));
     }
 
     @Test
-    void testGetEiProducerStatusInvalidJson() {
+    public void whenGetEiProducerStatusExceptionThrown_thenAssertionSucceeds() {
         whenGetReturnOK(URL_EI_PRODUCERS + "/" + EI_PRODUCER_1 + URL_STATUS, HttpStatus.OK,
             EI_PRODUCER_1_STATUS_INVALID);
+        Exception exception = assertThrows(JsonSyntaxException.class, () -> {
+            apiUnderTest.getEiProducerStatus(EI_PRODUCER_1);
+        });
 
-        ResponseEntity<String> returnedResp = apiUnderTest.getEiProducerStatus(EI_PRODUCER_1);
-
-        assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, returnedResp.getStatusCode());
-        assertTrue(returnedResp.getBody().contains("JSONException"));
+        String expectedMessage = "Expected BEGIN_OBJECT but was STRING";
+        String actualMessage = exception.getMessage();
+        assertTrue(actualMessage.contains(expectedMessage));
     }
 }
index c0fb4f1..decfab3 100644 (file)
@@ -37,6 +37,9 @@ import java.util.stream.Collectors;
 
 import org.oransc.portal.nonrtric.controlpanel.eiproducerapi.EiProducerApi;
 import org.oransc.portal.nonrtric.controlpanel.model.JobInfo;
+import org.oransc.portal.nonrtric.controlpanel.model.ProducerRegistrationInfo;
+import org.oransc.portal.nonrtric.controlpanel.model.ProducerRegistrationInfo.ProducerEiTypeRegistrationInfo;
+import org.oransc.portal.nonrtric.controlpanel.model.ProducerStatusInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.boot.test.context.TestConfiguration;
@@ -74,29 +77,29 @@ public class EnrichmentControllerMockConfiguration {
         }
 
         public ResponseEntity<String> getAllEiProducers() {
-            EiProducers result = new EiProducers();
+            List<ProducerRegistrationInfo> result = new ArrayList<>();
             result.addAll(database.getAllEiProducers());
             return new ResponseEntity<>(gson.toJson(result), HttpStatus.OK);
         }
 
         @Override
-        public ResponseEntity<String> getEiProducer(String eiProducerId) {
-            EiProducer result = database.getEiProducerInstance(eiProducerId);
-            return new ResponseEntity<>(gson.toJson(result), HttpStatus.OK);
+        public ResponseEntity<ProducerRegistrationInfo> getEiProducer(String eiProducerId) {
+            ProducerRegistrationInfo result = database.getEiProducerInstance(eiProducerId);
+            return new ResponseEntity<>(result, HttpStatus.OK);
         }
 
         @Override
-        public ResponseEntity<String> getEiJobsForOneEiProducer(String eiProducerId) {
-            EiJobs result = new EiJobs();
+        public ResponseEntity<List<JobInfo>> getEiJobsForOneEiProducer(String eiProducerId) {
+            List<JobInfo> result = new ArrayList<>();
 
             result.addAll(database.getAllEiJobs());
-            return new ResponseEntity<>(gson.toJson(result), HttpStatus.OK);
+            return new ResponseEntity<>(result, HttpStatus.OK);
         }
 
         @Override
-        public ResponseEntity<String> getEiProducerStatus(String eiProducerId) {
-            EiProducer result = database.getEiProducerInstance(eiProducerId);
-            return new ResponseEntity<>(gson.toJson(result.status()), HttpStatus.OK);
+        public ResponseEntity<ProducerStatusInfo> getEiProducerStatus(String eiProducerId) {
+            ProducerStatusInfo status = new ProducerStatusInfo(ProducerStatusInfo.OperationalState.ENABLED);
+            return new ResponseEntity<>(status, HttpStatus.OK);
         }
     }
 
@@ -104,25 +107,35 @@ public class EnrichmentControllerMockConfiguration {
 
         Database() {
 
-            List<EiType> supported_types = new ArrayList<EiType>();
+            List<ProducerEiTypeRegistrationInfo> supported_types = new ArrayList<ProducerEiTypeRegistrationInfo>();
 
-            // Create EiType instance
+            // Create ProducerEiTypeRegistrationInfo instance
             String schema = getStringFromFile("ei-type-1.json");
-            EiType eiType1 = getEiTypeInstance("type1", schema, Arrays.asList("prod-1"));
+            ProducerEiTypeRegistrationInfo eiType1 = getEiTypeInstance("type1", schema, Arrays.asList("prod-1"));
             supported_types.add(eiType1);
 
-            // Create EiType instance
+            // Create ProducerEiTypeRegistrationInfo instance
             schema = getStringFromFile("ei-type-2.json");
-            EiType eiType2 = getEiTypeInstance("type2", schema, Arrays.asList("prod-1"));
+            ProducerEiTypeRegistrationInfo eiType2 = getEiTypeInstance("type2", schema, Arrays.asList("prod-1"));
             supported_types.add(eiType2);
 
-            // Create EiProducer instance
+            // Create ProducerRegistrationInfo instance
             putEiProducerInstance("prod-1", "http://example.com/", "http://example.com/", "http://example.com/",
                 supported_types, new ProducerStatusInfo(ProducerStatusInfo.OperationalState.ENABLED));
 
+            putEiProducerInstance("prod-2", "http://example.com/", "http://example.com/", "http://example.com/",
+                Arrays.asList(supported_types.get(0)),
+                new ProducerStatusInfo(ProducerStatusInfo.OperationalState.DISABLED));
+
+            putEiProducerInstance("3-prod", "http://example.com/", "http://example.com/", "http://example.com/",
+                supported_types, new ProducerStatusInfo(ProducerStatusInfo.OperationalState.ENABLED));
+
             // Create EiJob instance
             schema = getStringFromFile("job-1.json");
             putEiJobInstance("type1", "job1", schema, "owner", "http://example.com/");
+
+            schema = getStringFromFile("job-1.json");
+            putEiJobInstance("type2", "job2", schema, "owner", "http://example.com/");
         }
 
         private String getStringFromFile(String path) {
@@ -152,22 +165,23 @@ public class EnrichmentControllerMockConfiguration {
         }
 
         void putEiProducerInstance(String id, String creation_url, String deletion_url, String callback_url,
-            List<EiType> supported_types, ProducerStatusInfo status) {
-            EiProducer eiProducer = ImmutableEiProducer.builder() //
-                .ei_producer_id(id) //
-                .ei_job_creation_callback_url(creation_url) //
-                .ei_job_deletion_callback_url(deletion_url) //
-                .ei_producer_supervision_callback_url(callback_url) //
-                .supported_ei_types(supported_types) //
-                .status(status).build(); //
+            List<ProducerEiTypeRegistrationInfo> supported_types, ProducerStatusInfo status) {
+            Collection<String> supportedTypeIds = new ArrayList<>();
+            for (ProducerEiTypeRegistrationInfo i : supported_types) {
+                supportedTypeIds.add(i.eiTypeId);
+            }
+            ProducerRegistrationInfo eiProducer = ProducerRegistrationInfo.builder() //
+                .jobCallbackUrl(creation_url) //
+                .producerSupervisionCallbackUrl(callback_url) //
+                .supportedTypeIds(supportedTypeIds) //
+                .build(); //
             eiProducers.put(id, eiProducer);
         }
 
-        EiType getEiTypeInstance(String id, Object data, List<String> producer_ids) {
-            return ImmutableEiType.builder() //
-                .ei_type_identity(id) //
-                .ei_job_data_schema(data) //
-                .ei_producer_ids(producer_ids) //
+        ProducerEiTypeRegistrationInfo getEiTypeInstance(String id, Object data, List<String> producer_ids) {
+            return ProducerEiTypeRegistrationInfo.builder() //
+                .eiTypeId(id) //
+                .jobDataSchema(data) //
                 .build(); //
         }
 
@@ -179,8 +193,8 @@ public class EnrichmentControllerMockConfiguration {
             eiJobs.remove(id);
         }
 
-        EiProducer getEiProducerInstance(String id) throws RestClientException {
-            EiProducer i = eiProducers.get(id);
+        ProducerRegistrationInfo getEiProducerInstance(String id) throws RestClientException {
+            ProducerRegistrationInfo i = eiProducers.get(id);
             if (i == null) {
                 throw new RestClientException("Producer not found: " + id);
             }
@@ -191,16 +205,15 @@ public class EnrichmentControllerMockConfiguration {
             return Collections.unmodifiableCollection(eiProducers.keySet());
         }
 
-        public Collection<EiProducer> getAllEiProducers() {
+        public Collection<ProducerRegistrationInfo> getAllEiProducers() {
             return eiProducers.values();
         }
 
         public List<JobInfo> getAllEiJobs() {
             return new ArrayList<>(eiJobs.values());
-
         }
 
-        private Map<String, EiProducer> eiProducers = new HashMap<>();
+        private Map<String, ProducerRegistrationInfo> eiProducers = new HashMap<>();
         private Map<String, JobInfo> eiJobs = new HashMap<>();
     }
 }
index ea751d7..c246694 100644 (file)
@@ -22,79 +22,79 @@ limitations under the License.
 <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.o-ran-sc.portal.nonrtric.controlpanel</groupId>
-               <artifactId>nonrtric-controlpanel-parent</artifactId>
-               <version>2.1.0-SNAPSHOT</version>
-       </parent>
-       <artifactId>nonrtric-controlpanel-fe</artifactId>
-       <name>Non-RT RIC Control Panel Webapp frontend</name>
-       <build>
-               <plugins>
-                       <plugin>
-                               <groupId>com.github.eirslett</groupId>
-                               <artifactId>frontend-maven-plugin</artifactId>
-                               <version>1.3</version>
-                               <configuration>
-                                       <nodeVersion>v10.15.3</nodeVersion>
-                                       <npmVersion>6.7.0</npmVersion>
-                                       <workingDirectory>.</workingDirectory>
-                               </configuration>
-                               <executions>
-                                       <execution>
-                                               <id>install node and npm</id>
-                                               <goals>
-                                                       <goal>install-node-and-npm</goal>
-                                               </goals>
-                                       </execution>
-                                       <execution>
-                                               <id>npm install</id>
-                                               <goals>
-                                                       <goal>npm</goal>
-                                               </goals>
-                                       </execution>
-                                       <execution>
-                                               <id>npm run build</id>
-                                               <goals>
-                                                       <goal>npm</goal>
-                                               </goals>
-                                               <configuration>
-                                                       <arguments>run build</arguments>
-                                               </configuration>
-                                       </execution>
-                                       <execution>
-                                               <id>prod</id>
-                                               <goals>
-                                                       <goal>npm</goal>
-                                               </goals>
-                                               <configuration>
-                                                       <arguments>run-script build</arguments>
-                                               </configuration>
-                                               <phase>generate-resources</phase>
-                                       </execution>
-                               </executions>
-                       </plugin>
-                       <plugin>
-                               <groupId>org.apache.maven.plugins</groupId>
-                               <artifactId>maven-clean-plugin</artifactId>
-                               <configuration>
-                                       <filesets>
-                                               <fileset>
-                                                       <directory>${project.basedir}</directory>
-                                                       <includes>
-                                                               <include>**/node_modules/**</include>
-                                                               <include>dist/**</include>
-                                                               <include>node/**</include>
-                                                       </includes>
-                                                       <followSymlinks>false</followSymlinks>
-                                               </fileset>
-                                               <fileset>
-                                                       <directory>node</directory>
-                                               </fileset>
-                                       </filesets>
-                               </configuration>
-                       </plugin>
-               </plugins>
-       </build>
-</project>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.o-ran-sc.portal.nonrtric.controlpanel</groupId>
+        <artifactId>nonrtric-controlpanel-parent</artifactId>
+        <version>2.1.1-SNAPSHOT</version>
+    </parent>
+    <artifactId>nonrtric-controlpanel-fe</artifactId>
+    <name>Non-RT RIC Control Panel Webapp frontend</name>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>com.github.eirslett</groupId>
+                <artifactId>frontend-maven-plugin</artifactId>
+                <version>1.3</version>
+                <configuration>
+                    <nodeVersion>v10.15.3</nodeVersion>
+                    <npmVersion>6.7.0</npmVersion>
+                    <workingDirectory>.</workingDirectory>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>install node and npm</id>
+                        <goals>
+                            <goal>install-node-and-npm</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>npm install</id>
+                        <goals>
+                            <goal>npm</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>npm run build</id>
+                        <goals>
+                            <goal>npm</goal>
+                        </goals>
+                        <configuration>
+                            <arguments>run build</arguments>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>prod</id>
+                        <goals>
+                            <goal>npm</goal>
+                        </goals>
+                        <configuration>
+                            <arguments>run-script build</arguments>
+                        </configuration>
+                        <phase>generate-resources</phase>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-clean-plugin</artifactId>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>${project.basedir}</directory>
+                            <includes>
+                                <include>**/node_modules/**</include>
+                                <include>dist/**</include>
+                                <include>node/**</include>
+                            </includes>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>node</directory>
+                        </fileset>
+                    </filesets>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
\ No newline at end of file