2 * ========================LICENSE_START=================================
5 * Copyright (C) 2019 Nordix Foundation
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ========================LICENSE_END===================================
21 package org.oransc.policyagent.clients;
23 import java.lang.invoke.MethodHandles;
24 import java.util.ArrayList;
25 import java.util.List;
27 import org.json.JSONArray;
28 import org.json.JSONException;
29 import org.json.JSONObject;
30 import org.oransc.policyagent.configuration.RicConfig;
31 import org.oransc.policyagent.repository.Policy;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
35 import reactor.core.publisher.Flux;
36 import reactor.core.publisher.Mono;
38 public class ControllerA1Client implements A1Client {
39 private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
40 private static final String A1_CONTROLLER_URL =
41 "http://admin:Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U@a1-controller-container:8181/restconf/operations";
43 private final RicConfig ricConfig;
44 private final AsyncRestClient restClient;
46 public ControllerA1Client(RicConfig ricConfig) {
47 this.ricConfig = ricConfig;
48 this.restClient = new AsyncRestClient(A1_CONTROLLER_URL);
49 logger.debug("ControllerA1Client for ric: {}", this.ricConfig.name());
53 public Mono<List<String>> getPolicyTypeIdentities() {
54 JSONObject paramsJson = new JSONObject();
55 paramsJson.put("near-rt-ric-url", ricConfig.baseUrl());
56 String inputJsonString = createInputJsonString(paramsJson);
57 logger.debug("POST getPolicyTypeIdentities inputJsonString = {}", inputJsonString);
59 return restClient.post("/A1-ADAPTER-API:getPolicyTypeIdentities", inputJsonString) //
60 .flatMap(response -> getValueFromResponse(response, "policy-type-id-list")) //
61 .flatMap(this::parseJsonArrayOfString);
65 public Mono<List<String>> getPolicyIdentities() {
66 JSONObject paramsJson = new JSONObject();
67 paramsJson.put("near-rt-ric-url", ricConfig.baseUrl());
68 String inputJsonString = createInputJsonString(paramsJson);
69 logger.debug("POST getPolicyIdentities inputJsonString = {}", inputJsonString);
71 return restClient.post("/A1-ADAPTER-API:getPolicyIdentities", inputJsonString) //
72 .flatMap(response -> getValueFromResponse(response, "policy-id-list")) //
73 .flatMap(this::parseJsonArrayOfString);
77 public Mono<String> getPolicyTypeSchema(String policyTypeId) {
78 JSONObject paramsJson = new JSONObject();
79 paramsJson.put("near-rt-ric-url", ricConfig.baseUrl());
80 paramsJson.put("policy-type-id", policyTypeId);
81 String inputJsonString = createInputJsonString(paramsJson);
82 logger.debug("POST getPolicyType inputJsonString = {}", inputJsonString);
84 return restClient.post("/A1-ADAPTER-API:getPolicyType", inputJsonString) //
85 .flatMap(response -> getValueFromResponse(response, "policy-type")) //
86 .flatMap(this::extractPolicySchema);
90 public Mono<String> putPolicy(Policy policy) {
91 JSONObject paramsJson = new JSONObject();
92 paramsJson.put("near-rt-ric-url", ricConfig.baseUrl());
93 paramsJson.put("policy-id", policy.id());
94 paramsJson.put("policy-type-id", policy.type().name());
95 paramsJson.put("policy", policy.json());
96 String inputJsonString = createInputJsonString(paramsJson);
97 logger.debug("POST putPolicy inputJsonString = {}", inputJsonString);
99 return restClient.post("/A1-ADAPTER-API:putPolicy", inputJsonString) //
100 .flatMap(response -> getValueFromResponse(response, "returned-policy")) //
101 .flatMap(this::validateJson);
105 public Mono<String> deletePolicy(Policy policy) {
106 return deletePolicy(policy.id());
110 public Flux<String> deleteAllPolicies() {
111 return getPolicyIdentities() //
112 .flatMapMany(policyIds -> Flux.fromIterable(policyIds)) // )
113 .flatMap(policyId -> deletePolicy(policyId)); //
116 public Mono<String> deletePolicy(String policyId) {
117 JSONObject paramsJson = new JSONObject();
118 paramsJson.put("near-rt-ric-url", ricConfig.baseUrl());
119 paramsJson.put("policy-id", policyId);
120 String inputJsonString = createInputJsonString(paramsJson);
121 logger.debug("POST deletePolicy inputJsonString = {}", inputJsonString);
123 return restClient.post("/A1-ADAPTER-API:deletePolicy", inputJsonString);
127 public Mono<A1ProtocolType> getProtocolVersion() {
128 return getPolicyTypeIdentities() //
129 .flatMap(x -> Mono.just(A1ProtocolType.CONTROLLER));
132 private String createInputJsonString(JSONObject paramsJson) {
133 JSONObject inputJson = new JSONObject();
134 inputJson.put("input", paramsJson);
135 return inputJson.toString();
138 private Mono<String> getValueFromResponse(String response, String key) {
139 logger.debug("A1 client: response = {}", response);
141 JSONObject outputJson = new JSONObject(response);
142 JSONObject responseParams = outputJson.getJSONObject("output");
143 String value = responseParams.get(key).toString();
144 return Mono.just(value);
145 } catch (JSONException ex) { // invalid json
146 return Mono.error(ex);
150 private Mono<List<String>> parseJsonArrayOfString(String inputString) {
152 List<String> arrayList = new ArrayList<>();
153 JSONArray jsonArray = new JSONArray(inputString);
154 for (int i = 0; i < jsonArray.length(); i++) {
155 arrayList.add(jsonArray.getString(i));
157 logger.debug("A1 client: received list = {}", arrayList);
158 return Mono.just(arrayList);
159 } catch (JSONException ex) { // invalid json
160 return Mono.error(ex);
164 private Mono<String> extractPolicySchema(String inputString) {
166 JSONObject jsonObject = new JSONObject(inputString);
167 JSONObject schemaObject = jsonObject.getJSONObject("policySchema");
168 String schemaString = schemaObject.toString();
169 return Mono.just(schemaString);
170 } catch (JSONException ex) { // invalid json
171 return Mono.error(ex);
175 private Mono<String> validateJson(String inputString) {
177 new JSONObject(inputString);
178 return Mono.just(inputString);
179 } catch (JSONException ex) { // invalid json
180 return Mono.error(ex);