From: Patrik Buhr Date: Tue, 12 Jan 2021 15:24:36 +0000 (+0000) Subject: Merge "Dockerize the frontend of controlpanel" X-Git-Tag: 2.2.0~122 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=b36108a6b4f18c5620ed120184bdd8c86c85c70e;hp=f9523c1537c94946ecd9a8250b0de429881418f5;p=portal%2Fnonrtric-controlpanel.git Merge "Dockerize the frontend of controlpanel" --- diff --git a/docs/api.json b/docs/api.json index 53e1a2f..3a47572 100644 --- a/docs/api.json +++ b/docs/api.json @@ -141,7 +141,7 @@ "tags": [ "policy-controller" ], - "summary": "Returns a policy instance of a type", + "summary": "Returns a policy instance", "operationId": "getPolicyInstanceUsingGET", "produces": [ "application/json" @@ -153,13 +153,6 @@ "description": "policy_instance_id", "required": true, "type": "string" - }, - { - "name": "type", - "in": "query", - "description": "type", - "required": true, - "type": "string" } ], "responses": { diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/PolicyController.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/PolicyController.java index 6cf79f1..ccc2ac7 100644 --- a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/PolicyController.java +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/controller/PolicyController.java @@ -93,12 +93,10 @@ public class PolicyController { return this.policyAgentApi.getPolicyInstancesForType(policyTypeIdString); } - @ApiOperation(value = "Returns a policy instance of a type") + @ApiOperation(value = "Returns a policy instance") @GetMapping(POLICIES_NAME + "/{" + POLICY_INSTANCE_ID_NAME + "}") - public ResponseEntity getPolicyInstance( - @RequestParam(name = "type", required = true) String policyTypeIdString, - @PathVariable(POLICY_INSTANCE_ID_NAME) String policyInstanceId) { - logger.debug("getPolicyInstance {}:{}", policyTypeIdString, policyInstanceId); + public ResponseEntity getPolicyInstance(@PathVariable(POLICY_INSTANCE_ID_NAME) String policyInstanceId) { + logger.debug("getPolicyInstance {}", policyInstanceId); return this.policyAgentApi.getPolicyInstance(policyInstanceId); } diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyInfo.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyInfo.java index 782919d..9ea4d93 100644 --- a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyInfo.java +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyInfo.java @@ -18,25 +18,44 @@ * 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; -import org.immutables.value.Value; -@Value.Immutable @Gson.TypeAdapters -public interface PolicyInfo { +@Builder +public class PolicyInfo { + @SerializedName(value = "id", alternate = "policy_id") + public String policyId; + + @SerializedName(value = "type", alternate = "policytype_id") + public String policyTypeId; + + @SerializedName(value = "ric", alternate = "ric_id") + public String ricId; - public String id(); + @SerializedName(value = "json", alternate = "policy_data") + public Object policyData; - public String type(); + @SerializedName(value = "service", alternate = "service_id") + public String serviceId; - public String ric(); + @SerializedName("transient") + public boolean isTransient = false; - public Object json(); + @SerializedName(value = "statusNotificationUri", alternate = "status_notification_uri") + public String statusNotificationUri = ""; - public String service(); + @SerializedName("lastModified") + public String lastModified = ""; - public String lastModified(); + public boolean validate() { + return policyId != null && policyTypeId != null && ricId != null && policyData != null && serviceId != null; + } } diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyInstance.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyInstance.java new file mode 100644 index 0000000..993538c --- /dev/null +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyInstance.java @@ -0,0 +1,62 @@ +/*- + * ========================LICENSE_START================================= + * O-RAN-SC + * %% + * Copyright (C) 2019 Nordix Foundation + * Modifications 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 lombok.Builder; + +import org.immutables.gson.Gson; + +@Gson.TypeAdapters +@Builder +public class PolicyInstance { + + @SerializedName(value = "policy_id") + public String policyId; + + @SerializedName(value = "policytype_id") + public String policyTypeId; + + @SerializedName(value = "ric_id") + public String ricId; + + @SerializedName(value = "policy_data") + public Object policyData; + + @SerializedName(value = "service_id") + public String serviceId; + + @SerializedName(value = "transient") + public boolean isTransient = false; + + @SerializedName(value = "status_notification_uri") + public String statusNotificationUri = ""; + + @SerializedName(value = "lastModified") + public String lastModified = ""; + + public boolean validate() { + return policyId != null && policyTypeId != null && ricId != null && policyData != null && serviceId != null; + } + +} diff --git a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApiImpl.java b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApiImpl.java index f8b7c3e..9e30c51 100644 --- a/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApiImpl.java +++ b/webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApiImpl.java @@ -35,8 +35,8 @@ import java.util.List; import org.immutables.gson.Gson; import org.immutables.value.Value; -import org.oransc.portal.nonrtric.controlpanel.model.ImmutablePolicyInfo; import org.oransc.portal.nonrtric.controlpanel.model.PolicyInfo; +import org.oransc.portal.nonrtric.controlpanel.model.PolicyInstance; import org.oransc.portal.nonrtric.controlpanel.model.PolicyType; import org.oransc.portal.nonrtric.controlpanel.model.PolicyTypes; import org.oransc.portal.nonrtric.controlpanel.util.AsyncRestClient; @@ -127,31 +127,55 @@ public class PolicyAgentApiImpl implements PolicyAgentApi { .get("policy_ids") // .getAsJsonArray(); // - Type listType = new TypeToken>() {}.getType(); - List rspParsed = gson.fromJson(policyInstances, listType); + List res = new ArrayList<>(); + for (JsonElement p : policyInstances) { + ResponseEntity policyInstance = getIndividualPolicyInstance(p.getAsString()); + res.add(policyInstance.getBody()); + } - return new ResponseEntity<>(gson.toJson(rspParsed), rsp.getStatusCode()); + return new ResponseEntity<>(gson.toJson(res), rsp.getStatusCode()); } catch (Exception e) { return ErrorResponseHandler.handleException(e); } } - @Override - public ResponseEntity getPolicyInstance(String id) { + public ResponseEntity getIndividualPolicyInstance(String id) { try { String url = "/v2/policies/" + id; ResponseEntity rsp = webClient.getForEntity(url).block(); JsonObject obj = JsonParser.parseString(rsp.getBody()).getAsJsonObject(); - String str = obj.toString(); - return new ResponseEntity<>(str, rsp.getStatusCode()); + + // lastModified timestamp is fetched from PolicyStatus instead + ResponseEntity status = getPolicyStatus(id); + String lastModified = JsonParser.parseString(status.getBody()).getAsJsonObject() // + .get("last_modified") // + .getAsString(); // + obj.addProperty("lastModified", lastModified); + + PolicyInfo i = gson.fromJson(obj, PolicyInfo.class); + return new ResponseEntity<>(i, rsp.getStatusCode()); } catch (Exception e) { ResponseEntity rsp = ErrorResponseHandler.handleException(e); return new ResponseEntity<>(rsp.getBody(), rsp.getStatusCode()); } } - private String getTimeStampUTC() { - return java.time.Instant.now().toString(); + public ResponseEntity getPolicyStatus(String id) { + try { + String url = "/v2/policies/" + id + "/status"; + ResponseEntity rsp = webClient.getForEntity(url).block(); + return new ResponseEntity<>(rsp.getBody(), rsp.getStatusCode()); + } catch (Exception e) { + ResponseEntity rsp = ErrorResponseHandler.handleException(e); + return new ResponseEntity<>(rsp.getBody(), rsp.getStatusCode()); + } + } + + @Override + public ResponseEntity getPolicyInstance(String id) { + ResponseEntity rsp = getIndividualPolicyInstance(id); + PolicyInfo i = (PolicyInfo) rsp.getBody(); + return new ResponseEntity<>(i.policyData, rsp.getStatusCode()); } @Override @@ -159,17 +183,19 @@ public class PolicyAgentApiImpl implements PolicyAgentApi { String ric) { String url = "/v2/policies/"; - PolicyInfo i = ImmutablePolicyInfo.builder() // - .id(policyInstanceId) // - .type(policyTypeIdString) // - .ric(ric) // - .json(json) // - .service("controlpanel") // - .lastModified(getTimeStampUTC()) // + JsonElement data = JsonParser.parseString(json.toString()).getAsJsonObject(); + + PolicyInstance i = PolicyInstance.builder() // + .policyId(policyInstanceId) // + .policyTypeId(policyTypeIdString) // + .ricId(ric) // + .policyData(data) // + .serviceId("controlpanel") // .build(); // try { - String jsonStr = gson.toJson(i, PolicyInfo.class); + String jsonStr = gson.toJson(i, PolicyInstance.class); + logger.debug("PolicyInstance: " + jsonStr); webClient.putForEntity(url, jsonStr).block(); return new ResponseEntity<>(HttpStatus.OK); } catch (Exception e) { @@ -191,11 +217,11 @@ public class PolicyAgentApiImpl implements PolicyAgentApi { @Value.Immutable @Gson.TypeAdapters interface RicInfo { - public String ricName(); + public String ric_id(); - public Collection nodeNames(); + public Collection managed_element_ids(); - public Collection policyTypes(); + public Collection policytype_ids(); } @Override @@ -215,7 +241,7 @@ public class PolicyAgentApiImpl implements PolicyAgentApi { List rspParsed = gson.fromJson(rics, listType); Collection result = new ArrayList<>(rspParsed.size()); for (RicInfo ric : rspParsed) { - result.add(ric.ricName()); + result.add(ric.ric_id()); } String json = gson.toJson(result); return new ResponseEntity<>(json, HttpStatus.OK); diff --git a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/mock/PolicyControllerMockConfiguration.java b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/mock/PolicyControllerMockConfiguration.java index e593736..d6476db 100644 --- a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/mock/PolicyControllerMockConfiguration.java +++ b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/mock/PolicyControllerMockConfiguration.java @@ -35,7 +35,6 @@ import java.util.Optional; import java.util.Vector; import java.util.stream.Collectors; -import org.oransc.portal.nonrtric.controlpanel.model.ImmutablePolicyInfo; import org.oransc.portal.nonrtric.controlpanel.model.PolicyInfo; import org.oransc.portal.nonrtric.controlpanel.model.PolicyInstances; import org.oransc.portal.nonrtric.controlpanel.model.PolicyType; @@ -154,8 +153,14 @@ public class PolicyControllerMockConfiguration { } void putInstance(String typeId, String instanceId, Object instanceData, String ric) { - PolicyInfo i = ImmutablePolicyInfo.builder().json(instanceData).lastModified(getTimeStampUTC()) - .id(instanceId).ric(ric).service("service").type(typeId).build(); + PolicyInfo i = PolicyInfo.builder() // + .policyData(instanceData) // + .lastModified(getTimeStampUTC()) // + .policyId(instanceId) // + .ricId(ric) // + .serviceId("service") // + .policyTypeId(typeId) // + .build(); // instances.put(instanceId, i); } @@ -168,7 +173,7 @@ public class PolicyControllerMockConfiguration { if (i == null) { throw new RestClientException("Type not found: " + id); } - return i.json(); + return i.policyData; } public Collection getTypes() { @@ -179,7 +184,7 @@ public class PolicyControllerMockConfiguration { ArrayList result = new ArrayList<>(); for (PolicyInfo i : instances.values()) { if (typeId.isPresent()) { - if (i.type().equals(typeId.get())) { + if (i.policyTypeId.equals(typeId.get())) { result.add(i); } diff --git a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApiImplTest.java b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApiImplTest.java index 42d2669..deedd8e 100644 --- a/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApiImplTest.java +++ b/webapp-backend/src/test/java/org/oransc/portal/nonrtric/controlpanel/policyagentapi/PolicyAgentApiImplTest.java @@ -28,17 +28,17 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import com.google.gson.GsonBuilder; -import com.google.gson.reflect.TypeToken; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; -import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; import java.util.Arrays; -import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.oransc.portal.nonrtric.controlpanel.model.ImmutablePolicyInfo; import org.oransc.portal.nonrtric.controlpanel.model.PolicyInfo; +import org.oransc.portal.nonrtric.controlpanel.model.PolicyInstance; import org.oransc.portal.nonrtric.controlpanel.model.PolicyInstances; import org.oransc.portal.nonrtric.controlpanel.util.AsyncRestClient; import org.springframework.http.HttpStatus; @@ -53,13 +53,20 @@ class PolicyAgentApiImplTest { private static final String POLICY_TYPE_1_INVALID = "\"title\":\"type1\"}"; private static final String POLICY_TYPE_2_VALID = "{\"title\":\"type2\"}"; private static final String POLICY_1_ID = "policy1"; - private static final String POLICY_1_VALID = "{\"policyId\":\"policy1\"}"; - private static final String POLICY_1_INVALID = "\"policyId\":\"policy1\"}"; + private static final String POLICY_DATA = + "{\"qosObjectives\":{\"priorityLevel\":22.0},\"scope\":{\"qosId\":\"22\",\"ueId\":\"22\"}}"; + private static final String POLICY_1_VALID = + "{\"policy_id\":\"policy1\",\"policytype_id\":\"type1\",\"ric_id\":\"ric1\",\"policy_data\":" + POLICY_DATA + + ",\"service_id\":\"controlpanel\"}"; + private static final String POLICY_1_INVALID = "\"policy_id\":\"policy1\"}"; private static final String RIC_1_ID = "ric1"; - private static final String RIC_1_INFO_VALID = "{\"ricName\":\"ric1\",\"policyTypes\":[\"type1\"]}"; - private static final String RIC_1_INFO_INVALID = "{\"ricName\":\"ric1\",\"policyTypes\":\"type1\"]}"; + private static final String RIC_1_INFO_VALID = "{\"ric_id\":\"ric1\",\"policytype_ids\":[\"type1\"]}"; + private static final String RIC_1_INFO_INVALID = "{\"ric_id\":\"ric1\",\"policytype_ids\":\"type1\"]}"; private static final String CLIENT_ERROR_MESSAGE = "XXXXXXX"; - + private static final String SERVICE_ID = "controlpanel"; + private static final String TIMESTAMP = "2021-01-12T09:59:33.392470Z"; + private static final String STATUS = + "{\"last_modified\": \"" + TIMESTAMP + "\",\"status\":{\"enforceStatus\": \"\",\"enforceReason\": \"\"}}"; private static com.google.gson.Gson gson = new GsonBuilder() // .serializeNulls() // .create(); // @@ -129,10 +136,13 @@ class PolicyAgentApiImplTest { @Test void testGetPolicyInstancesForTypeSuccessValidJson() { - String policyInstances = "{\"policy_ids\":[{\"id\":\"policy1\"}]}"; - String policyInstancesJson = parsePolicyInstancesJson("[{\"id\":\"policy1\"}]"); + String policyInstances = "{\"policy_ids\":[\"policy1\"]}"; + String policyInstancesJson = parsePolicyInstancesJson("[\"policy1\"]"); whenGetReturnOK(urlPolicyInstances(POLICY_TYPE_1_ID), HttpStatus.OK, policyInstances); + whenGetReturnOK(urlPolicyInstance(POLICY_1_ID), HttpStatus.OK, POLICY_1_VALID); + whenGetReturnOK(urlPolicyStatus(POLICY_1_ID), HttpStatus.OK, STATUS); + ResponseEntity returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID); assertEquals(returnedResp.getBody(), policyInstancesJson); assertEquals(HttpStatus.OK, returnedResp.getStatusCode()); @@ -154,15 +164,19 @@ class PolicyAgentApiImplTest { return "/v2/policies/" + id; } + private String urlPolicyStatus(String id) { + return "/v2/policies/" + id + "/status"; + } + @Test void testGetPolicyInstance() { whenGetReturnOK(urlPolicyInstance(POLICY_1_ID), HttpStatus.OK, POLICY_1_VALID); + whenGetReturnOK(urlPolicyStatus(POLICY_1_ID), HttpStatus.OK, STATUS); ResponseEntity returnedResp = apiUnderTest.getPolicyInstance(POLICY_1_ID); assertEquals(HttpStatus.OK, returnedResp.getStatusCode()); - assertEquals(POLICY_1_VALID, returnedResp.getBody()); - + assertEquals(POLICY_DATA, gson.toJson(returnedResp.getBody())); } private String urlPutPolicy() { @@ -183,21 +197,20 @@ class PolicyAgentApiImplTest { @Test void testPutPolicyFailure() { String url = urlPutPolicy(); - - PolicyInfo i = ImmutablePolicyInfo.builder() // - .id(POLICY_1_ID) // - .type(POLICY_TYPE_1_ID) // - .ric(RIC_1_ID) // - .json(POLICY_1_VALID) // - .service("") // - .lastModified("") // + JsonElement data = JsonParser.parseString(POLICY_DATA).getAsJsonObject(); + PolicyInstance i = PolicyInstance.builder() // + .policyId(POLICY_1_ID) // + .policyTypeId(POLICY_TYPE_1_ID) // + .ricId(RIC_1_ID) // + .policyData(data) // + .serviceId(SERVICE_ID) // .build(); // - String jsonStr = gson.toJson(i, PolicyInfo.class); + String jsonStr = gson.toJson(i); whenPutReturnFailure(url, jsonStr, HttpStatus.NOT_FOUND, CLIENT_ERROR_MESSAGE); ResponseEntity returnedResp = - apiUnderTest.putPolicy(POLICY_TYPE_1_ID, POLICY_1_ID, POLICY_1_VALID, RIC_1_ID); + apiUnderTest.putPolicy(POLICY_TYPE_1_ID, POLICY_1_ID, POLICY_DATA, RIC_1_ID); assertTrue(returnedResp.getBody().contains(CLIENT_ERROR_MESSAGE)); assertEquals(HttpStatus.NOT_FOUND, returnedResp.getStatusCode()); @@ -206,22 +219,19 @@ class PolicyAgentApiImplTest { @Test void testPutPolicySuccess() { String url = urlPutPolicy(); - PolicyInfo i = ImmutablePolicyInfo.builder() // - .id(POLICY_1_ID) // - .type(POLICY_TYPE_1_ID) // - .ric(RIC_1_ID) // - .json(POLICY_1_VALID) // - .service("") // - .lastModified("") // + JsonElement data = JsonParser.parseString(POLICY_DATA).getAsJsonObject(); + PolicyInstance i = PolicyInstance.builder() // + .policyId(POLICY_1_ID) // + .policyTypeId(POLICY_TYPE_1_ID) // + .ricId(RIC_1_ID) // + .policyData(data) // + .serviceId(SERVICE_ID) // .build(); // - - String jsonStr = gson.toJson(i, PolicyInfo.class); - + String jsonStr = gson.toJson(i); whenPutReturnOK(url, jsonStr, HttpStatus.OK, POLICY_1_VALID); ResponseEntity returnedResp = - apiUnderTest.putPolicy(POLICY_TYPE_1_ID, POLICY_1_ID, POLICY_1_VALID, RIC_1_ID); - + apiUnderTest.putPolicy(POLICY_TYPE_1_ID, POLICY_1_ID, POLICY_DATA, RIC_1_ID); assertNull(returnedResp.getBody()); assertEquals(HttpStatus.OK, returnedResp.getStatusCode()); } @@ -288,12 +298,20 @@ class PolicyAgentApiImplTest { } private String parsePolicyInstancesJson(String inputString) { - Type listType = new TypeToken>() {}.getType(); - List rspParsed = gson.fromJson(inputString, listType); - PolicyInstances policyInstances = new PolicyInstances(); - for (PolicyInfo policy : rspParsed) { - policyInstances.add(policy); + JsonArray arr = JsonParser.parseString(inputString).getAsJsonArray(); + PolicyInstances res = new PolicyInstances(); + JsonElement data = JsonParser.parseString(POLICY_DATA).getAsJsonObject(); + for (JsonElement id : arr) { + PolicyInfo i = PolicyInfo.builder() // + .policyId(id.getAsString()) // + .policyTypeId(POLICY_TYPE_1_ID) // + .ricId(RIC_1_ID) // + .policyData(data) // + .serviceId(SERVICE_ID) // + .lastModified(TIMESTAMP) // + .build(); // + res.add(i); } - return gson.toJson(policyInstances); + return gson.toJson(res); } } diff --git a/webapp-frontend/src/app/controlpanel.component.html b/webapp-frontend/src/app/controlpanel.component.html index a6ae9e0..649a5d5 100644 --- a/webapp-frontend/src/app/controlpanel.component.html +++ b/webapp-frontend/src/app/controlpanel.component.html @@ -51,7 +51,7 @@