ref: 9d99a37374c9266f3d11ff0a19c2d068571159ba
containers:
- name: nonrtric-controlpanel
- version: 2.1.0
+ version: 2.1.1
| 2020-12-03 | 2.1.0 | Henrik Andersson | Cherry Release |
| | | | |
+------------+----------+------------------+----------------+
+| 2021-01-26 | 2.1.1 | Patrik Buhr | Cherry Release |
+| | | | maintenance |
++------------+----------+------------------+----------------+
Release Data
============
| | |
+-----------------------------+----------------------------------------------------------------+
+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.
<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
<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>
</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>
</plugin>
</plugins>
</build>
-</project>
+</project>
\ No newline at end of file
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;
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
// 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) {
@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();
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();
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();
}
}
*/
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);
}
*/
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;
private static final String STATUS = "/status";
private final AsyncRestClient webClient;
+ private static com.google.gson.Gson gson = new GsonBuilder().create();
@Autowired
public EiProducerApiImpl(
}
@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) {
--- /dev/null
+/*-
+ * ========================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;
+}
--- /dev/null
+/*-
+ * ========================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;
+ }
+
+}
--- /dev/null
+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;
+ }
+}
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;
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
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() {
*/
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;
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\"}";
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);
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
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());
}
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));
}
}
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;
}
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);
}
}
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) {
}
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(); //
}
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);
}
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<>();
}
}
<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