package org.ovirt.engine.core.bll.gluster;
import java.util.List;
import javax.inject.Inject;
import org.ovirt.engine.core.bll.gluster.tasks.GlusterTaskUtils;
import org.ovirt.engine.core.common.asynctasks.gluster.GlusterAsyncTask;
import org.ovirt.engine.core.common.asynctasks.gluster.GlusterTaskParameters;
import org.ovirt.engine.core.common.businessentities.VDS;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterServer;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeTaskStatusEntity;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeTaskStatusForHost;
import org.ovirt.engine.core.common.errors.EngineMessage;
import org.ovirt.engine.core.common.job.Step;
import org.ovirt.engine.core.common.queries.gluster.GlusterVolumeQueriesParameters;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.dao.StepDao;
import org.ovirt.engine.core.dao.VdsDao;
import org.ovirt.engine.core.dao.gluster.GlusterServerDao;
public abstract class GlusterAsyncTaskStatusQueryBase<P extends GlusterVolumeQueriesParameters> extends GlusterQueriesCommandBase<P> {
protected Guid clusterId;
protected GlusterVolumeEntity volume;
@Inject
protected StepDao stepDao;
@Inject
protected GlusterServerDao glusterServerDao;
@Inject
protected VdsDao vdsDao;
@Inject
protected GlusterTaskUtils glusterTaskUtils;
public GlusterAsyncTaskStatusQueryBase(P params) {
super(params);
}
@Override
public void executeQueryCommand() {
clusterId = getParameters().getClusterId();
volume = glusterVolumeDao.getById(getParameters().getVolumeId());
if (volume == null) {
throw new RuntimeException(EngineMessage.GLUSTER_VOLUME_ID_INVALID.toString());
}
if (clusterId == null) {
clusterId = volume.getClusterId();
}
getQueryReturnValue().setReturnValue(fetchTaskStatusDetails());
}
protected abstract GlusterVolumeTaskStatusEntity fetchTaskStatusDetails();
protected GlusterVolumeTaskStatusEntity updateStatusEntity(GlusterVolumeTaskStatusEntity status) {
// Set the volume remove bricks start time
setStartAndStopTime(status);
// update the latest status
updateLatestStatus(status);
// Update the host details as required into entity
return updateHostDetails(status);
}
private GlusterVolumeTaskStatusEntity updateHostDetails(GlusterVolumeTaskStatusEntity taskStatus) {
updateHostIP(taskStatus);
taskStatus.sort();
return taskStatus;
}
private void updateHostIP(GlusterVolumeTaskStatusEntity taskStatus) {
if (taskStatus != null) {
for (GlusterVolumeTaskStatusForHost hostStatus : taskStatus.getHostwiseStatusDetails()) {
GlusterServer glusterServer = glusterServerDao.getByGlusterServerUuid(hostStatus.getHostUuid());
if (glusterServer != null) {
VDS host = vdsDao.get(glusterServer.getId());
if (host != null) {
hostStatus.setHostName(host.getName());
hostStatus.setHostId(host.getId());
}
}
}
}
}
private GlusterVolumeTaskStatusEntity setStartAndStopTime(GlusterVolumeTaskStatusEntity status) {
if (status == null) {
return null;
}
GlusterAsyncTask asyncTask = volume.getAsyncTask();
if (asyncTask != null && asyncTask.getTaskId() != null) {
List<Step> stepsList = stepDao.getStepsByExternalId(asyncTask.getTaskId());
if (stepsList != null && !stepsList.isEmpty()) {
status.setStartTime(stepsList.get(0).getStartTime());
status.setStopTime(stepsList.get(0).getEndTime());
}
}
return status;
}
private void updateLatestStatus(GlusterVolumeTaskStatusEntity status) {
GlusterAsyncTask asyncTask = volume.getAsyncTask();
if (asyncTask != null && asyncTask.getTaskId() != null) {
GlusterTaskParameters taskParameters = new GlusterTaskParameters();
taskParameters.setVolumeName(volume.getName());
asyncTask.setTaskParameters(taskParameters);
List<Step> stepsList = stepDao.getStepsByExternalId(asyncTask.getTaskId());
// if step has already ended, do not update status.
if (stepsList != null && !stepsList.isEmpty() && stepsList.get(0).getEndTime() != null) {
asyncTask.setStatus(status.getStatusSummary().getStatus());
asyncTask.setMessage(glusterTaskUtils.getSummaryMessage(status.getStatusSummary()));
glusterTaskUtils.updateSteps(clusterDao.get(clusterId), asyncTask, stepsList);
// release the volume lock if the task is completed
if (glusterTaskUtils.hasTaskCompleted(asyncTask)) {
glusterTaskUtils.releaseLock(volume.getId());
}
}
}
}
}