6ecf5dc3f0db564332a39b865ef470fa9174bd13
[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.ResourceOperationStatusId;
35 import org.onap.so.db.request.beans.SiteStatus;
36 import org.onap.so.db.request.data.repository.InfraActiveRequestsRepository;
37 import org.onap.so.db.request.data.repository.OperationStatusRepository;
38 import org.onap.so.db.request.data.repository.ResourceOperationStatusRepository;
39 import org.onap.so.db.request.data.repository.SiteStatusRepository;
40 import org.onap.so.logger.ErrorCode;
41 import org.onap.so.requestsdb.RequestsDbConstant;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44 import org.springframework.beans.factory.annotation.Autowired;
45 import org.springframework.context.annotation.Primary;
46 import org.springframework.stereotype.Component;
47
48 @WebService(serviceName = "RequestsDbAdapter",
49         endpointInterface = "org.onap.so.adapters.requestsdb.MsoRequestsDbAdapter",
50         targetNamespace = "http://org.onap.so/requestsdb")
51 @Component
52 @Primary
53 public class MsoRequestsDbAdapterImpl implements MsoRequestsDbAdapter {
54
55     private static Logger logger = LoggerFactory.getLogger(MsoRequestsDbAdapterImpl.class);
56
57     @Autowired
58     private InfraActiveRequestsRepository infraActive;
59
60     @Autowired
61     private SiteStatusRepository siteRepo;
62
63     @Autowired
64     private OperationStatusRepository operationStatusRepository;
65
66     @Autowired
67     private ResourceOperationStatusRepository resourceOperationStatusRepository;
68
69     @Transactional
70     @Override
71     public void updateInfraRequest(String requestId, String lastModifiedBy, String statusMessage, String responseBody,
72             RequestStatusType requestStatus, String progress, String vnfOutputs, String serviceInstanceId,
73             String networkId, String vnfId, String vfModuleId, String volumeGroupId, String serviceInstanceName,
74             String configurationId, String configurationName, String vfModuleName) throws MsoRequestsDbException {
75         try {
76             InfraActiveRequests request = infraActive.findOneByRequestId(requestId);
77             if (request == null) {
78                 String error = "Entity not found. Unable to retrieve MSO Infra Requests DB for Request ID " + requestId;
79                 throw new MsoRequestsDbException(error);
80             }
81             if (statusMessage != null) {
82                 request.setStatusMessage(statusMessage);
83             }
84             if (responseBody != null) {
85                 request.setResponseBody(responseBody);
86             }
87             if (requestStatus != null) {
88                 request.setRequestStatus(requestStatus.toString());
89             }
90             if (progress != null) {
91                 setProgress(progress, request);
92             }
93             if (vnfOutputs != null) {
94                 request.setVnfOutputs(vnfOutputs);
95             }
96             if (serviceInstanceId != null) {
97                 request.setServiceInstanceId(serviceInstanceId);
98             }
99             if (networkId != null) {
100                 request.setNetworkId(networkId);
101             }
102             if (vnfId != null) {
103                 request.setVnfId(vnfId);
104             }
105             if (vfModuleId != null) {
106                 request.setVfModuleId(vfModuleId);
107             }
108             if (volumeGroupId != null) {
109                 request.setVolumeGroupId(volumeGroupId);
110             }
111             if (serviceInstanceName != null) {
112                 request.setServiceInstanceName(serviceInstanceName);
113             }
114             if (vfModuleName != null) {
115                 request.setVfModuleName(vfModuleName);
116             }
117             if (configurationId != null) {
118                 request.setConfigurationId(configurationId);
119             }
120             if (configurationName != null) {
121                 request.setConfigurationName(configurationName);
122             }
123             if (requestStatus == RequestStatusType.COMPLETE || requestStatus == RequestStatusType.FAILED) {
124                 Timestamp nowTimeStamp = new Timestamp(System.currentTimeMillis());
125                 request.setEndTime(nowTimeStamp);
126             }
127             request.setLastModifiedBy(lastModifiedBy);
128             infraActive.save(request);
129         } catch (Exception e) {
130             String error = "Error retrieving MSO Infra Requests DB for Request ID " + requestId;
131             logger.error(error, e);
132             throw new MsoRequestsDbException(error, ErrorCode.BusinessProcesssError, e);
133         }
134     }
135
136     private void setProgress(String progress, InfraActiveRequests request) {
137         try {
138             request.setProgress(Long.parseLong(progress));
139         } catch (NumberFormatException e) {
140             logger.warn("UpdateInfraRequest", "Invalid value sent for progress");
141         }
142     }
143
144     @Override
145     @Transactional
146     public InfraActiveRequests getInfraRequest(String requestId) throws MsoRequestsDbException {
147         logger.debug("Call to MSO Infra RequestsDb adapter get method with request Id: {}", requestId);
148         InfraActiveRequests request = null;
149         try {
150             request = infraActive.findOneByRequestId(requestId);
151             if (request == null) {
152                 String error = "Entity not found. Unable to retrieve MSO Infra Requests DB for Request ID " + requestId;
153                 throw new MsoRequestsDbException(error);
154             }
155         } catch (Exception e) {
156             String error = "Error retrieving MSO Infra Requests DB for Request ID " + requestId;
157             logger.error(error, e);
158             throw new MsoRequestsDbException(error, ErrorCode.BusinessProcesssError, e);
159         }
160         return request;
161     }
162
163     /**
164      * Get SiteStatus by SiteName.
165      *
166      * @param siteName The unique name of the site
167      * @return Status of that site
168      */
169     @Override
170     @Transactional
171     public boolean getSiteStatus(String siteName) {
172         SiteStatus siteStatus;
173         logger.debug("Request database - get Site Status with Site name: {}", siteName);
174         siteStatus = siteRepo.findOneBySiteName(siteName);
175         if (siteStatus == null) {
176             // if not exist in DB, it means the site is not disabled, thus
177             // return true
178             return true;
179         } else {
180             return siteStatus.getStatus();
181         }
182     }
183
184     /**
185      * update operation status <br>
186      * 
187      * @param serviceId
188      * @param operationId
189      * @param operationType
190      * @param userId
191      * @param result
192      * @param operationContent
193      * @param progress
194      * @param reason
195      * @throws MsoRequestsDbException
196      * @since ONAP Amsterdam Release
197      */
198     @Override
199     @Transactional
200     public void updateServiceOperationStatus(String serviceId, String operationId, String operationType, String userId,
201             String result, String operationContent, String progress, String reason) throws MsoRequestsDbException {
202         OperationStatus operStatus = operationStatusRepository.findOneByServiceIdAndOperationId(serviceId, operationId);
203         if (operStatus == null) {
204             String error = "Entity not found. Unable to retrieve OperationStatus Object ServiceId: " + serviceId
205                     + " operationId: " + operationId;
206             logger.error(error);
207             operStatus = new OperationStatus();
208             operStatus.setOperationId(operationId);
209             operStatus.setServiceId(serviceId);
210         }
211
212         operStatus.setUserId(userId);
213         operStatus.setOperation(operationType);
214         operStatus.setReason(reason);
215         operStatus.setProgress(progress);
216         operStatus.setResult(result);
217         operStatus.setOperationContent(operationContent);
218         operStatus.setResult(result);
219         operationStatusRepository.save(operStatus);
220     }
221
222     /**
223      * Init operation status <br>
224      *
225      * @param serviceId
226      * @param operationId
227      * @param operationType
228      * @param userId
229      * @param result
230      * @param operationContent
231      * @param progress
232      * @param reason
233      * @throws MsoRequestsDbException
234      * @since ONAP Casablanca Release
235      */
236     @Override
237     @Transactional
238     public void initServiceOperationStatus(String serviceId, String operationId, String operationType, String userId,
239             String result, String operationContent, String progress, String reason) throws MsoRequestsDbException {
240         OperationStatus operStatus = new OperationStatus();
241
242         operStatus.setOperationId(operationId);
243         operStatus.setServiceId(serviceId);
244         operStatus.setUserId(userId);
245         operStatus.setOperation(operationType);
246         operStatus.setReason(reason);
247         operStatus.setProgress(progress);
248         operStatus.setResult(result);
249         operStatus.setOperationContent(operationContent);
250         operStatus.setResult(result);
251         operationStatusRepository.save(operStatus);
252     }
253
254     /**
255      * init the operation status of all the resources <br>
256      * 
257      * @param serviceId the service Id
258      * @param operationId the operation Id
259      * @param operationType the operationType
260      * @param resourceTemplateUUIDs the resources, the UUID is split by ":"
261      * @throws MsoRequestsDbException
262      * @since ONAP Amsterdam Release
263      */
264     @Override
265     @Transactional
266     public void initResourceOperationStatus(String serviceId, String operationId, String operationType,
267             String resourceTemplateUUIDs) throws MsoRequestsDbException {
268         String[] resourceLst = resourceTemplateUUIDs.split(":");
269         for (String resource : resourceLst) {
270             if ("".equals(resource)) {
271                 continue;
272             }
273             ResourceOperationStatus resourceStatus = new ResourceOperationStatus();
274             resourceStatus.setOperationId(operationId);
275             resourceStatus.setServiceId(serviceId);
276             resourceStatus.setResourceTemplateUUID(resource);
277             resourceStatus.setOperType(operationType);
278             resourceStatus.setStatus(RequestsDbConstant.Status.PROCESSING);
279             resourceStatus.setStatusDescription("Waiting for start");
280             resourceOperationStatusRepository.save(resourceStatus);
281
282         }
283     }
284
285     /**
286      * get resource operation status <br>
287      * 
288      * @param serviceId
289      * @param operationId
290      * @param resourceTemplateUUID
291      * @return
292      * @throws MsoRequestsDbException
293      * @since ONAP Amsterdam Release
294      */
295     @Override
296     public ResourceOperationStatus getResourceOperationStatus(String serviceId, String operationId,
297             String resourceTemplateUUID) throws MsoRequestsDbException {
298
299         return resourceOperationStatusRepository
300                 .findById(new ResourceOperationStatusId(serviceId, operationId, resourceTemplateUUID))
301                 .orElseThrow(() -> new MsoRequestsDbException("Operation not found:" + operationId));
302
303     }
304
305     /**
306      * update resource operation status <br>
307      * 
308      * @param serviceId
309      * @param operationId
310      * @param resourceTemplateUUID
311      * @param operationType
312      * @param resourceInstanceID
313      * @param jobId
314      * @param status
315      * @param progress
316      * @param errorCode
317      * @param statusDescription
318      * @throws MsoRequestsDbException
319      * @since ONAP Amsterdam Release
320      */
321     @Override
322     public void updateResourceOperationStatus(String serviceId, String operationId, String resourceTemplateUUID,
323             String operationType, String resourceInstanceID, String jobId, String status, String progress,
324             String errorCode, String statusDescription) throws MsoRequestsDbException {
325         ResourceOperationStatus resStatus = new ResourceOperationStatus();
326         resStatus.setServiceId(serviceId);
327         resStatus.setOperationId(operationId);
328         resStatus.setResourceTemplateUUID(resourceTemplateUUID);
329         resStatus.setOperType(operationType);
330         resStatus.setResourceInstanceID(resourceInstanceID);
331         resStatus.setJobId(jobId);
332         resStatus.setStatus(status);
333         resStatus.setProgress(progress);
334         resStatus.setErrorCode(errorCode);
335         resStatus.setStatusDescription(statusDescription);
336         resourceOperationStatusRepository.save(resStatus);
337
338         updateOperationStatusBasedOnResourceStatus(resStatus);
339     }
340
341     /**
342      * update service operation status when a operation resource status updated <br>
343      * 
344      * @param operStatus the resource operation status
345      * @since ONAP Amsterdam Release
346      */
347     private void updateOperationStatusBasedOnResourceStatus(ResourceOperationStatus operStatus) {
348         String serviceId = operStatus.getServiceId();
349         String operationId = operStatus.getOperationId();
350
351         logger.debug("Request database - update Operation Status Based On Resource Operation Status with service Id: "
352                 + "{}, operationId: {}", serviceId, operationId);
353
354         List<ResourceOperationStatus> lstResourceStatus =
355                 resourceOperationStatusRepository.findByServiceIdAndOperationId(serviceId, operationId);
356         if (lstResourceStatus == null) {
357             logger.error("Unable to retrieve resourceOperStatus Object by ServiceId: {} operationId: {}", serviceId,
358                     operationId);
359             return;
360         }
361
362         // count the total progress
363         int resourceCount = lstResourceStatus.size();
364         int progress = 0;
365         boolean isFinished = true;
366         for (ResourceOperationStatus lstResourceStatu : lstResourceStatus) {
367             progress = progress + Integer.valueOf(lstResourceStatu.getProgress()) / resourceCount;
368             if (RequestsDbConstant.Status.PROCESSING.equals(lstResourceStatu.getStatus())) {
369                 isFinished = false;
370             }
371         }
372
373         OperationStatus serviceOperStatus =
374                 operationStatusRepository.findOneByServiceIdAndOperationId(serviceId, operationId);
375         if (serviceOperStatus == null) {
376             String error = "Entity not found. Unable to retrieve OperationStatus Object ServiceId: " + serviceId
377                     + " operationId: " + operationId;
378             logger.error(error);
379
380             serviceOperStatus = new OperationStatus();
381             serviceOperStatus.setOperationId(operationId);
382             serviceOperStatus.setServiceId(serviceId);
383         }
384
385         progress = progress > 100 ? 100 : progress;
386         serviceOperStatus.setProgress(String.valueOf(progress));
387         serviceOperStatus.setOperationContent(operStatus.getStatusDescription());
388         // if current resource failed. service failed.
389         if (RequestsDbConstant.Status.ERROR.equals(operStatus.getStatus())) {
390             serviceOperStatus.setResult(RequestsDbConstant.Status.ERROR);
391             serviceOperStatus.setReason(operStatus.getStatusDescription());
392         } else if (isFinished) {
393             // if finished
394             serviceOperStatus.setResult(RequestsDbConstant.Status.FINISHED);
395             serviceOperStatus.setProgress(RequestsDbConstant.Progress.ONE_HUNDRED);
396         }
397
398         operationStatusRepository.save(serviceOperStatus);
399     }
400 }