/*- * ============LICENSE_START======================================================= * SDC * ================================================================================ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= */ package org.openecomp.sdc.be.components.impl; import fj.data.Either; import java.time.Instant; import java.time.ZoneOffset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import org.apache.http.HttpStatus; import org.openecomp.sdc.be.dao.api.ActionStatus; import org.openecomp.sdc.be.dao.cassandra.AuditCassandraDao; import org.openecomp.sdc.be.info.DistributionStatusInfo; import org.openecomp.sdc.be.info.DistributionStatusListResponse; import org.openecomp.sdc.be.info.DistributionStatusOfServiceInfo; import org.openecomp.sdc.be.info.DistributionStatusOfServiceListResponce; import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations; import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation; import org.openecomp.sdc.be.model.operations.api.IElementOperation; import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation; import org.openecomp.sdc.be.model.operations.api.IGroupOperation; import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation; import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation; import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum; import org.openecomp.sdc.be.resources.data.auditing.AuditingGenericEvent; import org.openecomp.sdc.be.resources.data.auditing.DistributionStatusEvent; import org.openecomp.sdc.common.datastructure.AuditingFieldsKey; import org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode; import org.openecomp.sdc.common.log.wrappers.Logger; import org.openecomp.sdc.exception.ResponseFormat; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component("distributionMonitoringBusinessLogic") public class DistributionMonitoringBusinessLogic extends BaseBusinessLogic { private static final Logger log = Logger.getLogger(ArtifactsBusinessLogic.class.getName()); private static final String DEPLOYED = "Deployed"; private static final String ERROR = "Error"; private static final String DISTRIBUTED = "Distributed"; private static final String IN_PROGRESS = "In Progress"; private final AuditCassandraDao cassandraDao; @Autowired public DistributionMonitoringBusinessLogic(IElementOperation elementDao, IGroupOperation groupOperation, IGroupInstanceOperation groupInstanceOperation, IGroupTypeOperation groupTypeOperation, InterfaceOperation interfaceOperation, InterfaceLifecycleOperation interfaceLifecycleTypeOperation, AuditCassandraDao cassandraDao, ArtifactsOperations artifactToscaOperation) { super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, interfaceOperation, interfaceLifecycleTypeOperation, artifactToscaOperation); this.cassandraDao = cassandraDao; } public Either getListOfDistributionStatus(String did, String userId) { validateUserExists(userId); log.trace("getListOfDistributionStatus for did {}", did); Either, ActionStatus> distributionStatus = cassandraDao.getListOfDistributionStatuses(did); if (distributionStatus.isRight()) { log.debug("not found distribution statuses for did {} status is {} ", did, distributionStatus.right().value()); return Either.right(componentsUtils.getResponseFormat(distributionStatus.right().value(), did)); } List distribStatusInfoList = distributionStatus.left().value().stream() .filter(Objects::nonNull) .map(DistributionStatusInfo::new) .collect(Collectors.toList()); DistributionStatusListResponse distributionStatusListResponse = new DistributionStatusListResponse(); distributionStatusListResponse.setDistributionStatusList(distribStatusInfoList); log.trace("list statuses for did {} is {} ", did, distribStatusInfoList); return Either.left(distributionStatusListResponse); } public Either getListOfDistributionServiceStatus(String serviceUuid, String userId) { validateUserExists(userId); log.trace("getListOfDistributionServiceStatus for serviceUUID {}", serviceUuid); Either, ActionStatus> status = cassandraDao.getServiceDistributionStatusesList(serviceUuid); if (status.isRight()) { log.debug("failed to find service distribution statuses. error: {}", status); return Either.right(componentsUtils.getResponseFormat(status.right().value(), serviceUuid)); } List distributionStatusEventList = status.left().value(); List distributionStatusInfoList = handleAuditingDaoResponse(distributionStatusEventList); DistributionStatusOfServiceListResponce distributionStatusListResponse = new DistributionStatusOfServiceListResponce(distributionStatusInfoList); return Either.left(distributionStatusListResponse); } private List handleAuditingDaoResponse(List distribStatusInfoList) { List reslist = new ArrayList<>(); Map> serviceDidMap = createServiceDidMap(distribStatusInfoList); Set didSet = serviceDidMap.keySet(); for (String did : didSet) { DistributionStatusOfServiceInfo distributionStatusOfServiceInfo = new DistributionStatusOfServiceInfo(); distributionStatusOfServiceInfo.setDistributionID(did); String dReguestStatus = ""; String dNotifyStatus = ""; boolean isResult = false; List auditingGenericEventList = serviceDidMap.get(did); AuditingGenericEvent resAuditingGenericEvent = null; for (AuditingGenericEvent auditingGenericEvent : auditingGenericEventList) { auditingGenericEvent.fillFields(); String action = (String) auditingGenericEvent.getFields().get(AuditingFieldsKey.AUDIT_ACTION.getDisplayName()); Object modifierUserId = auditingGenericEvent.getFields().get(AuditingFieldsKey.AUDIT_MODIFIER_UID.getDisplayName()); if (modifierUserId != null) { distributionStatusOfServiceInfo.setUserId((String) modifierUserId); } if (action.equals(AuditingActionEnum.DISTRIBUTION_DEPLOY.getName())) { isResult = true; resAuditingGenericEvent = auditingGenericEvent; break; } else if (action.equals(AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REQUEST.getName())) { dReguestStatus = getStatusFromAuditEvent(auditingGenericEvent); } else if (action.equals(AuditingActionEnum.DISTRIBUTION_NOTIFY.getName())) { dNotifyStatus = getStatusFromAuditEvent(auditingGenericEvent); } resAuditingGenericEvent = auditingGenericEvent; } if (resAuditingGenericEvent != null) { Map fields = resAuditingGenericEvent.getFields(); if (fields != null) { Optional.ofNullable(fields.get(AuditingFieldsKey.AUDIT_TIMESTAMP.getDisplayName())) .ifPresent(timestamp -> distributionStatusOfServiceInfo.setTimestamp(formatTimestamp(timestamp))); } } if (!isResult) { if (dReguestStatus.equals(String.valueOf(HttpStatus.SC_OK))) { if (dNotifyStatus.isEmpty()) { distributionStatusOfServiceInfo.setDeployementStatus(IN_PROGRESS); } else { if (dNotifyStatus.equals(String.valueOf(HttpStatus.SC_OK))) { distributionStatusOfServiceInfo.setDeployementStatus(DISTRIBUTED); } else { distributionStatusOfServiceInfo.setDeployementStatus(ERROR); } } } else { distributionStatusOfServiceInfo.setDeployementStatus(ERROR); } } else { distributionStatusOfServiceInfo.setDeployementStatus(DEPLOYED); } reslist.add(distributionStatusOfServiceInfo); } return reslist; } private String formatTimestamp(Object timestamp) { if(timestamp instanceof String) { return (String) timestamp; } else if (timestamp instanceof Long) { try { return Instant.ofEpochMilli((Long) timestamp).atOffset(ZoneOffset.UTC).toString(); } catch (Exception e) { log.warn(EcompLoggerErrorCode.DATA_ERROR, "sdc-be", "Failed to format timestamp: {}. Returning without formatting", timestamp, e); return String.valueOf(timestamp); } } else { return String.valueOf(timestamp); } } private String getStatusFromAuditEvent(AuditingGenericEvent auditingGenericEvent) { String status = ""; Object requestStatus = auditingGenericEvent.getFields().get(AuditingFieldsKey.AUDIT_STATUS.getDisplayName()); if (requestStatus instanceof String) { status = (String) requestStatus; } return status; } private Map> createServiceDidMap(List distribStatusInfoList) { Map> serviceDidMap = new HashMap<>(); for (AuditingGenericEvent auditingGenericEvent : distribStatusInfoList) { List auditingGenericEventList = null; String did = ""; auditingGenericEvent.fillFields(); Object didValue = auditingGenericEvent.getFields().get(AuditingFieldsKey.AUDIT_DISTRIBUTION_ID.getDisplayName()); if (didValue != null) { did = (String) didValue; } if (!did.isEmpty()) { if (serviceDidMap.containsKey(did)) { auditingGenericEventList = serviceDidMap.get(did); } if (auditingGenericEventList == null) { auditingGenericEventList = new ArrayList<>(); } auditingGenericEventList.add(auditingGenericEvent); serviceDidMap.put(did, auditingGenericEventList); } } return serviceDidMap; } }