c4e5968ab03382ea8b41846d90c4d0d3cb026346
[so/adapters/so-cnf-adapter.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2020 Huawei Technologies Co., Ltd. All rights reserved.
6  * Modifications Copyright (C) 2021 Samsung Technologies Co.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21 package org.onap.so.adapters.cnf.service.synchrornization;
22
23 import org.apache.http.client.utils.URIBuilder;
24 import org.onap.so.adapters.cnf.client.MulticloudClient;
25 import org.onap.so.adapters.cnf.model.InstanceResponse;
26 import org.onap.so.adapters.cnf.model.aai.AaiRequest;
27 import org.onap.so.adapters.cnf.model.synchronization.SubscriptionRequest;
28 import org.onap.so.client.exception.BadResponseException;
29 import org.slf4j.Logger;
30 import org.slf4j.LoggerFactory;
31 import org.springframework.stereotype.Service;
32
33 import javax.annotation.PostConstruct;
34 import java.net.URISyntaxException;
35 import java.util.HashSet;
36 import java.util.Set;
37 import java.util.stream.Collectors;
38
39 @Service
40 public class SynchronizationService {
41
42     private static final Logger logger = LoggerFactory.getLogger(SynchronizationService.class);
43
44     private static final String PROTOCOL = "http";
45     private static final String HOST = "so-cnf-adapter";
46     private static final int PORT = 8090;
47
48     private final Set<String> subscriptions = new HashSet<>();
49     private final MulticloudClient multicloudClient;
50     private final SubscriptionsRecoveryProvider recoveryProvider;
51
52     public SynchronizationService(MulticloudClient multicloudClient, SubscriptionsRecoveryProvider recoveryProvider) {
53         this.multicloudClient = multicloudClient;
54         this.recoveryProvider = recoveryProvider;
55     }
56
57     @PostConstruct
58     private void postConstruct() {
59         recoverSubscriptions();
60     }
61
62     private void recoverSubscriptions() {
63         if (subscriptions.isEmpty()) {
64             Set<String> instanceIds;
65             try {
66
67                 instanceIds = recoveryProvider.getInstanceList();
68
69                 instanceIds.forEach(this::addSubscriptionIfSubscriptionFound);
70             } catch (BadResponseException e) {
71                 logger.error("Instances not found", e);
72             }
73         }
74     }
75
76     private void addSubscriptionIfSubscriptionFound(String instanceId) {
77         String subscriptionName = getSubscriptionName(instanceId);
78         try {
79             if (multicloudClient.hasSubscription(instanceId, subscriptionName))
80                 subscriptions.add(subscriptionName);
81         } catch (BadResponseException e) {
82             logger.warn("Subscriptions not found instanceId={} subscriptionName={}", instanceId, subscriptionName);
83         }
84     }
85
86     public void createSubscriptionIfNotExists(AaiRequest aaiRequest) throws BadResponseException {
87         logger.debug("createSubscriptionIfNotExists- START");
88         String instanceId = aaiRequest.getInstanceId();
89         String subscriptionName = getSubscriptionName(instanceId);
90         String callbackUrl = generateCallbackUrl(instanceId);
91
92         if (isSubscriptionActive(subscriptionName)) {
93             logger.info("Subscription: {} already exits", subscriptionName);
94         } else {
95             multicloudClient.registerSubscription(instanceId, getSubscriptionRequest(subscriptionName, callbackUrl, aaiRequest));
96             subscriptions.add(subscriptionName);
97             logger.info("Subscription: {} registered", subscriptionName);
98         }
99         logger.debug("createSubscriptionIfNotExists- END");
100     }
101
102     public void deleteSubscriptionIfExists(AaiRequest aaiRequest) throws BadResponseException {
103         logger.debug("deleteSubscriptionIfExists - START");
104         String instanceId = aaiRequest.getInstanceId();
105         String subscriptionName = getSubscriptionName(instanceId);
106
107         if (isSubscriptionActive(subscriptionName)) {
108             multicloudClient.deleteSubscription(instanceId, subscriptionName);
109             subscriptions.remove(subscriptionName);
110             logger.info("Subscription: {} removed", subscriptionName);
111         } else {
112             logger.info("Subscription: {} already removed or was not present", subscriptionName);
113         }
114         logger.debug("deleteSubscriptionIfExists - END");
115     }
116
117     public boolean isSubscriptionActive(String subscriptionName) {
118         return subscriptions.contains(subscriptionName);
119     }
120
121     public String getSubscriptionName(String instanceId) {
122         return instanceId + "-cnf-adapter";
123     }
124
125     private SubscriptionRequest getSubscriptionRequest(String name, String endpoint, AaiRequest aaiRequest) {
126         SubscriptionRequest subscriptionRequest = new SubscriptionRequest();
127
128         subscriptionRequest.setName(name);
129         subscriptionRequest.setCallbackUrl(endpoint);
130         subscriptionRequest.setMinNotifyInterval(30);
131         subscriptionRequest.setMetadata(aaiRequest);
132
133         return subscriptionRequest;
134     }
135
136     private String generateCallbackUrl(String instanceId) {
137         String path = String.format("/api/cnf-adapter/v1/instance/%s/status/notify", instanceId);
138
139         URIBuilder uriBuilder = new URIBuilder();
140         try {
141             return uriBuilder
142                     .setScheme(PROTOCOL)
143                     .setHost(HOST)
144                     .setPort(PORT)
145                     .setPath(path)
146                     .build()
147                     .toString();
148         } catch (URISyntaxException e) {
149             throw new RuntimeException(e);
150         }
151     }
152 }