2 * ============LICENSE_START=======================================================
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.onap.so.adapters.cnf.service.synchrornization;
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;
33 import javax.annotation.PostConstruct;
34 import java.net.URISyntaxException;
35 import java.util.HashSet;
37 import java.util.stream.Collectors;
40 public class SynchronizationService {
42 private static final Logger logger = LoggerFactory.getLogger(SynchronizationService.class);
44 private static final String PROTOCOL = "http";
45 private static final String HOST = "so-cnf-adapter";
46 private static final int PORT = 8090;
48 private final Set<String> subscriptions = new HashSet<>();
49 private final MulticloudClient multicloudClient;
50 private final SubscriptionsRecoveryProvider recoveryProvider;
52 public SynchronizationService(MulticloudClient multicloudClient, SubscriptionsRecoveryProvider recoveryProvider) {
53 this.multicloudClient = multicloudClient;
54 this.recoveryProvider = recoveryProvider;
58 private void postConstruct() {
59 recoverSubscriptions();
62 private void recoverSubscriptions() {
63 if (subscriptions.isEmpty()) {
64 Set<String> instanceIds;
67 instanceIds = recoveryProvider.getInstanceList();
69 instanceIds.forEach(this::addSubscriptionIfSubscriptionFound);
70 } catch (BadResponseException e) {
71 logger.error("Instances not found", e);
76 private void addSubscriptionIfSubscriptionFound(String instanceId) {
77 String subscriptionName = getSubscriptionName(instanceId);
79 if (multicloudClient.hasSubscription(instanceId, subscriptionName))
80 subscriptions.add(subscriptionName);
81 } catch (BadResponseException e) {
82 logger.warn("Subscriptions not found instanceId={} subscriptionName={}", instanceId, subscriptionName);
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);
92 if (isSubscriptionActive(subscriptionName)) {
93 logger.info("Subscription: {} already exits", subscriptionName);
95 multicloudClient.registerSubscription(instanceId, getSubscriptionRequest(subscriptionName, callbackUrl, aaiRequest));
96 subscriptions.add(subscriptionName);
97 logger.info("Subscription: {} registered", subscriptionName);
99 logger.debug("createSubscriptionIfNotExists- END");
102 public void deleteSubscriptionIfExists(AaiRequest aaiRequest) throws BadResponseException {
103 logger.debug("deleteSubscriptionIfExists - START");
104 String instanceId = aaiRequest.getInstanceId();
105 String subscriptionName = getSubscriptionName(instanceId);
107 if (isSubscriptionActive(subscriptionName)) {
108 multicloudClient.deleteSubscription(instanceId, subscriptionName);
109 subscriptions.remove(subscriptionName);
110 logger.info("Subscription: {} removed", subscriptionName);
112 logger.info("Subscription: {} already removed or was not present", subscriptionName);
114 logger.debug("deleteSubscriptionIfExists - END");
117 public boolean isSubscriptionActive(String subscriptionName) {
118 return subscriptions.contains(subscriptionName);
121 public String getSubscriptionName(String instanceId) {
122 return instanceId + "-cnf-adapter";
125 private SubscriptionRequest getSubscriptionRequest(String name, String endpoint, AaiRequest aaiRequest) {
126 SubscriptionRequest subscriptionRequest = new SubscriptionRequest();
128 subscriptionRequest.setName(name);
129 subscriptionRequest.setCallbackUrl(endpoint);
130 subscriptionRequest.setMinNotifyInterval(30);
131 subscriptionRequest.setMetadata(aaiRequest);
133 return subscriptionRequest;
136 private String generateCallbackUrl(String instanceId) {
137 String path = String.format("/api/cnf-adapter/v1/instance/%s/status/notify", instanceId);
139 URIBuilder uriBuilder = new URIBuilder();
148 } catch (URISyntaxException e) {
149 throw new RuntimeException(e);