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;
30 import org.json.JSONArray;
31 import org.json.JSONException;
32 import org.json.JSONObject;
33 import org.oransc.policyagent.configuration.RicConfig;
34 import org.oransc.policyagent.repository.Policy;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
38 import reactor.core.publisher.Flux;
39 import reactor.core.publisher.Mono;
41 public class SdncOscA1Client implements A1Client {
42 private static final String URL_PREFIX = "/A1-ADAPTER-API:";
44 private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
46 private final String a1ControllerUsername;
47 private final String a1ControllerPassword;
48 private final RicConfig ricConfig;
49 private final AsyncRestClient restClient;
51 private static Gson gson = new GsonBuilder() //
52 .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES) //
55 public SdncOscA1Client(RicConfig ricConfig, String baseUrl, String username, String password) {
56 this(ricConfig, username, password, new AsyncRestClient(baseUrl + "/restconf/operations"));
57 if (logger.isDebugEnabled()) {
58 logger.debug("SdncOscA1Client for ric: {}, a1ControllerBaseUrl: {}", ricConfig.name(), baseUrl);
62 public SdncOscA1Client(RicConfig ricConfig, String username, String password, AsyncRestClient restClient) {
63 this.ricConfig = ricConfig;
64 this.a1ControllerUsername = username;
65 this.a1ControllerPassword = password;
66 this.restClient = restClient;
70 public Mono<List<String>> getPolicyTypeIdentities() {
71 SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
72 .nearRtRicUrl(ricConfig.baseUrl()) //
74 String inputJsonString = createInputJsonString(inputParams);
75 logger.debug("POST getPolicyTypeIdentities inputJsonString = {}", inputJsonString);
78 .postWithAuthHeader(URL_PREFIX + "getPolicyTypeIdentities", inputJsonString, a1ControllerUsername,
79 a1ControllerPassword) //
80 .flatMap(response -> getValueFromResponse(response, "policy-type-id-list")) //
81 .flatMap(this::parseJsonArrayOfString);
85 public Mono<List<String>> getPolicyIdentities() {
86 SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
87 .nearRtRicUrl(ricConfig.baseUrl()) //
89 String inputJsonString = createInputJsonString(inputParams);
90 logger.debug("POST getPolicyIdentities inputJsonString = {}", inputJsonString);
93 .postWithAuthHeader(URL_PREFIX + "getPolicyIdentities", inputJsonString, a1ControllerUsername,
94 a1ControllerPassword) //
95 .flatMap(response -> getValueFromResponse(response, "policy-id-list")) //
96 .flatMap(this::parseJsonArrayOfString);
100 public Mono<String> getPolicyTypeSchema(String policyTypeId) {
101 SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
102 .nearRtRicUrl(ricConfig.baseUrl()) //
103 .policyTypeId(policyTypeId) //
105 String inputJsonString = createInputJsonString(inputParams);
106 logger.debug("POST getPolicyType inputJsonString = {}", inputJsonString);
109 .postWithAuthHeader(URL_PREFIX + "getPolicyType", inputJsonString, a1ControllerUsername,
110 a1ControllerPassword) //
111 .flatMap(response -> getValueFromResponse(response, "policy-type")) //
112 .flatMap(this::extractPolicySchema);
116 public Mono<String> putPolicy(Policy policy) {
117 SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
118 .nearRtRicUrl(ricConfig.baseUrl()) //
119 .policyTypeId(policy.type().name()) //
120 .policyId(policy.id()) //
121 .policy(policy.json()) //
123 String inputJsonString = createInputJsonString(inputParams);
124 logger.debug("POST putPolicy inputJsonString = {}", inputJsonString);
127 .postWithAuthHeader(URL_PREFIX + "putPolicy", inputJsonString, a1ControllerUsername, a1ControllerPassword)
128 .flatMap(response -> getValueFromResponse(response, "returned-policy")) //
129 .flatMap(this::validateJson);
133 public Mono<String> deletePolicy(Policy policy) {
134 return deletePolicyById(policy.id());
138 public Flux<String> deleteAllPolicies() {
139 return getPolicyIdentities() //
140 .flatMapMany(policyIds -> Flux.fromIterable(policyIds)) // )
141 .flatMap(policyId -> deletePolicyById(policyId)); //
145 public Mono<A1ProtocolType> getProtocolVersion() {
146 return getPolicyTypeIdentities() //
147 .flatMap(x -> Mono.just(A1ProtocolType.SDNC_OSC));
151 public Mono<String> getPolicyStatus(Policy policy) {
152 return Mono.error(new Exception("Status not implemented in the SDNC controller"));
155 private Mono<String> getValueFromResponse(String response, String key) {
156 logger.debug("A1 client: response = {}", response);
158 JSONObject outputJson = new JSONObject(response);
159 JSONObject responseParams = outputJson.getJSONObject("output");
160 if (!responseParams.has(key)) {
161 return Mono.just("");
163 String value = responseParams.get(key).toString();
164 return Mono.just(value);
165 } catch (JSONException ex) { // invalid json
166 return Mono.error(ex);
170 private Mono<List<String>> parseJsonArrayOfString(String inputString) {
172 List<String> arrayList = new ArrayList<>();
173 if (inputString.isEmpty()) {
174 return Mono.just(arrayList);
176 JSONArray jsonArray = new JSONArray(inputString);
177 for (int i = 0; i < jsonArray.length(); i++) {
178 arrayList.add(jsonArray.getString(i));
180 logger.debug("A1 client: received list = {}", arrayList);
181 return Mono.just(arrayList);
182 } catch (JSONException ex) { // invalid json
183 return Mono.error(ex);
187 private Mono<String> extractPolicySchema(String inputString) {
189 JSONObject jsonObject = new JSONObject(inputString);
190 JSONObject schemaObject = jsonObject.getJSONObject("policySchema");
191 String schemaString = schemaObject.toString();
192 return Mono.just(schemaString);
193 } catch (JSONException ex) { // invalid json
194 return Mono.error(ex);
198 private Mono<String> validateJson(String inputString) {
200 new JSONObject(inputString);
201 return Mono.just(inputString);
202 } catch (JSONException ex) { // invalid json
203 return Mono.error(ex);
207 private Mono<String> deletePolicyById(String policyId) {
208 SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
209 .nearRtRicUrl(ricConfig.baseUrl()) //
210 .policyId(policyId) //
213 String inputJsonString = createInputJsonString(inputParams);
214 logger.debug("POST deletePolicy inputJsonString = {}", inputJsonString);
216 return restClient.postWithAuthHeader(URL_PREFIX + "deletePolicy", inputJsonString, a1ControllerUsername,
217 a1ControllerPassword);
220 private String createInputJsonString(SdncOscAdapterInput params) {
221 JSONObject inputJson = new JSONObject();
222 inputJson.put("input", new JSONObject(gson.toJson(params)));
223 return inputJson.toString();