2 * ========================LICENSE_START=================================
5 * Copyright (C) 2020 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;
26 import java.util.Optional;
28 import org.immutables.gson.Gson;
29 import org.immutables.value.Value;
30 import org.oransc.policyagent.configuration.ControllerConfig;
31 import org.oransc.policyagent.configuration.RicConfig;
32 import org.oransc.policyagent.configuration.WebClientConfig;
33 import org.oransc.policyagent.repository.Policy;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
37 import reactor.core.publisher.Flux;
38 import reactor.core.publisher.Mono;
41 * Client for accessing the A1 adapter in the SDNC controller in ONAP
43 @SuppressWarnings("squid:S2629") // Invoke method(s) only conditionally
44 public class SdncOnapA1Client implements A1Client {
47 interface SdncOnapAdapterInput {
48 public String nearRtRicId();
50 public Optional<String> policyTypeId();
52 public Optional<String> policyInstanceId();
54 public Optional<String> policyInstance();
56 public Optional<List<String>> properties();
59 private static final String URL_PREFIX = "/A1-ADAPTER-API:";
61 private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
63 private final ControllerConfig controllerConfig;
64 private final RicConfig ricConfig;
65 private final AsyncRestClient restClient;
67 public SdncOnapA1Client(RicConfig ricConfig, ControllerConfig controllerConfig, WebClientConfig clientConfig) {
68 this(ricConfig, controllerConfig,
69 new AsyncRestClient(controllerConfig.baseUrl() + "/restconf/operations", clientConfig));
70 logger.debug("SdncOnapA1Client for ric: {}, a1ControllerBaseUrl: {}", ricConfig.name(),
71 controllerConfig.baseUrl());
74 public SdncOnapA1Client(RicConfig ricConfig, ControllerConfig controllerConfig, AsyncRestClient restClient) {
75 this.ricConfig = ricConfig;
76 this.controllerConfig = controllerConfig;
77 this.restClient = restClient;
81 public Mono<List<String>> getPolicyTypeIdentities() {
82 return getPolicyTypeIds() //
87 public Mono<List<String>> getPolicyIdentities() {
88 return getPolicyTypeIds() //
89 .flatMap(this::getPolicyIdentitiesByType) //
94 public Mono<String> getPolicyTypeSchema(String policyTypeId) {
95 SdncOnapAdapterInput inputParams = ImmutableSdncOnapAdapterInput.builder() //
96 .nearRtRicId(ricConfig.baseUrl()) //
97 .policyTypeId(policyTypeId) //
99 String inputJsonString = SdncJsonHelper.createInputJsonString(inputParams);
100 logger.debug("POST getPolicyType inputJsonString = {}", inputJsonString);
103 .postWithAuthHeader(URL_PREFIX + "getPolicyType", inputJsonString, controllerConfig.userName(),
104 controllerConfig.password()) //
105 .flatMap(response -> SdncJsonHelper.getValueFromResponse(response, "policy-type")) //
106 .flatMap(SdncJsonHelper::extractPolicySchema);
110 public Mono<String> putPolicy(Policy policy) {
111 SdncOnapAdapterInput inputParams = ImmutableSdncOnapAdapterInput.builder() //
112 .nearRtRicId(ricConfig.baseUrl()) //
113 .policyTypeId(policy.type().name()) //
114 .policyInstanceId(policy.id()) //
115 .policyInstance(policy.json()) //
116 .properties(new ArrayList<>()) //
119 String inputJsonString = SdncJsonHelper.createInputJsonString(inputParams);
120 logger.debug("POST putPolicy inputJsonString = {}", inputJsonString);
122 return restClient.postWithAuthHeader(URL_PREFIX + "createPolicyInstance", inputJsonString,
123 controllerConfig.userName(), controllerConfig.password());
127 public Mono<String> deletePolicy(Policy policy) {
128 return deletePolicyByTypeId(policy.type().name(), policy.id());
132 public Flux<String> deleteAllPolicies() {
133 return getPolicyTypeIds() //
134 .flatMap(this::deletePoliciesForType); //
138 public Mono<A1ProtocolType> getProtocolVersion() {
139 return getPolicyTypeIdentities() //
140 .flatMap(notUsed -> Mono.just(A1ProtocolType.SDNC_ONAP));
144 public Mono<String> getPolicyStatus(Policy policy) {
145 return Mono.error(new Exception("Status not implemented in the controller"));
148 private Flux<String> getPolicyTypeIds() {
149 SdncOnapAdapterInput inputParams = ImmutableSdncOnapAdapterInput.builder() //
150 .nearRtRicId(ricConfig.baseUrl()) //
152 String inputJsonString = SdncJsonHelper.createInputJsonString(inputParams);
153 logger.debug("POST getPolicyTypeIdentities inputJsonString = {}", inputJsonString);
156 .postWithAuthHeader(URL_PREFIX + "getPolicyTypes", inputJsonString, controllerConfig.userName(),
157 controllerConfig.password()) //
158 .flatMap(response -> SdncJsonHelper.getValueFromResponse(response, "policy-type-id-list")) //
159 .flatMapMany(SdncJsonHelper::parseJsonArrayOfString);
162 private Flux<String> getPolicyIdentitiesByType(String policyTypeId) {
163 SdncOnapAdapterInput inputParams = ImmutableSdncOnapAdapterInput.builder() //
164 .nearRtRicId(ricConfig.baseUrl()) //
165 .policyTypeId(policyTypeId) //
167 String inputJsonString = SdncJsonHelper.createInputJsonString(inputParams);
168 logger.debug("POST getPolicyIdentities inputJsonString = {}", inputJsonString);
171 .postWithAuthHeader(URL_PREFIX + "getPolicyInstances", inputJsonString, controllerConfig.userName(),
172 controllerConfig.password()) //
173 .flatMap(response -> SdncJsonHelper.getValueFromResponse(response, "policy-instance-id-list")) //
174 .flatMapMany(SdncJsonHelper::parseJsonArrayOfString);
177 private Flux<String> deletePoliciesForType(String typeId) {
178 return getPolicyIdentitiesByType(typeId) //
179 .flatMap(policyId -> deletePolicyByTypeId(typeId, policyId)); //
182 private Mono<String> deletePolicyByTypeId(String policyTypeId, String policyId) {
183 SdncOnapAdapterInput inputParams = ImmutableSdncOnapAdapterInput.builder() //
184 .nearRtRicId(ricConfig.baseUrl()) //
185 .policyTypeId(policyTypeId) //
186 .policyInstanceId(policyId) //
188 String inputJsonString = SdncJsonHelper.createInputJsonString(inputParams);
189 logger.debug("POST deletePolicy inputJsonString = {}", inputJsonString);
191 return restClient.postWithAuthHeader(URL_PREFIX + "deletePolicyInstance", inputJsonString,
192 controllerConfig.userName(), controllerConfig.password());