804513adf3b79c66db35db42f283847de0f6749f
[nonrtric.git] / policy-agent / src / main / java / org / oransc / policyagent / clients / SdncOscA1Client.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.Arrays;
25 import java.util.List;
26
27 import org.oransc.policyagent.configuration.RicConfig;
28 import org.oransc.policyagent.repository.Policy;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31
32 import reactor.core.publisher.Flux;
33 import reactor.core.publisher.Mono;
34
35 @SuppressWarnings("squid:S2629") // Invoke method(s) only conditionally
36 public class SdncOscA1Client implements A1Client {
37
38     private static final String URL_PREFIX = "/A1-ADAPTER-API:";
39     private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
40     private final String a1ControllerUsername;
41     private final String a1ControllerPassword;
42     private final RicConfig ricConfig;
43     private final AsyncRestClient restClient;
44
45     public SdncOscA1Client(RicConfig ricConfig, String baseUrl, String username, String password) {
46         this(ricConfig, username, password, new AsyncRestClient(baseUrl + "/restconf/operations"));
47         logger.debug("SdncOscA1Client for ric: {}, a1ControllerBaseUrl: {}", ricConfig.name(), baseUrl);
48     }
49
50     public SdncOscA1Client(RicConfig ricConfig, String username, String password, AsyncRestClient restClient) {
51         this.ricConfig = ricConfig;
52         this.a1ControllerUsername = username;
53         this.a1ControllerPassword = password;
54         this.restClient = restClient;
55     }
56
57     @Override
58     public Mono<List<String>> getPolicyTypeIdentities() {
59         return Mono.just(Arrays.asList(""));
60     }
61
62     @Override
63     public Mono<List<String>> getPolicyIdentities() {
64         return getPolicyIds() //
65             .collectList();
66     }
67
68     @Override
69     public Mono<String> getPolicyTypeSchema(String policyTypeId) {
70         return Mono.just("{}");
71     }
72
73     @Override
74     public Mono<String> putPolicy(Policy policy) {
75         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
76             .nearRtRicUrl(ricConfig.baseUrl()) //
77             .policyTypeId(policy.type().name()) //
78             .policyId(policy.id()) //
79             .policy(policy.json()) //
80             .build();
81         String inputJsonString = JsonHelper.createInputJsonString(inputParams);
82         return restClient
83             .postWithAuthHeader(URL_PREFIX + "putPolicy", inputJsonString, a1ControllerUsername, a1ControllerPassword)
84             .flatMap(response -> JsonHelper.getValueFromResponse(response, "returned-policy")) //
85             .flatMap(JsonHelper::validateJson);
86     }
87
88     @Override
89     public Mono<String> deletePolicy(Policy policy) {
90         return deletePolicyById(policy.id());
91     }
92
93     @Override
94     public Flux<String> deleteAllPolicies() {
95         return getPolicyIds() //
96             .flatMap(this::deletePolicyById); //
97     }
98
99     @Override
100     public Mono<A1ProtocolType> getProtocolVersion() {
101         return getPolicyIdentities() //
102             .flatMap(x -> Mono.just(A1ProtocolType.SDNC_OSC));
103     }
104
105     @Override
106     public Mono<String> getPolicyStatus(Policy policy) {
107         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
108             .nearRtRicUrl(ricConfig.baseUrl()) //
109             .policyId(policy.id()) //
110             .build();
111         String inputJsonString = JsonHelper.createInputJsonString(inputParams);
112         logger.debug("POST getPolicyStatus inputJsonString = {}", inputJsonString);
113
114         return restClient
115             .postWithAuthHeader(URL_PREFIX + "getPolicyStatus", inputJsonString, a1ControllerUsername,
116                 a1ControllerPassword) //
117             .flatMap(response -> JsonHelper.getValueFromResponse(response, "policy-status"));
118     }
119
120     private Flux<String> getPolicyIds() {
121         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
122             .nearRtRicUrl(ricConfig.baseUrl()) //
123             .build();
124         String inputJsonString = JsonHelper.createInputJsonString(inputParams);
125         return restClient
126             .postWithAuthHeader(URL_PREFIX + "getPolicyIdentities", inputJsonString, a1ControllerUsername,
127                 a1ControllerPassword) //
128             .flatMap(response -> JsonHelper.getValueFromResponse(response, "policy-id-list")) //
129             .flatMapMany(JsonHelper::parseJsonArrayOfString);
130     }
131
132     private Mono<String> deletePolicyById(String policyId) {
133         SdncOscAdapterInput inputParams = ImmutableSdncOscAdapterInput.builder() //
134             .nearRtRicUrl(ricConfig.baseUrl()) //
135             .policyId(policyId) //
136             .build();
137
138         String inputJsonString = JsonHelper.createInputJsonString(inputParams);
139         return restClient.postWithAuthHeader(URL_PREFIX + "deletePolicy", inputJsonString, a1ControllerUsername,
140             a1ControllerPassword);
141     }
142 }