From 6d8231a41263b49cb227b8eff2d39b1f3aa778bd Mon Sep 17 00:00:00 2001 From: RehanRaza Date: Thu, 12 Dec 2019 11:05:55 +0100 Subject: [PATCH] Add A1 Client in Policy Agent Change-Id: I9b10f5c0dbd1d8d0aef748c24a884b8671ef8863 Issue-ID: NONRTRIC-80 Signed-off-by: RehanRaza --- policy-agent/pom.xml | 5 + .../org/oransc/policyagent/clients/A1Client.java | 105 +++++++++++++++++++++ .../policyagent/clients/AsyncRestClient.java | 55 +++++++++++ 3 files changed, 165 insertions(+) create mode 100644 policy-agent/src/main/java/org/oransc/policyagent/clients/A1Client.java create mode 100644 policy-agent/src/main/java/org/oransc/policyagent/clients/AsyncRestClient.java diff --git a/policy-agent/pom.xml b/policy-agent/pom.xml index cca5bf6c..26245964 100644 --- a/policy-agent/pom.xml +++ b/policy-agent/pom.xml @@ -88,6 +88,11 @@ gson ${immutable.version} + + org.json + json + 20180130 + org.springframework.boot diff --git a/policy-agent/src/main/java/org/oransc/policyagent/clients/A1Client.java b/policy-agent/src/main/java/org/oransc/policyagent/clients/A1Client.java new file mode 100644 index 00000000..39fbc37b --- /dev/null +++ b/policy-agent/src/main/java/org/oransc/policyagent/clients/A1Client.java @@ -0,0 +1,105 @@ +/*- + * ========================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.policyagent.clients; + +import java.lang.invoke.MethodHandles; +import java.util.ArrayList; +import java.util.List; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +public class A1Client { + private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + + public String getBaseUrl(final String nearRtRicUrl) { + return nearRtRicUrl + "/A1-P/v1"; + } + + public Flux getAllPolicyTypes(String nearRtRicUrl) { + logger.debug("getAllPolicyTypes nearRtRicUrl = {}", nearRtRicUrl); + AsyncRestClient client = new AsyncRestClient(getBaseUrl(nearRtRicUrl)); + Mono response = client.get("/policytypes"); + return response.flatMapMany(this::createPolicyTypesFlux); + } + + public Flux getPoliciesForType(String nearRtRicUrl, String policyTypeId) { + logger.debug("getPoliciesForType nearRtRicUrl = {}, policyTypeId = {}", nearRtRicUrl, policyTypeId); + AsyncRestClient client = new AsyncRestClient(getBaseUrl(nearRtRicUrl)); + Mono response = client.get("/policies"); + return response.flatMapMany(policiesString -> createPoliciesFlux(policiesString, policyTypeId)); + } + + public Mono getPolicy(String nearRtRicUrl, String policyId) { + logger.debug("getPolicy nearRtRicUrl = {}, policyId = {}", nearRtRicUrl, policyId); + AsyncRestClient client = new AsyncRestClient(getBaseUrl(nearRtRicUrl)); + Mono response = client.get("/policies/" + policyId); + return response.flatMap(this::createPolicyMono); + } + + public Mono putPolicy(String nearRtRicUrl, String policyId, String policyString) { + logger.debug("putPolicy nearRtRicUrl = {}, policyId = {}, policyString = {}", nearRtRicUrl, policyId, + policyString); + AsyncRestClient client = new AsyncRestClient(getBaseUrl(nearRtRicUrl)); + Mono response = client.put("/policies/" + policyId, policyString); + return response.flatMap(this::createPolicyMono); + } + + public Mono deletePolicy(String nearRtRicUrl, String policyId) { + logger.debug("deletePolicy nearRtRicUrl = {}, policyId = {}", nearRtRicUrl, policyId); + AsyncRestClient client = new AsyncRestClient(getBaseUrl(nearRtRicUrl)); + return client.delete("/policies/" + policyId); + } + + private Flux createPolicyTypesFlux(String policyTypesString) { + List policyTypesList = new ArrayList<>(); + JSONArray policyTypesArray = new JSONArray(policyTypesString); + for (int i = 0; i < policyTypesArray.length(); i++) { + policyTypesList.add(policyTypesArray.getJSONObject(i).toString()); + } + logger.debug("A1 client: policyTypes = {}", policyTypesList); + return Flux.fromIterable(policyTypesList); + } + + private Flux createPoliciesFlux(String policiesString, String policyTypeId) { + List policiesList = new ArrayList<>(); + JSONArray policiesArray = new JSONArray(policiesString); + for (int i = 0; i < policiesArray.length(); i++) { + JSONObject policyObject = policiesArray.getJSONObject(i); + if (policyObject.get("policyTypeId").equals(policyTypeId)) { + policiesList.add(policyObject.toString()); + } + } + logger.debug("A1 client: policies = {}", policiesList); + return Flux.fromIterable(policiesList); + } + + private Mono createPolicyMono(String policyString) { + // remove white-spaces + policyString = policyString.replaceAll("\\s+", ""); + logger.debug("A1 client: policy = {}", policyString); + return Mono.just(policyString); + } +} diff --git a/policy-agent/src/main/java/org/oransc/policyagent/clients/AsyncRestClient.java b/policy-agent/src/main/java/org/oransc/policyagent/clients/AsyncRestClient.java new file mode 100644 index 00000000..c69afb2f --- /dev/null +++ b/policy-agent/src/main/java/org/oransc/policyagent/clients/AsyncRestClient.java @@ -0,0 +1,55 @@ +/*- + * ========================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.policyagent.clients; + +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +public class AsyncRestClient { + private final WebClient client; + + public AsyncRestClient(String baseUrl) { + this.client = WebClient.create(baseUrl); + } + + public Mono put(String uri, String body) { + return client.put() // + .uri(uri) // + .contentType(MediaType.APPLICATION_JSON) // + .syncBody(body) // + .retrieve() // + .bodyToMono(String.class); + } + + public Mono get(String uri) { + return client.get() // + .uri(uri) // + .retrieve() // + .bodyToMono(String.class); + } + + public Mono delete(String uri) { + return client.delete() // + .uri(uri) // + .retrieve() // + .bodyToMono(Void.class); + } +} -- 2.16.6