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.Snapshot; import org.ovirt.engine.api.resource.ActionResource; import org.ovirt.engine.api.resource.CreationResource; import org.ovirt.engine.api.resource.SnapshotCdromsResource; import org.ovirt.engine.api.resource.SnapshotDisksResource; import org.ovirt.engine.api.resource.SnapshotNicsResource; import org.ovirt.engine.api.resource.SnapshotResource; import org.ovirt.engine.core.common.action.RemoveSnapshotParameters; import org.ovirt.engine.core.common.action.RestoreAllSnapshotsParameters; import org.ovirt.engine.core.common.action.TryBackToAllSnapshotsOfVmParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.SnapshotActionEnum; import org.ovirt.engine.core.compat.Guid; public class BackendSnapshotResource extends AbstractBackendActionableResource<Snapshot, org.ovirt.engine.core.common.businessentities.Snapshot> implements SnapshotResource { private static final String RESTORE_SNAPSHOT_CORRELATION_ID = "RestoreSnapshot"; protected Guid parentId; protected BackendSnapshotsResource collection; public BackendSnapshotResource(String id, Guid parentId, BackendSnapshotsResource collection) { super(id, Snapshot.class, org.ovirt.engine.core.common.businessentities.Snapshot.class); this.parentId = parentId; this.collection = collection; } @Override public Snapshot get() { org.ovirt.engine.core.common.businessentities.Snapshot entity = getSnapshot(); Snapshot snapshot = populate(map(entity, null), entity); snapshot = addLinks(snapshot); snapshot = collection.addVmConfiguration(entity, snapshot); return snapshot; } protected org.ovirt.engine.core.common.businessentities.Snapshot getSnapshot() { org.ovirt.engine.core.common.businessentities.Snapshot entity = collection.getSnapshotById(guid); if (entity==null) { notFound(); } return entity; } @Override public Response restore(Action action) { action.setAsync(false); TryBackToAllSnapshotsOfVmParameters tryBackParams = new TryBackToAllSnapshotsOfVmParameters(parentId, guid); if (action.isSetRestoreMemory()) { tryBackParams.setRestoreMemory(action.isRestoreMemory()); } if (action.isSetDisks()) { tryBackParams.setDisks(collection.mapDisks(action.getDisks())); } tryBackParams.setCorrelationId(RESTORE_SNAPSHOT_CORRELATION_ID); //TODO: if user supplied, override with user value Response response = doAction(VdcActionType.TryBackToAllSnapshotsOfVm, tryBackParams, action, PollingType.JOB); if (response.getStatus()==Response.Status.OK.getStatusCode()) { RestoreAllSnapshotsParameters restoreParams = new RestoreAllSnapshotsParameters(parentId, SnapshotActionEnum.COMMIT); restoreParams.setCorrelationId(RESTORE_SNAPSHOT_CORRELATION_ID); Response response2 = doAction(VdcActionType.RestoreAllSnapshots, restoreParams, action); if (response2.getStatus()!=Response.Status.OK.getStatusCode()) { return response2; } } return response; } @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)); } @Override protected Snapshot addParents(Snapshot snapshot) { return collection.addParents(snapshot); } BackendSnapshotsResource getCollection() { return collection; } @Override public SnapshotCdromsResource getCdromsResource() { return inject(new BackendSnapshotCdRomsResource(this)); } @Override public SnapshotDisksResource getDisksResource() { return inject(new BackendSnapshotDisksResource(this)); } @Override public SnapshotNicsResource getNicsResource() { return inject(new BackendSnapshotNicsResource(this)); } public void setCollectionResource(BackendSnapshotsResource collection) { this.collection = collection; } @Override protected Snapshot doPopulate(Snapshot model, org.ovirt.engine.core.common.businessentities.Snapshot entity) { return collection.doPopulate(model, entity); } @Override public Response remove() { get(); return performAction(VdcActionType.RemoveSnapshot, new RemoveSnapshotParameters(guid, parentId)); } }