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