package org.ovirt.engine.api.restapi.resource; import java.util.List; import javax.ws.rs.core.Response; import org.ovirt.engine.api.model.InstanceType; import org.ovirt.engine.api.model.Template; import org.ovirt.engine.api.model.Vm; 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.api.restapi.types.RngDeviceMapper; import org.ovirt.engine.api.restapi.types.VmMapper; import org.ovirt.engine.api.restapi.util.DisplayHelper; import org.ovirt.engine.api.restapi.util.VmHelper; import org.ovirt.engine.core.common.action.AddVmPoolParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.Cluster; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmDynamic; import org.ovirt.engine.core.common.businessentities.VmRngDevice; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.VmStatistics; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.queries.GetVmTemplateParameters; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.NameQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; public class BackendVmPoolsResource extends AbstractBackendCollectionResource<VmPool, org.ovirt.engine.core.common.businessentities.VmPool> implements VmPoolsResource { public BackendVmPoolsResource() { super(VmPool.class, org.ovirt.engine.core.common.businessentities.VmPool.class); } @Override public VmPools list() { if (isFiltered()) { return mapCollection(getBackendCollection(VdcQueryType.GetAllVmPoolsAttachedToUser, new VdcQueryParametersBase(), SearchType.VmPools)); } else { return mapCollection(getBackendCollection(SearchType.VmPools)); } } @Override public Response add(VmPool pool) { validateParameters(pool, "name", "template.id|name", "cluster.id|name"); Cluster cluster = getCluster(pool); pool.getCluster().setId(cluster.getId().toString()); VmTemplate template = getVmTemplate(pool); if (namedTemplate(pool)) { pool.getTemplate().setId(template.getId().toString()); } org.ovirt.engine.core.common.businessentities.VmPool entity = map(pool); VM vm = mapToVM(pool, template, cluster); int size = pool.isSetSize() ? pool.getSize() : 1; AddVmPoolParameters params = new AddVmPoolParameters(entity, vm, size); params.setConsoleEnabled(!getConsoleDevicesForEntity(template.getId()).isEmpty()); params.setVirtioScsiEnabled(!VmHelper.getVirtioScsiControllersForEntity(this, template.getId()).isEmpty()); params.setSoundDeviceEnabled(pool.isSetSoundcardEnabled() ? pool.isSoundcardEnabled() : !VmHelper.getSoundDevicesForEntity(this, template.getId()).isEmpty()); return performCreate(VdcActionType.AddVmPool, params, new QueryIdResolver<Guid>(VdcQueryType.GetVmPoolById, IdQueryParameters.class)); } @Override public VmPoolResource getPoolResource(String id) { return inject(new BackendVmPoolResource(id, this)); } @Override public VmPool doPopulate(VmPool pool, org.ovirt.engine.core.common.businessentities.VmPool entity) { VM vmModel = getVM(pool); if (vmModel != null) { Vm vm = VmMapper.map(vmModel, new Vm()); BackendVmDeviceHelper.setPayload(this, vm); MemoryPolicyHelper.setupMemoryBalloon(vm, this); BackendVmDeviceHelper.setConsoleDevice(this, vm); BackendVmDeviceHelper.setVirtioScsiController(this, vm); BackendVmDeviceHelper.setSoundcard(this, vm); BackendVmDeviceHelper.setCertificateInfo(this, vm); BackendVmDeviceHelper.setRngDevice(this, vm); pool.setVm(vm); } // Legacy code setRngDevice(pool); return pool; } protected void setRngDevice(VmPool model) { List<VmRngDevice> rngDevices = getEntity(List.class, VdcQueryType.GetRngDevice, new IdQueryParameters(Guid.createGuidFromString(model.getId())), "GetRngDevice", true); if (rngDevices != null && !rngDevices.isEmpty()) { model.setRngDevice(RngDeviceMapper.map(rngDevices.get(0), null)); } } @Override protected VmPool deprecatedPopulate(VmPool model, org.ovirt.engine.core.common.businessentities.VmPool entity) { if (model.isSetSize() && model.getSize() > 0) { VM vm = getVM(model); model.setTemplate(new Template()); model.getTemplate().setId(vm.getVmtGuid().toString()); model = getMapper(VM.class, VmPool.class).map(vm, model); DisplayHelper.adjustDisplayData(this, model.getVm(), false); if (vm.getInstanceTypeId() != null) { model.setInstanceType(new InstanceType()); model.getInstanceType().setId(vm.getInstanceTypeId().toString()); } } return model; } private VM getVM(VmPool model) { if (isFiltered()) { return getEntity(VM.class, VdcQueryType.GetVmDataByPoolId, new IdQueryParameters(asGuid(model.getId())), model.getId()); } return getEntity(VM.class, VdcQueryType.GetVmDataByPoolName, new NameQueryParameters(model.getName()), "Vms: pool=" + model.getName()); } protected VM mapToVM(VmPool model, VmTemplate template, Cluster cluster) { // apply template VmStatic fromTemplate = getMapper(VmTemplate.class, VmStatic.class).map(template, null); VmStatic fromInstanceType = null; if (model.isSetInstanceType()) { org.ovirt.engine.core.common.businessentities.InstanceType instanceType = loadInstanceType(model); fromTemplate.setInstanceTypeId(instanceType.getId()); fromInstanceType = VmMapper.map(instanceType, fromTemplate, cluster.getCompatibilityVersion()); fromInstanceType.setInstanceTypeId(instanceType.getId()); } // override with client-provided data VM vm = new VM(getMapper(VmPool.class, VmStatic.class).map( model, fromInstanceType != null ? fromInstanceType : fromTemplate), new VmDynamic(), new VmStatistics()); return vm; } protected VmPools mapCollection(List<org.ovirt.engine.core.common.businessentities.VmPool> entities) { VmPools collection = new VmPools(); for (org.ovirt.engine.core.common.businessentities.VmPool 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 Cluster getCluster(VmPool pool) { if (namedCluster(pool)) { return getEntity(Cluster.class, VdcQueryType.GetClusterByName, new NameQueryParameters(pool.getCluster().getName()), "Cluster: name=" + pool.getCluster().getName()); } else { return getEntity(Cluster.class, VdcQueryType.GetClusterById, new IdQueryParameters(asGuid(pool.getCluster().getId())), "Cluster: id=" + pool.getCluster().getId()); } } 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 { GetVmTemplateParameters params = new GetVmTemplateParameters(pool.getTemplate().getName()); params.setClusterId(asGuid(pool.getCluster().getId())); return getEntity(VmTemplate.class, VdcQueryType.GetVmTemplate, params, "Template: name=" + pool.getTemplate().getName()); } } private List<String> getConsoleDevicesForEntity(Guid id) { return getEntity(List.class, VdcQueryType.GetConsoleDevices, new IdQueryParameters(id), "GetConsoleDevices", true); } private org.ovirt.engine.core.common.businessentities.InstanceType loadInstanceType(VmPool pool) { validateParameters(pool.getInstanceType(), "id|name"); GetVmTemplateParameters params; String identifier; InstanceType instanceType = pool.getInstanceType(); if (instanceType.isSetId()) { params = new GetVmTemplateParameters(asGuid(instanceType.getId())); identifier = "InstanceType: id=" + instanceType.getId(); } else { params = new GetVmTemplateParameters(instanceType.getName()); identifier = "InstanceType: name=" + instanceType.getName(); } return getEntity(VmTemplate.class, VdcQueryType.GetInstanceType, params, identifier); } }