218cc2de033816247654e46afcd276b0f121f58b
[so.git] /
1 package org.onap.svnfm.simulator.services;
2
3 import java.nio.charset.StandardCharsets;
4 import java.util.ArrayList;
5 import java.util.List;
6 import java.util.UUID;
7 import javax.ws.rs.core.MediaType;
8 import org.apache.commons.codec.binary.Base64;
9 import org.modelmapper.ModelMapper;
10 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.ApiResponse;
11 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.GrantRequest;
12 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.GrantsAddResources;
13 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.GrantsLinks;
14 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.GrantsLinksVnfLcmOpOcc;
15 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.InlineResponse201;
16 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.ApiClient;
17 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.ApiException;
18 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.api.DefaultApi;
19 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs;
20 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs.ChangeTypeEnum;
21 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.LcnVnfLcmOperationOccurrenceNotificationLinks;
22 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance;
23 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.VnfLcmOperationOccurrenceNotification;
24 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.VnfLcmOperationOccurrenceNotification.NotificationStatusEnum;
25 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.VnfLcmOperationOccurrenceNotification.NotificationTypeEnum;
26 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.VnfLcmOperationOccurrenceNotification.OperationEnum;
27 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.VnfLcmOperationOccurrenceNotification.OperationStateEnum;
28 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse200;
29 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201InstantiatedVnfInfoVnfcResourceInfo;
30 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.SubscriptionsAuthenticationParamsBasic;
31 import org.onap.svnfm.simulator.config.ApplicationConfig;
32 import org.onap.svnfm.simulator.model.VnfOperation;
33 import org.onap.svnfm.simulator.model.Vnfds;
34 import org.onap.svnfm.simulator.repository.VnfOperationRepository;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38 public abstract class OperationProgressor implements Runnable {
39
40     private static final Logger LOGGER = LoggerFactory.getLogger(OperationProgressor.class);
41     protected final VnfOperation operation;
42     protected final SvnfmService svnfmService;
43     private final VnfOperationRepository vnfOperationRepository;
44     private final ApplicationConfig applicationConfig;
45     protected final Vnfds vnfds;
46     private final SubscriptionService subscriptionService;
47     private final DefaultApi notificationClient;
48     private final org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.api.DefaultApi grantClient;
49
50     public OperationProgressor(final VnfOperation operation, final SvnfmService svnfmService,
51             final VnfOperationRepository vnfOperationRepository, final ApplicationConfig applicationConfig,
52             final Vnfds vnfds, final SubscriptionService subscriptionService) {
53         this.operation = operation;
54         this.svnfmService = svnfmService;
55         this.vnfOperationRepository = vnfOperationRepository;
56         this.applicationConfig = applicationConfig;
57         this.vnfds = vnfds;
58         this.subscriptionService = subscriptionService;
59
60         final ApiClient apiClient = new ApiClient();
61         String callBackUrl = subscriptionService.getSubscriptions().iterator().next().getCallbackUri();
62         callBackUrl = callBackUrl.substring(0, callBackUrl.indexOf("/lcn/"));
63         apiClient.setBasePath(callBackUrl);
64         notificationClient = new DefaultApi(apiClient);
65
66         final org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.ApiClient grantApiClient =
67                 new org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.ApiClient();
68         grantApiClient.setBasePath(callBackUrl);
69         grantClient = new org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.api.DefaultApi(grantApiClient);
70     }
71
72     @Override
73     public void run() {
74         try {
75             final VnfLcmOperationOccurrenceNotification notificationOfStarting =
76                     buildNotification(NotificationStatusEnum.START, OperationStateEnum.STARTING);
77             sendNotification(notificationOfStarting);
78
79             sleep(2000);
80             setState(InlineResponse200.OperationStateEnum.PROCESSING);
81             final VnfLcmOperationOccurrenceNotification notificationOfProcessing =
82                     buildNotification(NotificationStatusEnum.START, OperationStateEnum.PROCESSING);
83             sendNotification(notificationOfProcessing);
84
85
86             final GrantRequest grantRequest = buildGrantRequest();
87             final InlineResponse201 grantResponse = sendGrantRequest(grantRequest);
88             final List<InlineResponse201InstantiatedVnfInfoVnfcResourceInfo> vnfcs = handleGrantResponse(grantResponse);
89
90             svnfmService.getVnf(operation.getVnfInstanceId()).getInstantiatedVnfInfo();
91
92             sleep(10000);
93             setState(InlineResponse200.OperationStateEnum.COMPLETED);
94             final VnfLcmOperationOccurrenceNotification notificationOfCompleted =
95                     buildNotification(NotificationStatusEnum.RESULT, OperationStateEnum.COMPLETED);
96             notificationOfCompleted.setAffectedVnfcs(getVnfcs(vnfcs));
97
98             sendNotification(notificationOfCompleted);
99         } catch (final Exception exception) {
100             LOGGER.error("Error in OperationProgressor ", exception);
101         }
102
103     }
104
105     private void sleep(final long milliSeconds) {
106         try {
107             Thread.sleep(milliSeconds);
108         } catch (final InterruptedException e) {
109             operation.setOperationState(InlineResponse200.OperationStateEnum.FAILED);
110             // Restore interrupted state
111             Thread.currentThread().interrupt();
112         }
113     }
114
115     private void setState(final InlineResponse200.OperationStateEnum state) {
116         LOGGER.info("Setting state to {} for operation {}", state, operation.getId());
117         operation.setOperationState(state);
118         vnfOperationRepository.save(operation);
119     }
120
121     private VnfLcmOperationOccurrenceNotification buildNotification(final NotificationStatusEnum status,
122             final OperationStateEnum operationState) {
123         final VnfLcmOperationOccurrenceNotification notification = new VnfLcmOperationOccurrenceNotification();
124         notification.setId(UUID.randomUUID().toString());
125         notification.setNotificationType(NotificationTypeEnum.VNFLCMOPERATIONOCCURRENCENOTIFICATION);
126         notification.setNotificationStatus(status);
127         notification.setOperationState(operationState);
128         notification.setOperation(OperationEnum.fromValue(operation.getOperation().toString()));
129         notification.setVnfInstanceId(operation.getVnfInstanceId());
130         notification.setVnfLcmOpOccId(operation.getId());
131
132         final LcnVnfLcmOperationOccurrenceNotificationLinks links = new LcnVnfLcmOperationOccurrenceNotificationLinks();
133         final LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance vnfInstanceLink =
134                 new LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance();
135         vnfInstanceLink.setHref(getVnfLink());
136         links.setVnfInstance(vnfInstanceLink);
137
138
139         final LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance operationLink =
140                 new LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance();
141         operationLink.setHref(getOperationLink());
142         links.setVnfLcmOpOcc(operationLink);
143
144         notification.setLinks(links);
145
146         return notification;
147     }
148
149     private List<LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs> getVnfcs(
150             final List<InlineResponse201InstantiatedVnfInfoVnfcResourceInfo> instantiatedVnfcs) {
151         final List<LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs> vnfcs = new ArrayList<>();
152         if (instantiatedVnfcs != null) {
153             for (final InlineResponse201InstantiatedVnfInfoVnfcResourceInfo instantiatedVnfc : instantiatedVnfcs) {
154                 LOGGER.info("VNFC TO BE CONVERTED: {}", instantiatedVnfc);
155                 final ModelMapper mapper = new ModelMapper();
156                 final LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs vnfc =
157                         mapper.map(instantiatedVnfc, LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs.class);
158                 LOGGER.info("VNFC FROM CONVERSION: {}", vnfc);
159                 vnfc.setChangeType(getVnfcChangeType());
160                 vnfcs.add(vnfc);
161             }
162         }
163         return vnfcs;
164     }
165
166     private void sendNotification(final VnfLcmOperationOccurrenceNotification notification) {
167         LOGGER.info("Sending notification: {}", notification);
168         try {
169             final SubscriptionsAuthenticationParamsBasic subscriptionAuthentication =
170                     subscriptionService.getSubscriptions().iterator().next().getAuthentication().getParamsBasic();
171             final String auth =
172                     subscriptionAuthentication.getUserName() + ":" + subscriptionAuthentication.getPassword();
173             final byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.ISO_8859_1));
174             final String authHeader = "Basic " + new String(encodedAuth);
175             notificationClient.lcnVnfLcmOperationOccurrenceNotificationPostWithHttpInfo(notification,
176                     MediaType.APPLICATION_JSON, authHeader);
177         } catch (final ApiException exception) {
178             LOGGER.error("Error sending notification: " + notification, exception);
179         }
180     }
181
182
183     public GrantRequest buildGrantRequest() {
184         final GrantRequest grantRequest = new GrantRequest();
185         grantRequest.setVnfInstanceId(operation.getVnfInstanceId());
186         final String vnfdId = svnfmService.getVnf(operation.getVnfInstanceId()).getVnfdId();
187         grantRequest.setVnfdId(vnfdId);
188         grantRequest.setAddResources(getAddResources(vnfdId));
189         grantRequest.setRemoveResources(getRemoveResources(vnfdId));
190         grantRequest.setVnfLcmOpOccId(operation.getId());
191         grantRequest
192                 .setOperation(org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.GrantRequest.OperationEnum
193                         .fromValue(operation.getOperation().getValue()));
194         grantRequest.setIsAutomaticInvocation(false);
195
196         final GrantsLinksVnfLcmOpOcc vnfInstanceLink = new GrantsLinksVnfLcmOpOcc();
197         vnfInstanceLink.setHref(getVnfLink());
198         final GrantsLinksVnfLcmOpOcc operationInstanceLink = new GrantsLinksVnfLcmOpOcc();
199         operationInstanceLink.setHref(getOperationLink());
200         final GrantsLinks links = new GrantsLinks();
201         links.setVnfInstance(vnfInstanceLink);
202         links.setVnfLcmOpOcc(operationInstanceLink);
203         grantRequest.setLinks(links);
204         return grantRequest;
205     }
206
207     protected abstract List<GrantsAddResources> getAddResources(final String vnfdId);
208
209     protected abstract List<GrantsAddResources> getRemoveResources(final String vnfdId);
210
211     protected abstract List<InlineResponse201InstantiatedVnfInfoVnfcResourceInfo> handleGrantResponse(
212             InlineResponse201 grantResponse);
213
214     protected abstract ChangeTypeEnum getVnfcChangeType();
215
216     private InlineResponse201 sendGrantRequest(final GrantRequest grantRequest) {
217         LOGGER.info("Sending grant request: {}", grantRequest);
218         try {
219             final ApiResponse<InlineResponse201> response = grantClient.grantsPostWithHttpInfo(grantRequest,
220                     MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON, "Basic dm5mbTpwYXNzd29yZDEk");
221             LOGGER.info("Grant Response: {}", response);
222             return response.getData();
223         } catch (final org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.ApiException exception) {
224             LOGGER.error("Error sending notification: " + grantRequest, exception);
225             return null;
226         }
227     }
228
229     private String getVnfLink() {
230         return getLinkBaseUrl() + "/vnf_instances/" + operation.getVnfInstanceId();
231     }
232
233     private String getOperationLink() {
234         return getLinkBaseUrl() + "/vnf_lcm_op_occs/" + operation.getId();
235     }
236
237     private String getLinkBaseUrl() {
238         return applicationConfig.getBaseUrl() + "/vnflcm/v1";
239     }
240
241 }