package org.ovirt.engine.core.dao;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import org.ovirt.engine.core.common.AuditLogSeverity;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.businessentities.AuditLog;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dal.dbbroker.DbEngineDialect;
import org.ovirt.engine.core.dal.dbbroker.DbFacadeUtils;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
/**
* {@code AuditLogDaoImpl} provides a concrete implementation of {@link AuditLogDao}.
*/
@Named
@Singleton
public class AuditLogDaoImpl extends BaseDao implements AuditLogDao {
private static final RowMapper<AuditLog> auditLogRowMapper = (rs, rowNum) -> {
AuditLog entity = new AuditLog();
entity.setAuditLogId(rs.getLong("audit_log_id"));
entity.setLogTime(DbFacadeUtils.fromDate(rs.getTimestamp("log_time")));
entity.setLogType(AuditLogType.forValue(rs.getInt("log_type")));
entity.setSeverity(AuditLogSeverity.forValue(rs.getInt("severity")));
entity.setMessage(rs.getString("message"));
entity.setUserId(getGuid(rs, "user_id"));
entity.setUserName(rs.getString("user_name"));
entity.setVdsId(getGuid(rs, "vds_id"));
entity.setVdsName(rs.getString("vds_name"));
entity.setVmId(getGuid(rs, "vm_id"));
entity.setVmName(rs.getString("vm_name"));
entity.setVmTemplateId(getGuid(rs, "vm_template_id"));
entity.setVmTemplateName(rs.getString("vm_template_name"));
entity.setStoragePoolId(getGuid(rs, "storage_pool_id"));
entity.setStoragePoolName(rs.getString("storage_pool_name"));
entity.setStorageDomainId(getGuid(rs, "storage_domain_id"));
entity.setStorageDomainName(rs.getString("storage_domain_name"));
entity.setClusterId(getGuid(rs, "cluster_id"));
entity.setClusterName(rs.getString("cluster_name"));
entity.setCorrelationId(rs.getString("correlation_id"));
entity.setJobId(getGuid(rs, "job_id"));
entity.setQuotaId(getGuid(rs, "quota_id"));
entity.setQuotaName(rs.getString("quota_name"));
entity.setGlusterVolumeId(getGuid(rs, "gluster_volume_id"));
entity.setGlusterVolumeName(rs.getString("gluster_volume_name"));
entity.setOrigin(rs.getString("origin"));
entity.setCustomEventId(rs.getInt("custom_event_id"));
entity.setEventFloodInSec(rs.getInt("event_flood_in_sec"));
entity.setCustomData(rs.getString("custom_data"));
entity.setDeleted(rs.getBoolean("deleted"));
entity.setCallStack(rs.getString("call_stack"));
entity.setBrickId(getGuid(rs, "brick_id"));
entity.setBrickPath(rs.getString("brick_path"));
return entity;
};
private final DbEngineDialect dbEngineDialect;
@Inject
AuditLogDaoImpl(DbEngineDialect dbEngineDialect) {
Objects.requireNonNull(dbEngineDialect, "dbEngineDialect cannot be null");
this.dbEngineDialect = dbEngineDialect;
}
@Override
public AuditLog get(long id) {
MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource()
.addValue("audit_log_id", id);
return getCallsHandler().executeRead("GetAuditLogByAuditLogId", auditLogRowMapper, parameterSource);
}
@Override
public AuditLog getByOriginAndCustomEventId(String origin, int customEventId) {
MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource()
.addValue("origin", origin)
.addValue("custom_event_id", customEventId);
return getCallsHandler().executeRead("GetAuditLogByOriginAndCustomEventId", auditLogRowMapper, parameterSource);
}
@Override
public List<AuditLog> getAllAfterDate(Date cutoff) {
MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource()
.addValue("date", cutoff);
return getCallsHandler().executeReadList("GetAuditLogLaterThenDate", auditLogRowMapper, parameterSource);
}
@Override
public List<AuditLog> getAllWithQuery(String query) {
return getJdbcTemplate().query(query, auditLogRowMapper);
}
@Override
public List<AuditLog> getAll(Guid userID, boolean isFiltered) {
MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource()
.addValue("user_id", userID).addValue("is_filtered", isFiltered);
return getCallsHandler().executeReadList("GetAllFromAuditLog", auditLogRowMapper, parameterSource);
}
@Override
public List<AuditLog> getAllByVMId(Guid vmId) {
return getAllByVMId(vmId, null, false);
}
@Override
public List<AuditLog> getAllByVMId(Guid vmId, Guid userID, boolean isFiltered) {
MapSqlParameterSource parameterSource =
getCustomMapSqlParameterSource()
.addValue("vm_id", vmId)
.addValue("user_id", userID)
.addValue("is_filtered", isFiltered);
return getCallsHandler().executeReadList("GetAuditLogByVMId", auditLogRowMapper, parameterSource);
}
@Override
public List<AuditLog> getAllByVMTemplateId(Guid vmId) {
return getAllByVMTemplateId(vmId, null, false);
}
@Override
public List<AuditLog> getAllByVMTemplateId(Guid vmId, Guid userID, boolean isFiltered) {
MapSqlParameterSource parameterSource =
getCustomMapSqlParameterSource()
.addValue("vm_template_id", vmId)
.addValue("user_id", userID)
.addValue("is_filtered", isFiltered);
return getCallsHandler().executeReadList("GetAuditLogByVMTemplateId", auditLogRowMapper, parameterSource);
}
@Override
public List<AuditLog> getByVolumeIdAndType(Guid volumeId, int type) {
MapSqlParameterSource parameterSource =
getCustomMapSqlParameterSource()
.addValue("gluster_volume_id", volumeId)
.addValue("log_type", type);
return getCallsHandler().executeReadList("GetAuditLogByVolumeIdAndType", auditLogRowMapper, parameterSource);
}
@Override
public void removeAllofTypeForBrick(Guid brickId, int logType){
MapSqlParameterSource parameterSource =
getCustomMapSqlParameterSource()
.addValue("brick_id", brickId)
.addValue("audit_log_type", logType);
getCallsHandler().executeModification("RemoveAuditLogByBrickIdLogType", parameterSource);
}
@Override
public void save(AuditLog event) {
Map<String, Object> outParameters =
getCallsHandler().executeModification("InsertAuditLog", getSqlMapper(event));
event.setAuditLogId((Long) outParameters.get("audit_log_id"));
}
@Override
public void update(AuditLog event) {
throw new UnsupportedOperationException();
}
private MapSqlParameterSource getSqlMapper(AuditLog event) {
return getCustomMapSqlParameterSource()
.addValue("audit_log_id", event.getAuditLogId())
.addValue("log_time", event.getLogTime())
.addValue("log_type", event.getLogType())
.addValue("log_type_name", event.getLogTypeName())
.addValue("severity", event.getSeverity())
.addValue("message", event.getMessage())
.addValue("user_id", event.getUserId())
.addValue("user_name", event.getUserName())
.addValue("vds_id", event.getVdsId())
.addValue("vds_name", event.getVdsName())
.addValue("vm_id", event.getVmId())
.addValue("vm_name", event.getVmName())
.addValue("vm_template_id", event.getVmTemplateId())
.addValue("vm_template_name", event.getVmTemplateName())
.addValue("storage_pool_id", event.getStoragePoolId())
.addValue("storage_pool_name", event.getStoragePoolName())
.addValue("storage_domain_id", event.getStorageDomainId())
.addValue("storage_domain_name", event.getStorageDomainName())
.addValue("cluster_id", event.getClusterId())
.addValue("cluster_name", event.getClusterName())
.addValue("correlation_id", event.getCorrelationId())
.addValue("job_id", event.getJobId())
.addValue("quota_id", event.getQuotaId())
.addValue("quota_name", event.getQuotaName())
.addValue("gluster_volume_id", event.getGlusterVolumeId())
.addValue("gluster_volume_name", event.getGlusterVolumeName())
.addValue("call_stack", event.getCallStack())
.addValue("repeatable", event.isRepeatable())
.addValue("brick_id", event.getBrickId())
.addValue("brick_path", event.getBrickPath())
.addValue("origin", event.getOrigin())
.addValue("custom_event_id", event.getCustomEventId())
.addValue("event_flood_in_sec", event.getEventFloodInSec())
.addValue("custom_data", event.getCustomData());
}
@Override
public void remove(long id) {
MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource()
.addValue("audit_log_id", id);
getCallsHandler().executeModification("DeleteAuditLog", parameterSource);
}
@Override
public void removeAllBeforeDate(Date cutoff) {
MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource()
.addValue("date", cutoff);
getCallsHandler().executeModification("DeleteAuditLogOlderThenDate", parameterSource);
}
@Override
public void removeAllForVds(Guid id, boolean removeConfigAlerts) {
MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource()
.addValue("vds_id", id).addValue("delete_config_alerts",
removeConfigAlerts);
getCallsHandler().executeModification("DeleteAuditLogAlertsByVdsID", parameterSource);
}
@Override
public void removeAllOfTypeForVds(Guid id, int type) {
MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource()
.addValue("vds_id", id).addValue("log_type", type);
getCallsHandler().executeModification("DeleteAuditAlertLogByVdsIDAndType", parameterSource);
}
@Override
public void removeAllOfTypeForVolume(Guid volumeId, int type) {
MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource()
.addValue("gluster_volume_id", volumeId).addValue("log_type", type);
getCallsHandler().executeModification("DeleteAuditAlertLogByVolumeIDAndType", parameterSource);
}
@Override
public int getTimeToWaitForNextPmOp(String vdsName, String event) {
MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource()
.addValue("vds_name", vdsName)
.addValue("event", event)
.addValue("wait_for_sec", Config.getValue(ConfigValues.FenceQuietTimeBetweenOperationsInSec));
Map<String, Object> dbResults =
new SimpleJdbcCall(getJdbcTemplate()).withFunctionName("get_seconds_to_wait_before_pm_operation")
.execute(
parameterSource);
String resultKey = dbEngineDialect.getFunctionReturnKey();
return (Integer) dbResults.getOrDefault(resultKey, 0);
}
@Override
public void clearAllEvents() {
getCallsHandler().executeModification("ClearAllAuditLogEvents",
getCustomMapSqlParameterSource().addValue("severity", AuditLogSeverity.ALERT));
}
@Override
public void displayAllEvents() {
getCallsHandler().executeModification("DisplayAllAuditLogEvents",
getCustomMapSqlParameterSource().addValue("severity", AuditLogSeverity.ALERT));
}
@Override
public void clearAllAlerts() {
getCallsHandler().executeModification("SetAllAuditLogAlerts",
getCustomMapSqlParameterSource().addValue("severity", AuditLogSeverity.ALERT)
.addValue("value", true));
}
@Override
public void displayAllAlerts() {
getCallsHandler().executeModification("SetAllAuditLogAlerts",
getCustomMapSqlParameterSource().addValue("severity", AuditLogSeverity.ALERT)
.addValue("value", false));
}
@Override
public void deleteBackupRelatedAlerts() {
getCallsHandler().executeModification("DeleteBackupRelatedAlerts", getCustomMapSqlParameterSource());
}
}