package org.ovirt.engine.api.restapi.resource; import java.util.List; import javax.ws.rs.core.Response; import org.ovirt.engine.api.model.Action; import org.ovirt.engine.api.model.Console; import org.ovirt.engine.api.model.Template; import org.ovirt.engine.api.model.VirtioScsi; import org.ovirt.engine.api.resource.ActionResource; import org.ovirt.engine.api.resource.AssignedPermissionsResource; import org.ovirt.engine.api.resource.AssignedTagsResource; import org.ovirt.engine.api.resource.CreationResource; import org.ovirt.engine.api.resource.TemplateCdromsResource; import org.ovirt.engine.api.resource.TemplateDiskAttachmentsResource; import org.ovirt.engine.api.resource.TemplateDisksResource; import org.ovirt.engine.api.resource.TemplateGraphicsConsolesResource; import org.ovirt.engine.api.resource.TemplateNicsResource; import org.ovirt.engine.api.resource.TemplateResource; import org.ovirt.engine.api.resource.TemplateWatchdogsResource; import org.ovirt.engine.api.restapi.logging.Messages; import org.ovirt.engine.api.restapi.types.RngDeviceMapper; import org.ovirt.engine.api.restapi.types.VmMapper; import org.ovirt.engine.api.restapi.util.DisplayHelper; import org.ovirt.engine.api.restapi.util.IconHelper; import org.ovirt.engine.api.restapi.util.VmHelper; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.MoveOrCopyParameters; import org.ovirt.engine.core.common.action.UpdateVmTemplateParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VmTemplateManagementParameters; import org.ovirt.engine.core.common.businessentities.VmRngDevice; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.queries.GetPermissionsForObjectParameters; import org.ovirt.engine.core.common.queries.GetVmTemplateParameters; 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 BackendTemplateResource extends AbstractBackendActionableResource<Template, VmTemplate> implements TemplateResource { public BackendTemplateResource(String id) { super(id, Template.class, VmTemplate.class); } @Override public Template get() { Template template = performGet(VdcQueryType.GetVmTemplate, new GetVmTemplateParameters(guid)); if (template != null) { DisplayHelper.adjustDisplayData(this, template); } return template; } @Override public Response remove() { get(); return performAction(VdcActionType.RemoveVmTemplate, new VmTemplateManagementParameters(guid)); } @Override public Template update(Template incoming) { validateIconParams(incoming); Template result = performUpdate( incoming, new QueryIdResolver<>(VdcQueryType.GetVmTemplate, GetVmTemplateParameters.class), VdcActionType.UpdateVmTemplate, new UpdateParametersProvider() ); if (result != null) { DisplayHelper.adjustDisplayData(this, result); } return result; } private void validateIconParams(Template incoming) { if (!IconHelper.validateIconParameters(incoming)) { throw new BaseBackendResource.WebFaultException(null, localize(Messages.INVALID_ICON_PARAMETERS), Response.Status.BAD_REQUEST); } } @Override public Response export(Action action) { validateParameters(action, "storageDomain.id|name"); MoveOrCopyParameters params = new MoveOrCopyParameters(guid, getStorageDomainId(action)); if (action.isSetExclusive() && action.isExclusive()) { params.setForceOverride(true); } return doAction(VdcActionType.ExportVmTemplate, params, action, PollingType.JOB); } @Override public TemplateCdromsResource getCdromsResource() { return inject(new BackendTemplateCdromsResource(guid)); } public TemplateDisksResource getDisksResource() { return inject(new BackendTemplateDisksResource(guid)); } @Override public TemplateDiskAttachmentsResource getDiskAttachmentsResource() { return inject(new BackendTemplateDiskAttachmentsResource(guid)); } @Override public TemplateNicsResource getNicsResource() { return inject(new BackendTemplateNicsResource(guid)); } @Override public AssignedTagsResource getTagsResource() { return inject(new BackendTemplateTagsResource(id)); } @Override public AssignedPermissionsResource getPermissionsResource() { return inject(new BackendAssignedPermissionsResource(guid, VdcQueryType.GetPermissionsForObject, new GetPermissionsForObjectParameters(guid), Template.class, VdcObjectType.VmTemplate)); } @Override public CreationResource getCreationResource(String ids) { return inject(new BackendCreationResource(ids)); } @Override public ActionResource getActionResource(String action, String ids) { return inject(new BackendActionResource(action, ids)); } protected class UpdateParametersProvider implements ParametersProvider<Template, VmTemplate> { @Override public VdcActionParametersBase getParameters(Template incoming, VmTemplate entity) { VmTemplate updated = getMapper(modelType, VmTemplate.class).map(incoming, entity); updated.setUsbPolicy(VmMapper.getUsbPolicyOnUpdate(incoming.getUsb(), entity.getUsbPolicy())); UpdateVmTemplateParameters params = new UpdateVmTemplateParameters(updated); if (incoming.isSetRngDevice()) { params.setUpdateRngDevice(true); params.setRngDevice(RngDeviceMapper.map(incoming.getRngDevice(), null)); } if(incoming.isSetSoundcardEnabled()) { params.setSoundDeviceEnabled(incoming.isSoundcardEnabled()); } if (incoming.isSetVirtioScsi()) { if (incoming.getVirtioScsi().isSetEnabled()) { params.setVirtioScsiEnabled(incoming.getVirtioScsi().isEnabled()); } } IconHelper.setIconToParams(incoming, params); DisplayHelper.setGraphicsToParams(incoming.getDisplay(), params); if (incoming.isSetMemoryPolicy() && incoming.getMemoryPolicy().isSetBallooning()) { params.setBalloonEnabled(incoming.getMemoryPolicy().isBallooning()); } return getMapper(modelType, UpdateVmTemplateParameters.class).map(incoming, params); } } @Override protected Template doPopulate(Template model, VmTemplate entity) { if (!model.isSetConsole()) { model.setConsole(new Console()); } model.getConsole().setEnabled(!getConsoleDevicesForEntity(entity.getId()).isEmpty()); if (!model.isSetVirtioScsi()) { model.setVirtioScsi(new VirtioScsi()); } model.getVirtioScsi().setEnabled(!VmHelper.getVirtioScsiControllersForEntity(this, entity.getId()).isEmpty()); model.setSoundcardEnabled(VmHelper.getSoundDevicesForEntity(this, entity.getId()).isEmpty()); setRngDevice(model); return model; } @Override protected Template deprecatedPopulate(Template model, VmTemplate entity) { MemoryPolicyHelper.setupMemoryBalloon(model, this); return model; } private void setRngDevice(Template model) { List<VmRngDevice> rngDevices = getEntity(List.class, VdcQueryType.GetRngDevice, new IdQueryParameters(Guid.createGuidFromString(model.getId())), "GetRngDevice", true); if (rngDevices != null && !rngDevices.isEmpty()) { model.setRngDevice(RngDeviceMapper.map(rngDevices.get(0), null)); } } @Override public TemplateWatchdogsResource getWatchdogsResource() { return inject(new BackendTemplateWatchdogsResource(guid)); } @Override public TemplateGraphicsConsolesResource getGraphicsConsolesResource() { return inject(new BackendTemplateGraphicsConsolesResource(guid)); } private List<String> getConsoleDevicesForEntity(Guid id) { return getEntity(List.class, VdcQueryType.GetConsoleDevices, new IdQueryParameters(id), "GetConsoleDevices", true); } }