package org.ovirt.engine.core.vdsbroker.jsonrpc; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import org.ovirt.engine.core.vdsbroker.irsbroker.FileStatsReturn; import org.ovirt.engine.core.vdsbroker.irsbroker.GetVmsInfoReturn; import org.ovirt.engine.core.vdsbroker.irsbroker.IIrsServer; import org.ovirt.engine.core.vdsbroker.irsbroker.ImagesListReturn; import org.ovirt.engine.core.vdsbroker.irsbroker.IrsStatsAndStatus; import org.ovirt.engine.core.vdsbroker.irsbroker.OneUuidReturn; import org.ovirt.engine.core.vdsbroker.irsbroker.StatusReturn; import org.ovirt.engine.core.vdsbroker.irsbroker.StoragePoolInfo; import org.ovirt.engine.core.vdsbroker.irsbroker.StorageStatusReturn; import org.ovirt.engine.core.vdsbroker.irsbroker.UUIDListReturn; import org.ovirt.engine.core.vdsbroker.irsbroker.VmLeaseTaskInfoReturn; import org.ovirt.engine.core.vdsbroker.irsbroker.VolumeListReturn; import org.ovirt.engine.core.vdsbroker.vdsbroker.ResizeStorageDomainPVMapReturn; import org.ovirt.engine.core.vdsbroker.vdsbroker.StatusOnlyReturn; import org.ovirt.vdsm.jsonrpc.client.JsonRpcClient; import org.ovirt.vdsm.jsonrpc.client.JsonRpcRequest; import org.ovirt.vdsm.jsonrpc.client.RequestBuilder; public class JsonRpcIIrsServer implements IIrsServer { private JsonRpcClient client; public JsonRpcIIrsServer(JsonRpcClient client) { this.client = client; } @Override public void close() { this.client.close(); } @Override public OneUuidReturn createVolume(String sdUUID, String spUUID, String imgGUID, String size, int volFormat, int volType, int diskType, String volUUID, String descr, String srcImgGUID, String srcVolUUID, String initialSize) { JsonRpcRequest request = new RequestBuilder("Volume.create").withParameter("volumeID", volUUID) .withParameter("storagepoolID", spUUID) .withParameter("storagedomainID", sdUUID) .withParameter("imageID", imgGUID) .withParameter("size", size) .withParameter("volFormat", volFormat) .withParameter("preallocate", volType) .withParameter("diskType", diskType) .withParameter("desc", descr) .withParameter("srcImgUUID", srcImgGUID) .withParameter("srcVolUUID", srcVolUUID) .withOptionalParameter("initialSize", initialSize) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("uuid"); return new OneUuidReturn(response); } @Override public OneUuidReturn copyImage(String sdUUID, String spUUID, String vmGUID, String srcImgGUID, String srcVolUUID, String dstImgGUID, String dstVolUUID, String descr, String dstSdUUID, int volType, int volFormat, int preallocate, String postZero, String force) { // vmGUID is not needed and can be removed from the interface return copyImage(sdUUID, spUUID, vmGUID, srcImgGUID, srcVolUUID, dstImgGUID, dstVolUUID, descr, dstSdUUID, volType, volFormat, preallocate, postZero, null, force); } @Override public OneUuidReturn copyImage(String sdUUID, String spUUID, String vmGUID, String srcImgGUID, String srcVolUUID, String dstImgGUID, String dstVolUUID, String descr, String dstSdUUID, int volType, int volFormat, int preallocate, String postZero, Boolean discard, String force) { // vmGUID is not needed and can be removed from the interface JsonRpcRequest request = new RequestBuilder("Volume.copy").withParameter("volumeID", srcVolUUID) .withParameter("storagepoolID", spUUID) .withParameter("storagedomainID", sdUUID) .withParameter("imageID", srcImgGUID) .withParameter("dstSdUUID", dstSdUUID) .withParameter("dstImgUUID", dstImgGUID) .withParameter("dstVolUUID", dstVolUUID) .withParameter("desc", descr) .withParameter("volType", volType) .withParameter("volFormat", volFormat) .withParameter("preallocate", preallocate) .withParameter("postZero", postZero) .withOptionalParameter("discard", discard) .withParameter("force", force) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("uuid"); return new OneUuidReturn(response); } @SuppressWarnings("rawtypes") @Override public OneUuidReturn downloadImage(Map methodInfo, String spUUID, String sdUUID, String dstImgGUID, String dstVolUUID) { JsonRpcRequest request = new RequestBuilder("Image.download").withParameter("methodArgs", methodInfo) .withParameter("storagepoolID", spUUID) .withParameter("storagedomainID", sdUUID) .withParameter("imageID", dstImgGUID) .withParameter("volumeID", dstVolUUID) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("uuid"); return new OneUuidReturn(response); } @SuppressWarnings("rawtypes") @Override public OneUuidReturn uploadImage(Map methodInfo, String spUUID, String sdUUID, String srcImgGUID, String srcVolUUID) { JsonRpcRequest request = new RequestBuilder("Image.upload").withParameter("methodArgs", methodInfo) .withParameter("storagepoolID", spUUID) .withParameter("storagedomainID", sdUUID) .withParameter("imageID", srcImgGUID) .withParameter("volumeID", srcVolUUID) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("uuid"); return new OneUuidReturn(response); } @Override public OneUuidReturn mergeSnapshots(String sdUUID, String spUUID, String vmGUID, String imgGUID, String ancestorUUID, String successorUUID, String postZero) { // vmGUID not used and can be removed from the interface return mergeSnapshots(sdUUID, spUUID, vmGUID, imgGUID, ancestorUUID, successorUUID, postZero, null); } @Override public OneUuidReturn mergeSnapshots(String sdUUID, String spUUID, String vmGUID, String imgGUID, String ancestorUUID, String successorUUID, String postZero, Boolean discard) { // vmGUID not used and can be removed from the interface JsonRpcRequest request = new RequestBuilder("Image.mergeSnapshots").withParameter("imageID", imgGUID) .withParameter("storagepoolID", spUUID) .withParameter("storagedomainID", sdUUID) .withParameter("ancestor", ancestorUUID) .withParameter("successor", successorUUID) .withParameter("postZero", postZero) .withOptionalParameter("discard", discard) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("uuid"); return new OneUuidReturn(response); } @Override public VolumeListReturn reconcileVolumeChain(String spUUID, String sdUUID, String imgGUID, String leafVolUUID) { JsonRpcRequest request = new RequestBuilder("Image.reconcileVolumeChain").withParameter("storagepoolID", spUUID) .withParameter("storagedomainID", sdUUID) .withParameter("imageID", imgGUID) .withParameter("leafVolID", leafVolUUID) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("volumes") .withResponseType(Object[].class); return new VolumeListReturn(response); } @Override public OneUuidReturn deleteVolume(String sdUUID, String spUUID, String imgGUID, String[] volUUID, String postZero, String force) { return deleteVolume(sdUUID, spUUID, imgGUID, volUUID, postZero, null, force); } @Override public OneUuidReturn deleteVolume(String sdUUID, String spUUID, String imgGUID, String[] volUUID, String postZero, Boolean discard, String force) { JsonRpcRequest request = new RequestBuilder("Image.deleteVolumes").withParameter("imageID", imgGUID) .withParameter("storagepoolID", spUUID) .withParameter("storagedomainID", sdUUID) .withParameter("volumeList", new ArrayList<>(Arrays.asList(volUUID))) .withOptionalParameter("postZero", postZero) .withOptionalParameter("discard", discard) .withOptionalParameter("force", force) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("uuid"); return new OneUuidReturn(response); } @Override public IrsStatsAndStatus getIrsStats() { JsonRpcRequest request = new RequestBuilder("Host.getStorageRepoStats").build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("stats"); return new IrsStatsAndStatus(response); } @Override public FileStatsReturn getFileStats(String sdUUID, String pattern, boolean caseSensitive) { JsonRpcRequest request = new RequestBuilder("StorageDomain.getFileStats").withParameter("storagedomainID", sdUUID) .withParameter("pattern", pattern) .withParameter("caseSensitive", caseSensitive) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("fileStats"); return new FileStatsReturn(response); } @Override public StorageStatusReturn activateStorageDomain(String sdUUID, String spUUID) { JsonRpcRequest request = new RequestBuilder("StorageDomain.activate").withParameter("storagedomainID", sdUUID) .withParameter("storagepoolID", spUUID) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("storageStatus") .withResponseType(String.class); return new StorageStatusReturn(response); } @Override public StatusOnlyReturn deactivateStorageDomain(String sdUUID, String spUUID, String msdUUID, int masterVersion) { JsonRpcRequest request = new RequestBuilder("StorageDomain.deactivate").withParameter("storagedomainID", sdUUID) .withParameter("storagepoolID", spUUID) .withParameter("masterSdUUID", msdUUID) .withParameter("masterVersion", masterVersion) .build(); Map<String, Object> response = new FutureMap(this.client, request); return new StatusOnlyReturn(response); } @Override public StatusOnlyReturn detachStorageDomain(String sdUUID, String spUUID, String msdUUID, int masterVersion) { JsonRpcRequest request = new RequestBuilder("StorageDomain.detach").withParameter("storagedomainID", sdUUID) .withParameter("storagepoolID", spUUID) .withParameter("masterSdUUID", msdUUID) .withParameter("masterVersion", masterVersion) .build(); Map<String, Object> response = new FutureMap(this.client, request); return new StatusOnlyReturn(response); } @Override public StatusOnlyReturn forcedDetachStorageDomain(String sdUUID, String spUUID) { JsonRpcRequest request = new RequestBuilder("StorageDomain.detach").withParameter("storagedomainID", sdUUID) .withParameter("storagepoolID", spUUID) .withParameter("force", true) .build(); Map<String, Object> response = new FutureMap(this.client, request); return new StatusOnlyReturn(response); } @Override public StatusOnlyReturn attachStorageDomain(String sdUUID, String spUUID) { JsonRpcRequest request = new RequestBuilder("StorageDomain.attach").withParameter("storagedomainID", sdUUID) .withParameter("storagepoolID", spUUID) .build(); Map<String, Object> response = new FutureMap(this.client, request); return new StatusOnlyReturn(response); } @Override public StatusOnlyReturn setStorageDomainDescription(String sdUUID, String description) { JsonRpcRequest request = new RequestBuilder("StorageDomain.setDescription").withParameter("storagedomainID", sdUUID) .withParameter("description", description) .build(); Map<String, Object> response = new FutureMap(this.client, request); return new StatusOnlyReturn(response); } @Override public StatusOnlyReturn extendStorageDomain(String sdUUID, String spUUID, String[] devlist, boolean force) { JsonRpcRequest request = new RequestBuilder("StorageDomain.extend").withParameter("storagedomainID", sdUUID) .withParameter("storagepoolID", spUUID) .withParameter("devlist", new ArrayList<>(Arrays.asList(devlist))) // TODO: Change to withOptionalParameter when the API will allow to send primitives as // optional parameters. .withParameter("force", force) .build(); Map<String, Object> response = new FutureMap(this.client, request); return new StatusOnlyReturn(response); } @Override public ResizeStorageDomainPVMapReturn resizeStorageDomainPV(String sdUUID, String spUUID, String device) { JsonRpcRequest request = new RequestBuilder("StorageDomain.resizePV").withParameter("storagedomainID", sdUUID) .withParameter("storagepoolID", spUUID) .withParameter("guid", device) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("size"); return new ResizeStorageDomainPVMapReturn(response); } @Override public StoragePoolInfo getStoragePoolInfo(String spUUID) { // duplicated in IVdsServer#getStoragePoolInfo JsonRpcRequest request = new RequestBuilder("StoragePool.getInfo").withParameter("storagepoolID", spUUID).build(); Map<String, Object> response = new FutureMap(this.client, request).withIgnoreResponseKey(); return new StoragePoolInfo(response); } @Override public StatusOnlyReturn destroyStoragePool(String spUUID, int hostSpmId, String SCSIKey) { JsonRpcRequest request = new RequestBuilder("StoragePool.destroy").withParameter("storagepoolID", spUUID) .withParameter("hostID", hostSpmId) .withParameter("scsiKey", SCSIKey) .build(); Map<String, Object> response = new FutureMap(this.client, request); return new StatusOnlyReturn(response); } @Override public OneUuidReturn deleteImage(String sdUUID, String spUUID, String imgGUID, String postZero, String force) { return deleteImage(sdUUID, spUUID, imgGUID, postZero, null, force); } @Override public OneUuidReturn deleteImage(String sdUUID, String spUUID, String imgGUID, String postZero, Boolean discard, String force) { JsonRpcRequest request = new RequestBuilder("Image.delete").withParameter("imageID", imgGUID) .withParameter("storagepoolID", spUUID) .withParameter("storagedomainID", sdUUID) .withParameter("postZero", postZero) .withOptionalParameter("discard", discard) .withParameter("force", force) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("uuid"); return new OneUuidReturn(response); } @Override public OneUuidReturn moveImage(String spUUID, String srcDomUUID, String dstDomUUID, String imgGUID, String vmGUID, int op, String postZero, String force) { return moveImage(spUUID, srcDomUUID, dstDomUUID, imgGUID, vmGUID, op, postZero, null, force); } @Override public OneUuidReturn moveImage(String spUUID, String srcDomUUID, String dstDomUUID, String imgGUID, String vmGUID, int op, String postZero, Boolean discard, String force) { JsonRpcRequest request = new RequestBuilder("Image.move").withParameter("imageID", imgGUID) .withParameter("storagepoolID", spUUID) .withParameter("storagedomainID", srcDomUUID) .withParameter("dstSdUUID", dstDomUUID) .withParameter("operation", op) .withParameter("postZero", postZero) .withOptionalParameter("discard", discard) .withParameter("force", force) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("uuid"); return new OneUuidReturn(response); } @Override public OneUuidReturn cloneImageStructure(String spUUID, String srcDomUUID, String imgGUID, String dstDomUUID) { JsonRpcRequest request = new RequestBuilder("Image.cloneStructure").withParameter("imageID", imgGUID) .withParameter("storagepoolID", spUUID) .withParameter("storagedomainID", srcDomUUID) .withParameter("dstSdUUID", dstDomUUID) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("uuid"); return new OneUuidReturn(response); } @Override public OneUuidReturn syncImageData(String spUUID, String srcDomUUID, String imgGUID, String dstDomUUID, String syncType) { JsonRpcRequest request = new RequestBuilder("Image.syncData").withParameter("imageID", imgGUID) .withParameter("storagepoolID", spUUID) .withParameter("storagedomainID", srcDomUUID) .withParameter("dstSdUUID", dstDomUUID) .withParameter("syncType", syncType) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("uuid"); return new OneUuidReturn(response); } @SuppressWarnings("rawtypes") @Override public StatusOnlyReturn updateVM(String spUUID, Map[] vms) { return updateVMInImportExport(spUUID, vms, null); } @Override public StatusOnlyReturn removeVM(String spUUID, String vmGUID) { return removeVM(spUUID, vmGUID, null); } @SuppressWarnings("rawtypes") @Override public StatusOnlyReturn updateVMInImportExport(String spUUID, Map[] vms, String StorageDomainId) { JsonRpcRequest request = new RequestBuilder("StoragePool.updateVMs").withParameter("storagepoolID", spUUID) .withParameter("vmList", new ArrayList<>(Arrays.asList(vms))) .withOptionalParameter("storagedomainID", StorageDomainId) .build(); Map<String, Object> response = new FutureMap(this.client, request); return new StatusOnlyReturn(response); } @Override public StatusOnlyReturn removeVM(String spUUID, String vmGUID, String storageDomainId) { JsonRpcRequest request = new RequestBuilder("StoragePool.removeVM").withParameter("storagepoolID", spUUID) .withParameter("vmUUID", vmGUID).withOptionalParameter("storagedomainID", storageDomainId) .build(); Map<String, Object> response = new FutureMap(this.client, request); return new StatusOnlyReturn(response); } @Override public GetVmsInfoReturn getVmsInfo(String storagePoolId, String storageDomainId, String[] VMIDList) { JsonRpcRequest request = new RequestBuilder("StoragePool.getBackedUpVmsInfo").withParameter("storagepoolID", storagePoolId) .withParameter("storagedomainID", storageDomainId) .withParameter("vmList", new ArrayList<>(Arrays.asList(VMIDList))) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("vmlist"); return new GetVmsInfoReturn(response); } @Override public StatusOnlyReturn upgradeStoragePool(String storagePoolId, String targetVersion) { JsonRpcRequest request = new RequestBuilder("StoragePool.upgrade").withParameter("storagepoolID", storagePoolId) .withParameter("targetDomVersion", targetVersion) .build(); Map<String, Object> response = new FutureMap(this.client, request); return new StatusOnlyReturn(response); } @Override public ImagesListReturn getImagesList(String sdUUID) { JsonRpcRequest request = new RequestBuilder("StorageDomain.getImages").withParameter("storagedomainID", sdUUID).build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("imageslist") .withResponseType(Object[].class); return new ImagesListReturn(response); } @Override public UUIDListReturn getVolumesList(String sdUUID, String spUUID, String imgUUID) { JsonRpcRequest request = new RequestBuilder("StorageDomain.getVolumes").withParameter("storagedomainID", sdUUID) .withParameter("storagepoolID", spUUID) .withParameter("imageID", imgUUID) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("uuidlist") .withResponseType(Object[].class); return new UUIDListReturn(response); } @Override public OneUuidReturn extendVolumeSize(String spUUID, String sdUUID, String imageUUID, String volumeUUID, String newSize) { JsonRpcRequest request = new RequestBuilder("Volume.extendSize").withParameter("storagepoolID", spUUID) .withParameter("storagedomainID", sdUUID) .withParameter("imageID", imageUUID) .withParameter("volumeID", volumeUUID) .withParameter("newSize", newSize) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("uuid"); return new OneUuidReturn(response); } @Override public StatusOnlyReturn setVolumeDescription(String sdUUID, String spUUID, String imgGUID, String volUUID, String description) { JsonRpcRequest request = new RequestBuilder("Volume.setDescription").withParameter("volumeID", volUUID) .withParameter("storagepoolID", spUUID) .withParameter("storagedomainID", sdUUID) .withParameter("imageID", imgGUID) .withParameter("description", description) .build(); Map<String, Object> response = new FutureMap(this.client, request); return new StatusOnlyReturn(response); } @Override public StatusReturn setVolumeLegality(String spID, String sdID, String imageID, String volumeID, String legality) { JsonRpcRequest request = new RequestBuilder("Volume.setLegality") .withParameter("storagepoolID", spID) .withParameter("storagedomainID", sdID) .withParameter("imageID", imageID) .withParameter("volumeID", volumeID) .withParameter("legality", legality) .build(); Map<String, Object> response = new FutureMap(this.client, request); return new StatusReturn(response); } @Override public OneUuidReturn prepareMerge(String spUUID, Map<String, Object> subchainInfo) { JsonRpcRequest request = new RequestBuilder("StoragePool.prepareMerge") .withParameter("storagepoolID", spUUID) .withParameter("subchainInfo", subchainInfo) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("uuid"); return new OneUuidReturn(response); } @Override public OneUuidReturn finalizeMerge(String spUUID, Map<String, Object> subchainInfo) { JsonRpcRequest request = new RequestBuilder("StoragePool.finalizeMerge") .withParameter("storagepoolID", spUUID) .withParameter("subchainInfo", subchainInfo) .build(); Map<String, Object> response = new FutureMap(this.client, request).withResponseKey("uuid"); return new OneUuidReturn(response); } @Override public VmLeaseTaskInfoReturn addVmLease(String leaseUUID, String sdUUID) { HashMap<String, Object> leaseDict = new HashMap<>(); leaseDict.put("lease_id", leaseUUID); leaseDict.put("sd_id", sdUUID); JsonRpcRequest request = new RequestBuilder("Lease.create") .withParameter("lease", leaseDict) .build(); Map<String, Object> response = new FutureMap(this.client, request); return new VmLeaseTaskInfoReturn(response); } @Override public VmLeaseTaskInfoReturn removeVmLease(String leaseUUID, String sdUUID) { HashMap<String, Object> leaseDict = new HashMap<>(); leaseDict.put("lease_id", leaseUUID); leaseDict.put("sd_id", sdUUID); JsonRpcRequest request = new RequestBuilder("Lease.delete") .withParameter("lease", leaseDict) .build(); Map<String, Object> response = new FutureMap(this.client, request); return new VmLeaseTaskInfoReturn(response); } }