1 package org.onap.svnfm.simulator.services;
3 import java.nio.charset.StandardCharsets;
4 import java.util.ArrayList;
5 import java.util.HashMap;
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.GrantsAddResources.TypeEnum;
16 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.GrantsLinks;
17 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.GrantsLinksVnfLcmOpOcc;
18 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.InlineResponse201;
19 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.InlineResponse201AddResources;
20 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.InlineResponse201VimConnections;
21 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.ApiClient;
22 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.ApiException;
23 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.api.DefaultApi;
24 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs;
25 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs.ChangeTypeEnum;
26 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.LcnVnfLcmOperationOccurrenceNotificationLinks;
27 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance;
28 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.VnfLcmOperationOccurrenceNotification;
29 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.VnfLcmOperationOccurrenceNotification.NotificationStatusEnum;
30 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.VnfLcmOperationOccurrenceNotification.NotificationTypeEnum;
31 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.VnfLcmOperationOccurrenceNotification.OperationEnum;
32 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.lcn.model.VnfLcmOperationOccurrenceNotification.OperationStateEnum;
33 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse200;
34 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201InstantiatedVnfInfo;
35 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201InstantiatedVnfInfoResourceHandle;
36 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201InstantiatedVnfInfoVnfcResourceInfo;
37 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.InlineResponse201VimConnectionInfo;
38 import org.onap.so.adapters.vnfmadapter.extclients.vnfm.model.SubscriptionsAuthenticationParamsBasic;
39 import org.onap.svnfm.simulator.config.ApplicationConfig;
40 import org.onap.svnfm.simulator.model.VnfOperation;
41 import org.onap.svnfm.simulator.model.Vnfds;
42 import org.onap.svnfm.simulator.model.Vnfds.Vnfc;
43 import org.onap.svnfm.simulator.model.Vnfds.Vnfd;
44 import org.onap.svnfm.simulator.repository.VnfOperationRepository;
45 import org.onap.svnfm.simulator.repository.VnfmCacheRepository;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
49 public class OperationProgressor implements Runnable {
51 private static final Logger LOGGER = LoggerFactory.getLogger(OperationProgressor.class);
52 private final VnfOperation operation;
53 private final VnfmCacheRepository vnfRepository;
54 private final VnfOperationRepository vnfOperationRepository;
55 private final ApplicationConfig applicationConfig;
56 private final Vnfds vnfds;
57 private final SubscriptionService subscriptionService;
58 private final DefaultApi notificationClient;
59 private final org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.api.DefaultApi grantClient;
61 public OperationProgressor(final VnfOperation operation, final VnfmCacheRepository vnfRepository,
62 final VnfOperationRepository vnfOperationRepository, final ApplicationConfig applicationConfig,
63 final Vnfds vnfds, final SubscriptionService subscriptionService) {
64 this.operation = operation;
65 this.vnfRepository = vnfRepository;
66 this.vnfOperationRepository = vnfOperationRepository;
67 this.applicationConfig = applicationConfig;
69 this.subscriptionService = subscriptionService;
71 final ApiClient apiClient = new ApiClient();
72 String callBackUrl = subscriptionService.getSubscriptions().iterator().next().getCallbackUri();
73 callBackUrl = callBackUrl.substring(0, callBackUrl.indexOf("/lcn/"));
74 apiClient.setBasePath(callBackUrl);
75 notificationClient = new DefaultApi(apiClient);
77 final org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.ApiClient grantApiClient =
78 new org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.ApiClient();
79 grantApiClient.setBasePath(callBackUrl);
80 grantClient = new org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.api.DefaultApi(grantApiClient);
86 final VnfLcmOperationOccurrenceNotification notificationOfStarting =
87 buildNotification(NotificationStatusEnum.START, OperationStateEnum.STARTING);
88 sendNotification(notificationOfStarting);
91 setState(InlineResponse200.OperationStateEnum.PROCESSING);
92 final VnfLcmOperationOccurrenceNotification notificationOfProcessing =
93 buildNotification(NotificationStatusEnum.START, OperationStateEnum.PROCESSING);
94 sendNotification(notificationOfProcessing);
97 final GrantRequest grantRequest = buildGrantRequest();
98 final InlineResponse201 grantResponse = sendGrantRequest(grantRequest);
99 final InlineResponse201InstantiatedVnfInfo instantiatedVnfInfo = createInstantiatedVnfInfo(grantResponse);
100 vnfRepository.updateVnf(instantiatedVnfInfo, operation.getVnfInstanceId(),
101 getVimConnections(grantResponse));
104 setState(InlineResponse200.OperationStateEnum.COMPLETED);
105 final VnfLcmOperationOccurrenceNotification notificationOfCompleted =
106 buildNotification(NotificationStatusEnum.RESULT, OperationStateEnum.COMPLETED);
107 notificationOfCompleted.setAffectedVnfcs(getVnfcs(instantiatedVnfInfo.getVnfcResourceInfo()));
109 sendNotification(notificationOfCompleted);
110 } catch (final Exception exception) {
111 LOGGER.error("Error in OperationProgressor ", exception);
116 private void sleep(final long milliSeconds) {
118 Thread.sleep(milliSeconds);
119 } catch (final InterruptedException e) {
120 operation.setOperationState(InlineResponse200.OperationStateEnum.FAILED);
124 private void setState(final InlineResponse200.OperationStateEnum state) {
125 LOGGER.info("Setting state to {} for operation {}", state, operation.getId());
126 operation.setOperationState(state);
127 vnfOperationRepository.save(operation);
130 private VnfLcmOperationOccurrenceNotification buildNotification(final NotificationStatusEnum status,
131 final OperationStateEnum operationState) {
132 final VnfLcmOperationOccurrenceNotification notification = new VnfLcmOperationOccurrenceNotification();
133 notification.setId(UUID.randomUUID().toString());
134 notification.setNotificationType(NotificationTypeEnum.VNFLCMOPERATIONOCCURRENCENOTIFICATION);
135 notification.setNotificationStatus(status);
136 notification.setOperationState(operationState);
137 notification.setOperation(OperationEnum.fromValue(operation.getOperation().toString()));
138 notification.setVnfInstanceId(operation.getVnfInstanceId());
140 final LcnVnfLcmOperationOccurrenceNotificationLinks links = new LcnVnfLcmOperationOccurrenceNotificationLinks();
141 final LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance vnfInstanceLink =
142 new LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance();
143 vnfInstanceLink.setHref(getVnfLink());
144 links.setVnfInstance(vnfInstanceLink);
147 final LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance operationLink =
148 new LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance();
149 operationLink.setHref(getOperationLink());
150 links.setVnfLcmOpOcc(operationLink);
152 notification.setLinks(links);
157 private List<LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs> getVnfcs(
158 final List<InlineResponse201InstantiatedVnfInfoVnfcResourceInfo> instantiatedVnfcs) {
159 final List<LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs> vnfcs = new ArrayList<>();
160 for (final InlineResponse201InstantiatedVnfInfoVnfcResourceInfo instantiatedVnfc : instantiatedVnfcs) {
161 LOGGER.info("VNFC TO BE CONVERTED: {}", instantiatedVnfc);
162 final ModelMapper mapper = new ModelMapper();
163 final LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs vnfc =
164 mapper.map(instantiatedVnfc, LcnVnfLcmOperationOccurrenceNotificationAffectedVnfcs.class);
165 LOGGER.info("VNFC FROM CONVERSION: {}", vnfc);
166 vnfc.setChangeType(ChangeTypeEnum.ADDED);
172 private void sendNotification(final VnfLcmOperationOccurrenceNotification notification) {
173 LOGGER.info("Sending notification: {}", notification);
175 final SubscriptionsAuthenticationParamsBasic subscriptionAuthentication =
176 subscriptionService.getSubscriptions().iterator().next().getAuthentication().getParamsBasic();
178 subscriptionAuthentication.getUserName() + ":" + subscriptionAuthentication.getPassword();
179 final byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.ISO_8859_1));
180 final String authHeader = "Basic " + new String(encodedAuth);
181 notificationClient.lcnVnfLcmOperationOccurrenceNotificationPostWithHttpInfo(notification,
182 MediaType.APPLICATION_JSON, authHeader);
183 } catch (final ApiException exception) {
184 LOGGER.error("Error sending notification: " + notification, exception);
189 public GrantRequest buildGrantRequest() {
190 final GrantRequest grantRequest = new GrantRequest();
191 grantRequest.setVnfInstanceId(operation.getVnfInstanceId());
192 final String vnfdId = vnfRepository.getVnf(operation.getVnfInstanceId()).getVnfdId();
193 grantRequest.setVnfdId(vnfdId);
194 grantRequest.setAddResources(getAddResources(vnfdId));
195 grantRequest.setVnfLcmOpOccId(operation.getId());
197 .setOperation(org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.GrantRequest.OperationEnum
198 .fromValue(operation.getOperation().getValue()));
199 grantRequest.setIsAutomaticInvocation(false);
201 final GrantsLinksVnfLcmOpOcc vnfInstanceLink = new GrantsLinksVnfLcmOpOcc();
202 vnfInstanceLink.setHref(getVnfLink());
203 final GrantsLinksVnfLcmOpOcc operationInstanceLink = new GrantsLinksVnfLcmOpOcc();
204 operationInstanceLink.setHref(getOperationLink());
205 final GrantsLinks links = new GrantsLinks();
206 links.setVnfInstance(vnfInstanceLink);
207 links.setVnfLcmOpOcc(operationInstanceLink);
208 grantRequest.setLinks(links);
212 private List<GrantsAddResources> getAddResources(final String vnfdId) {
213 final List<GrantsAddResources> resources = new ArrayList<>();
215 for (final Vnfd vnfd : vnfds.getVnfdList()) {
216 if (vnfd.getVnfdId().equals(vnfdId)) {
217 for (final Vnfc vnfc : vnfd.getVnfcList()) {
218 final GrantsAddResources addResource = new GrantsAddResources();
219 vnfc.setGrantResourceId(UUID.randomUUID().toString());
220 addResource.setId(vnfc.getGrantResourceId());
221 addResource.setType(TypeEnum.fromValue(vnfc.getType()));
222 addResource.setResourceTemplateId(vnfc.getResourceTemplateId());
223 addResource.setVduId(vnfc.getVduId());
224 resources.add(addResource);
231 private InlineResponse201 sendGrantRequest(final GrantRequest grantRequest) {
232 LOGGER.info("Sending grant request: {}", grantRequest);
234 final ApiResponse<InlineResponse201> response = grantClient.grantsPostWithHttpInfo(grantRequest,
235 MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON, "Basic dm5mbTpwYXNzd29yZDEk");
236 LOGGER.info("Grant Response: {}", response);
237 return response.getData();
238 } catch (final org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.ApiException exception) {
239 LOGGER.error("Error sending notification: " + grantRequest, exception);
244 private InlineResponse201InstantiatedVnfInfo createInstantiatedVnfInfo(final InlineResponse201 grantResponse) {
245 final InlineResponse201InstantiatedVnfInfo instantiatedVnfInfo = new InlineResponse201InstantiatedVnfInfo();
247 final Map<String, String> mapOfGrantResourceIdToVimConnectionId = new HashMap<>();
248 for (final InlineResponse201AddResources addResource : grantResponse.getAddResources()) {
249 mapOfGrantResourceIdToVimConnectionId.put(addResource.getResourceDefinitionId(),
250 addResource.getVimConnectionId());
253 for (final Vnfd vnfd : vnfds.getVnfdList()) {
254 if (vnfd.getVnfdId().equals(vnfRepository.getVnf(operation.getVnfInstanceId()).getVnfdId())) {
255 for (final Vnfc vnfc : vnfd.getVnfcList()) {
256 final InlineResponse201InstantiatedVnfInfoVnfcResourceInfo vnfcResourceInfoItem =
257 new InlineResponse201InstantiatedVnfInfoVnfcResourceInfo();
258 vnfcResourceInfoItem.setId(vnfc.getVnfcId());
259 vnfcResourceInfoItem.setVduId(vnfc.getVduId());
260 final InlineResponse201InstantiatedVnfInfoResourceHandle computeResource =
261 new InlineResponse201InstantiatedVnfInfoResourceHandle();
262 computeResource.setResourceId(UUID.randomUUID().toString());
264 .setVimConnectionId(mapOfGrantResourceIdToVimConnectionId.get(vnfc.getGrantResourceId()));
265 computeResource.setVimLevelResourceType("OS::Nova::Server");
266 vnfcResourceInfoItem.setComputeResource(computeResource);
267 instantiatedVnfInfo.addVnfcResourceInfoItem(vnfcResourceInfoItem);
272 return instantiatedVnfInfo;
275 private List<InlineResponse201VimConnectionInfo> getVimConnections(final InlineResponse201 grantResponse) {
276 final List<InlineResponse201VimConnectionInfo> vimConnectionInfo = new ArrayList<>();
277 for (final InlineResponse201VimConnections vimConnection : grantResponse.getVimConnections()) {
278 final ModelMapper modelMapper = new ModelMapper();
279 vimConnectionInfo.add(modelMapper.map(vimConnection, InlineResponse201VimConnectionInfo.class));
281 return vimConnectionInfo;
284 private String getVnfLink() {
285 return getLinkBaseUrl() + "/vnf_instances/" + operation.getVnfInstanceId();
288 private String getOperationLink() {
289 return getLinkBaseUrl() + "/vnf_lcm_op_occs/" + operation.getId();
292 private String getLinkBaseUrl() {
293 return applicationConfig.getBaseUrl() + "/vnflcm/v1";