package org.ovirt.engine.api.restapi.resource;
import java.util.List;
import java.util.Objects;
import javax.ws.rs.core.Response;
import org.ovirt.engine.api.model.Action;
import org.ovirt.engine.api.model.Disk;
import org.ovirt.engine.api.model.Template;
import org.ovirt.engine.api.resource.CreationResource;
import org.ovirt.engine.api.resource.TemplateDiskResource;
import org.ovirt.engine.api.restapi.util.ParametersHelper;
import org.ovirt.engine.core.common.action.ExportRepoImageParameters;
import org.ovirt.engine.core.common.action.MoveOrCopyImageGroupParameters;
import org.ovirt.engine.core.common.action.RemoveDiskParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.storage.ImageOperation;
import org.ovirt.engine.core.common.queries.IdQueryParameters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
public class BackendTemplateDiskResource
extends AbstractBackendActionableResource<Disk, org.ovirt.engine.core.common.businessentities.storage.Disk>
implements TemplateDiskResource {
public static final String FORCE = "force";
public static final String STORAGE_DOMAIN = "storage_domain";
private Guid templateId;
public BackendTemplateDiskResource(String diskId, Guid templateId) {
super(diskId, Disk.class, org.ovirt.engine.core.common.businessentities.storage.Disk.class);
this.templateId = templateId;
}
@Override
public Disk get() {
List<org.ovirt.engine.core.common.businessentities.storage.Disk> entities = getBackendCollection(
org.ovirt.engine.core.common.businessentities.storage.Disk.class,
VdcQueryType.GetVmTemplatesDisks,
new IdQueryParameters(templateId)
);
for (org.ovirt.engine.core.common.businessentities.storage.Disk entity : entities) {
if (Objects.equals(entity.getId(), guid)) {
return addLinks(populate(map(entity), entity));
}
}
return notFound();
}
@Override
public CreationResource getCreationResource(String ids) {
return inject(new BackendCreationResource(ids));
}
@Override
public Disk addParents(Disk entity) {
entity.setTemplate(new Template());
entity.getTemplate().setId(templateId.toString());
return entity;
}
@Override
public Response copy(Action action) {
validateParameters(action, "storageDomain.id|name");
Guid storageDomainId = getStorageDomainId(action);
Disk disk = getDisk();
Guid imageId = asGuid(disk.getImageId());
MoveOrCopyImageGroupParameters params =
new MoveOrCopyImageGroupParameters(imageId,
Guid.Empty,
storageDomainId,
ImageOperation.Copy);
params.setImageGroupID(asGuid(disk.getId()));
return doAction(VdcActionType.MoveOrCopyDisk, params, action);
}
protected Disk getDisk() {
return performGet(VdcQueryType.GetDiskByDiskId, new IdQueryParameters(guid));
}
@Override
public Response export(Action action) {
validateParameters(action, "storageDomain.id|name");
return doAction(VdcActionType.ExportRepoImage,
new ExportRepoImageParameters(guid, getStorageDomainId(action)), action);
}
@Override
public Response remove() {
get(); // will throw 404 if entity not found.
RemoveDiskParameters params = new RemoveDiskParameters(asGuid(id));
boolean force = ParametersHelper.getBooleanParameter(httpHeaders, uriInfo, FORCE, true, false);
if (force) {
params.setForceDelete(force);
}
String storageDomain = ParametersHelper.getParameter(httpHeaders, uriInfo, STORAGE_DOMAIN);
if (storageDomain != null) {
params.setStorageDomainId(asGuid(storageDomain));
}
return performAction(VdcActionType.RemoveDisk, params);
}
}