package org.ovirt.engine.api.restapi.util; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.ovirt.engine.api.model.BaseResource; import org.ovirt.engine.api.model.Display; import org.ovirt.engine.api.model.DisplayType; import org.ovirt.engine.api.model.Template; import org.ovirt.engine.api.model.Vm; import org.ovirt.engine.api.restapi.resource.BackendResource; import org.ovirt.engine.api.restapi.types.DisplayMapper; import org.ovirt.engine.core.common.action.HasGraphicsDevices; import org.ovirt.engine.core.common.businessentities.GraphicsDevice; import org.ovirt.engine.core.common.businessentities.GraphicsType; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.IdsQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; public class DisplayHelper { private DisplayHelper() { } /** * Returns graphics types of graphics devices of entity with given id. */ public static List<GraphicsType> getGraphicsTypesForEntity(BackendResource backendResource, Guid id, boolean nextRun) { return getGraphicsTypesForEntity(backendResource, id, null, nextRun); } public static List<GraphicsType> getGraphicsTypesForEntity(BackendResource backendResource, Guid id, Map<Guid, List<GraphicsDevice>> cache, boolean nextRun) { List<GraphicsType> graphicsTypes = new ArrayList<>(); List<GraphicsDevice> graphicsDevices; if (cache == null) { graphicsDevices = getGraphicsDevicesForEntity(backendResource, id, nextRun); } else { graphicsDevices = cache.get(id); } if (graphicsDevices != null) { for (GraphicsDevice graphicsDevice : graphicsDevices) { graphicsTypes.add(graphicsDevice.getGraphicsType()); } } return graphicsTypes; } public static List<GraphicsDevice> getGraphicsDevicesForEntity(BackendResource backendResource, Guid id, boolean nextRun) { List<GraphicsDevice> graphicsDevices = backendResource.getEntity(List.class, nextRun ? VdcQueryType.GetNextRunGraphicsDevices : VdcQueryType.GetGraphicsDevices, new IdQueryParameters(id), id.toString(), true); return graphicsDevices; } public static Map<Guid, List<GraphicsDevice>> getGraphicsDevicesForMultipleEntities( BackendResource backendResource, List<Guid> vmIds) { Map<Guid, List<GraphicsDevice>> graphicsDevices = backendResource.getEntity(Map.class, VdcQueryType.GetGraphicsDevicesMultiple, new IdsQueryParameters(vmIds), "GetGraphicsDevicesMultiple", true); return graphicsDevices; } /** * Set data about graphics from (REST) Template to parameters. * * @param display - display that contains graphics data * @param params - parameters to be updated with graphics data */ public static void setGraphicsToParams(Display display, HasGraphicsDevices params) { if (display != null && display.isSetType()) { DisplayType newDisplayType = display.getType(); if (newDisplayType != null) { for (GraphicsType graphicsType : GraphicsType.values()) { params.getGraphicsDevices().put(graphicsType, null); // reset graphics devices } GraphicsType newGraphicsType = DisplayMapper.map(newDisplayType, null); params.getGraphicsDevices().put(newGraphicsType, new GraphicsDevice(newGraphicsType.getCorrespondingDeviceType())); } } } /** * Sets static display info (derived from graphics device) to the Template. * Serves for BC purposes as VM can have more graphics devices, but old restapi allows us to set only one. * If there are multiple graphics, SPICE is preferred. */ public static void adjustDisplayData(BackendResource res, Template template) { adjustDisplayDataInternal(res, template, null, false); } /** * Sets static display info (derived from graphics device) to the VM. * Serves for BC purposes as VM can have more graphics devices, but old restapi allows us to set only one. * If there are multiple graphics, SPICE is preferred. */ public static void adjustDisplayData(BackendResource res, Vm vm, boolean nextRun) { adjustDisplayData(res, vm, null, nextRun); } public static void adjustDisplayData(BackendResource res, Vm vm, Map<Guid, List<GraphicsDevice>> vmsGraphicsDevices, boolean nextRun) { adjustDisplayDataInternal(res, vm, vmsGraphicsDevices, nextRun); } private static void adjustDisplayDataInternal(BackendResource backendResource, BaseResource res, Map<Guid, List<GraphicsDevice>> vmsGraphicsDevices, boolean nextRun) { Display display = extractDisplayFromResource(res); if (display != null && !display.isSetType()) { List<GraphicsType> graphicsTypes = getGraphicsTypesForEntity(backendResource, new Guid(res.getId()), vmsGraphicsDevices, nextRun); if (graphicsTypes.contains(GraphicsType.SPICE)) { display.setType(DisplayType.SPICE); } else if (graphicsTypes.contains(GraphicsType.VNC)) { display.setType(DisplayType.VNC); } else { resetDisplay(res); } } } private static Display extractDisplayFromResource(BaseResource res) { if (res instanceof Vm) { return ((Vm) res).getDisplay(); } if (res instanceof Template) { return ((Template) res).getDisplay(); } return null; } private static void resetDisplay(BaseResource res) { if (res instanceof Vm) { ((Vm) res).setDisplay(null); } if (res instanceof Template) { ((Template) res).setDisplay(null); } } }