package org.ovirt.engine.api.restapi.resource; import java.util.List; import javax.ws.rs.core.Response; import org.ovirt.engine.api.model.Vm; import org.ovirt.engine.api.model.Vms; import org.ovirt.engine.api.resource.AffinityLabelVmResource; import org.ovirt.engine.api.resource.AffinityLabelVmsResource; import org.ovirt.engine.api.restapi.utils.GuidUtils; import org.ovirt.engine.core.common.action.LabelActionParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.Label; import org.ovirt.engine.core.common.businessentities.LabelBuilder; import org.ovirt.engine.core.common.businessentities.VM; public class BackendAffinityLabelVmsResource extends AbstractBackendCollectionResource<Vm, VM> implements AffinityLabelVmsResource { private String labelId; public BackendAffinityLabelVmsResource(String labelId) { super(Vm.class, VM.class); this.labelId = labelId; } @Override public Response add(Vm model) { validateParameters(model, "id"); Label label = BackendAffinityLabelHelper.getLabel(this, labelId); VM entity = new VM(); entity.setId(GuidUtils.asGuid(model.getId())); Label updatedLabel = new LabelBuilder(label) .entity(entity) .build(); // The command used to add the virtual machine to the label returns the label, but we need to return the virtual // machine, so we ignore the result and return a link to the added virtual machine: LabelActionParameters updateParams = new LabelActionParameters(updatedLabel); try { doAction(VdcActionType.UpdateLabel, updateParams); } catch (BackendFailureException exception) { handleError(exception, false); } Vm result = BackendAffinityLabelHelper.makeVmLink(entity.getId()); return Response.ok(Response.Status.CREATED).entity(result).build(); } @Override public Vms list() { Vms vms = new Vms(); List<Vm> list = vms.getVms(); Label label = BackendAffinityLabelHelper.getLabel(this, labelId); label.getVms().stream() .map(BackendAffinityLabelHelper::makeVmLink) .forEach(list::add); return vms; } @Override public AffinityLabelVmResource getVmResource(String id) { return inject(new BackendAffinityLabelVmResource(labelId, id)); } }