Merge "Added STD sim 2.0.0 tests"
[nonrtric.git] / policy-agent / src / main / java / org / oransc / policyagent / clients / SdncOnapA1Client.java
1 /*-
2  * ========================LICENSE_START=================================
3  * O-RAN-SC
4  * %%
5  * Copyright (C) 2020 Nordix Foundation
6  * %%
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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===================================
19  */
20
21 package org.oransc.policyagent.clients;
22
23 import java.lang.invoke.MethodHandles;
24 import java.util.ArrayList;
25 import java.util.List;
26 import java.util.Optional;
27
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;
36
37 import reactor.core.publisher.Flux;
38 import reactor.core.publisher.Mono;
39
40 /**
41  * Client for accessing the A1 adapter in the SDNC controller in ONAP
42  */
43 @SuppressWarnings("squid:S2629") // Invoke method(s) only conditionally
44 public class SdncOnapA1Client implements A1Client {
45     @Value.Immutable
46     @Gson.TypeAdapters
47     interface SdncOnapAdapterInput {
48         public String nearRtRicId();
49
50         public Optional<String> policyTypeId();
51
52         public Optional<String> policyInstanceId();
53
54         public Optional<String> policyInstance();
55
56         public Optional<List<String>> properties();
57     }
58
59     private static final String URL_PREFIX = "/A1-ADAPTER-API:";
60
61     private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
62
63     private final ControllerConfig controllerConfig;
64     private final RicConfig ricConfig;
65     private final AsyncRestClient restClient;
66
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());
72     }
73
74     public SdncOnapA1Client(RicConfig ricConfig, ControllerConfig controllerConfig, AsyncRestClient restClient) {
75         this.ricConfig = ricConfig;
76         this.controllerConfig = controllerConfig;
77         this.restClient = restClient;
78     }
79
80     @Override
81     public Mono<List<String>> getPolicyTypeIdentities() {
82         return getPolicyTypeIds() //
83             .collectList();
84     }
85
86     @Override
87     public Mono<List<String>> getPolicyIdentities() {
88         return getPolicyTypeIds() //
89             .flatMap(this::getPolicyIdentitiesByType) //
90             .collectList();
91     }
92
93     @Override
94     public Mono<String> getPolicyTypeSchema(String policyTypeId) {
95         SdncOnapAdapterInput inputParams = ImmutableSdncOnapAdapterInput.builder() //
96             .nearRtRicId(ricConfig.baseUrl()) //
97             .policyTypeId(policyTypeId) //
98             .build();
99         String inputJsonString = SdncJsonHelper.createInputJsonString(inputParams);
100         logger.debug("POST getPolicyType inputJsonString = {}", inputJsonString);
101
102         return restClient
103             .postWithAuthHeader(URL_PREFIX + "getPolicyType", inputJsonString, controllerConfig.userName(),
104                 controllerConfig.password()) //
105             .flatMap(response -> SdncJsonHelper.getValueFromResponse(response, "policy-type")) //
106             .flatMap(SdncJsonHelper::extractPolicySchema);
107     }
108
109     @Override
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<>()) //
117             .build();
118
119         String inputJsonString = SdncJsonHelper.createInputJsonString(inputParams);
120         logger.debug("POST putPolicy inputJsonString = {}", inputJsonString);
121
122         return restClient.postWithAuthHeader(URL_PREFIX + "createPolicyInstance", inputJsonString,
123             controllerConfig.userName(), controllerConfig.password());
124     }
125
126     @Override
127     public Mono<String> deletePolicy(Policy policy) {
128         return deletePolicyByTypeId(policy.type().name(), policy.id());
129     }
130
131     @Override
132     public Flux<String> deleteAllPolicies() {
133         return getPolicyTypeIds() //
134             .flatMap(this::deletePoliciesForType); //
135     }
136
137     @Override
138     public Mono<A1ProtocolType> getProtocolVersion() {
139         return getPolicyTypeIdentities() //
140             .flatMap(notUsed -> Mono.just(A1ProtocolType.SDNC_ONAP));
141     }
142
143     @Override
144     public Mono<String> getPolicyStatus(Policy policy) {
145         return Mono.error(new Exception("Status not implemented in the controller"));
146     }
147
148     private Flux<String> getPolicyTypeIds() {
149         SdncOnapAdapterInput inputParams = ImmutableSdncOnapAdapterInput.builder() //
150             .nearRtRicId(ricConfig.baseUrl()) //
151             .build();
152         String inputJsonString = SdncJsonHelper.createInputJsonString(inputParams);
153         logger.debug("POST getPolicyTypeIdentities inputJsonString = {}", inputJsonString);
154
155         return restClient
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);
160     }
161
162     private Flux<String> getPolicyIdentitiesByType(String policyTypeId) {
163         SdncOnapAdapterInput inputParams = ImmutableSdncOnapAdapterInput.builder() //
164             .nearRtRicId(ricConfig.baseUrl()) //
165             .policyTypeId(policyTypeId) //
166             .build();
167         String inputJsonString = SdncJsonHelper.createInputJsonString(inputParams);
168         logger.debug("POST getPolicyIdentities inputJsonString = {}", inputJsonString);
169
170         return restClient
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);
175     }
176
177     private Flux<String> deletePoliciesForType(String typeId) {
178         return getPolicyIdentitiesByType(typeId) //
179             .flatMap(policyId -> deletePolicyByTypeId(typeId, policyId)); //
180     }
181
182     private Mono<String> deletePolicyByTypeId(String policyTypeId, String policyId) {
183         SdncOnapAdapterInput inputParams = ImmutableSdncOnapAdapterInput.builder() //
184             .nearRtRicId(ricConfig.baseUrl()) //
185             .policyTypeId(policyTypeId) //
186             .policyInstanceId(policyId) //
187             .build();
188         String inputJsonString = SdncJsonHelper.createInputJsonString(inputParams);
189         logger.debug("POST deletePolicy inputJsonString = {}", inputJsonString);
190
191         return restClient.postWithAuthHeader(URL_PREFIX + "deletePolicyInstance", inputJsonString,
192             controllerConfig.userName(), controllerConfig.password());
193     }
194 }