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