package org.ovirt.engine.core.vdsbroker.monitoring;
import java.util.Comparator;
import java.util.stream.Stream;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;
import org.ovirt.engine.core.common.businessentities.VMStatus;
import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector;
import org.ovirt.engine.core.vdsbroker.VdsManager;
/**
* <code>VMStatsRefresher</code> provides abstraction for core responsible for
* fetching statistics for vms.
*
*/
public abstract class VmStatsRefresher {
protected VdsManager vdsManager;
@Inject
protected AuditLogDirector auditLogDirector;
@Inject
private Instance<VmsMonitoring> vmsMonitoring;
@Inject
private Instance<VmDevicesMonitoring> vmDevicesMonitoring;
public VmStatsRefresher(VdsManager vdsManager) {
this.vdsManager = vdsManager;
}
/**
* Performs operations required to start monitoring vms.
*/
public abstract void startMonitoring();
/**
* Perform operations required to stop monitoring vms.
*/
public abstract void stopMonitoring();
protected void processDevices(Stream<VdsmVm> vms, long fetchTime) {
VmDevicesMonitoring.Change deviceChange = getVmDevicesMonitoring().createChange(vdsManager.getVdsId(), fetchTime);
vms.filter(vm -> vm.getVmDynamic() != null && vm.getVmDynamic().getStatus() != VMStatus.MigratingTo)
.sorted(Comparator.comparing(VdsmVm::getId)) // Important to avoid deadlock
.forEach(vm -> deviceChange.updateVm(vm.getId(), vm.getDevicesHash()));
deviceChange.flush();
}
protected VmsMonitoring getVmsMonitoring() {
return vmsMonitoring.get();
}
protected VmDevicesMonitoring getVmDevicesMonitoring() {
return vmDevicesMonitoring.get();
}
}