VNFM simulator implementation for instantiate flow
[so.git] / vnfm-simulator / vnfm-service / src / main / java / org / onap / svnfm / simulator / services / OperationProgressor.java
1 package org.onap.svnfm.simulator.services;
2
3 import java.nio.charset.StandardCharsets;
4 import java.util.ArrayList;
5 import java.util.HashMap;
6 import java.util.List;
7 import java.util.Map;
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.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;
48
49 public class OperationProgressor implements Runnable {
50
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;
60
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;
68         this.vnfds = vnfds;
69         this.subscriptionService = subscriptionService;
70
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);
76
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);
81     }
82
83     @Override
84     public void run() {
85         try {
86             final VnfLcmOperationOccurrenceNotification notificationOfStarting =
87                     buildNotification(NotificationStatusEnum.START, OperationStateEnum.STARTING);
88             sendNotification(notificationOfStarting);
89
90             sleep(2000);
91             setState(InlineResponse200.OperationStateEnum.PROCESSING);
92             final VnfLcmOperationOccurrenceNotification notificationOfProcessing =
93                     buildNotification(NotificationStatusEnum.START, OperationStateEnum.PROCESSING);
94             sendNotification(notificationOfProcessing);
95
96
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));
102
103             sleep(10000);
104             setState(InlineResponse200.OperationStateEnum.COMPLETED);
105             final VnfLcmOperationOccurrenceNotification notificationOfCompleted =
106                     buildNotification(NotificationStatusEnum.RESULT, OperationStateEnum.COMPLETED);
107             notificationOfCompleted.setAffectedVnfcs(getVnfcs(instantiatedVnfInfo.getVnfcResourceInfo()));
108
109             sendNotification(notificationOfCompleted);
110         } catch (final Exception exception) {
111             LOGGER.error("Error in OperationProgressor ", exception);
112         }
113
114     }
115
116     private void sleep(final long milliSeconds) {
117         try {
118             Thread.sleep(milliSeconds);
119         } catch (final InterruptedException e) {
120             operation.setOperationState(InlineResponse200.OperationStateEnum.FAILED);
121         }
122     }
123
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);
128     }
129
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());
139
140         final LcnVnfLcmOperationOccurrenceNotificationLinks links = new LcnVnfLcmOperationOccurrenceNotificationLinks();
141         final LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance vnfInstanceLink =
142                 new LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance();
143         vnfInstanceLink.setHref(getVnfLink());
144         links.setVnfInstance(vnfInstanceLink);
145
146
147         final LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance operationLink =
148                 new LcnVnfLcmOperationOccurrenceNotificationLinksVnfInstance();
149         operationLink.setHref(getOperationLink());
150         links.setVnfLcmOpOcc(operationLink);
151
152         notification.setLinks(links);
153
154         return notification;
155     }
156
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);
167             vnfcs.add(vnfc);
168         }
169         return vnfcs;
170     }
171
172     private void sendNotification(final VnfLcmOperationOccurrenceNotification notification) {
173         LOGGER.info("Sending notification: {}", notification);
174         try {
175             final SubscriptionsAuthenticationParamsBasic subscriptionAuthentication =
176                     subscriptionService.getSubscriptions().iterator().next().getAuthentication().getParamsBasic();
177             final String auth =
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);
185         }
186     }
187
188
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());
196         grantRequest
197                 .setOperation(org.onap.so.adapters.vnfmadapter.extclients.vnfm.grant.model.GrantRequest.OperationEnum
198                         .fromValue(operation.getOperation().getValue()));
199         grantRequest.setIsAutomaticInvocation(false);
200
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);
209         return grantRequest;
210     }
211
212     private List<GrantsAddResources> getAddResources(final String vnfdId) {
213         final List<GrantsAddResources> resources = new ArrayList<>();
214
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);
225                 }
226             }
227         }
228         return resources;
229     }
230
231     private InlineResponse201 sendGrantRequest(final GrantRequest grantRequest) {
232         LOGGER.info("Sending grant request: {}", grantRequest);
233         try {
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);
240             return null;
241         }
242     }
243
244     private InlineResponse201InstantiatedVnfInfo createInstantiatedVnfInfo(final InlineResponse201 grantResponse) {
245         final InlineResponse201InstantiatedVnfInfo instantiatedVnfInfo = new InlineResponse201InstantiatedVnfInfo();
246
247         final Map<String, String> mapOfGrantResourceIdToVimConnectionId = new HashMap<>();
248         for (final InlineResponse201AddResources addResource : grantResponse.getAddResources()) {
249             mapOfGrantResourceIdToVimConnectionId.put(addResource.getResourceDefinitionId(),
250                     addResource.getVimConnectionId());
251         }
252
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());
263                     computeResource
264                             .setVimConnectionId(mapOfGrantResourceIdToVimConnectionId.get(vnfc.getGrantResourceId()));
265                     computeResource.setVimLevelResourceType("OS::Nova::Server");
266                     vnfcResourceInfoItem.setComputeResource(computeResource);
267                     instantiatedVnfInfo.addVnfcResourceInfoItem(vnfcResourceInfoItem);
268                 }
269             }
270         }
271
272         return instantiatedVnfInfo;
273     }
274
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));
280         }
281         return vimConnectionInfo;
282     }
283
284     private String getVnfLink() {
285         return getLinkBaseUrl() + "/vnf_instances/" + operation.getVnfInstanceId();
286     }
287
288     private String getOperationLink() {
289         return getLinkBaseUrl() + "/vnf_lcm_op_occs/" + operation.getId();
290     }
291
292     private String getLinkBaseUrl() {
293         return applicationConfig.getBaseUrl() + "/vnflcm/v1";
294     }
295
296 }