package org.ovirt.engine.api.restapi.resource;
import javax.ws.rs.core.Response;
import org.ovirt.engine.api.model.Action;
import org.ovirt.engine.api.model.CdRom;
import org.ovirt.engine.api.model.CdRoms;
import org.ovirt.engine.api.model.Disk;
import org.ovirt.engine.api.model.Disks;
import org.ovirt.engine.api.model.NIC;
import org.ovirt.engine.api.model.Nics;
import org.ovirt.engine.api.model.Template;
import org.ovirt.engine.api.resource.ActionResource;
import org.ovirt.engine.api.resource.AssignedPermissionsResource;
import org.ovirt.engine.api.resource.CreationResource;
import org.ovirt.engine.api.resource.ReadOnlyDevicesResource;
import org.ovirt.engine.api.resource.TemplateResource;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.MoveVmParameters;
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.businessentities.storage_domains;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.interfaces.SearchType;
import org.ovirt.engine.core.common.queries.GetPermissionsForObjectParameters;
import org.ovirt.engine.core.common.queries.GetVmTemplatesDisksParameters;
import org.ovirt.engine.core.common.queries.GetVmTemplateParameters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
import static org.ovirt.engine.api.restapi.resource.BackendVmsResource.SUB_COLLECTIONS;
public class BackendTemplateResource
extends AbstractBackendActionableResource<Template, VmTemplate>
implements TemplateResource {
public BackendTemplateResource(String id) {
super(id, Template.class, VmTemplate.class, SUB_COLLECTIONS);
}
@Override
public Template get() {
return performGet(VdcQueryType.GetVmTemplate, new GetVmTemplateParameters(guid));
}
@Override
public Template update(Template incoming) {
return performUpdate(incoming,
new QueryIdResolver(VdcQueryType.GetVmTemplate, GetVmTemplateParameters.class),
VdcActionType.UpdateVmTemplate,
new UpdateParametersProvider());
}
@Override
public Response export(Action action) {
validateParameters(action, "storageDomain.id|name");
MoveVmParameters params = new MoveVmParameters(guid, getStorageDomainId(action));
if (action.isSetExclusive() && action.isExclusive()) {
params.setForceOverride(true);
}
return doAction(VdcActionType.ExportVmTemplate, params, action);
}
protected Guid getStorageDomainId(Action action) {
if (action.getStorageDomain().isSetId()) {
return asGuid(action.getStorageDomain().getId());
} else {
return lookupStorageDomainIdByName(action.getStorageDomain().getName());
}
}
protected Guid lookupStorageDomainIdByName(String name) {
return getEntity(storage_domains.class, SearchType.StorageDomain, "Storage: name=" + name).getid();
}
@Override
public ReadOnlyDevicesResource<CdRom, CdRoms> getCdRomsResource() {
return inject(new BackendReadOnlyCdRomsResource<VmTemplate>
(VmTemplate.class,
guid,
VdcQueryType.GetVmTemplate,
new GetVmTemplateParameters(guid)));
}
@Override
public ReadOnlyDevicesResource<Disk, Disks> getDisksResource() {
return inject(new BackendReadOnlyDisksResource(guid,
VdcQueryType.GetVmTemplatesDisks,
new GetVmTemplatesDisksParameters(guid)));
}
@Override
public ReadOnlyDevicesResource<NIC, Nics> getNicsResource() {
return inject(new BackendTemplateNicsResource(guid));
}
@Override
public AssignedPermissionsResource getPermissionsResource() {
return inject(new BackendAssignedPermissionsResource(guid,
VdcQueryType.GetPermissionsForObject,
new GetPermissionsForObjectParameters(guid),
Template.class,
VdcObjectType.VmTemplate));
}
@Override
public CreationResource getCreationSubresource(String ids) {
return inject(new BackendCreationResource(ids));
}
@Override
public ActionResource getActionSubresource(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);
return new UpdateVmTemplateParameters(updated);
}
}
}