package org.ovirt.engine.api.restapi.resource.gluster;
import javax.ws.rs.core.Response;
import org.ovirt.engine.api.model.Action;
import org.ovirt.engine.api.model.GlusterVolume;
import org.ovirt.engine.api.model.GlusterVolumeProfileDetails;
import org.ovirt.engine.api.model.Option;
import org.ovirt.engine.api.resource.StatisticsResource;
import org.ovirt.engine.api.resource.gluster.GlusterBricksResource;
import org.ovirt.engine.api.resource.gluster.GlusterVolumeResource;
import org.ovirt.engine.api.restapi.logging.Messages;
import org.ovirt.engine.api.restapi.resource.AbstractBackendActionableResource;
import org.ovirt.engine.api.restapi.resource.BackendStatisticsResource;
import org.ovirt.engine.api.restapi.resource.VolumeStatisticalQuery;
import org.ovirt.engine.api.restapi.types.GlusterVolumeProfileInfoMapper;
import org.ovirt.engine.api.restapi.util.LinkHelper;
import org.ovirt.engine.api.restapi.util.ParametersHelper;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.gluster.GlusterVolumeActionParameters;
import org.ovirt.engine.core.common.action.gluster.GlusterVolumeOptionParameters;
import org.ovirt.engine.core.common.action.gluster.GlusterVolumeParameters;
import org.ovirt.engine.core.common.action.gluster.GlusterVolumeRebalanceParameters;
import org.ovirt.engine.core.common.action.gluster.ResetGlusterVolumeOptionsParameters;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeEntity;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeOptionEntity;
import org.ovirt.engine.core.common.businessentities.gluster.GlusterVolumeProfileInfo;
import org.ovirt.engine.core.common.queries.IdQueryParameters;
import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.common.queries.gluster.GlusterVolumeProfileParameters;
import org.ovirt.engine.core.compat.Guid;
/**
* Implementation of the "glustervolumes/{id}" resource
*/
public class BackendGlusterVolumeResource
extends AbstractBackendActionableResource<GlusterVolume, GlusterVolumeEntity>
implements GlusterVolumeResource {
private static final String NFS_CONSTRAINT_PARAMETER = "nfsStatistics";
private BackendGlusterVolumesResource parent;
public BackendGlusterVolumeResource(String volumeId, BackendGlusterVolumesResource parent) {
this(volumeId);
setParent(parent);
}
public BackendGlusterVolumeResource(String volumeId) {
super(volumeId, GlusterVolume.class, GlusterVolumeEntity.class);
}
@Override
protected GlusterVolume addParents(GlusterVolume model) {
model.setId(id);
parent.addParents(model);
return model;
}
@Override
public GlusterVolume get() {
return performGet(VdcQueryType.GetGlusterVolumeById, new IdQueryParameters(guid));
}
@Override
public Response start(Action action) {
return doAction(VdcActionType.StartGlusterVolume, new GlusterVolumeActionParameters(guid,
action.isSetForce() ? action.isForce() : false), action);
}
@Override
public Response stop(Action action) {
return doAction(VdcActionType.StopGlusterVolume, new GlusterVolumeActionParameters(guid,
action.isSetForce() ? action.isForce() : false), action);
}
@Override
public Response rebalance(Action action) {
boolean fixLayoutOnly = action.isSetFixLayout() ? action.isFixLayout() : false;
boolean force = action.isSetForce() ? action.isForce() : false;
return doAction(VdcActionType.StartRebalanceGlusterVolume,
new GlusterVolumeRebalanceParameters(guid,
fixLayoutOnly,
force), action);
}
@Override
public Response stopRebalance(Action action) {
return doAction(VdcActionType.StopRebalanceGlusterVolume,
new GlusterVolumeRebalanceParameters(guid), action);
}
@Override
public Response setOption(Action action) {
Option option = action.getOption();
validateParameters(option, "name", "value");
return doAction(VdcActionType.SetGlusterVolumeOption,
new GlusterVolumeOptionParameters(new GlusterVolumeOptionEntity(guid,
option.getName(),
option.getValue())),
action);
}
@Override
public Response resetOption(Action action) {
Option option = action.getOption();
validateParameters(option, "name");
return resetOption(action, option.getName(), option.getValue(), action.isSetForce() ? action.isForce() : false);
}
@Override
public Response resetAllOptions(Action action) {
return resetOption(action, null, null, action.isSetForce() ? action.isForce() : false);
}
private Response resetOption(Action action, String optionName, String optionValue, boolean force) {
return doAction(VdcActionType.ResetGlusterVolumeOptions,
new ResetGlusterVolumeOptionsParameters(guid,
new GlusterVolumeOptionEntity(guid, optionName, optionValue),
force), action);
}
@Override
public Response startProfile(Action action) {
return doAction(VdcActionType.StartGlusterVolumeProfile, new GlusterVolumeParameters(guid), action);
}
@Override
public Response stopProfile(Action action) {
return doAction(VdcActionType.StopGlusterVolumeProfile, new GlusterVolumeParameters(guid), action);
}
@Override
public GlusterBricksResource getGlusterBricksResource() {
return inject(new BackendGlusterBricksResource(this));
}
public BackendGlusterVolumesResource getParent() {
return parent;
}
public void setParent(BackendGlusterVolumesResource parent) {
this.parent = parent;
}
public String getId() {
return this.id;
}
@Override
public StatisticsResource getStatisticsResource() {
EntityIdResolver<Guid> resolver =
new QueryIdResolver<>(VdcQueryType.GetGlusterVolumeById, IdQueryParameters.class);
VolumeStatisticalQuery query = new VolumeStatisticalQuery(resolver, newModel(id));
return inject(new BackendStatisticsResource<>(entityType,
guid,
query));
}
@Override
public Response getProfileStatistics(Action action) {
boolean nfsStats = isNfsStatistics();
VdcQueryReturnValue result = runQuery(VdcQueryType.GetGlusterVolumeProfileInfo,
new GlusterVolumeProfileParameters(Guid.createGuidFromString(parent.getParent().get().getId()), guid, nfsStats));
if (result != null
&& result.getSucceeded()
&& result.getReturnValue() != null) {
GlusterVolumeProfileInfo info = result.getReturnValue();
GlusterVolumeProfileDetails statistics = GlusterVolumeProfileInfoMapper.map(info, null);
statistics = LinkHelper.addLinks(statistics);
return Response.ok(statistics).build();
} else {
//throw exception
throw new WebFaultException(null, localize(Messages.BACKEND_FAILED), Response.Status.INTERNAL_SERVER_ERROR);
}
}
private Boolean isNfsStatistics() {
return ParametersHelper.getBooleanParameter(httpHeaders, uriInfo, NFS_CONSTRAINT_PARAMETER, true, false);
}
@Override
public Response remove() {
get();
return performAction(VdcActionType.DeleteGlusterVolume, new GlusterVolumeParameters(guid));
}
}