b262cb21cbfd71bfaca36ca6b540ab9a695ed572
[so.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP - SO
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Modifications Copyright (C) 2018 IBM.
8  * Modifications Copyright (c) 2019 Samsung
9  * ================================================================================
10  * Licensed under the Apache License, Version 2.0 (the "License");
11  * you may not use this file except in compliance with the License.
12  * You may obtain a copy of the License at
13  *
14  *      http://www.apache.org/licenses/LICENSE-2.0
15  *
16  * Unless required by applicable law or agreed to in writing, software
17  * distributed under the License is distributed on an "AS IS" BASIS,
18  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19  * See the License for the specific language governing permissions and
20  * limitations under the License.
21  * ============LICENSE_END=========================================================
22  */
23
24 package org.onap.so.adapters.requestsdb;
25
26 import java.sql.Timestamp;
27 import java.util.List;
28 import javax.jws.WebService;
29 import javax.transaction.Transactional;
30 import org.onap.so.adapters.requestsdb.exceptions.MsoRequestsDbException;
31 import org.onap.so.db.request.beans.InfraActiveRequests;
32 import org.onap.so.db.request.beans.OperationStatus;
33 import org.onap.so.db.request.beans.ResourceOperationStatus;
34 import org.onap.so.db.request.beans.InstanceNfvoMapping;
35 import org.onap.so.db.request.beans.ResourceOperationStatusId;
36 import org.onap.so.db.request.beans.SiteStatus;
37 import org.onap.so.db.request.data.repository.InfraActiveRequestsRepository;
38 import org.onap.so.db.request.data.repository.OperationStatusRepository;
39 import org.onap.so.db.request.data.repository.ResourceOperationStatusRepository;
40 import org.onap.so.db.request.data.repository.SiteStatusRepository;
41 import org.onap.so.db.request.data.repository.InstanceNfvoMappingRepository;
42 import org.onap.logging.filter.base.ErrorCode;
43 import org.onap.so.requestsdb.RequestsDbConstant;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46 import org.springframework.beans.factory.annotation.Autowired;
47 import org.springframework.context.annotation.Primary;
48 import org.springframework.stereotype.Component;
49
50 @Deprecated
51 @WebService(serviceName = "RequestsDbAdapter",
52         endpointInterface = "org.onap.so.adapters.requestsdb.MsoRequestsDbAdapter",
53         targetNamespace = "http://org.onap.so/requestsdb")
54 @Component
55 @Primary
56 public class MsoRequestsDbAdapterImpl implements MsoRequestsDbAdapter {
57
58     private static Logger logger = LoggerFactory.getLogger(MsoRequestsDbAdapterImpl.class);
59
60     @Autowired
61     private InfraActiveRequestsRepository infraActive;
62
63     @Autowired
64     private InstanceNfvoMappingRepository instanceNfvoMappingRepository;
65
66     @Autowired
67     private SiteStatusRepository siteRepo;
68
69     @Autowired
70     private OperationStatusRepository operationStatusRepository;
71
72     @Autowired
73     private ResourceOperationStatusRepository resourceOperationStatusRepository;
74
75     @Transactional
76     @Override
77     public void setInstanceNfvoMappingRepository(String instanceId, String nfvoName, String endpoint, String username,
78             String password, String apiRoot) {
79         InstanceNfvoMapping instanceNfvoMapping = new InstanceNfvoMapping();
80         if (apiRoot != null) {
81             instanceNfvoMapping.setApiRoot(apiRoot);
82         }
83         if (endpoint != null) {
84             instanceNfvoMapping.setEndpoint(endpoint);
85         }
86         if (instanceId != null) {
87             instanceNfvoMapping.setInstanceId(instanceId);
88         }
89         if (nfvoName != null) {
90             instanceNfvoMapping.setNfvoName(nfvoName);
91         }
92         if (username != null) {
93             instanceNfvoMapping.setUsername(username);
94         }
95         if (password != null) {
96             instanceNfvoMapping.setPassword(password);
97         }
98
99         instanceNfvoMappingRepository.save(instanceNfvoMapping);
100     }
101
102     @Transactional
103     @Override
104     public InstanceNfvoMapping getInstanceNfvoMapping(String instanceId) {
105         InstanceNfvoMapping instanceNfvoMapping = instanceNfvoMappingRepository.findOneByInstanceId(instanceId);
106         return instanceNfvoMapping;
107     }
108
109     @Transactional
110     @Override
111     public void updateInfraRequest(String requestId, String lastModifiedBy, String statusMessage, String responseBody,
112             RequestStatusType requestStatus, String progress, String vnfOutputs, String serviceInstanceId,
113             String networkId, String vnfId, String vfModuleId, String volumeGroupId, String serviceInstanceName,
114             String configurationId, String configurationName, String vfModuleName) throws MsoRequestsDbException {
115         try {
116             InfraActiveRequests request = infraActive.findOneByRequestId(requestId);
117             if (request == null) {
118                 String error = "Entity not found. Unable to retrieve MSO Infra Requests DB for Request ID " + requestId;
119                 throw new MsoRequestsDbException(error);
120             }
121             if (statusMessage != null) {
122                 request.setStatusMessage(statusMessage);
123             }
124             if (responseBody != null) {
125                 request.setResponseBody(responseBody);
126             }
127             if (requestStatus != null) {
128                 request.setRequestStatus(requestStatus.toString());
129             }
130             if (progress != null) {
131                 setProgress(progress, request);
132             }
133             if (vnfOutputs != null) {
134                 request.setVnfOutputs(vnfOutputs);
135             }
136             if (serviceInstanceId != null) {
137                 request.setServiceInstanceId(serviceInstanceId);
138             }
139             if (networkId != null) {
140                 request.setNetworkId(networkId);
141             }
142             if (vnfId != null) {
143                 request.setVnfId(vnfId);
144             }
145             if (vfModuleId != null) {
146                 request.setVfModuleId(vfModuleId);
147             }
148             if (volumeGroupId != null) {
149                 request.setVolumeGroupId(volumeGroupId);
150             }
151             if (serviceInstanceName != null) {
152                 request.setServiceInstanceName(serviceInstanceName);
153             }
154             if (vfModuleName != null) {
155                 request.setVfModuleName(vfModuleName);
156             }
157             if (configurationId != null) {
158                 request.setConfigurationId(configurationId);
159             }
160             if (configurationName != null) {
161                 request.setConfigurationName(configurationName);
162             }
163             if (requestStatus == RequestStatusType.COMPLETE || requestStatus == RequestStatusType.FAILED) {
164                 Timestamp nowTimeStamp = new Timestamp(System.currentTimeMillis());
165                 request.setEndTime(nowTimeStamp);
166             }
167             request.setLastModifiedBy(lastModifiedBy);
168             infraActive.save(request);
169         } catch (Exception e) {
170             String error = "Error retrieving MSO Infra Requests DB for Request ID " + requestId;
171             logger.error(error, e);
172             throw new MsoRequestsDbException(error, ErrorCode.BusinessProcessError, e);
173         }
174     }
175
176     private void setProgress(String progress, InfraActiveRequests request) {
177         try {
178             request.setProgress(Long.parseLong(progress));
179         } catch (NumberFormatException e) {
180             logger.warn("UpdateInfraRequest", "Invalid value sent for progress");
181         }
182     }
183
184     @Override
185     @Transactional
186     public InfraActiveRequests getInfraRequest(String requestId) throws MsoRequestsDbException {
187         logger.debug("Call to MSO Infra RequestsDb adapter get method with request Id: {}", requestId);
188         InfraActiveRequests request = null;
189         try {
190             request = infraActive.findOneByRequestId(requestId);
191             if (request == null) {
192                 String error = "Entity not found. Unable to retrieve MSO Infra Requests DB for Request ID " + requestId;
193                 throw new MsoRequestsDbException(error);
194             }
195         } catch (Exception e) {
196             String error = "Error retrieving MSO Infra Requests DB for Request ID " + requestId;
197             logger.error(error, e);
198             throw new MsoRequestsDbException(error, ErrorCode.BusinessProcessError, e);
199         }
200         return request;
201     }
202
203     /**
204      * Get SiteStatus by SiteName.
205      *
206      * @param siteName The unique name of the site
207      * @return Status of that site
208      */
209     @Override
210     @Transactional
211     public boolean getSiteStatus(String siteName) {
212         SiteStatus siteStatus;
213         logger.debug("Request database - get Site Status with Site name: {}", siteName);
214         siteStatus = siteRepo.findOneBySiteName(siteName);
215         if (siteStatus == null) {
216             // if not exist in DB, it means the site is not disabled, thus
217             // return true
218             return true;
219         } else {
220             return siteStatus.getStatus();
221         }
222     }
223
224     /**
225      * update operation status <br>
226      *
227      * @param serviceId
228      * @param operationId
229      * @param operationType
230      * @param userId
231      * @param result
232      * @param operationContent
233      * @param progress
234      * @param reason
235      * @throws MsoRequestsDbException
236      * @since ONAP Amsterdam Release
237      */
238     @Override
239     @Transactional
240     public void updateServiceOperationStatus(String serviceId, String operationId, String operationType, String userId,
241             String result, String operationContent, String progress, String reason) throws MsoRequestsDbException {
242         OperationStatus operStatus = operationStatusRepository.findOneByServiceIdAndOperationId(serviceId, operationId);
243         if (operStatus == null) {
244             String error = "Entity not found. Unable to retrieve OperationStatus Object ServiceId: " + serviceId
245                     + " operationId: " + operationId;
246             logger.error(error);
247             operStatus = new OperationStatus();
248             operStatus.setOperationId(operationId);
249             operStatus.setServiceId(serviceId);
250         }
251
252         operStatus.setUserId(userId);
253         operStatus.setOperation(operationType);
254         operStatus.setReason(reason);
255         operStatus.setProgress(progress);
256         operStatus.setResult(result);
257         operStatus.setOperationContent(operationContent);
258         operStatus.setResult(result);
259         operationStatusRepository.save(operStatus);
260     }
261
262     /**
263      * Init operation status <br>
264      *
265      * @param serviceId
266      * @param operationId
267      * @param operationType
268      * @param userId
269      * @param result
270      * @param operationContent
271      * @param progress
272      * @param reason
273      * @throws MsoRequestsDbException
274      * @since ONAP Casablanca Release
275      */
276     @Override
277     @Transactional
278     public void initServiceOperationStatus(String serviceId, String operationId, String operationType, String userId,
279             String result, String operationContent, String progress, String reason) throws MsoRequestsDbException {
280         OperationStatus operStatus = new OperationStatus();
281
282         operStatus.setOperationId(operationId);
283         operStatus.setServiceId(serviceId);
284         operStatus.setUserId(userId);
285         operStatus.setOperation(operationType);
286         operStatus.setReason(reason);
287         operStatus.setProgress(progress);
288         operStatus.setResult(result);
289         operStatus.setOperationContent(operationContent);
290         operStatus.setResult(result);
291         operationStatusRepository.save(operStatus);
292     }
293
294     /**
295      * init the operation status of all the resources <br>
296      *
297      * @param serviceId the service Id
298      * @param operationId the operation Id
299      * @param operationType the operationType
300      * @param resourceTemplateUUIDs the resources, the UUID is split by ":"
301      * @throws MsoRequestsDbException
302      * @since ONAP Amsterdam Release
303      */
304     @Override
305     @Transactional
306     public void initResourceOperationStatus(String serviceId, String operationId, String operationType,
307             String resourceTemplateUUIDs) throws MsoRequestsDbException {
308         String[] resourceLst = resourceTemplateUUIDs.split(":");
309         for (String resource : resourceLst) {
310             if ("".equals(resource)) {
311                 continue;
312             }
313             ResourceOperationStatus resourceStatus = new ResourceOperationStatus();
314             resourceStatus.setOperationId(operationId);
315             resourceStatus.setServiceId(serviceId);
316             resourceStatus.setResourceTemplateUUID(resource);
317             resourceStatus.setOperType(operationType);
318             resourceStatus.setStatus(RequestsDbConstant.Status.PROCESSING);
319             resourceStatus.setStatusDescription("Waiting for start");
320             resourceOperationStatusRepository.save(resourceStatus);
321
322         }
323     }
324
325     /**
326      * get resource operation status <br>
327      *
328      * @param serviceId
329      * @param operationId
330      * @param resourceTemplateUUID
331      * @return
332      * @throws MsoRequestsDbException
333      * @since ONAP Amsterdam Release
334      */
335     @Override
336     public ResourceOperationStatus getResourceOperationStatus(String serviceId, String operationId,
337             String resourceTemplateUUID) throws MsoRequestsDbException {
338
339         return resourceOperationStatusRepository
340                 .findById(new ResourceOperationStatusId(serviceId, operationId, resourceTemplateUUID))
341                 .orElseThrow(() -> new MsoRequestsDbException("Operation not found:" + operationId));
342
343     }
344
345     /**
346      * update resource operation status <br>
347      *
348      * @param serviceId
349      * @param operationId
350      * @param resourceTemplateUUID
351      * @param operationType
352      * @param resourceInstanceID
353      * @param jobId
354      * @param status
355      * @param progress
356      * @param errorCode
357      * @param statusDescription
358      * @throws MsoRequestsDbException
359      * @since ONAP Amsterdam Release
360      */
361     @Override
362     public void updateResourceOperationStatus(String serviceId, String operationId, String resourceTemplateUUID,
363             String operationType, String resourceInstanceID, String jobId, String status, String progress,
364             String errorCode, String statusDescription) throws MsoRequestsDbException {
365         ResourceOperationStatus resStatus = new ResourceOperationStatus();
366         resStatus.setServiceId(serviceId);
367         resStatus.setOperationId(operationId);
368         resStatus.setResourceTemplateUUID(resourceTemplateUUID);
369         resStatus.setOperType(operationType);
370         resStatus.setResourceInstanceID(resourceInstanceID);
371         resStatus.setJobId(jobId);
372         resStatus.setStatus(status);
373         resStatus.setProgress(progress);
374         resStatus.setErrorCode(errorCode);
375         resStatus.setStatusDescription(statusDescription);
376         resourceOperationStatusRepository.save(resStatus);
377
378         updateOperationStatusBasedOnResourceStatus(resStatus);
379     }
380
381     /**
382      * update service operation status when a operation resource status updated <br>
383      *
384      * @param operStatus the resource operation status
385      * @since ONAP Amsterdam Release
386      */
387     private void updateOperationStatusBasedOnResourceStatus(ResourceOperationStatus operStatus) {
388         String serviceId = operStatus.getServiceId();
389         String operationId = operStatus.getOperationId();
390
391         logger.debug("Request database - update Operation Status Based On Resource Operation Status with service Id: "
392                 + "{}, operationId: {}", serviceId, operationId);
393
394         List<ResourceOperationStatus> lstResourceStatus =
395                 resourceOperationStatusRepository.findByServiceIdAndOperationId(serviceId, operationId);
396         if (lstResourceStatus == null) {
397             logger.error("Unable to retrieve resourceOperStatus Object by ServiceId: {} operationId: {}", serviceId,
398                     operationId);
399             return;
400         }
401
402         // count the total progress
403         int resourceCount = lstResourceStatus.size();
404         int progress = 0;
405         boolean isFinished = true;
406         for (ResourceOperationStatus lstResourceStatu : lstResourceStatus) {
407             progress = progress + Integer.valueOf(lstResourceStatu.getProgress()) / resourceCount;
408             if (RequestsDbConstant.Status.PROCESSING.equals(lstResourceStatu.getStatus())) {
409                 isFinished = false;
410             }
411         }
412
413         OperationStatus serviceOperStatus =
414                 operationStatusRepository.findOneByServiceIdAndOperationId(serviceId, operationId);
415         if (serviceOperStatus == null) {
416             String error = "Entity not found. Unable to retrieve OperationStatus Object ServiceId: " + serviceId
417                     + " operationId: " + operationId;
418             logger.error(error);
419
420             serviceOperStatus = new OperationStatus();
421             serviceOperStatus.setOperationId(operationId);
422             serviceOperStatus.setServiceId(serviceId);
423         }
424
425         progress = progress > 100 ? 100 : progress;
426         serviceOperStatus.setProgress(String.valueOf(progress));
427         serviceOperStatus.setOperationContent(operStatus.getStatusDescription());
428         // if current resource failed. service failed.
429         if (RequestsDbConstant.Status.ERROR.equals(operStatus.getStatus())) {
430             serviceOperStatus.setResult(RequestsDbConstant.Status.ERROR);
431             serviceOperStatus.setReason(operStatus.getStatusDescription());
432         } else if (isFinished) {
433             // if finished
434             serviceOperStatus.setResult(RequestsDbConstant.Status.FINISHED);
435             serviceOperStatus.setProgress(RequestsDbConstant.Progress.ONE_HUNDRED);
436         }
437
438         operationStatusRepository.save(serviceOperStatus);
439     }
440 }