Listing distributions (/services/{distributionId}/distribution/) fails with ClassCast...
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / impl / DistributionMonitoringBusinessLogic.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20 package org.openecomp.sdc.be.components.impl;
21
22 import fj.data.Either;
23 import java.time.Instant;
24 import java.time.ZoneOffset;
25 import java.util.ArrayList;
26 import java.util.HashMap;
27 import java.util.List;
28 import java.util.Map;
29 import java.util.Objects;
30 import java.util.Optional;
31 import java.util.Set;
32 import java.util.stream.Collectors;
33 import org.apache.http.HttpStatus;
34 import org.openecomp.sdc.be.dao.api.ActionStatus;
35 import org.openecomp.sdc.be.dao.cassandra.AuditCassandraDao;
36 import org.openecomp.sdc.be.info.DistributionStatusInfo;
37 import org.openecomp.sdc.be.info.DistributionStatusListResponse;
38 import org.openecomp.sdc.be.info.DistributionStatusOfServiceInfo;
39 import org.openecomp.sdc.be.info.DistributionStatusOfServiceListResponce;
40 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
41 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
42 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
43 import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
44 import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
45 import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
46 import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
47 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
48 import org.openecomp.sdc.be.resources.data.auditing.AuditingGenericEvent;
49 import org.openecomp.sdc.be.resources.data.auditing.DistributionStatusEvent;
50 import org.openecomp.sdc.common.datastructure.AuditingFieldsKey;
51 import org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode;
52 import org.openecomp.sdc.common.log.wrappers.Logger;
53 import org.openecomp.sdc.exception.ResponseFormat;
54 import org.springframework.beans.factory.annotation.Autowired;
55 import org.springframework.stereotype.Component;
56
57 @Component("distributionMonitoringBusinessLogic")
58 public class DistributionMonitoringBusinessLogic extends BaseBusinessLogic {
59
60     private static final Logger log = Logger.getLogger(ArtifactsBusinessLogic.class.getName());
61     private static final String DEPLOYED = "Deployed";
62     private static final String ERROR = "Error";
63     private static final String DISTRIBUTED = "Distributed";
64     private static final String IN_PROGRESS = "In Progress";
65     private final AuditCassandraDao cassandraDao;
66
67     @Autowired
68     public DistributionMonitoringBusinessLogic(IElementOperation elementDao, IGroupOperation groupOperation,
69                                                IGroupInstanceOperation groupInstanceOperation, IGroupTypeOperation groupTypeOperation,
70                                                InterfaceOperation interfaceOperation, InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
71                                                AuditCassandraDao cassandraDao, ArtifactsOperations artifactToscaOperation) {
72         super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, interfaceOperation, interfaceLifecycleTypeOperation,
73             artifactToscaOperation);
74         this.cassandraDao = cassandraDao;
75     }
76
77     public Either<DistributionStatusListResponse, ResponseFormat> getListOfDistributionStatus(String did, String userId) {
78         validateUserExists(userId);
79         log.trace("getListOfDistributionStatus for did {}", did);
80         Either<List<DistributionStatusEvent>, ActionStatus> distributionStatus = cassandraDao.getListOfDistributionStatuses(did);
81         if (distributionStatus.isRight()) {
82             log.debug("not found distribution statuses for did {}   status is {} ", did, distributionStatus.right().value());
83             return Either.right(componentsUtils.getResponseFormat(distributionStatus.right().value(), did));
84         }
85         List<DistributionStatusInfo> distribStatusInfoList = distributionStatus.left().value().stream()
86             .filter(Objects::nonNull)
87             .map(DistributionStatusInfo::new)
88             .collect(Collectors.toList());
89
90         DistributionStatusListResponse distributionStatusListResponse = new DistributionStatusListResponse();
91         distributionStatusListResponse.setDistributionStatusList(distribStatusInfoList);
92         log.trace("list statuses for did {} is {} ", did, distribStatusInfoList);
93         return Either.left(distributionStatusListResponse);
94     }
95
96     public Either<DistributionStatusOfServiceListResponce, ResponseFormat> getListOfDistributionServiceStatus(String serviceUuid, String userId) {
97         validateUserExists(userId);
98         log.trace("getListOfDistributionServiceStatus for serviceUUID {}", serviceUuid);
99         Either<List<? extends AuditingGenericEvent>, ActionStatus> status = cassandraDao.getServiceDistributionStatusesList(serviceUuid);
100         if (status.isRight()) {
101             log.debug("failed to find service distribution statuses. error: {}", status);
102             return Either.right(componentsUtils.getResponseFormat(status.right().value(), serviceUuid));
103         }
104         List<? extends AuditingGenericEvent> distributionStatusEventList = status.left().value();
105         List<DistributionStatusOfServiceInfo> distributionStatusInfoList = handleAuditingDaoResponse(distributionStatusEventList);
106         DistributionStatusOfServiceListResponce distributionStatusListResponse = new DistributionStatusOfServiceListResponce(distributionStatusInfoList);
107         return Either.left(distributionStatusListResponse);
108     }
109
110     private List<DistributionStatusOfServiceInfo> handleAuditingDaoResponse(List<? extends AuditingGenericEvent> distribStatusInfoList) {
111         List<DistributionStatusOfServiceInfo> reslist = new ArrayList<>();
112         Map<String, List<AuditingGenericEvent>> serviceDidMap = createServiceDidMap(distribStatusInfoList);
113         Set<String> didSet = serviceDidMap.keySet();
114         for (String did : didSet) {
115             DistributionStatusOfServiceInfo distributionStatusOfServiceInfo = new DistributionStatusOfServiceInfo();
116             distributionStatusOfServiceInfo.setDistributionID(did);
117             String dReguestStatus = "";
118             String dNotifyStatus = "";
119             boolean isResult = false;
120             List<? extends AuditingGenericEvent> auditingGenericEventList = serviceDidMap.get(did);
121             AuditingGenericEvent resAuditingGenericEvent = null;
122             for (AuditingGenericEvent auditingGenericEvent : auditingGenericEventList) {
123                 auditingGenericEvent.fillFields();
124                 String action = (String) auditingGenericEvent.getFields().get(AuditingFieldsKey.AUDIT_ACTION.getDisplayName());
125                 Object modifierUserId = auditingGenericEvent.getFields().get(AuditingFieldsKey.AUDIT_MODIFIER_UID.getDisplayName());
126                 if (modifierUserId != null) {
127                     distributionStatusOfServiceInfo.setUserId((String) modifierUserId);
128                 }
129                 if (action.equals(AuditingActionEnum.DISTRIBUTION_DEPLOY.getName())) {
130                     isResult = true;
131                     resAuditingGenericEvent = auditingGenericEvent;
132                     break;
133                 } else if (action.equals(AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REQUEST.getName())) {
134                     dReguestStatus = getStatusFromAuditEvent(auditingGenericEvent);
135                 } else if (action.equals(AuditingActionEnum.DISTRIBUTION_NOTIFY.getName())) {
136                     dNotifyStatus = getStatusFromAuditEvent(auditingGenericEvent);
137                 }
138                 resAuditingGenericEvent = auditingGenericEvent;
139             }
140             if (resAuditingGenericEvent != null) {
141                 Map<String, Object> fields = resAuditingGenericEvent.getFields();
142                 if (fields != null) {
143                     Optional.ofNullable(fields.get(AuditingFieldsKey.AUDIT_TIMESTAMP.getDisplayName()))
144                         .ifPresent(timestamp -> distributionStatusOfServiceInfo.setTimestamp(formatTimestamp(timestamp)));
145                 }
146             }
147             if (!isResult) {
148                 if (dReguestStatus.equals(String.valueOf(HttpStatus.SC_OK))) {
149                     if (dNotifyStatus.isEmpty()) {
150                         distributionStatusOfServiceInfo.setDeployementStatus(IN_PROGRESS);
151                     } else {
152                         if (dNotifyStatus.equals(String.valueOf(HttpStatus.SC_OK))) {
153                             distributionStatusOfServiceInfo.setDeployementStatus(DISTRIBUTED);
154                         } else {
155                             distributionStatusOfServiceInfo.setDeployementStatus(ERROR);
156                         }
157                     }
158                 } else {
159                     distributionStatusOfServiceInfo.setDeployementStatus(ERROR);
160                 }
161             } else {
162                 distributionStatusOfServiceInfo.setDeployementStatus(DEPLOYED);
163             }
164             reslist.add(distributionStatusOfServiceInfo);
165         }
166         return reslist;
167     }
168
169     private String formatTimestamp(Object timestamp) {
170         if(timestamp instanceof String) {
171             return (String) timestamp;
172         } else if (timestamp instanceof Long) {
173             try {
174                 return Instant.ofEpochMilli((Long) timestamp).atOffset(ZoneOffset.UTC).toString();
175             } catch (Exception e) {
176                 log.warn(EcompLoggerErrorCode.DATA_ERROR, "sdc-be", "Failed to format timestamp: {}. Returning without formatting", timestamp, e);
177                 return String.valueOf(timestamp);
178             }
179         } else {
180             return String.valueOf(timestamp);
181         }
182     }
183
184     private String getStatusFromAuditEvent(AuditingGenericEvent auditingGenericEvent) {
185         String status = "";
186         Object requestStatus = auditingGenericEvent.getFields().get(AuditingFieldsKey.AUDIT_STATUS.getDisplayName());
187         if (requestStatus instanceof String) {
188             status = (String) requestStatus;
189         }
190         return status;
191     }
192
193     private Map<String, List<AuditingGenericEvent>> createServiceDidMap(List<? extends AuditingGenericEvent> distribStatusInfoList) {
194         Map<String, List<AuditingGenericEvent>> serviceDidMap = new HashMap<>();
195         for (AuditingGenericEvent auditingGenericEvent : distribStatusInfoList) {
196             List<AuditingGenericEvent> auditingGenericEventList = null;
197             String did = "";
198             auditingGenericEvent.fillFields();
199             Object didValue = auditingGenericEvent.getFields().get(AuditingFieldsKey.AUDIT_DISTRIBUTION_ID.getDisplayName());
200             if (didValue != null) {
201                 did = (String) didValue;
202             }
203             if (!did.isEmpty()) {
204                 if (serviceDidMap.containsKey(did)) {
205                     auditingGenericEventList = serviceDidMap.get(did);
206                 }
207                 if (auditingGenericEventList == null) {
208                     auditingGenericEventList = new ArrayList<>();
209                 }
210                 auditingGenericEventList.add(auditingGenericEvent);
211                 serviceDidMap.put(did, auditingGenericEventList);
212             }
213         }
214         return serviceDidMap;
215     }
216 }