package org.ovirt.engine.core.bll;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.BackendService;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.compat.Version;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogable;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableImpl;
import org.ovirt.engine.core.dao.StoragePoolDao;
import org.ovirt.engine.core.utils.timer.OnTimerMethodAnnotation;
import org.ovirt.engine.core.utils.timer.SchedulerUtilQuartzImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Singleton
public class DataCenterCompatibilityChecker implements BackendService {
private static final Logger log = LoggerFactory.getLogger(DataCenterCompatibilityChecker.class);
@Inject
private SchedulerUtilQuartzImpl schedulerUtil;
@Inject
private StoragePoolDao storagePoolDao;
@Inject
private AuditLogDirector auditLogDirector;
@PostConstruct
private void init() {
log.info("Start initializing {}", getClass().getSimpleName());
schedulerUtil.scheduleAFixedDelayJob(this,
"onTimer",
new Class[]{},
new Object[]{},
0,
7,
TimeUnit.DAYS);
log.info("Finished initializing {}", getClass().getSimpleName());
}
@OnTimerMethodAnnotation("onTimer")
public void onTimer() {
Optional<Version> retVal = Config.<HashSet<Version>> getValue(ConfigValues.SupportedClusterLevels).stream()
.max(Comparator.naturalOrder());
if (retVal.isPresent()) {
Version version = retVal.get();
storagePoolDao.getAll().stream()
.filter(storagePool -> version.compareTo(storagePool.getCompatibilityVersion()) > 0)
.forEach(storagePool -> logAlert(version, storagePool));
}
}
private void logAlert(Version version, StoragePool storagePool) {
AuditLogable auditLog = new AuditLogableImpl();
auditLog.setStoragePoolId(storagePool.getId());
auditLog.setStoragePoolName(storagePool.getName());
auditLog.addCustomValue("engineVersion", version.toString());
auditLog.addCustomValue("dcVersion", storagePool.getCompatibilityVersion().toString());
auditLogDirector.log(auditLog, AuditLogType.STORAGE_POOL_LOWER_THAN_ENGINE_HIGHEST_CLUSTER_LEVEL);
}
}