package org.ovirt.engine.ui.frontend.server.dashboard.dao;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.ovirt.engine.ui.frontend.server.dashboard.DashboardDataException;
import org.ovirt.engine.ui.frontend.server.dashboard.models.ResourceUsage;
import org.ovirt.engine.ui.frontend.server.dashboard.models.StorageDomainAverage;
import org.ovirt.engine.ui.frontend.server.dashboard.models.TrendResources;
public class StorageDomainDwhDao extends BaseDao {
private static final String NAME = "name"; //$NON-NLS-1$
private static final String AVERAGE = "avg"; //$NON-NLS-1$
private static final String USED = "used"; //$NON-NLS-1$
private static final String DATE = "the_date"; //$NON-NLS-1$
private static final String TOTAL = "total"; //$NON-NLS-1$
private static final String AVAILABLE="available"; //$NON-NLS-1$
private static final String PREVIOUS_USED="previous_used"; //$NON-NLS-1$
private static final String PREVIOUS_TOTAL="previous_total"; //$NON-NLS-1$
private static final String STORAGE_LAST24_AVERAGE = "storage.last24hours_average"; //$NON-NLS-1$
private static final String HOURLY_STORAGE_HISTORY = "storage.hourly_history"; //$NON-NLS-1$
private static final String LAST5_MIN_STORAGE_AVERAGE = "storage.last5_minutes_average"; //$NON-NLS-1$
private static final String TOTAL_STORAGE_COUNT = "storage.total_count"; //$NON-NLS-1$
private static final String STORAGE_DOMAIN_UTILIZATION = "storage.utilization"; //$NON-NLS-1$
private static final String VM_STORAGE_UTILIZATION = "storage.vm_utilization"; //$NON-NLS-1$
public StorageDomainDwhDao(DataSource dwhDataSource) throws DashboardDataException {
super(dwhDataSource, "StorageDomainDwhDAO.properties", StorageDomainDwhDao.class); //$NON-NLS-1$
}
public List<StorageDomainAverage> getStorageAverage() throws DashboardDataException {
final List<StorageDomainAverage> result = new ArrayList<>();
runQuery(STORAGE_LAST24_AVERAGE,
rs -> result.add(new StorageDomainAverage(rs.getString(NAME), rs.getDouble(AVERAGE))));
return result;
}
public List<ResourceUsage> getHourlyStorageHistory() throws DashboardDataException {
final List<ResourceUsage> history = new ArrayList<>();
runQuery(HOURLY_STORAGE_HISTORY, rs -> {
ResourceUsage usage = new ResourceUsage();
usage.setEpoch(rs.getTimestamp(DATE).getTime());
usage.setStorageValue(rs.getDouble(USED));
history.add(usage);
});
return history;
}
/**
* Returns the average storage domain usage over the last 5 minute in GB.
* @return A double indicating the average usage over 5 minutes in GB.
* @throws DashboardDataException If a database issue occurs.
*/
public double getLast5MinutesStorageAverage() throws DashboardDataException {
final double[] result = {0};
runQuery(LAST5_MIN_STORAGE_AVERAGE, rs -> result[0] = rs.getDouble(USED));
return result[0];
}
/**
* Returns the total storage domain storage over all storage domains in GB.
* @return The total storage domain value over all storage domains in GB.
* @throws DashboardDataException If a database issue occurs.
*/
public Double getTotalStorageCount() throws DashboardDataException {
final Double[] result = {0.0};
runQuery(TOTAL_STORAGE_COUNT, rs -> result[0] = rs.getDouble(TOTAL));
return result[0];
}
/**
* Get the CPU utilization for the last 5 minutes per storage domain. Also retrieve the previous 5 minutes
* before that, so we can calculate a trend. Usage in returned in GB. Top 10 are returned.
* @return List of {@code TrendResources} objects containing usage of each storage domain.
* @throws DashboardDataException If there is a database problem.
*/
public List<TrendResources> getStorageDomainUtilization() throws DashboardDataException {
final List<TrendResources> result = new ArrayList<>();
runQuery(STORAGE_DOMAIN_UTILIZATION, rs -> {
TrendResources usage = new TrendResources();
usage.setName(rs.getString(NAME));
usage.setUsed(rs.getDouble(USED));
usage.setTotal(rs.getDouble(USED) + rs.getDouble(AVAILABLE));
usage.setPreviousUsed(rs.getDouble(PREVIOUS_USED));
result.add(usage);
});
return result;
}
/**
* Get storage utilization for the last 5 minutes per storage domain. Also retrieve the previous 5 minute
* before that, so we can calculate a trend. Usage is returned in GB. Top 10 are returned
* @return List of {@code TrendResources} objects containing usage of each VM.
* @throws DashboardDataException If there is a database problem.
*/
public List<TrendResources> getStorageUtilizationVms() throws DashboardDataException {
final List<TrendResources> result = new ArrayList<>();
runQuery(VM_STORAGE_UTILIZATION, rs -> {
TrendResources usage = new TrendResources();
usage.setName(rs.getString(NAME));
usage.setUsed(rs.getDouble(USED) / 1024);
usage.setTotal(rs.getDouble(TOTAL) / 1024);
usage.setPreviousUsed(rs.getDouble(PREVIOUS_USED) / rs.getDouble(PREVIOUS_TOTAL) * 100);
result.add(usage);
});
return result;
}
}