public static DiskImage cloneDiskImage( Guid storageDomainId, Guid newImageGroupId, Guid newImageGuid, DiskImage srcDiskImage, Guid diskProfileId, Guid snapshotId, DiskImage diskImageFromClient) { DiskImage clonedDiskImage = DiskImage.copyOf(srcDiskImage); clonedDiskImage.setImageId(newImageGuid); clonedDiskImage.setParentId(Guid.Empty); clonedDiskImage.setImageTemplateId(Guid.Empty); clonedDiskImage.setVmSnapshotId(snapshotId); clonedDiskImage.setId(newImageGroupId); clonedDiskImage.setLastModifiedDate(new Date()); clonedDiskImage.setvolumeFormat(srcDiskImage.getVolumeFormat()); clonedDiskImage.setVolumeType(srcDiskImage.getVolumeType()); ArrayList<Guid> storageIds = new ArrayList<>(); storageIds.add(storageDomainId); clonedDiskImage.setStorageIds(storageIds); clonedDiskImage.setDiskProfileId(diskProfileId); // If volume information was changed at client , use its volume information. // If volume information was not changed at client - use the volume information of the ancestral // image if (diskImageFromClient != null) { if (volumeInfoChanged(diskImageFromClient, srcDiskImage)) { changeVolumeInfo(clonedDiskImage, diskImageFromClient); } else { DiskImage ancestorDiskImage = getDiskImageDao().getAncestor(srcDiskImage.getImageId()); changeVolumeInfo(clonedDiskImage, ancestorDiskImage); } } else { DiskImage ancestorDiskImage = getDiskImageDao().getAncestor(srcDiskImage.getImageId()); changeVolumeInfo(clonedDiskImage, ancestorDiskImage); } return clonedDiskImage; }