1 package org.onap.svnfm.simulator.services;
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.nio.charset.StandardCharsets;
6 import java.util.ArrayList;
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;
41 public abstract class OperationProgressor implements Runnable {
43 private static final Logger LOGGER = LoggerFactory.getLogger(OperationProgressor.class);
44 private static final String CERTIFICATE_TO_TRUST = "so-vnfm-adapter.crt.pem";
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;
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;
63 this.subscriptionService = subscriptionService;
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);
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);
79 private InputStream getCertificateToTrust() {
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);
91 final VnfLcmOperationOccurrenceNotification notificationOfStarting =
92 buildNotification(NotificationStatusEnum.START, OperationStateEnum.STARTING);
93 sendNotification(notificationOfStarting);
96 setState(InlineResponse200.OperationStateEnum.PROCESSING);
97 final VnfLcmOperationOccurrenceNotification notificationOfProcessing =
98 buildNotification(NotificationStatusEnum.START, OperationStateEnum.PROCESSING);
99 sendNotification(notificationOfProcessing);
102 final GrantRequest grantRequest = buildGrantRequest();
103 final InlineResponse201 grantResponse = sendGrantRequest(grantRequest);
104 final List<InlineResponse201InstantiatedVnfInfoVnfcResourceInfo> vnfcs = handleGrantResponse(grantResponse);
106 svnfmService.getVnf(operation.getVnfInstanceId()).getInstantiatedVnfInfo();
109 setState(InlineResponse200.OperationStateEnum.COMPLETED);
110 final VnfLcmOperationOccurrenceNotification notificationOfCompleted =
111 buildNotification(NotificationStatusEnum.RESULT, OperationStateEnum.COMPLETED);
112 notificationOfCompleted.setAffectedVnfcs(getVnfcs(vnfcs));
114 sendNotification(notificationOfCompleted);
115 } catch (final Exception exception) {
116 LOGGER.error("Error in OperationProgressor ", exception);
121 private void sleep(final long milliSeconds) {
123 Thread.sleep(milliSeconds);
124 } catch (final InterruptedException e) {
125 operation.setOperationState(InlineResponse200.OperationStateEnum.FAILED);
126 // Restore interrupted state
127 Thread.currentThread().interrupt();
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);
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());
148 final LcnVnfLcmOperationOccurrenceNotificationLinks links = new LcnVnfLcmOperationOccurrenceNotificationLinks();
149 final LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance vnfInstanceLink =
150 new LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance();
151 vnfInstanceLink.setHref(getVnfLink());
152 links.setVnfInstance(vnfInstanceLink);
155 final LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance operationLink =
156 new LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance();
157 operationLink.setHref(getOperationLink());
158 links.setVnfLcmOpOcc(operationLink);
160 notification.setLinks(links);
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());
182 private void sendNotification(final VnfLcmOperationOccurrenceNotification notification) {
183 LOGGER.info("Sending notification: {}", notification);
185 final SubscriptionsAuthenticationParamsBasic subscriptionAuthentication =
186 subscriptionService.getSubscriptions().iterator().next().getAuthentication().getParamsBasic();
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());
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());
211 .setOperation(org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.GrantRequest.OperationEnum
212 .fromValue(operation.getOperation().getValue()));
213 grantRequest.setIsAutomaticInvocation(false);
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);
226 protected abstract List<GrantsAddResources> getAddResources(final String vnfdId);
228 protected abstract List<GrantsAddResources> getRemoveResources(final String vnfdId);
230 protected abstract List<InlineResponse201InstantiatedVnfInfoVnfcResourceInfo> handleGrantResponse(
231 InlineResponse201 grantResponse);
233 protected abstract ChangeTypeEnum getVnfcChangeType();
235 private InlineResponse201 sendGrantRequest(final GrantRequest grantRequest) {
236 LOGGER.info("Sending grant request: {}", grantRequest);
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);
248 private String getVnfLink() {
249 return getLinkBaseUrl() + "/vnf_instances/" + operation.getVnfInstanceId();
252 private String getOperationLink() {
253 return getLinkBaseUrl() + "/vnf_lcm_op_occs/" + operation.getId();
256 private String getLinkBaseUrl() {
257 return applicationConfig.getBaseUrl() + "/vnflcm/v1";