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 com.google.gson.FieldNamingPolicy;
24 import com.google.gson.Gson;
25 import com.google.gson.GsonBuilder;
26 import java.lang.invoke.MethodHandles;
27 import java.util.ArrayList;
28 import java.util.List;
29 import org.json.JSONArray;
30 import org.json.JSONException;
31 import org.json.JSONObject;
32 import org.oransc.policyagent.configuration.RicConfig;
33 import org.oransc.policyagent.repository.Policy;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36 import reactor.core.publisher.Flux;
37 import reactor.core.publisher.Mono;
39 public class SdncOscA1Client implements A1Client {
40 private static final String URL_PREFIX = "/A1-ADAPTER-API:";
42 private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
44 private final String a1ControllerUsername;
45 private final String a1ControllerPassword;
46 private final RicConfig ricConfig;
47 private final AsyncRestClient restClient;
49 private static Gson gson = new GsonBuilder() //
50 .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES) //
53 public SdncOscA1Client(RicConfig ricConfig, String baseUrl, String username, String password) {
54 this(ricConfig, username, password, new AsyncRestClient(baseUrl + "/restconf/operations"));
55 if (logger.isDebugEnabled()) {
56 logger.debug("SdncOscA1Client for ric: {}, a1ControllerBaseUrl: {}", ricConfig.name(), baseUrl);
60 public SdncOscA1Client(RicConfig ricConfig, String username, String password, AsyncRestClient restClient) {
61 this.ricConfig = ricConfig;
62 this.a1ControllerUsername = username;
63 this.a1ControllerPassword = password;
64 this.restClient = restClient;
68 public Mono<List<String>> getPolicyTypeIdentities() {
69 SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
70 .nearRtRicUrl(ricConfig.baseUrl()) //
72 String inputJsonString = createInputJsonString(inputParams);
73 logger.debug("POST getPolicyTypeIdentities inputJsonString = {}", inputJsonString);
76 .postWithAuthHeader(URL_PREFIX + "getPolicyTypeIdentities", inputJsonString, a1ControllerUsername,
77 a1ControllerPassword) //
78 .flatMap(response -> getValueFromResponse(response, "policy-type-id-list")) //
79 .flatMapMany(this::parseJsonArrayOfString) //
84 public Mono<List<String>> getPolicyIdentities() {
85 return getPolicyIds() //
90 public Mono<String> getPolicyTypeSchema(String policyTypeId) {
91 SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
92 .nearRtRicUrl(ricConfig.baseUrl()) //
93 .policyTypeId(policyTypeId) //
95 String inputJsonString = createInputJsonString(inputParams);
96 logger.debug("POST getPolicyType inputJsonString = {}", inputJsonString);
99 .postWithAuthHeader(URL_PREFIX + "getPolicyType", inputJsonString, a1ControllerUsername,
100 a1ControllerPassword) //
101 .flatMap(response -> getValueFromResponse(response, "policy-type")) //
102 .flatMap(this::extractPolicySchema);
106 public Mono<String> putPolicy(Policy policy) {
107 SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
108 .nearRtRicUrl(ricConfig.baseUrl()) //
109 .policyTypeId(policy.type().name()) //
110 .policyId(policy.id()) //
111 .policy(policy.json()) //
113 String inputJsonString = createInputJsonString(inputParams);
114 logger.debug("POST putPolicy inputJsonString = {}", inputJsonString);
117 .postWithAuthHeader(URL_PREFIX + "putPolicy", inputJsonString, a1ControllerUsername, a1ControllerPassword)
118 .flatMap(response -> getValueFromResponse(response, "returned-policy")) //
119 .flatMap(this::validateJson);
123 public Mono<String> deletePolicy(Policy policy) {
124 return deletePolicyById(policy.id());
128 public Flux<String> deleteAllPolicies() {
129 return getPolicyIds() //
130 .flatMap(this::deletePolicyById); //
134 public Mono<A1ProtocolType> getProtocolVersion() {
135 return getPolicyTypeIdentities() //
136 .flatMap(x -> Mono.just(A1ProtocolType.SDNC_OSC));
140 public Mono<String> getPolicyStatus(Policy policy) {
141 return Mono.error(new Exception("Status not implemented in the SDNC controller"));
144 private Flux<String> getPolicyIds() {
145 SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
146 .nearRtRicUrl(ricConfig.baseUrl()) //
148 String inputJsonString = createInputJsonString(inputParams);
149 logger.debug("POST getPolicyIdentities inputJsonString = {}", inputJsonString);
152 .postWithAuthHeader("/A1-ADAPTER-API:getPolicyIdentities", inputJsonString, a1ControllerUsername,
153 a1ControllerPassword) //
154 .flatMap(response -> getValueFromResponse(response, "policy-id-list")) //
155 .flatMapMany(this::parseJsonArrayOfString);
158 private Mono<String> getValueFromResponse(String response, String key) {
159 logger.debug("A1 client: response = {}", response);
161 JSONObject outputJson = new JSONObject(response);
162 JSONObject responseParams = outputJson.getJSONObject("output");
163 if (!responseParams.has(key)) {
164 return Mono.just("");
166 String value = responseParams.get(key).toString();
167 return Mono.just(value);
168 } catch (JSONException ex) { // invalid json
169 return Mono.error(ex);
173 private Flux<String> parseJsonArrayOfString(String inputString) {
175 List<String> arrayList = new ArrayList<>();
176 if (!inputString.isEmpty()) {
177 JSONArray jsonArray = new JSONArray(inputString);
178 for (int i = 0; i < jsonArray.length(); i++) {
179 arrayList.add(jsonArray.getString(i));
182 logger.debug("A1 client: received list = {}", arrayList);
183 return Flux.fromIterable(arrayList);
184 } catch (JSONException ex) { // invalid json
185 return Flux.error(ex);
189 private Mono<String> extractPolicySchema(String inputString) {
191 JSONObject jsonObject = new JSONObject(inputString);
192 JSONObject schemaObject = jsonObject.getJSONObject("policySchema");
193 String schemaString = schemaObject.toString();
194 return Mono.just(schemaString);
195 } catch (JSONException ex) { // invalid json
196 return Mono.error(ex);
200 private Mono<String> validateJson(String inputString) {
202 new JSONObject(inputString);
203 return Mono.just(inputString);
204 } catch (JSONException ex) { // invalid json
205 return Mono.error(ex);
209 private Mono<String> deletePolicyById(String policyId) {
210 SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
211 .nearRtRicUrl(ricConfig.baseUrl()) //
212 .policyId(policyId) //
215 String inputJsonString = createInputJsonString(inputParams);
216 logger.debug("POST deletePolicy inputJsonString = {}", inputJsonString);
218 return restClient.postWithAuthHeader(URL_PREFIX + "deletePolicy", inputJsonString, a1ControllerUsername,
219 a1ControllerPassword);
222 private String createInputJsonString(SdncOscAdapterInput params) {
223 JSONObject inputJson = new JSONObject();
224 inputJson.put("input", new JSONObject(gson.toJson(params)));
225 return inputJson.toString();