package org.ovirt.engine.api.restapi.resource; import java.math.BigDecimal; import java.math.MathContext; import java.util.ArrayList; import java.util.List; import org.ovirt.engine.api.model.Host; import org.ovirt.engine.api.model.Job; import org.ovirt.engine.api.model.Statistic; import org.ovirt.engine.api.model.StatisticUnit; import org.ovirt.engine.api.model.Step; import org.ovirt.engine.api.model.ValueType; import org.ovirt.engine.api.restapi.resource.BaseBackendResource.BackendFailureException; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeTaskStatusEntity; import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeTaskStatusForHost; import org.ovirt.engine.core.compat.Guid; public class StepStatisticalQuery extends AbstractStatisticalQuery<Step, GlusterVolumeTaskStatusEntity> { public static final Statistic FILES_MOVED = create("files.moved", "Number of files moved", COUNTER, StatisticUnit.NONE, ValueType.INTEGER); public static final Statistic SIZE_MOVED = create("size.moved", "size of files moved", GAUGE, BYTES, ValueType.INTEGER); public static final Statistic FILES_SKIPPED = create("files.skipped", "Number of files skipped", COUNTER, StatisticUnit.NONE, ValueType.INTEGER); public static final Statistic FILES_SCANNED = create("files.scanned", "Number of files scanned", COUNTER, StatisticUnit.NONE, ValueType.INTEGER); public static final Statistic FILES_FAILED = create("files.failed", "Number of files failed", COUNTER, StatisticUnit.NONE, ValueType.INTEGER); public static final Statistic RUN_TIME = create("run.time", "Time for which task is running", COUNTER, StatisticUnit.SECONDS, ValueType.DECIMAL); public static final Statistic STATUS = create("status", "Status of task", GAUGE, StatisticUnit.NONE, ValueType.STRING); protected IResolver<Guid, GlusterVolumeTaskStatusEntity> taskStatusResolver; public StepStatisticalQuery(IResolver<Guid, GlusterVolumeTaskStatusEntity> taskStatusResolver, Step parent) { super(Step.class, parent, null); this.taskStatusResolver = taskStatusResolver; } @Override public GlusterVolumeTaskStatusEntity resolve(Guid id) throws BackendFailureException { return taskStatusResolver.resolve(id); } @Override public List<Statistic> getStatistics(GlusterVolumeTaskStatusEntity entity) { List<Statistic> list = new ArrayList<>(); if (entity == null) { return list; } for (GlusterVolumeTaskStatusForHost hostStatus: entity.getHostwiseStatusDetails()) { Guid hostId = hostStatus.getHostId(); list.add(adopt(setHostDatum(FILES_MOVED, hostStatus.getFilesMoved(), hostId))); list.add(adopt(setHostDatum(SIZE_MOVED, hostStatus.getTotalSizeMoved(), hostId))); list.add(adopt(setHostDatum(FILES_SKIPPED, hostStatus.getFilesSkipped(), hostId))); list.add(adopt(setHostDatum(FILES_SCANNED, hostStatus.getFilesScanned(), hostId))); list.add(adopt(setHostDatum(FILES_FAILED, hostStatus.getFilesFailed(), hostId))); list.add(adopt(setHostDatum(RUN_TIME, hostStatus.getRunTime(), hostId))); list.add(adopt(setHostDatum(STATUS, hostStatus.getStatus().toString(), hostId))); } return list; } private Statistic setHostDatum(Statistic stat, long value, Guid hostId) { return setHostDatum(stat, new BigDecimal(value, new MathContext(0)), hostId); } private Statistic setHostDatum(Statistic stat, BigDecimal value, Guid hostId) { Statistic statistic = setDatum(clone(stat), value); statistic.setHost(getHost(hostId)); return statistic; } private Statistic setHostDatum(Statistic stat, String value, Guid hostId) { Statistic statistic = setDatum(clone(stat), value); statistic.setHost(getHost(hostId)); return statistic; } public Statistic setHostDatum(Statistic statistic, double datum, Guid hostId) { return setHostDatum(statistic, new BigDecimal(datum, new MathContext(0)), hostId); } private Host getHost(Guid hostId) { Host host = new Host(); host.setId(hostId.toString()); return host; } @Override public Statistic adopt(Statistic statistic) { statistic.setStep(clone(parent)); return statistic; } private Step clone(Step step) { //Needed to avoid NPE in LinkHelper due to unsetting of grandparent in LinkHelper#addLinks. Step cloned = new Step(); cloned.setId(step.getId()); cloned.setJob(new Job()); cloned.getJob().setId(step.getJob().getId()); return cloned; } }