package org.ovirt.engine.api.restapi.resource;
import javax.ws.rs.core.Response;
import org.ovirt.engine.api.model.Action;
import org.ovirt.engine.api.model.Template;
import org.ovirt.engine.api.model.Templates;
import org.ovirt.engine.api.resource.ActionResource;
import org.ovirt.engine.api.resource.StorageDomainContentDisksResource;
import org.ovirt.engine.api.resource.StorageDomainTemplateResource;
import org.ovirt.engine.core.common.action.ImportVmTemplateParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VmTemplateImportExportParameters;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.businessentities.storage.Disk;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.queries.GetVmTemplateParameters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
public class BackendStorageDomainTemplateResource
extends AbstractBackendStorageDomainContentResource<Templates, Template, VmTemplate>
implements StorageDomainTemplateResource {
VmTemplate template;
public BackendStorageDomainTemplateResource(BackendStorageDomainTemplatesResource parent, String templateId) {
super(templateId, parent, Template.class, VmTemplate.class);
}
@Override
public Template get() {
switch (parent.getStorageDomainType()) {
case Data:
case Master:
return getFromDataDomain();
case ImportExport:
return getFromExportDomain();
default:
return null;
}
}
private Template getFromDataDomain() {
return performGet(VdcQueryType.GetVmTemplate, new GetVmTemplateParameters(guid));
}
private Template getFromExportDomain() {
org.ovirt.engine.core.common.businessentities.VmTemplate entity = getEntity();
return addLinks(populate(map(entity, null), entity), null, new String[0]);
}
@Override
public Response register(Action action) {
validateParameters(action, "cluster.id|name");
ImportVmTemplateParameters params = new ImportVmTemplateParameters();
params.setContainerId(guid);
params.setStorageDomainId(parent.getStorageDomainId());
params.setClusterId(getClusterId(action));
params.setImagesExistOnTargetStorageDomain(true);
if (action.isSetClone()) {
params.setImportAsNewEntity(action.isClone());
if (action.isSetVm() && action.getTemplate().isSetName()) {
params.getVmTemplate().setName(action.getTemplate().getName());
}
}
if (action.isSetAllowPartialImport()) {
params.setAllowPartialImport(action.isAllowPartialImport());
}
return doAction(VdcActionType.ImportVmTemplateFromConfiguration, params, action);
}
@Override
public Response doImport(Action action) {
validateParameters(action, "cluster.id|name", "storageDomain.id|name");
Guid destStorageDomainId = getDestStorageDomainId(action);
ImportVmTemplateParameters params = new ImportVmTemplateParameters(parent.getDataCenterId(destStorageDomainId),
parent.getStorageDomainId(),
destStorageDomainId,
getClusterId(action),
getEntity());
params.setImageToDestinationDomainMap(getDiskToDestinationMap(action));
params.setForceOverride(action.isSetExclusive() ? action.isExclusive() : false);
if (action.isSetClone()){
params.setImportAsNewEntity(action.isClone());
if(action.isSetTemplate() && action.getTemplate().isSetName()) {
params.getVmTemplate().setName(action.getTemplate().getName());
}
}
return doAction(VdcActionType.ImportVmTemplate, params, action);
}
@Override
public ActionResource getActionResource(String action, String ids) {
return inject(new BackendActionResource(action, ids));
}
@Override
protected Template addParents(Template template) {
template.setStorageDomain(parent.getStorageDomainModel());
return template;
}
protected VmTemplate getEntity() {
if (template != null) {
return template;
}
for (VmTemplate entity : parent.getEntitiesFromExportDomain()) {
if (guid.equals(entity.getId())) {
template = entity;
return entity;
}
}
return entityNotFound();
}
@Override
public java.util.Map<Guid, Disk> getDiskMap() {
java.util.Map<Guid, Disk> diskMap = new java.util.HashMap<>();
for (java.util.Map.Entry<Guid, DiskImage> entry : getEntity().getDiskTemplateMap().entrySet()) {
diskMap.put(entry.getKey(), entry.getValue());
}
return diskMap;
}
@Override
public StorageDomainContentDisksResource getDisksResource() {
return inject(new BackendExportDomainDisksResource(this));
}
@Override
public Response remove() {
get();
return performAction(VdcActionType.RemoveVmTemplateFromImportExport,
new VmTemplateImportExportParameters(guid,
parent.storageDomainId,
getDataCenterId(parent.storageDomainId)));
}
}