package org.ovirt.engine.api.restapi.resource; import java.util.List; import javax.ws.rs.core.Response; import org.ovirt.engine.api.model.VirtualNumaNode; import org.ovirt.engine.api.model.VirtualNumaNodes; import org.ovirt.engine.api.model.Vm; import org.ovirt.engine.api.resource.VmNumaNodeResource; import org.ovirt.engine.api.resource.VmNumaNodesResource; import org.ovirt.engine.api.restapi.resource.AbstractBackendSubResource.ParametersProvider; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VmNumaNodeOperationParameters; import org.ovirt.engine.core.common.businessentities.VmNumaNode; 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 BackendVmNumaNodesResource extends AbstractBackendCollectionResource<VirtualNumaNode, VmNumaNode> implements VmNumaNodesResource { private VdcActionType addAction; private VdcActionType updateType; protected Class<VirtualNumaNodes> collectionType; protected Guid parentId; protected VdcQueryType queryType; protected VdcQueryParametersBase queryParams; public BackendVmNumaNodesResource(Guid parentId) { super(VirtualNumaNode.class, VmNumaNode.class); this.addAction = VdcActionType.AddVmNumaNodes; this.updateType = VdcActionType.UpdateVmNumaNodes; this.collectionType = VirtualNumaNodes.class; this.parentId = parentId; this.queryType = VdcQueryType.GetVmNumaNodesByVmId; this.queryParams = new IdQueryParameters(parentId); } private boolean matchEntity(VmNumaNode entity, Guid id) { return id != null && id.equals(entity.getId()); } private String[] getRequiredAddFields() { return new String[] { "index", "memory", "cpu" }; } private String[] getRequiredUpdateFields() { return new String[0]; } private VdcActionParametersBase getAddParameters(VmNumaNode entity, VirtualNumaNode device) { VmNumaNodeOperationParameters parameters = new VmNumaNodeOperationParameters(parentId, map(device, entity)); return parameters; } private ParametersProvider<VirtualNumaNode, VmNumaNode> getUpdateParametersProvider() { return new UpdateParametersProvider(); } private class UpdateParametersProvider implements ParametersProvider<VirtualNumaNode, VmNumaNode> { @Override public VdcActionParametersBase getParameters(VirtualNumaNode incoming, VmNumaNode entity) { return new VmNumaNodeOperationParameters(parentId, map(incoming, entity)); } } protected VmNumaNode lookupEntity(Guid id) { for (VmNumaNode entity : getBackendCollection(queryType, queryParams)) { if (matchEntity(entity, id)) { return entity; } } return null; } @Override public VirtualNumaNode addParents(VirtualNumaNode node) { node.setVm(new Vm()); node.getVm().setId(parentId.toString()); return node; } @Override public VirtualNumaNodes list() { return mapCollection(getBackendCollection(queryType, queryParams)); } protected VirtualNumaNodes mapCollection(List<VmNumaNode> entities) { VirtualNumaNodes collection = instantiate(collectionType); List<VirtualNumaNode> list = collection.getVirtualNumaNodes(); for (VmNumaNode entity : entities) { VirtualNumaNode candidate = populate(map(entity), entity); candidate = addLinks(candidate); list.add(candidate); } return collection; } @Override public VmNumaNodeResource getNodeResource(String id) { return inject(new BackendVmNumaNodeResource(id, this, updateType, getUpdateParametersProvider(), getRequiredUpdateFields())); } @Override public Response add(VirtualNumaNode node) { validateParameters(node, getRequiredAddFields()); return performCreate(addAction, getAddParameters(map(node), node), getEntityIdResolver(node.getName())); } public EntityIdResolver<Guid> getEntityIdResolver(String name) { return new NodeIdResolver(); } protected class NodeIdResolver extends EntityIdResolver<Guid> { @Override public VmNumaNode lookupEntity(Guid id) throws BackendFailureException { for (VmNumaNode entity : getBackendCollection(queryType, queryParams)) { if (matchEntity(entity, id)) { return entity; } } return null; } } }