package org.ovirt.engine.api.restapi.resource; import java.util.List; import org.ovirt.engine.api.model.VmPool; import org.ovirt.engine.api.resource.AssignedPermissionsResource; import org.ovirt.engine.api.resource.VmPoolResource; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.AddVmPoolWithVmsParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.DiskImage; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.vm_pools; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.queries.GetPermissionsForObjectParameters; import org.ovirt.engine.core.common.queries.GetVmPoolByIdParameters; import org.ovirt.engine.core.common.queries.GetVmTemplatesDisksParameters; import org.ovirt.engine.core.common.queries.GetVmTemplateParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; import static org.ovirt.engine.api.restapi.resource.BackendVmPoolsResource.SUB_COLLECTION; public class BackendVmPoolResource extends AbstractBackendSubResource<VmPool, vm_pools> implements VmPoolResource { private BackendVmPoolsResource parent; public BackendVmPoolResource(String id, BackendVmPoolsResource parent) { super(id, VmPool.class, vm_pools.class, SUB_COLLECTION); this.parent = parent; } @Override public VmPool get() { return performGet(VdcQueryType.GetVmPoolById, new GetVmPoolByIdParameters(guid)); } @Override public VmPool update(VmPool incoming) { return performUpdate(incoming, new QueryIdResolver(VdcQueryType.GetVmPoolById, GetVmPoolByIdParameters.class), VdcActionType.UpdateVmPoolWithVms, new UpdateParametersProvider()); } @Override public AssignedPermissionsResource getPermissionsResource() { return inject(new BackendAssignedPermissionsResource(guid, VdcQueryType.GetPermissionsForObject, new GetPermissionsForObjectParameters(guid), VmPool.class, VdcObjectType.VmPool)); } @Override protected VmPool populate(VmPool pool, vm_pools entity) { return parent.populate(pool, entity); } protected VM mapToVM(VmPool model) { return getMapper(VmPool.class, VM.class).map(model, null); } protected Guid getStorageDomainId(Guid templateId) { Guid storageDomainId = null; if (templateId != null) { List<DiskImage> images = asCollection(DiskImage.class, getEntity(List.class, VdcQueryType.GetVmTemplatesDisks, new GetVmTemplatesDisksParameters(templateId), templateId.toString())); if (images != null && images.size() > 0) { storageDomainId = images.get(0).getstorage_id().getValue(); } } return storageDomainId; } protected class UpdateParametersProvider implements ParametersProvider<VmPool, vm_pools> { @Override public VdcActionParametersBase getParameters(VmPool incoming, vm_pools current) { int currentVmCount = current.getvm_assigned_count(); vm_pools entity = map(incoming, current); VM vm = mapToVM(map(entity)); int size = incoming.isSetSize() && incoming.getSize() > currentVmCount ? incoming.getSize() - currentVmCount : 0; if (incoming.isSetTemplate()) { vm.setvmt_guid(new Guid(incoming.getTemplate().getId())); } else { VM existing = currentVmCount > 0 ? getEntity(VM.class, SearchType.VM, "Vms: pool=" + incoming.getName()) : null; if (existing != null) { vm.setvmt_guid(existing.getvmt_guid()); } } if (vm.getvmt_guid() != null) { VmTemplate template = getEntity(VmTemplate.class, VdcQueryType.GetVmTemplate, new GetVmTemplateParameters(vm.getvm_guid()), vm.getvm_guid().toString()); vm.getStaticData().setmem_size_mb(template.getmem_size_mb()); } AddVmPoolWithVmsParameters parameters = new AddVmPoolWithVmsParameters(entity, vm, size, -1); parameters.setStorageDomainId(getStorageDomainId(vm.getvmt_guid())); return parameters; } } }