package org.ovirt.engine.core.bll.storage.ovfstore;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.ovirt.engine.core.bll.interfaces.BackendInternal;
import org.ovirt.engine.core.common.BackendService;
import org.ovirt.engine.core.common.action.ProcessOvfUpdateForStorageDomainCommandParameters;
import org.ovirt.engine.core.common.action.ProcessOvfUpdateForStoragePoolParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdcReturnValueBase;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.core.common.businessentities.StoragePoolStatus;
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.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 OvfDataUpdater implements BackendService {
private static final Logger log = LoggerFactory.getLogger(OvfDataUpdater.class);
@Inject
private StoragePoolDao storagePoolDao;
@Inject
private BackendInternal backend;
@Inject
private SchedulerUtilQuartzImpl scheduler;
private volatile String updateTimerJobId;
@PostConstruct
public void initOvfDataUpdater() {
updateTimerJobId = scheduler.scheduleAFixedDelayJob(this, "ovfUpdateTimer", new Class[] {},
new Object[] {}, Config.<Integer> getValue(ConfigValues.OvfUpdateIntervalInMinutes),
Config.<Integer> getValue(ConfigValues.OvfUpdateIntervalInMinutes), TimeUnit.MINUTES);
log.info("Initialization of OvfDataUpdater completed successfully.");
}
protected void performOvfUpdateForDomain(Guid storagePoolId, Guid domainId) {
backend.runInternalAction(VdcActionType.ProcessOvfUpdateForStorageDomain,
new ProcessOvfUpdateForStorageDomainCommandParameters(storagePoolId, domainId));
}
protected VdcReturnValueBase performOvfUpdateForStoragePool(Guid storagePoolId) {
ProcessOvfUpdateForStoragePoolParameters parameters = new ProcessOvfUpdateForStoragePoolParameters(storagePoolId);
return backend.runInternalAction(VdcActionType.ProcessOvfUpdateForStoragePool, parameters);
}
@OnTimerMethodAnnotation("ovfUpdateTimer")
public void ovfUpdateTimer() {
List<StoragePool> storagePools = storagePoolDao.getAllByStatus(StoragePoolStatus.Up);
updateOvfData(storagePools);
}
public void updateOvfData(List<StoragePool> storagePools) {
log.info("Attempting to update VMs/Templates Ovf.");
for (StoragePool pool : storagePools) {
VdcReturnValueBase returnValueBase = performOvfUpdateForStoragePool(pool.getId());
if (!returnValueBase.getSucceeded()) {
log.error("Exception while trying to update or remove VMs/Templates ovf in Data Center '{}'.", pool.getName());
}
log.debug("Attempting to update ovfs in domain in Data Center '{}'",
pool.getName());
Set<Guid> domainsToUpdate = returnValueBase.getActionReturnValue();
if (domainsToUpdate != null) {
for (Guid id : domainsToUpdate) {
performOvfUpdateForDomain(pool.getId(), id);
}
} else {
log.error("Data Center '{}' domains list for OVF update returned as NULL");
}
}
}
public void triggerNow() {
if (updateTimerJobId != null) {
scheduler.triggerJob(updateTimerJobId);
}
}
}