package org.ovirt.engine.api.restapi.resource;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.core.Response;
import org.ovirt.engine.api.model.Action;
import org.ovirt.engine.api.model.Step;
import org.ovirt.engine.api.resource.StatisticsResource;
import org.ovirt.engine.api.resource.StepResource;
import org.ovirt.engine.core.common.action.EndExternalStepParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.gluster.GlusterVolumeRemoveBricksQueriesParameters;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeTaskStatusEntity;
import org.ovirt.engine.core.common.queries.IdQueryParameters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.common.queries.gluster.GlusterVolumeQueriesParameters;
import org.ovirt.engine.core.compat.Guid;
public class BackendStepResource extends AbstractBackendActionableResource<org.ovirt.engine.api.model.Step, org.ovirt.engine.core.common.job.Step> implements StepResource{
private BackendStepsResource parent;
public BackendStepsResource getParent() {
return parent;
}
public void setParent(BackendStepsResource parent) {
this.parent = parent;
}
public BackendStepResource(String id, BackendStepsResource parent) {
super(id, org.ovirt.engine.api.model.Step.class, org.ovirt.engine.core.common.job.Step.class);
this.setParent(parent);
}
@Override
protected Step addParents(Step model) {
parent.addParents(model);
return model;
}
@Override
public Response end(Action action) {
EndExternalStepParameters parameters = new EndExternalStepParameters(
guid,
action.isSetSucceeded() ? action.isSucceeded(): true
);
return doAction(VdcActionType.EndExternalStep, parameters, action);
}
@Override
public Step get() {
return parent.injectParent(getStepById(guid));
}
private Step getStepById(Guid id) {
IdQueryParameters params = new IdQueryParameters(id);
Step step = performGet(VdcQueryType.GetStepWithSubjectEntitiesByStepId, params);
return step;
}
@Override
public StatisticsResource getStatisticsResource() {
StepStatisticalQuery query = new StepStatisticalQuery(new TaskQueryResolver<Guid>(), newModel(id));
return inject(new BackendStatisticsResource<>(GlusterVolumeTaskStatusEntity.class, guid, query));
}
public class TaskQueryResolver<T> implements IResolver<Guid, GlusterVolumeTaskStatusEntity> {
public TaskQueryResolver() {
}
@Override
public GlusterVolumeTaskStatusEntity resolve(Guid id) throws BackendFailureException {
org.ovirt.engine.core.common.job.Step stepEntity = getEntity(org.ovirt.engine.core.common.job.Step.class,
VdcQueryType.GetStepWithSubjectEntitiesByStepId,
new IdQueryParameters(id),
null,
true);
if (stepEntity.getExternalSystem() == null) {
return null;
}
Guid glusterTaskId = stepEntity.getExternalSystem().getId();
if (glusterTaskId == null) {
return null;
}
GlusterVolumeEntity volume = getEntity(GlusterVolumeEntity.class,
VdcQueryType.GetGlusterVolumeByTaskId,
new IdQueryParameters(glusterTaskId),
null,
true);
if (volume == null) {
return null;
}
switch (stepEntity.getStepType()) {
case REBALANCING_VOLUME:
GlusterVolumeTaskStatusEntity rebalanceStatusEntity = getEntity(GlusterVolumeTaskStatusEntity.class,
VdcQueryType.GetGlusterVolumeRebalanceStatus,
new GlusterVolumeQueriesParameters(volume.getClusterId(), volume.getId()),
null,
true);
return rebalanceStatusEntity;
case REMOVING_BRICKS:
List<GlusterBrickEntity> bricks = new ArrayList<>();
for (GlusterBrickEntity brick: volume.getBricks()) {
if (brick.getAsyncTask()!=null && brick.getAsyncTask().getTaskId()!=null) {
bricks.add(brick);
}
}
GlusterVolumeTaskStatusEntity removeBricksStatusEntity = getEntity(GlusterVolumeTaskStatusEntity.class,
VdcQueryType.GetGlusterVolumeRemoveBricksStatus,
new GlusterVolumeRemoveBricksQueriesParameters(volume.getClusterId(), volume.getId(), bricks),
null,
true);
return removeBricksStatusEntity;
default:
break;
}
return null;
}
}
}