From 6c32d755f6bd864f2888d5b7242edf344b21f5aa Mon Sep 17 00:00:00 2001 From: ecaiyanlinux Date: Mon, 4 Jan 2021 22:13:48 +0100 Subject: [PATCH] Improvement of controlpanel dashboard Fix some bugs in the backend to support PMS_V2.0 return list of policy instances policyData in put request should be a object instead of string Signed-off-by: ecaiyanlinux Issue-ID: NONRTRIC-314 Change-Id: I5de0f6484d5232132fd8b6b945074b8adccf8e3e --- docs/api.json | 9 +-- .../controlpanel/controller/PolicyController.java | 8 +- .../nonrtric/controlpanel/model/PolicyInfo.java | 37 ++++++--- .../controlpanel/model/PolicyInstance.java | 62 +++++++++++++++ .../policyagentapi/PolicyAgentApiImpl.java | 50 +++++++----- .../mock/PolicyControllerMockConfiguration.java | 15 ++-- .../policyagentapi/PolicyAgentApiImplTest.java | 90 ++++++++++++---------- 7 files changed, 185 insertions(+), 86 deletions(-) create mode 100644 webapp-backend/src/main/java/org/oransc/portal/nonrtric/controlpanel/model/PolicyInstance.java 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..56f2c38 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,29 +127,38 @@ 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()); + 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()); } } + @Override + public ResponseEntity getPolicyInstance(String id) { + ResponseEntity rsp = getIndividualPolicyInstance(id); + PolicyInfo i = (PolicyInfo) rsp.getBody(); + return new ResponseEntity<>(i.policyData, rsp.getStatusCode()); + } + private String getTimeStampUTC() { return java.time.Instant.now().toString(); } @@ -159,17 +168,20 @@ 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") // + JsonElement data = JsonParser.parseString(json.toString()).getAsJsonObject(); + + PolicyInstance i = PolicyInstance.builder() // + .policyId(policyInstanceId) // + .policyTypeId(policyTypeIdString) // + .ricId(ric) // + .policyData(data) // + .serviceId("controlpanel") // .lastModified(getTimeStampUTC()) // .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 +203,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 +227,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..ade6343 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 @@ -23,22 +23,23 @@ package org.oransc.portal.nonrtric.controlpanel.policyagentapi; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.contains; 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.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,12 +54,17 @@ 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 com.google.gson.Gson gson = new GsonBuilder() // .serializeNulls() // @@ -129,10 +135,12 @@ 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); + ResponseEntity returnedResp = apiUnderTest.getPolicyInstancesForType(POLICY_TYPE_1_ID); assertEquals(returnedResp.getBody(), policyInstancesJson); assertEquals(HttpStatus.OK, returnedResp.getStatusCode()); @@ -161,8 +169,7 @@ class PolicyAgentApiImplTest { 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() { @@ -171,33 +178,32 @@ class PolicyAgentApiImplTest { private void whenPutReturnOK(String url, String putBody, HttpStatus status, String body) { ResponseEntity ret = new ResponseEntity<>(body, status); - when(restClient.putForEntity(eq(url), eq(putBody))).thenReturn(Mono.just(ret)); + when(restClient.putForEntity(eq(url), contains(SERVICE_ID))).thenReturn(Mono.just(ret)); } private void whenPutReturnFailure(String url, String putBody, HttpStatus status, String body) { HttpServerErrorException e = new HttpServerErrorException(status, body, body.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8); - when(restClient.putForEntity(eq(url), eq(putBody))).thenReturn(Mono.error(e)); + when(restClient.putForEntity(eq(url), contains(SERVICE_ID))).thenReturn(Mono.error(e)); } @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("") // + PolicyInstance i = PolicyInstance.builder() // + .policyId(POLICY_1_ID) // + .policyTypeId(POLICY_TYPE_1_ID) // + .ricId(RIC_1_ID) // + .policyData(POLICY_DATA) // + .serviceId(SERVICE_ID) // .build(); // - String jsonStr = gson.toJson(i, PolicyInfo.class); + String jsonStr = gson.toJson(i, PolicyInstance.class); 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 +212,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("") // + PolicyInstance i = PolicyInstance.builder() // + .policyId(POLICY_1_ID) // + .policyTypeId(POLICY_TYPE_1_ID) // + .ricId(RIC_1_ID) // + .policyData(POLICY_DATA) // + .serviceId(SERVICE_ID) // .build(); // - - String jsonStr = gson.toJson(i, PolicyInfo.class); + String jsonStr = gson.toJson(i, PolicyInstance.class); 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 +291,19 @@ 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) // + .build(); // + res.add(i); } - return gson.toJson(policyInstances); + return gson.toJson(res); } } -- 2.16.6