VNFM simulator implementation for delete flow
[so.git] / vnfm-simulator / vnfm-service / src / main / java / org / onap / svnfm / simulator / services / OperationProgressor.java
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         }
111     }
112
113     private void setState(final InlineResponse200.OperationStateEnum state) {
114         LOGGER.info("Setting state to {} for operation {}", state, operation.getId());
115         operation.setOperationState(state);
116         vnfOperationRepository.save(operation);
117     }
118
119     private VnfLcmOperationOccurrenceNotification buildNotification(final NotificationStatusEnum status,
120             final OperationStateEnum operationState) {
121         final VnfLcmOperationOccurrenceNotification notification = new VnfLcmOperationOccurrenceNotification();
122         notification.setId(UUID.randomUUID().toString());
123         notification.setNotificationType(NotificationTypeEnum.VNFLCMOPERATIONOCCURRENCENOTIFICATION);
124         notification.setNotificationStatus(status);
125         notification.setOperationState(operationState);
126         notification.setOperation(OperationEnum.fromValue(operation.getOperation().toString()));
127         notification.setVnfInstanceId(operation.getVnfInstanceId());
128         notification.setVnfLcmOpOccId(operation.getId());
129
130         final LcnVnfLcmOperationOccurrenceNotificationLinks links = new LcnVnfLcmOperationOccurrenceNotificationLinks();
131         final LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance vnfInstanceLink =
132                 new LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance();
133         vnfInstanceLink.setHref(getVnfLink());
134         links.setVnfInstance(vnfInstanceLink);
135
136
137         final LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance operationLink =
138                 new LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance();
139         operationLink.setHref(getOperationLink());
140         links.setVnfLcmOpOcc(operationLink);
141
142         notification.setLinks(links);
143
144         return notification;
145     }
146
147     private List<LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs> getVnfcs(
148             final List<InlineResponse201InstantiatedVnfInfoVnfcResourceInfo> instantiatedVnfcs) {
149         final List<LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs> vnfcs = new ArrayList<>();
150         if (instantiatedVnfcs != null) {
151             for (final InlineResponse201InstantiatedVnfInfoVnfcResourceInfo instantiatedVnfc : instantiatedVnfcs) {
152                 LOGGER.info("VNFC TO BE CONVERTED: {}", instantiatedVnfc);
153                 final ModelMapper mapper = new ModelMapper();
154                 final LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs vnfc =
155                         mapper.map(instantiatedVnfc, LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs.class);
156                 LOGGER.info("VNFC FROM CONVERSION: {}", vnfc);
157                 vnfc.setChangeType(getVnfcChangeType());
158                 vnfcs.add(vnfc);
159             }
160         }
161         return vnfcs;
162     }
163
164     private void sendNotification(final VnfLcmOperationOccurrenceNotification notification) {
165         LOGGER.info("Sending notification: {}", notification);
166         try {
167             final SubscriptionsAuthenticationParamsBasic subscriptionAuthentication =
168                     subscriptionService.getSubscriptions().iterator().next().getAuthentication().getParamsBasic();
169             final String auth =
170                     subscriptionAuthentication.getUserName() + ":" + subscriptionAuthentication.getPassword();
171             final byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.ISO_8859_1));
172             final String authHeader = "Basic " + new String(encodedAuth);
173             notificationClient.lcnVnfLcmOperationOccurrenceNotificationPostWithHttpInfo(notification,
174                     MediaType.APPLICATION_JSON, authHeader);
175         } catch (final ApiException exception) {
176             LOGGER.error("Error sending notification: " + notification, exception);
177         }
178     }
179
180
181     public GrantRequest buildGrantRequest() {
182         final GrantRequest grantRequest = new GrantRequest();
183         grantRequest.setVnfInstanceId(operation.getVnfInstanceId());
184         final String vnfdId = svnfmService.getVnf(operation.getVnfInstanceId()).getVnfdId();
185         grantRequest.setVnfdId(vnfdId);
186         grantRequest.setAddResources(getAddResources(vnfdId));
187         grantRequest.setRemoveResources(getRemoveResources(vnfdId));
188         grantRequest.setVnfLcmOpOccId(operation.getId());
189         grantRequest
190                 .setOperation(org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.GrantRequest.OperationEnum
191                         .fromValue(operation.getOperation().getValue()));
192         grantRequest.setIsAutomaticInvocation(false);
193
194         final GrantsLinksVnfLcmOpOcc vnfInstanceLink = new GrantsLinksVnfLcmOpOcc();
195         vnfInstanceLink.setHref(getVnfLink());
196         final GrantsLinksVnfLcmOpOcc operationInstanceLink = new GrantsLinksVnfLcmOpOcc();
197         operationInstanceLink.setHref(getOperationLink());
198         final GrantsLinks links = new GrantsLinks();
199         links.setVnfInstance(vnfInstanceLink);
200         links.setVnfLcmOpOcc(operationInstanceLink);
201         grantRequest.setLinks(links);
202         return grantRequest;
203     }
204
205     protected abstract List<GrantsAddResources> getAddResources(final String vnfdId);
206
207     protected abstract List<GrantsAddResources> getRemoveResources(final String vnfdId);
208
209     protected abstract List<InlineResponse201InstantiatedVnfInfoVnfcResourceInfo> handleGrantResponse(
210             InlineResponse201 grantResponse);
211
212     protected abstract ChangeTypeEnum getVnfcChangeType();
213
214     private InlineResponse201 sendGrantRequest(final GrantRequest grantRequest) {
215         LOGGER.info("Sending grant request: {}", grantRequest);
216         try {
217             final ApiResponse<InlineResponse201> response = grantClient.grantsPostWithHttpInfo(grantRequest,
218                     MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON, "Basic dm5mbTpwYXNzd29yZDEk");
219             LOGGER.info("Grant Response: {}", response);
220             return response.getData();
221         } catch (final org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.ApiException exception) {
222             LOGGER.error("Error sending notification: " + grantRequest, exception);
223             return null;
224         }
225     }
226
227     private String getVnfLink() {
228         return getLinkBaseUrl() + "/vnf_instances/" + operation.getVnfInstanceId();
229     }
230
231     private String getOperationLink() {
232         return getLinkBaseUrl() + "/vnf_lcm_op_occs/" + operation.getId();
233     }
234
235     private String getLinkBaseUrl() {
236         return applicationConfig.getBaseUrl() + "/vnflcm/v1";
237     }
238
239 }