1 package org.onap.svnfm.simulator.services;
3 import java.nio.charset.StandardCharsets;
4 import java.util.ArrayList;
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;
38 public abstract class OperationProgressor implements Runnable {
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;
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;
58 this.subscriptionService = subscriptionService;
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);
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);
75 final VnfLcmOperationOccurrenceNotification notificationOfStarting =
76 buildNotification(NotificationStatusEnum.START, OperationStateEnum.STARTING);
77 sendNotification(notificationOfStarting);
80 setState(InlineResponse200.OperationStateEnum.PROCESSING);
81 final VnfLcmOperationOccurrenceNotification notificationOfProcessing =
82 buildNotification(NotificationStatusEnum.START, OperationStateEnum.PROCESSING);
83 sendNotification(notificationOfProcessing);
86 final GrantRequest grantRequest = buildGrantRequest();
87 final InlineResponse201 grantResponse = sendGrantRequest(grantRequest);
88 final List<InlineResponse201InstantiatedVnfInfoVnfcResourceInfo> vnfcs = handleGrantResponse(grantResponse);
90 svnfmService.getVnf(operation.getVnfInstanceId()).getInstantiatedVnfInfo();
93 setState(InlineResponse200.OperationStateEnum.COMPLETED);
94 final VnfLcmOperationOccurrenceNotification notificationOfCompleted =
95 buildNotification(NotificationStatusEnum.RESULT, OperationStateEnum.COMPLETED);
96 notificationOfCompleted.setAffectedVnfcs(getVnfcs(vnfcs));
98 sendNotification(notificationOfCompleted);
99 } catch (final Exception exception) {
100 LOGGER.error("Error in OperationProgressor ", exception);
105 private void sleep(final long milliSeconds) {
107 Thread.sleep(milliSeconds);
108 } catch (final InterruptedException e) {
109 operation.setOperationState(InlineResponse200.OperationStateEnum.FAILED);
110 // Restore interrupted state
111 Thread.currentThread().interrupt();
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);
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());
132 final LcnVnfLcmOperationOccurrenceNotificationLinks links = new LcnVnfLcmOperationOccurrenceNotificationLinks();
133 final LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance vnfInstanceLink =
134 new LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance();
135 vnfInstanceLink.setHref(getVnfLink());
136 links.setVnfInstance(vnfInstanceLink);
139 final LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance operationLink =
140 new LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance();
141 operationLink.setHref(getOperationLink());
142 links.setVnfLcmOpOcc(operationLink);
144 notification.setLinks(links);
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());
166 private void sendNotification(final VnfLcmOperationOccurrenceNotification notification) {
167 LOGGER.info("Sending notification: {}", notification);
169 final SubscriptionsAuthenticationParamsBasic subscriptionAuthentication =
170 subscriptionService.getSubscriptions().iterator().next().getAuthentication().getParamsBasic();
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);
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());
192 .setOperation(org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.GrantRequest.OperationEnum
193 .fromValue(operation.getOperation().getValue()));
194 grantRequest.setIsAutomaticInvocation(false);
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);
207 protected abstract List<GrantsAddResources> getAddResources(final String vnfdId);
209 protected abstract List<GrantsAddResources> getRemoveResources(final String vnfdId);
211 protected abstract List<InlineResponse201InstantiatedVnfInfoVnfcResourceInfo> handleGrantResponse(
212 InlineResponse201 grantResponse);
214 protected abstract ChangeTypeEnum getVnfcChangeType();
216 private InlineResponse201 sendGrantRequest(final GrantRequest grantRequest) {
217 LOGGER.info("Sending grant request: {}", grantRequest);
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);
229 private String getVnfLink() {
230 return getLinkBaseUrl() + "/vnf_instances/" + operation.getVnfInstanceId();
233 private String getOperationLink() {
234 return getLinkBaseUrl() + "/vnf_lcm_op_occs/" + operation.getId();
237 private String getLinkBaseUrl() {
238 return applicationConfig.getBaseUrl() + "/vnflcm/v1";