package org.ovirt.engine.api.restapi.resource;
import java.util.List;
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.VmPool;
import org.ovirt.engine.api.resource.ActionResource;
import org.ovirt.engine.api.resource.AssignedPermissionsResource;
import org.ovirt.engine.api.resource.CreationResource;
import org.ovirt.engine.api.resource.VmPoolResource;
import org.ovirt.engine.api.restapi.util.LinkHelper;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.AddVmPoolParameters;
import org.ovirt.engine.core.common.action.AttachUserToVmFromPoolAndRunParameters;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VmPoolParametersBase;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.queries.GetPermissionsForObjectParameters;
import org.ovirt.engine.core.common.queries.GetVmTemplateParameters;
import org.ovirt.engine.core.common.queries.IdQueryParameters;
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 BackendVmPoolResource
extends AbstractBackendActionableResource<VmPool, org.ovirt.engine.core.common.businessentities.VmPool>
implements VmPoolResource {
private BackendVmPoolsResource parent;
public BackendVmPoolResource(String id, BackendVmPoolsResource parent) {
super(id, VmPool.class, org.ovirt.engine.core.common.businessentities.VmPool.class);
this.parent = parent;
}
@Override
public VmPool get() {
return performGet(VdcQueryType.GetVmPoolById, new IdQueryParameters(guid));
}
@Override
public VmPool update(VmPool incoming) {
return performUpdate(incoming,
new QueryIdResolver<>(VdcQueryType.GetVmPoolById, IdQueryParameters.class),
VdcActionType.UpdateVmPool,
new UpdateParametersProvider());
}
@Override
public AssignedPermissionsResource getPermissionsResource() {
return inject(new BackendAssignedPermissionsResource(guid,
VdcQueryType.GetPermissionsForObject,
new GetPermissionsForObjectParameters(guid),
VmPool.class,
VdcObjectType.VmPool));
}
@Override
protected VmPool deprecatedPopulate(VmPool pool, org.ovirt.engine.core.common.businessentities.VmPool entity) {
return parent.deprecatedPopulate(pool, entity);
}
@Override
protected VmPool doPopulate(VmPool pool, org.ovirt.engine.core.common.businessentities.VmPool entity) {
return parent.doPopulate(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 IdQueryParameters(templateId),
templateId.toString()));
if (images != null && images.size() > 0) {
storageDomainId = images.get(0).getStorageIds().get(0);
}
}
return storageDomainId;
}
protected class UpdateParametersProvider implements ParametersProvider<VmPool, org.ovirt.engine.core.common.businessentities.VmPool> {
@Override
public VdcActionParametersBase getParameters(VmPool incoming,
org.ovirt.engine.core.common.businessentities.VmPool current) {
final int currentVmCount = current.getAssignedVmsCount();
int size = 0;
if (incoming.isSetSize()) {
// in case the value is negative, the backend command will fail on validate
size = incoming.getSize() - currentVmCount;
}
final org.ovirt.engine.core.common.businessentities.VmPool entity = map(incoming, current);
final VM vm = mapToVM(map(entity));
if (incoming.isSetTemplate()) {
vm.setVmtGuid(getTempalteId(incoming.getTemplate()));
} else {
final VM existing = currentVmCount > 0
? getEntity(VM.class,
VdcQueryType.GetVmDataByPoolId,
new IdQueryParameters(current.getId()),
"Vms: pool=" + current.getId())
: null;
if (existing != null) {
vm.setVmtGuid(existing.getVmtGuid());
vm.setVmInit(existing.getVmInit());
}
}
if (vm.getVmtGuid() != null) {
final VmTemplate template = getEntity(VmTemplate.class,
VdcQueryType.GetVmTemplate,
new GetVmTemplateParameters(vm.getVmtGuid()),
vm.getVmtGuid().toString());
vm.getStaticData().setMemSizeMb(template.getMemSizeMb());
vm.getStaticData().setMaxMemorySizeMb(template.getMaxMemorySizeMb());
vm.getStaticData().setSingleQxlPci(template.getSingleQxlPci());
vm.getStaticData().setOsId(template.getOsId());
vm.getStaticData().setDefaultDisplayType(template.getDefaultDisplayType());
vm.getStaticData().setMigrationSupport(template.getMigrationSupport());
if (vm.getVmInit() == null) {
vm.setVmInit(template.getVmInit());
}
}
if (incoming.isSetUseLatestTemplateVersion()) {
vm.setUseLatestVersion(incoming.isUseLatestTemplateVersion());
}
final AddVmPoolParameters parameters = new AddVmPoolParameters(entity, vm, size);
parameters.setStorageDomainId(getStorageDomainId(vm.getVmtGuid()));
return parameters;
}
}
private Guid getTempalteId(Template template) {
Guid result = null;
if (template.isSetId()) {
result = new Guid(template.getId());
} else if (template.isSetName()) {
result = lookupTemplateByName(template.getName()).getId();
}
return result;
}
private VmTemplate lookupTemplateByName(String name) {
return getEntity(VmTemplate.class,
VdcQueryType.GetVmTemplate,
new GetVmTemplateParameters(name),
"GetVmTemplate");
}
@Override
public Response allocateVm(Action action) {
return doAction(VdcActionType.AttachUserToVmFromPoolAndRun,
new AttachUserToVmFromPoolAndRunParameters(guid, getCurrent().getUser().getId()),
action,
new VmQueryIdResolver(VdcQueryType.GetVmByVmId,
IdQueryParameters.class));
}
protected class VmQueryIdResolver extends EntityResolver {
private VdcQueryType query;
private Class<? extends VdcQueryParametersBase> queryParamsClass;
public VmQueryIdResolver(VdcQueryType query, Class<? extends VdcQueryParametersBase> queryParamsClass) {
this.query = query;
this.queryParamsClass = queryParamsClass;
}
@Override
public Object lookupEntity(Object id) throws BackendFailureException {
VM vm = doGetEntity(VM.class,
query, getQueryParams(queryParamsClass, id), id.toString());
org.ovirt.engine.api.model.Vm model = new org.ovirt.engine.api.model.Vm();
model.setId(vm.getId().toString());
return LinkHelper.addLinks(model);
}
}
@Override
public CreationResource getCreationResource(String ids) {
return inject(new BackendCreationResource(ids));
}
@Override
public ActionResource getActionResource(String action, String ids) {
return inject(new BackendActionResource(action, ids));
}
public BackendVmPoolsResource getParent() {
return parent;
}
@Override
public Response remove() {
get();
return performAction(VdcActionType.RemoveVmPool, new VmPoolParametersBase(asGuid(id)));
}
}