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.VmPool; import org.ovirt.engine.api.model.VmPools; import org.ovirt.engine.api.resource.VmPoolResource; import org.ovirt.engine.api.resource.VmPoolsResource; import org.ovirt.engine.core.common.action.AddVmPoolWithVmsParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VmPoolParametersBase; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmPoolType; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.vm_pools; import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.queries.GetVmPoolByIdParameters; import org.ovirt.engine.core.common.queries.GetVmTemplateParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; public class BackendVmPoolsResource extends AbstractBackendCollectionResource<VmPool, vm_pools> implements VmPoolsResource { static final String SUB_COLLECTION = "permissions"; public BackendVmPoolsResource() { super(VmPool.class, vm_pools.class); } @Override public VmPools list() { return mapCollection(getBackendCollection(SearchType.VmPools)); } @Override public Response add(VmPool pool) { validateParameters(pool, "name", "template.id|name", "cluster.id|name"); VmTemplate template = getVmTemplate(pool); if (namedTemplate(pool)) { pool.getTemplate().setId(template.getId().toString()); } if (namedCluster(pool)) { pool.getCluster().setId(getClusterId(pool)); } vm_pools entity = map(pool); entity.setvm_pool_type(VmPoolType.Automatic); VM vm = mapToVM(pool, template); int size = pool.isSetSize() ? pool.getSize() : 1; return performCreation(VdcActionType.AddVmPoolWithVms, new AddVmPoolWithVmsParameters(entity, vm, size, -1), new QueryIdResolver(VdcQueryType.GetVmPoolById, GetVmPoolByIdParameters.class)); } @Override public Response performRemove(String id) { return performAction(VdcActionType.RemoveVmPool, new VmPoolParametersBase(asGuid(id))); } @Override @SingleEntityResource public VmPoolResource getVmPoolSubResource(String id) { return inject(new BackendVmPoolResource(id, this)); } @Override public VmPool populate(VmPool pool, vm_pools entity) { if (pool.isSetSize() && pool.getSize() > 0) { VM vm = getEntity(VM.class, SearchType.VM, "Vms: pool=" + pool.getName()); pool.setTemplate(new Template()); pool.getTemplate().setId(vm.getvmt_guid().toString()); } return pool; } protected VM mapToVM(VmPool model, VmTemplate template) { // REVISIT: we should reverse the mapping order here, // so that we map from template->VM in the first instance // and then override any values (memory size, boot order etc.) // that are set in the client-provided VmPool instance VM vm = getMapper(VmPool.class, VM.class).map(model, null); vm.getStaticData().setmem_size_mb(template.getmem_size_mb()); return vm; } protected VmPools mapCollection(List<vm_pools> entities) { VmPools collection = new VmPools(); for (vm_pools entity : entities) { collection.getVmPools().add(addLinks(populate(map(entity), entity))); } return collection; } protected boolean namedCluster(VmPool pool) { return pool.getCluster().isSetName() && !pool.getCluster().isSetId(); } protected String getClusterId(VmPool pool) { return getEntity(VDSGroup.class, SearchType.Cluster, "Cluster: name=" + pool.getCluster().getName()).getID().toString(); } protected boolean namedTemplate(VmPool pool) { return pool.getTemplate().isSetName() && !pool.getTemplate().isSetId(); } protected VmTemplate getVmTemplate(VmPool pool) { if (pool.getTemplate().isSetId()) { return getEntity(VmTemplate.class, VdcQueryType.GetVmTemplate, new GetVmTemplateParameters(asGuid(pool.getTemplate().getId())), pool.getTemplate().getId()); } else { return getEntity(VmTemplate.class, SearchType.VmTemplate, "Template: name=" + pool.getTemplate().getName()); } } }