145a823ce83ec56f9331084e03e980e63773568f
[nonrtric/plt/a1policymanagementservice.git] / add-src / main / java / org / onap / ccsdk / oran / a1policymanagementservice / clients / A1MediatorAdapterI.java
1 /*-
2  * ========================LICENSE_START=================================
3  * O-RAN-SC
4  * %%
5  *  Copyright (C) 2024 OpenInfra Foundation Europe. 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 static org.onap.ccsdk.oran.a1policymanagementservice.clients.OscA1Client.extractCreateSchema;
24
25 import java.lang.invoke.MethodHandles;
26 import java.util.List;
27 import java.util.Set;
28 import org.onap.ccsdk.oran.a1policymanagementservice.configuration.RicConfig;
29 import org.onap.ccsdk.oran.a1policymanagementservice.repository.Policy;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32 import reactor.core.publisher.Flux;
33 import reactor.core.publisher.Mono;
34
35 /**
36  * Client for accessing OSC A1-Mediator A1-P Version (Release I)
37  */
38 @SuppressWarnings("squid:S2629") // Invoke method(s) only conditionally
39 public class A1MediatorAdapterI implements A1Client {
40     static final int CONCURRENCY_RIC = 1; // How many parallel requests that is sent to one NearRT RIC
41
42     public static class Factory implements A1Client.Factory {
43         @Override
44         public A1Client create(RicConfig ricConfig, AsyncRestClientFactory restClientFactory) {
45             return new A1MediatorAdapterI(ricConfig, restClientFactory);
46         }
47     }
48
49     public static class A1MediatorRelIUriBuilder extends StdA1ClientVersion2.OranV2UriBuilder{
50         public A1MediatorRelIUriBuilder(RicConfig ricConfig) {
51             super(ricConfig);
52         }
53     }
54
55     private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
56     private final AsyncRestClient restClient;
57     private final A1MediatorRelIUriBuilder uriBuilder;
58
59     public A1MediatorAdapterI(RicConfig ricConfig, AsyncRestClientFactory restClientFactory) {
60         this(ricConfig, restClientFactory.createRestClientUseHttpProxy(""));
61     }
62
63     public A1MediatorAdapterI(RicConfig ricConfig, AsyncRestClient restClient) {
64         this.restClient = restClient;
65         logger.debug("A1MediatorAdapterI for ric: {}", ricConfig.getRicId());
66         uriBuilder = new A1MediatorRelIUriBuilder(ricConfig);
67     }
68
69     @Override
70     public Mono<List<String>> getPolicyTypeIdentities() {
71         return getPolicyTypeIds() //
72                 .collectList();
73     }
74
75     @Override
76     public Mono<List<String>> getPolicyIdentities() {
77         return getPolicyTypeIds() //
78                 .flatMap(this::getPolicyIdentitiesByType) //
79                 .collectList();
80     }
81
82     @Override
83     public Mono<String> getPolicyTypeSchema(String policyTypeId) {
84         String schemaUri = uriBuilder.createGetSchemaUri(policyTypeId);
85         return restClient.get(schemaUri) //
86                 .flatMap(response -> extractCreateSchema(response, policyTypeId));
87     }
88
89     @Override
90     public Mono<String> putPolicy(Policy policy) {
91         String policyUri = this.uriBuilder.createPutPolicyUri(policy.getType().getId(), policy.getId(),
92                 policy.getStatusNotificationUri());
93         return restClient.put(policyUri, policy.getJson());
94     }
95
96     @Override
97     public Mono<String> deletePolicy(Policy policy) {
98         return deletePolicyById(policy.getType().getId(), policy.getId());
99     }
100
101     @Override
102     public Mono<A1ProtocolType> getProtocolVersion() {
103         return Mono.just(A1ProtocolType.CUSTOM_PROTOCOL);
104     }
105
106     @Override
107     public Flux<String> deleteAllPolicies(Set<String> excludePolicyIds) {
108         return getPolicyTypeIds() //
109                 .flatMap(typeId -> deletePoliciesForType(typeId, excludePolicyIds), CONCURRENCY_RIC);
110     }
111
112     @Override
113     public Mono<String> getPolicyStatus(Policy policy) {
114         String statusUri = uriBuilder.createGetPolicyStatusUri(policy.getType().getId(), policy.getId());
115         return restClient.get(statusUri);
116
117     }
118
119     private Flux<String> getPolicyTypeIds() {
120         return restClient.get(uriBuilder.createPolicyTypesUri()) //
121                 .flatMapMany(A1AdapterJsonHelper::parseJsonArrayOfString);
122     }
123
124     private Flux<String> getPolicyIdentitiesByType(String typeId) {
125         return restClient.get(uriBuilder.createGetPolicyIdsUri(typeId)) //
126                 .flatMapMany(A1AdapterJsonHelper::parseJsonArrayOfString);
127     }
128
129     private Mono<String> deletePolicyById(String typeId, String policyId) {
130         String policyUri = uriBuilder.createDeleteUri(typeId, policyId);
131         return restClient.delete(policyUri);
132     }
133
134     private Flux<String> deletePoliciesForType(String typeId, Set<String> excludePolicyIds) {
135         return getPolicyIdentitiesByType(typeId) //
136                 .filter(policyId -> !excludePolicyIds.contains(policyId)) //
137                 .flatMap(policyId -> deletePolicyById(typeId, policyId), CONCURRENCY_RIC);
138     }
139 }