68b0ab186817fe8a168580e7a3de33f808b44739
[ccsdk/oran.git] /
1 /*-
2  * ========================LICENSE_START=================================
3  * ONAP : ccsdk oran
4  * ======================================================================
5  * Copyright (C) 2020 Nordix Foundation. All rights reserved.
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.onap.ccsdk.oran.a1policymanagementservice.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.onap.ccsdk.oran.a1policymanagementservice.configuration.ControllerConfig;
31 import org.onap.ccsdk.oran.a1policymanagementservice.configuration.RicConfig;
32 import org.onap.ccsdk.oran.a1policymanagementservice.repository.Policy;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35
36 import reactor.core.publisher.Flux;
37 import reactor.core.publisher.Mono;
38
39 /**
40  * Client for accessing the A1 adapter in the SDNC controller in ONAP
41  */
42 @SuppressWarnings("squid:S2629") // Invoke method(s) only conditionally
43 public class SdncOnapA1Client implements A1Client {
44     @Value.Immutable
45     @Gson.TypeAdapters
46     interface SdncOnapAdapterInput {
47         public String nearRtRicId();
48
49         public Optional<String> policyTypeId();
50
51         public Optional<String> policyInstanceId();
52
53         public Optional<String> policyInstance();
54
55         public Optional<List<String>> properties();
56     }
57
58     private static final String URL_PREFIX = "/A1-ADAPTER-API:";
59
60     private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
61
62     private final ControllerConfig controllerConfig;
63     private final RicConfig ricConfig;
64     private final AsyncRestClient restClient;
65
66     public SdncOnapA1Client(RicConfig ricConfig, ControllerConfig controllerConfig,
67             AsyncRestClientFactory restClientFactory) {
68         this(ricConfig, controllerConfig,
69                 restClientFactory.createRestClient(controllerConfig.baseUrl() + "/restconf/operations"));
70         logger.debug("SdncOnapA1Client for ric: {}, a1ControllerBaseUrl: {}", ricConfig.ricId(),
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().id()) //
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().id(), 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 }