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);
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);
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());
130 final LcnVnfLcmOperationOccurrenceNotificationLinks links = new LcnVnfLcmOperationOccurrenceNotificationLinks();
131 final LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance vnfInstanceLink =
132 new LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance();
133 vnfInstanceLink.setHref(getVnfLink());
134 links.setVnfInstance(vnfInstanceLink);
137 final LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance operationLink =
138 new LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance();
139 operationLink.setHref(getOperationLink());
140 links.setVnfLcmOpOcc(operationLink);
142 notification.setLinks(links);
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());
164 private void sendNotification(final VnfLcmOperationOccurrenceNotification notification) {
165 LOGGER.info("Sending notification: {}", notification);
167 final SubscriptionsAuthenticationParamsBasic subscriptionAuthentication =
168 subscriptionService.getSubscriptions().iterator().next().getAuthentication().getParamsBasic();
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);
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());
190 .setOperation(org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.GrantRequest.OperationEnum
191 .fromValue(operation.getOperation().getValue()));
192 grantRequest.setIsAutomaticInvocation(false);
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);
205 protected abstract List<GrantsAddResources> getAddResources(final String vnfdId);
207 protected abstract List<GrantsAddResources> getRemoveResources(final String vnfdId);
209 protected abstract List<InlineResponse201InstantiatedVnfInfoVnfcResourceInfo> handleGrantResponse(
210 InlineResponse201 grantResponse);
212 protected abstract ChangeTypeEnum getVnfcChangeType();
214 private InlineResponse201 sendGrantRequest(final GrantRequest grantRequest) {
215 LOGGER.info("Sending grant request: {}", grantRequest);
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);
227 private String getVnfLink() {
228 return getLinkBaseUrl() + "/vnf_instances/" + operation.getVnfInstanceId();
231 private String getOperationLink() {
232 return getLinkBaseUrl() + "/vnf_lcm_op_occs/" + operation.getId();
235 private String getLinkBaseUrl() {
236 return applicationConfig.getBaseUrl() + "/vnflcm/v1";