package org.ovirt.engine.api.restapi.resource; import java.util.List; import javax.ws.rs.core.Response; import org.ovirt.engine.api.model.HostDevice; import org.ovirt.engine.api.model.HostDevices; import org.ovirt.engine.api.model.Vm; import org.ovirt.engine.api.resource.VmHostDeviceResource; import org.ovirt.engine.api.resource.VmHostDevicesResource; import org.ovirt.engine.api.restapi.utils.HexUtils; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VmHostDevicesParameters; import org.ovirt.engine.core.common.businessentities.HostDeviceView; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; public class BackendVmHostDevicesResource extends AbstractBackendCollectionResource<HostDevice, HostDeviceView> implements VmHostDevicesResource { private Guid vmId; public BackendVmHostDevicesResource(Guid parentId) { super(HostDevice.class, HostDeviceView.class); vmId = parentId; } @Override protected HostDevice addParents(HostDevice model) { model.setVm(new Vm()); model.getVm().setId(vmId.toString()); return super.addParents(model); } @Override public HostDevices list() { HostDevices model = new HostDevices(); for (HostDeviceView hostDevice : getCollection()) { model.getHostDevices().add(addLinks(map(hostDevice, new HostDevice()))); } return model; } @Override public Response add(final HostDevice hostDevice) { validateParameters(hostDevice, "id|name"); String deviceName = hostDevice.getName(); if (hostDevice.isSetId()) { // in case both 'name' and 'id' is set, 'id' takes priority deviceName = HexUtils.hex2string(hostDevice.getId()); } return performCreate(VdcActionType.AddVmHostDevices, new VmHostDevicesParameters(vmId, deviceName), new DeviceNameResolver(deviceName)); } @Override public VmHostDeviceResource getDeviceResource(String deviceId) { return inject(new BackendVmHostDeviceResource(deviceId, this)); } protected List<HostDeviceView> getCollection() { return getBackendCollection(VdcQueryType.GetExtendedVmHostDevicesByVmId, new IdQueryParameters(vmId)); } public Guid getVmId() { return vmId; } private class DeviceNameResolver extends EntityIdResolver<Void> { private final String deviceName; public DeviceNameResolver(String deviceName) { this.deviceName = deviceName; } @Override public HostDeviceView lookupEntity(Void ignored) throws BackendFailureException { for (HostDeviceView device : getCollection()) { if (device.getDeviceName().equals(deviceName)) { return device; } } return null; } } }