package org.ovirt.engine.api.restapi.resource; import java.util.List; import javax.ws.rs.core.Response; import org.ovirt.engine.api.model.Host; import org.ovirt.engine.api.model.Hosts; import org.ovirt.engine.api.resource.AffinityLabelHostResource; import org.ovirt.engine.api.resource.AffinityLabelHostsResource; 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.VDS; public class BackendAffinityLabelHostsResource extends AbstractBackendCollectionResource<Host, VDS> implements AffinityLabelHostsResource { private String labelId; public BackendAffinityLabelHostsResource(String labelId) { super(Host.class, VDS.class); this.labelId = labelId; } @Override public Response add(Host model) { validateParameters(model, "id"); Label label = BackendAffinityLabelHelper.getLabel(this, labelId); VDS entity = new VDS(); entity.setId(GuidUtils.asGuid(model.getId())); Label updatedLabel = new LabelBuilder(label) .entity(entity) .build(); // The command used to add the host 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 host: LabelActionParameters updateParams = new LabelActionParameters(updatedLabel); try { doAction(VdcActionType.UpdateLabel, updateParams); } catch (BackendFailureException exception) { handleError(exception, false); } Host result = BackendAffinityLabelHelper.makeHostLink(entity.getId()); return Response.ok(Response.Status.CREATED).entity(result).build(); } @Override public Hosts list() { Hosts hosts = new Hosts(); List<Host> list = hosts.getHosts(); Label label = BackendAffinityLabelHelper.getLabel(this, labelId); label.getHosts().stream() .map(BackendAffinityLabelHelper::makeHostLink) .forEach(list::add); return hosts; } @Override public AffinityLabelHostResource getHostResource(String id) { return inject(new BackendAffinityLabelHostResource(labelId, id)); } }