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 SdncOscA1Client implements A1Client {
39 private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
40 private static final String A1_CONTROLLER_URL = "http://a1-controller-container:8181/restconf/operations";
41 private static final String A1_CONTROLLER_USERNAME = "admin";
42 private static final String A1_CONTROLLER_PASSWORD = "Kp8bJ4SXszM0WXlhak3eHlcse2gAw84vaoGGmJvUy2U";
44 private final RicConfig ricConfig;
45 private final AsyncRestClient restClient;
47 public SdncOscA1Client(RicConfig ricConfig) {
48 this.ricConfig = ricConfig;
49 this.restClient = new AsyncRestClient(A1_CONTROLLER_URL);
50 logger.debug("SdncOscA1Client for ric: {}", this.ricConfig.name());
54 public Mono<List<String>> getPolicyTypeIdentities() {
55 JSONObject paramsJson = new JSONObject();
56 paramsJson.put("near-rt-ric-url", ricConfig.baseUrl());
57 String inputJsonString = createInputJsonString(paramsJson);
58 logger.debug("POST getPolicyTypeIdentities inputJsonString = {}", inputJsonString);
61 .postWithAuthHeader("/A1-ADAPTER-API:getPolicyTypeIdentities", inputJsonString, A1_CONTROLLER_USERNAME,
62 A1_CONTROLLER_PASSWORD) //
63 .flatMap(response -> getValueFromResponse(response, "policy-type-id-list")) //
64 .flatMap(this::parseJsonArrayOfString);
68 public Mono<List<String>> getPolicyIdentities() {
69 JSONObject paramsJson = new JSONObject();
70 paramsJson.put("near-rt-ric-url", ricConfig.baseUrl());
71 String inputJsonString = createInputJsonString(paramsJson);
72 logger.debug("POST getPolicyIdentities inputJsonString = {}", inputJsonString);
75 .postWithAuthHeader("/A1-ADAPTER-API:getPolicyIdentities", inputJsonString, A1_CONTROLLER_USERNAME,
76 A1_CONTROLLER_PASSWORD) //
77 .flatMap(response -> getValueFromResponse(response, "policy-id-list")) //
78 .flatMap(this::parseJsonArrayOfString);
82 public Mono<String> getPolicyTypeSchema(String policyTypeId) {
83 JSONObject paramsJson = new JSONObject();
84 paramsJson.put("near-rt-ric-url", ricConfig.baseUrl());
85 paramsJson.put("policy-type-id", policyTypeId);
86 String inputJsonString = createInputJsonString(paramsJson);
87 logger.debug("POST getPolicyType inputJsonString = {}", inputJsonString);
90 .postWithAuthHeader("/A1-ADAPTER-API:getPolicyType", inputJsonString, A1_CONTROLLER_USERNAME,
91 A1_CONTROLLER_PASSWORD) //
92 .flatMap(response -> getValueFromResponse(response, "policy-type")) //
93 .flatMap(this::extractPolicySchema);
97 public Mono<String> putPolicy(Policy policy) {
98 JSONObject paramsJson = new JSONObject();
99 paramsJson.put("near-rt-ric-url", ricConfig.baseUrl());
100 paramsJson.put("policy-id", policy.id());
101 paramsJson.put("policy-type-id", policy.type().name());
102 paramsJson.put("policy", policy.json());
103 String inputJsonString = createInputJsonString(paramsJson);
104 logger.debug("POST putPolicy inputJsonString = {}", inputJsonString);
107 .postWithAuthHeader("/A1-ADAPTER-API:putPolicy", inputJsonString, A1_CONTROLLER_USERNAME,
108 A1_CONTROLLER_PASSWORD) //
109 .flatMap(response -> getValueFromResponse(response, "returned-policy")) //
110 .flatMap(this::validateJson);
114 public Mono<String> deletePolicy(Policy policy) {
115 return deletePolicy(policy.id());
119 public Flux<String> deleteAllPolicies() {
120 return getPolicyIdentities() //
121 .flatMapMany(policyIds -> Flux.fromIterable(policyIds)) // )
122 .flatMap(policyId -> deletePolicy(policyId)); //
125 public Mono<String> deletePolicy(String policyId) {
126 JSONObject paramsJson = new JSONObject();
127 paramsJson.put("near-rt-ric-url", ricConfig.baseUrl());
128 paramsJson.put("policy-id", policyId);
129 String inputJsonString = createInputJsonString(paramsJson);
130 logger.debug("POST deletePolicy inputJsonString = {}", inputJsonString);
132 return restClient.postWithAuthHeader("/A1-ADAPTER-API:deletePolicy", inputJsonString, A1_CONTROLLER_USERNAME,
133 A1_CONTROLLER_PASSWORD);
137 public Mono<A1ProtocolType> getProtocolVersion() {
138 return getPolicyTypeIdentities() //
139 .flatMap(x -> Mono.just(A1ProtocolType.SDNC_OSC));
142 private String createInputJsonString(JSONObject paramsJson) {
143 JSONObject inputJson = new JSONObject();
144 inputJson.put("input", paramsJson);
145 return inputJson.toString();
148 private Mono<String> getValueFromResponse(String response, String key) {
149 logger.debug("A1 client: response = {}", response);
151 JSONObject outputJson = new JSONObject(response);
152 JSONObject responseParams = outputJson.getJSONObject("output");
153 String value = responseParams.get(key).toString();
154 return Mono.just(value);
155 } catch (JSONException ex) { // invalid json
156 return Mono.error(ex);
160 private Mono<List<String>> parseJsonArrayOfString(String inputString) {
162 List<String> arrayList = new ArrayList<>();
163 JSONArray jsonArray = new JSONArray(inputString);
164 for (int i = 0; i < jsonArray.length(); i++) {
165 arrayList.add(jsonArray.getString(i));
167 logger.debug("A1 client: received list = {}", arrayList);
168 return Mono.just(arrayList);
169 } catch (JSONException ex) { // invalid json
170 return Mono.error(ex);
174 private Mono<String> extractPolicySchema(String inputString) {
176 JSONObject jsonObject = new JSONObject(inputString);
177 JSONObject schemaObject = jsonObject.getJSONObject("policySchema");
178 String schemaString = schemaObject.toString();
179 return Mono.just(schemaString);
180 } catch (JSONException ex) { // invalid json
181 return Mono.error(ex);
185 private Mono<String> validateJson(String inputString) {
187 new JSONObject(inputString);
188 return Mono.just(inputString);
189 } catch (JSONException ex) { // invalid json
190 return Mono.error(ex);