package org.ovirt.engine.api.restapi.resource; import java.util.List; import javax.ws.rs.core.Response; import org.ovirt.engine.api.model.Template; import org.ovirt.engine.api.model.Templates; import org.ovirt.engine.api.resource.TemplateResource; import org.ovirt.engine.api.resource.TemplatesResource; import org.ovirt.engine.core.common.action.AddVmTemplateParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VmTemplateParametersBase; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.queries.GetVmByVmIdParameters; 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 BackendTemplatesResource extends AbstractBackendCollectionResource<Template, VmTemplate> implements TemplatesResource { static final String[] SUB_COLLECTIONS = { "disks", "nics", "cdroms", "permissions" }; public BackendTemplatesResource() { super(Template.class, VmTemplate.class, SUB_COLLECTIONS); } @Override public Templates list() { return mapCollection(getBackendCollection(SearchType.VmTemplate)); } @Override @SingleEntityResource public TemplateResource getTemplateSubResource(String id) { return inject(new BackendTemplateResource(id)); } @Override public Response add(Template template) { validateParameters(template, "name", "vm.id|name"); VmStatic staticVm = getMapper(Template.class, VmStatic.class).map(template, getVm(template)); if (namedCluster(template)) { staticVm.setvds_group_id(getClusterId(template)); } // REVISIT: powershell has a IsVmTemlateWithSameNameExist safety check AddVmTemplateParameters params = new AddVmTemplateParameters(staticVm, template.getName(), template.getDescription()); if (template.isSetStorageDomain() && template.getStorageDomain().isSetId()) { params.setDestinationStorageDomainId(asGuid(template.getStorageDomain().getId())); } return performCreation(VdcActionType.AddVmTemplate, params, new QueryIdResolver(VdcQueryType.GetVmTemplate, GetVmTemplateParameters.class)); } @Override public Response performRemove(String id) { return performAction(VdcActionType.RemoveVmTemplate, new VmTemplateParametersBase(asGuid(id))); } protected Templates mapCollection(List<VmTemplate> entities) { Templates collection = new Templates(); for (VmTemplate entity : entities) { collection.getTemplates().add(addLinks(map(entity))); } return collection; } protected VmStatic getVm(Template template) { org.ovirt.engine.core.common.businessentities.VM vm; if (template.getVm().isSetId()) { vm = getEntity(org.ovirt.engine.core.common.businessentities.VM.class, VdcQueryType.GetVmByVmId, new GetVmByVmIdParameters(asGuid(template.getVm().getId())), template.getVm().getId()); } else { vm = getEntity(org.ovirt.engine.core.common.businessentities.VM.class, SearchType.VM, "VM: name=" + template.getVm().getName()); } return vm.getStaticData(); } protected boolean namedCluster(Template template) { return template.isSetCluster() && template.getCluster().isSetName() && !template.getCluster().isSetId(); } protected Guid getClusterId(Template template) { return getEntity(VDSGroup.class, SearchType.Cluster, "Cluster: name=" + template.getCluster().getName()).getID(); } }