From b641c8557f74509330ca43e0daea71e841e5cc24 Mon Sep 17 00:00:00 2001 From: "tao.gan" Date: Mon, 15 Dec 2025 18:00:55 +0800 Subject: [PATCH] [volume]: + ZMigrate + + + 1000 + ZCE-X generic error + + + + 1001 + Failed to connect ZCE-X server + + + + 1002 + Authorization fails in ZCE-X server + + + + 1003 + ZCE-X API operation fail + + diff --git a/header/src/main/java/org/zstack/header/storage/backup/CopyFileFromBackupStorageHostMsg.java b/header/src/main/java/org/zstack/header/storage/backup/CopyFileFromBackupStorageHostMsg.java new file mode 100644 index 00000000000..8892b665742 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/backup/CopyFileFromBackupStorageHostMsg.java @@ -0,0 +1,79 @@ +package org.zstack.header.storage.backup; + +import org.zstack.header.message.NeedReplyMessage; + +public class CopyFileFromBackupStorageHostMsg extends NeedReplyMessage implements BackupStorageMessage { + private String backupStorageUuid; + private String backupStorageHostUuid; + private String dstHostname; + private String dstSshPassword; + private String dstSshUsername; + private int dstSshPort; + private String dstFilePath; + private String targetFilePath; + + @Override + public String getBackupStorageUuid() { + return backupStorageUuid; + } + + public void setBackupStorageUuid(String backupStorageUuid) { + this.backupStorageUuid = backupStorageUuid; + } + + public String getBackupStorageHostUuid() { + return backupStorageHostUuid; + } + + public void setBackupStorageHostUuid(String backupStorageHostUuid) { + this.backupStorageHostUuid = backupStorageHostUuid; + } + + public String getDstHostname() { + return dstHostname; + } + + public void setDstHostname(String dstHostname) { + this.dstHostname = dstHostname; + } + + public String getDstSshPassword() { + return dstSshPassword; + } + + public void setDstSshPassword(String dstSshPassword) { + this.dstSshPassword = dstSshPassword; + } + + public String getDstSshUsername() { + return dstSshUsername; + } + + public void setDstSshUsername(String dstSshUsername) { + this.dstSshUsername = dstSshUsername; + } + + public int getDstSshPort() { + return dstSshPort; + } + + public void setDstSshPort(int dstSshPort) { + this.dstSshPort = dstSshPort; + } + + public String getDstFilePath() { + return dstFilePath; + } + + public void setDstFilePath(String dstFilePath) { + this.dstFilePath = dstFilePath; + } + + public String getTargetFilePath() { + return targetFilePath; + } + + public void setTargetFilePath(String targetFilePath) { + this.targetFilePath = targetFilePath; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/backup/CopyFileFromBackupStorageHostReply.java b/header/src/main/java/org/zstack/header/storage/backup/CopyFileFromBackupStorageHostReply.java new file mode 100644 index 00000000000..a3981a7e949 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/backup/CopyFileFromBackupStorageHostReply.java @@ -0,0 +1,15 @@ +package org.zstack.header.storage.backup; + +import org.zstack.header.message.MessageReply; + +public class CopyFileFromBackupStorageHostReply extends MessageReply { + private String upgradeScriptPath; + + public String getUpgradeScriptPath() { + return upgradeScriptPath; + } + + public void setUpgradeScriptPath(String upgradeScriptPath) { + this.upgradeScriptPath = upgradeScriptPath; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/backup/DeleteFilesOnBackupStorageHostMsg.java b/header/src/main/java/org/zstack/header/storage/backup/DeleteFilesOnBackupStorageHostMsg.java new file mode 100644 index 00000000000..c072015519f --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/backup/DeleteFilesOnBackupStorageHostMsg.java @@ -0,0 +1,36 @@ +package org.zstack.header.storage.backup; + +import org.zstack.header.message.NeedReplyMessage; + +import java.util.List; + +public class DeleteFilesOnBackupStorageHostMsg extends NeedReplyMessage implements BackupStorageMessage { + private String backupStorageUuid; + private String backupStorageHostUuid; + private List filesPath; + + @Override + public String getBackupStorageUuid() { + return backupStorageUuid; + } + + public void setBackupStorageUuid(String backupStorageUuid) { + this.backupStorageUuid = backupStorageUuid; + } + + public String getBackupStorageHostUuid() { + return backupStorageHostUuid; + } + + public void setBackupStorageHostUuid(String backupStorageHostUuid) { + this.backupStorageHostUuid = backupStorageHostUuid; + } + + public List getFilesPath() { + return filesPath; + } + + public void setFilesPath(List filesPath) { + this.filesPath = filesPath; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/backup/DeleteFilesOnBackupStorageHostReply.java b/header/src/main/java/org/zstack/header/storage/backup/DeleteFilesOnBackupStorageHostReply.java new file mode 100644 index 00000000000..4890a2749f2 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/backup/DeleteFilesOnBackupStorageHostReply.java @@ -0,0 +1,55 @@ +package org.zstack.header.storage.backup; + +import org.zstack.header.log.NoLogging; +import org.zstack.header.message.MessageReply; + +import java.util.Map; + +public class DeleteFilesOnBackupStorageHostReply extends MessageReply { + private String md5sum; + private long size; + @NoLogging(type = NoLogging.Type.Uri) + private String directUploadUrl; + private String unzipInstallPath; + private Map filesSize; + + public String getMd5sum() { + return md5sum; + } + + public void setMd5sum(String md5sum) { + this.md5sum = md5sum; + } + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } + + public String getDirectUploadUrl() { + return directUploadUrl; + } + + public void setDirectUploadUrl(String directUploadUrl) { + this.directUploadUrl = directUploadUrl; + } + + public String getUnzipInstallPath() { + return unzipInstallPath; + } + + public void setUnzipInstallPath(String unzipInstallPath) { + this.unzipInstallPath = unzipInstallPath; + } + + public Map getFilesSize() { + return filesSize; + } + + public void setFilesSize(Map filesSize) { + this.filesSize = filesSize; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/backup/GetFileDownloadProgressMsg.java b/header/src/main/java/org/zstack/header/storage/backup/GetFileDownloadProgressMsg.java new file mode 100644 index 00000000000..c82463565f8 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/backup/GetFileDownloadProgressMsg.java @@ -0,0 +1,43 @@ +package org.zstack.header.storage.backup; + +import org.zstack.header.message.NeedReplyMessage; + +public class GetFileDownloadProgressMsg extends NeedReplyMessage implements BackupStorageMessage { + private String backupStorageUuid; + private String backupStorageHostUuid; + private String taskUuid; + private String hostname; + + @Override + public String getBackupStorageUuid() { + return backupStorageUuid; + } + + public void setBackupStorageUuid(String backupStorageUuid) { + this.backupStorageUuid = backupStorageUuid; + } + + public String getBackupStorageHostUuid() { + return backupStorageHostUuid; + } + + public void setBackupStorageHostUuid(String backupStorageHostUuid) { + this.backupStorageHostUuid = backupStorageHostUuid; + } + + public String getTaskUuid() { + return taskUuid; + } + + public void setTaskUuid(String taskUuid) { + this.taskUuid = taskUuid; + } + + public String getHostname() { + return hostname; + } + + public void setHostname(String hostname) { + this.hostname = hostname; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/backup/GetFileDownloadProgressReply.java b/header/src/main/java/org/zstack/header/storage/backup/GetFileDownloadProgressReply.java new file mode 100644 index 00000000000..b982811afc1 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/backup/GetFileDownloadProgressReply.java @@ -0,0 +1,122 @@ +package org.zstack.header.storage.backup; + +import org.zstack.header.message.MessageReply; + +import java.util.Map; + +public class GetFileDownloadProgressReply extends MessageReply { + private boolean completed; + private int progress; + + private long size; + private long actualSize; + private long downloadSize; + private String installPath; + private long lastOpTime; + private boolean supportSuspend; + private String md5sum; + private String format; + + private String unzipInstallPath; + private Map unzipFiles; + + public boolean isCompleted() { + return completed; + } + + public void setCompleted(boolean completed) { + this.completed = completed; + } + + public int getProgress() { + return progress; + } + + public void setProgress(int progress) { + this.progress = progress; + } + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } + + public long getActualSize() { + return actualSize; + } + + public void setActualSize(long actualSize) { + this.actualSize = actualSize; + } + + public boolean isDownloadComplete() { + return actualSize > 0 && actualSize == downloadSize; + } + + public String getInstallPath() { + return installPath; + } + + public void setInstallPath(String installPath) { + this.installPath = installPath; + } + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + + public long getLastOpTime() { + return lastOpTime; + } + + public void setLastOpTime(long lastOpTime) { + this.lastOpTime = lastOpTime; + } + + public long getDownloadSize() { + return downloadSize; + } + + public void setDownloadSize(long downloadSize) { + this.downloadSize = downloadSize; + } + + public boolean isSupportSuspend() { + return supportSuspend; + } + + public void setSupportSuspend(boolean supportSuspend) { + this.supportSuspend = supportSuspend; + } + + public String getMd5sum() { + return md5sum; + } + + public void setMd5sum(String md5sum) { + this.md5sum = md5sum; + } + + public String getUnzipInstallPath() { + return unzipInstallPath; + } + + public void setUnzipInstallPath(String unzipInstallPath) { + this.unzipInstallPath = unzipInstallPath; + } + + public Map getUnzipFiles() { + return unzipFiles; + } + + public void setUnzipFiles(Map unzipFiles) { + this.unzipFiles = unzipFiles; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/backup/UploadFileToBackupStorageHostMsg.java b/header/src/main/java/org/zstack/header/storage/backup/UploadFileToBackupStorageHostMsg.java new file mode 100644 index 00000000000..4f2d2b173c4 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/backup/UploadFileToBackupStorageHostMsg.java @@ -0,0 +1,45 @@ +package org.zstack.header.storage.backup; + +import org.zstack.header.log.NoLogging; +import org.zstack.header.message.NeedReplyMessage; + +public class UploadFileToBackupStorageHostMsg extends NeedReplyMessage implements BackupStorageMessage { + private String backupStorageUuid; + private String taskUuid; + @NoLogging(type = NoLogging.Type.Uri) + private String url; + private String installPath; + + @Override + public String getBackupStorageUuid() { + return backupStorageUuid; + } + + public void setBackupStorageUuid(String backupStorageUuid) { + this.backupStorageUuid = backupStorageUuid; + } + + public String getTaskUuid() { + return taskUuid; + } + + public void setTaskUuid(String taskUuid) { + this.taskUuid = taskUuid; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getInstallPath() { + return installPath; + } + + public void setInstallPath(String installPath) { + this.installPath = installPath; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/backup/UploadFileToBackupStorageHostReply.java b/header/src/main/java/org/zstack/header/storage/backup/UploadFileToBackupStorageHostReply.java new file mode 100644 index 00000000000..7f56d9679b8 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/backup/UploadFileToBackupStorageHostReply.java @@ -0,0 +1,64 @@ +package org.zstack.header.storage.backup; + +import org.zstack.header.log.NoLogging; +import org.zstack.header.message.MessageReply; + +import java.util.Map; + +public class UploadFileToBackupStorageHostReply extends MessageReply { + private String md5sum; + private long size; + @NoLogging(type = NoLogging.Type.Uri) + private String directUploadUrl; + private String unzipInstallPath; + private Map filesSize; + private String backupStorageHostUuid; + + public String getMd5sum() { + return md5sum; + } + + public void setMd5sum(String md5sum) { + this.md5sum = md5sum; + } + + public long getSize() { + return size; + } + + public void setSize(long size) { + this.size = size; + } + + public String getDirectUploadUrl() { + return directUploadUrl; + } + + public void setDirectUploadUrl(String directUploadUrl) { + this.directUploadUrl = directUploadUrl; + } + + public String getUnzipInstallPath() { + return unzipInstallPath; + } + + public void setUnzipInstallPath(String unzipInstallPath) { + this.unzipInstallPath = unzipInstallPath; + } + + public Map getFilesSize() { + return filesSize; + } + + public void setFilesSize(Map filesSize) { + this.filesSize = filesSize; + } + + public String getBackupStorageHostUuid() { + return backupStorageHostUuid; + } + + public void setBackupStorageHostUuid(String backupStorageHostUuid) { + this.backupStorageHostUuid = backupStorageHostUuid; + } +} diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageBase.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageBase.java index e24fdc21e11..9c993dcb9ea 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageBase.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/backup/CephBackupStorageBase.java @@ -19,6 +19,7 @@ import org.zstack.core.thread.ChainTask; import org.zstack.core.thread.SyncTaskChain; import org.zstack.core.thread.SyncThread; +import org.zstack.core.timeout.ApiTimeoutManager; import org.zstack.core.workflow.FlowChainBuilder; import org.zstack.core.workflow.ShareFlow; import org.zstack.header.Constants; @@ -30,6 +31,7 @@ import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.errorcode.SysErrors; import org.zstack.header.exception.CloudRuntimeException; +import org.zstack.header.host.GetFileDownloadProgressReply; import org.zstack.header.image.*; import org.zstack.header.log.NoLogging; import org.zstack.header.message.APIMessage; @@ -40,6 +42,7 @@ import org.zstack.storage.backup.BackupStorageBase; import org.zstack.storage.ceph.*; import org.zstack.storage.ceph.CephMonBase.PingResult; +import org.zstack.storage.ceph.primary.CephPrimaryStorageMonBase; import org.zstack.storage.ceph.primary.CephPrimaryStorageVO; import org.zstack.storage.ceph.primary.CephPrimaryStorageVO_; import org.zstack.utils.CollectionUtils; @@ -51,6 +54,7 @@ import javax.persistence.Tuple; import javax.persistence.TypedQuery; import java.io.Serializable; +import java.net.URI; import java.net.URISyntaxException; import java.util.*; import java.util.concurrent.TimeUnit; @@ -91,6 +95,8 @@ void unlock() { protected RESTFacade restf; @Autowired protected CephBackupStorageMetaDataMaker metaDataMaker; + @Autowired + private ApiTimeoutManager timeoutManager; public enum PingOperationFailure { UnableToCreateFile, @@ -659,6 +665,68 @@ public void setCancellationApiId(String cancellationApiId) { } } + public static class DownloadFileCmd extends AgentCommand implements HasThreadContext, Serializable { + public String taskUuid; + public String installPath; + @NoLogging(type = NoLogging.Type.Uri) + public String url; + @NoLogging(type = NoLogging.Type.Uri) + public String urlScheme; + public long timeout; + @NoLogging(type = NoLogging.Type.Uri) + public String sendCommandUrl; + } + + public static class DownloadFileResponse extends AgentResponse { + public String md5sum; + public long size; + public String unzipInstallPath; + public Map filesSize; + } + + public static class DeleteFilesCmd extends AgentCommand implements HasThreadContext, Serializable { + List filesPath; + } + + public static class DeleteFilesResponse extends AgentResponse { + } + + public static class UploadFileCmd extends AgentCommand implements HasThreadContext, Serializable { + public String taskUuid; + public String installPath; + @NoLogging(type = NoLogging.Type.Uri) + public String url; + public long timeout; + } + + public static class UploadFileResponse extends AgentResponse { + public String directUploadPath; + } + + public static class GetDownloadFileProgressCmd extends AgentCommand { + public String taskUuid; + } + + public static class GetDownloadFileProgressResponse extends AgentResponse { + public boolean completed; + public int progress; + public long size; + public long actualSize; + public String installPath; + public String format; + public long lastOpTime; + public long downloadSize; + public String md5sum; + public boolean supportSuspend; + } + + public static class CopyFileProgressCmd extends AgentCommand { + public String taskUuid; + } + + public static class CopyFileProgressResponse extends AgentResponse { + } + // common response of storage migration public static class StorageMigrationRsp extends AgentResponse { } @@ -680,6 +748,12 @@ public static class StorageMigrationRsp extends AgentResponse { public static final String GET_LOCAL_FILE_SIZE = "/ceph/backupstorage/getlocalfilesize"; public static final String CEPH_TO_CEPH_MIGRATE_IMAGE_PATH = "/ceph/backupstorage/image/migrate"; + public static final String FILE_DOWNLOAD_PATH = "/ceph/file/download"; + public static final String FILE_UPLOAD_PATH = "/ceph/file/upload"; + public static final String FILE_UPLOAD_PROGRESS_PATH = "/ceph/file/progress"; + public static final String DELETE_FILES_PATH = "/ceph/files/delete"; + public static final String COPY_FILES_TO_HOST_PATH = "/ceph/files/copytohost"; + protected String makeImageInstallPath(String imageUuid) { return String.format("ceph://%s/%s", getSelf().getPoolName(), imageUuid); } @@ -1663,6 +1737,14 @@ protected void handleLocalMessage(Message msg) throws URISyntaxException { handle((CephToCephMigrateImageMsg) msg); } else if (msg instanceof ExportImageFromBackupStorageMsg) { handle((ExportImageFromBackupStorageMsg) msg); + } else if (msg instanceof UploadFileToBackupStorageHostMsg) { + handle((UploadFileToBackupStorageHostMsg) msg); + } else if (msg instanceof DeleteFilesOnBackupStorageHostMsg) { + handle((DeleteFilesOnBackupStorageHostMsg) msg); + } else if (msg instanceof GetFileDownloadProgressMsg) { + handle((GetFileDownloadProgressMsg) msg); + } else if (msg instanceof CopyFileFromBackupStorageHostMsg) { + handle((CopyFileFromBackupStorageHostMsg) msg); } else { super.handleLocalMessage(msg); @@ -2021,4 +2103,171 @@ protected void handle(CalculateImageHashOnBackupStorageMsg msg) { private void doRestoreImagesBackupStorageMetadataToDatabase(RestoreImagesBackupStorageMetadataToDatabaseMsg msg) { metaDataMaker.restoreImagesBackupStorageMetadataToDatabase(msg.getImagesMetadata(), msg.getBackupStorageUuid()); } + + protected void handle(final UploadFileToBackupStorageHostMsg msg) { + UploadFileToBackupStorageHostReply reply = new UploadFileToBackupStorageHostReply(); + + if (msg.getUrl().startsWith("upload://")) { + UploadFileCmd cmd = new UploadFileCmd(); + cmd.url = msg.getUrl(); + cmd.installPath = msg.getInstallPath(); + cmd.timeout = timeoutManager.getTimeout(); + cmd.taskUuid = msg.getTaskUuid(); + httpCall(FILE_UPLOAD_PATH, cmd, UploadFileResponse.class, new ReturnValueCompletion(msg) { + @Override + public void fail(ErrorCode err) { + reply.setError(err); + bus.reply(msg, reply); + } + + @Override + public void success(UploadFileResponse rsp) { + reply.setDirectUploadUrl(rsp.directUploadPath); + reply.setBackupStorageHostUuid(rsp.handleMon.getMonUuid()); + bus.reply(msg, reply); + } + }); + return; + } + + DownloadFileCmd cmd = new DownloadFileCmd(); + cmd.url = msg.getUrl(); + cmd.installPath = msg.getInstallPath(); + cmd.timeout = timeoutManager.getTimeout(); + cmd.taskUuid = msg.getTaskUuid(); + cmd.sendCommandUrl = restf.getSendCommandUrl(); + + String scheme; + try { + URI uri = new URI(msg.getUrl()); + scheme = uri.getScheme(); + } catch (URISyntaxException e) { + reply.setError(operr("failed to parse upload URL [%s]: %s", msg.getUrl(), e.getMessage())); + bus.reply(msg, reply); + return; + } + if (scheme == null) { + reply.setError(operr("upload URL [%s] is missing a protocol prefix", msg.getUrl())); + bus.reply(msg, reply); + return; + } + cmd.urlScheme = scheme; + + httpCall(FILE_DOWNLOAD_PATH, cmd, DownloadFileResponse.class, new ReturnValueCompletion(msg) { + @Override + public void fail(ErrorCode err) { + reply.setError(err); + bus.reply(msg, reply); + } + + @Override + public void success(DownloadFileResponse rsp) { + reply.setMd5sum(rsp.md5sum); + reply.setSize(rsp.size); + reply.setUnzipInstallPath(rsp.unzipInstallPath); + reply.setFilesSize(rsp.filesSize); + reply.setBackupStorageHostUuid(rsp.handleMon.getMonUuid()); + bus.reply(msg, reply); + } + }); + } + + protected void handle(final DeleteFilesOnBackupStorageHostMsg msg) { + DeleteFilesOnBackupStorageHostReply reply = new DeleteFilesOnBackupStorageHostReply(); + if (CoreGlobalProperty.UNIT_TEST_ON) { + bus.reply(msg, reply); + return; + } + + CephBackupStorageMonVO mon = getSelf().getMons().stream() + .filter(m -> m.getUuid().equals(msg.getBackupStorageHostUuid())).findAny().orElse(null); + if (mon == null) { + reply.setError(operr("failed to find mon with uuid [%s]", msg.getBackupStorageHostUuid())); + bus.reply(msg, reply); + return; + } + + DeleteFilesCmd cmd = new DeleteFilesCmd(); + cmd.filesPath = msg.getFilesPath(); + + CephPrimaryStorageMonBase monBase = transform(Collections.singletonList(mon), CephPrimaryStorageMonBase::new).get(0); + monBase.httpCall(DELETE_FILES_PATH, cmd, DownloadFileResponse.class, new ReturnValueCompletion(msg) { + @Override + public void fail(ErrorCode err) { + reply.setError(err); + bus.reply(msg, reply); + } + + @Override + public void success(DownloadFileResponse rsp) { + bus.reply(msg, reply); + } + }); + } + + protected void handle(GetFileDownloadProgressMsg msg) { + GetFileDownloadProgressReply reply = new GetFileDownloadProgressReply(); + + CephBackupStorageMonVO mon = getSelf().getMons().stream() + .filter(m -> m.getUuid().equals(msg.getBackupStorageHostUuid())).findAny().orElse(null); + if (mon == null) { + reply.setError(operr("failed to find mon with uuid [%s]", msg.getBackupStorageHostUuid())); + bus.reply(msg, reply); + return; + } + + GetDownloadFileProgressCmd cmd = new GetDownloadFileProgressCmd(); + cmd.taskUuid = msg.getTaskUuid(); + + CephPrimaryStorageMonBase monBase = transform(Collections.singletonList(mon), CephPrimaryStorageMonBase::new).get(0); + monBase.httpCall(FILE_UPLOAD_PROGRESS_PATH, cmd, GetDownloadFileProgressResponse.class, new ReturnValueCompletion(msg) { + @Override + public void fail(ErrorCode err) { + reply.setError(err); + bus.reply(msg, reply); + } + + @Override + public void success(GetDownloadFileProgressResponse rsp) { + reply.setCompleted(rsp.completed); + reply.setProgress(rsp.progress); + reply.setActualSize(rsp.actualSize); + reply.setSize(rsp.size); + reply.setInstallPath(rsp.installPath); + reply.setDownloadSize(rsp.downloadSize); + reply.setLastOpTime(rsp.lastOpTime); + reply.setMd5sum(rsp.md5sum); + reply.setSupportSuspend(rsp.supportSuspend); + bus.reply(msg, reply); + } + }); + } + + protected void handle(CopyFileFromBackupStorageHostMsg msg) { + CopyFileFromBackupStorageHostReply reply = new CopyFileFromBackupStorageHostReply(); + + CephBackupStorageMonVO mon = getSelf().getMons().stream() + .filter(m -> m.getUuid().equals(msg.getBackupStorageHostUuid())).findAny().orElse(null); + if (mon == null) { + reply.setError(operr("failed to find mon with uuid [%s]", msg.getBackupStorageHostUuid())); + bus.reply(msg, reply); + return; + } + + CopyFileProgressCmd cmd = new CopyFileProgressCmd(); + + CephPrimaryStorageMonBase monBase = transform(Collections.singletonList(mon), CephPrimaryStorageMonBase::new).get(0); + monBase.httpCall(COPY_FILES_TO_HOST_PATH, cmd, CopyFileProgressResponse.class, new ReturnValueCompletion(msg) { + @Override + public void fail(ErrorCode err) { + reply.setError(err); + bus.reply(msg, reply); + } + + @Override + public void success(CopyFileProgressResponse rsp) { + bus.reply(msg, reply); + } + }); + } } diff --git a/sdk/src/main/java/org/zstack/sdk/AdditionalLicenseType.java b/sdk/src/main/java/org/zstack/sdk/AdditionalLicenseType.java index 6121f538d79..2c35a09e98a 100644 --- a/sdk/src/main/java/org/zstack/sdk/AdditionalLicenseType.java +++ b/sdk/src/main/java/org/zstack/sdk/AdditionalLicenseType.java @@ -5,4 +5,5 @@ public enum AdditionalLicenseType { zstone, zcex, zsv, + zmigrate, } diff --git a/sdk/src/main/java/org/zstack/sdk/softwarePackage/header/UploadAndExecuteSoftwareUpgradePackageAction.java b/sdk/src/main/java/org/zstack/sdk/softwarePackage/header/UploadAndExecuteSoftwareUpgradePackageAction.java new file mode 100644 index 00000000000..40417ce8ca9 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/softwarePackage/header/UploadAndExecuteSoftwareUpgradePackageAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk.softwarePackage.header; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UploadAndExecuteSoftwareUpgradePackageAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.softwarePackage.header.UploadAndExecuteSoftwareUpgradePackageResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String backupStorageUuid; + + @Param(required = false, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String url; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.softwarePackage.header.UploadAndExecuteSoftwareUpgradePackageResult value = res.getResult(org.zstack.sdk.softwarePackage.header.UploadAndExecuteSoftwareUpgradePackageResult.class); + ret.value = value == null ? new org.zstack.sdk.softwarePackage.header.UploadAndExecuteSoftwareUpgradePackageResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/software-packages/backup-storage/{uuid}/upgrade"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/softwarePackage/header/UploadAndExecuteSoftwareUpgradePackageResult.java b/sdk/src/main/java/org/zstack/sdk/softwarePackage/header/UploadAndExecuteSoftwareUpgradePackageResult.java new file mode 100644 index 00000000000..a469abc8017 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/softwarePackage/header/UploadAndExecuteSoftwareUpgradePackageResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk.softwarePackage.header; + + + +public class UploadAndExecuteSoftwareUpgradePackageResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/softwarePackage/header/UploadSoftwarePackageToBackupStorageAction.java b/sdk/src/main/java/org/zstack/sdk/softwarePackage/header/UploadSoftwarePackageToBackupStorageAction.java new file mode 100644 index 00000000000..301061c70b6 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/softwarePackage/header/UploadSoftwarePackageToBackupStorageAction.java @@ -0,0 +1,119 @@ +package org.zstack.sdk.softwarePackage.header; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UploadSoftwarePackageToBackupStorageAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.softwarePackage.header.UploadSoftwarePackageToBackupStorageResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String type; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String backupStorageUuid; + + @Param(required = true, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String url; + + @Param(required = true, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String installPath; + + @Param(required = false) + public java.lang.String resourceUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.List tagUuids; + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + @NonAPIParam + public long timeout = -1; + + @NonAPIParam + public long pollingInterval = -1; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.softwarePackage.header.UploadSoftwarePackageToBackupStorageResult value = res.getResult(org.zstack.sdk.softwarePackage.header.UploadSoftwarePackageToBackupStorageResult.class); + ret.value = value == null ? new org.zstack.sdk.softwarePackage.header.UploadSoftwarePackageToBackupStorageResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "POST"; + info.path = "/software-packages/backup-storage/upload"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/softwarePackage/header/UploadSoftwarePackageToBackupStorageResult.java b/sdk/src/main/java/org/zstack/sdk/softwarePackage/header/UploadSoftwarePackageToBackupStorageResult.java new file mode 100644 index 00000000000..89829806437 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/softwarePackage/header/UploadSoftwarePackageToBackupStorageResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.softwarePackage.header; + +import org.zstack.sdk.softwarePackage.header.SoftwarePackageInventory; + +public class UploadSoftwarePackageToBackupStorageResult { + public SoftwarePackageInventory inventory; + public void setInventory(SoftwarePackageInventory inventory) { + this.inventory = inventory; + } + public SoftwarePackageInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateGatewayVmInstancesAction.java b/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateGatewayVmInstancesAction.java new file mode 100644 index 00000000000..4d9fdef8f37 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateGatewayVmInstancesAction.java @@ -0,0 +1,92 @@ +package org.zstack.sdk.zmigrate.api; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetZMigrateGatewayVmInstancesAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.zmigrate.api.GetZMigrateGatewayVmInstancesResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.zmigrate.api.GetZMigrateGatewayVmInstancesResult value = res.getResult(org.zstack.sdk.zmigrate.api.GetZMigrateGatewayVmInstancesResult.class); + ret.value = value == null ? new org.zstack.sdk.zmigrate.api.GetZMigrateGatewayVmInstancesResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/zmigrate/vm-instances"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateGatewayVmInstancesResult.java b/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateGatewayVmInstancesResult.java new file mode 100644 index 00000000000..3030187c8db --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateGatewayVmInstancesResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk.zmigrate.api; + + + +public class GetZMigrateGatewayVmInstancesResult { + public java.lang.String managementVmInstanceUuid; + public void setManagementVmInstanceUuid(java.lang.String managementVmInstanceUuid) { + this.managementVmInstanceUuid = managementVmInstanceUuid; + } + public java.lang.String getManagementVmInstanceUuid() { + return this.managementVmInstanceUuid; + } + + public java.util.List getawayVmInstances; + public void setGetawayVmInstances(java.util.List getawayVmInstances) { + this.getawayVmInstances = getawayVmInstances; + } + public java.util.List getGetawayVmInstances() { + return this.getawayVmInstances; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateImagesAction.java b/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateImagesAction.java new file mode 100644 index 00000000000..89d3060d7f8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateImagesAction.java @@ -0,0 +1,92 @@ +package org.zstack.sdk.zmigrate.api; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetZMigrateImagesAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.zmigrate.api.GetZMigrateImagesResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.zmigrate.api.GetZMigrateImagesResult value = res.getResult(org.zstack.sdk.zmigrate.api.GetZMigrateImagesResult.class); + ret.value = value == null ? new org.zstack.sdk.zmigrate.api.GetZMigrateImagesResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/zmigrate/images"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateImagesResult.java b/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateImagesResult.java new file mode 100644 index 00000000000..0e84b8cf33b --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateImagesResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk.zmigrate.api; + + + +public class GetZMigrateImagesResult { + public java.util.Map images; + public void setImages(java.util.Map images) { + this.images = images; + } + public java.util.Map getImages() { + return this.images; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateInfosAction.java b/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateInfosAction.java new file mode 100644 index 00000000000..52efd803ef3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateInfosAction.java @@ -0,0 +1,92 @@ +package org.zstack.sdk.zmigrate.api; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetZMigrateInfosAction extends AbstractAction { + + private static final HashMap parameterMap = new HashMap<>(); + + private static final HashMap nonAPIParameterMap = new HashMap<>(); + + public static class Result { + public ErrorCode error; + public org.zstack.sdk.zmigrate.api.GetZMigrateInfosResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s]", error.code, error.description, error.details) + ); + } + + return this; + } + } + + @Param(required = false) + public java.util.List systemTags; + + @Param(required = false) + public java.util.List userTags; + + @Param(required = false) + public String sessionId; + + @Param(required = false) + public String accessKeyId; + + @Param(required = false) + public String accessKeySecret; + + @Param(required = false) + public String requestIp; + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.zmigrate.api.GetZMigrateInfosResult value = res.getResult(org.zstack.sdk.zmigrate.api.GetZMigrateInfosResult.class); + ret.value = value == null ? new org.zstack.sdk.zmigrate.api.GetZMigrateInfosResult() : value; + + return ret; + } + + public Result call() { + ApiResult res = ZSClient.call(this); + return makeResult(res); + } + + public void call(final Completion completion) { + ZSClient.call(this, new InternalCompletion() { + @Override + public void complete(ApiResult res) { + completion.complete(makeResult(res)); + } + }); + } + + protected Map getParameterMap() { + return parameterMap; + } + + protected Map getNonAPIParameterMap() { + return nonAPIParameterMap; + } + + protected RestInfo getRestInfo() { + RestInfo info = new RestInfo(); + info.httpMethod = "GET"; + info.path = "/zmigrate/management/infos"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateInfosResult.java b/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateInfosResult.java new file mode 100644 index 00000000000..6c20ec599c3 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/zmigrate/api/GetZMigrateInfosResult.java @@ -0,0 +1,54 @@ +package org.zstack.sdk.zmigrate.api; + + + +public class GetZMigrateInfosResult { + public java.lang.String zMigrateVmInstanceStatus; + public void setZMigrateVmInstanceStatus(java.lang.String zMigrateVmInstanceStatus) { + this.zMigrateVmInstanceStatus = zMigrateVmInstanceStatus; + } + public java.lang.String getZMigrateVmInstanceStatus() { + return this.zMigrateVmInstanceStatus; + } + + public java.lang.String version; + public void setVersion(java.lang.String version) { + this.version = version; + } + public java.lang.String getVersion() { + return this.version; + } + + public long platforms; + public void setPlatforms(long platforms) { + this.platforms = platforms; + } + public long getPlatforms() { + return this.platforms; + } + + public long gateways; + public void setGateways(long gateways) { + this.gateways = gateways; + } + public long getGateways() { + return this.gateways; + } + + public long migrateJobs; + public void setMigrateJobs(long migrateJobs) { + this.migrateJobs = migrateJobs; + } + public long getMigrateJobs() { + return this.migrateJobs; + } + + public long zMigrateStartTime; + public void setZMigrateStartTime(long zMigrateStartTime) { + this.zMigrateStartTime = zMigrateStartTime; + } + public long getZMigrateStartTime() { + return this.zMigrateStartTime; + } + +} diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index 07c05b73b9e..7fc606d9fc2 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -38745,6 +38745,33 @@ abstract class ApiHelper { } + def uploadAndExecuteSoftwareUpgradePackage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.softwarePackage.header.UploadAndExecuteSoftwareUpgradePackageAction.class) Closure c) { + def a = new org.zstack.sdk.softwarePackage.header.UploadAndExecuteSoftwareUpgradePackageAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def uploadSoftwarePackage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.softwarePackage.header.UploadSoftwarePackageAction.class) Closure c) { def a = new org.zstack.sdk.softwarePackage.header.UploadSoftwarePackageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -38771,6 +38798,33 @@ abstract class ApiHelper { } + def uploadSoftwarePackageToBackupStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.softwarePackage.header.UploadSoftwarePackageToBackupStorageAction.class) Closure c) { + def a = new org.zstack.sdk.softwarePackage.header.UploadSoftwarePackageToBackupStorageAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def addZceX(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.zcex.api.AddZceXAction.class) Closure c) { def a = new org.zstack.sdk.zcex.api.AddZceXAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -39018,6 +39072,87 @@ abstract class ApiHelper { } + def getZMigrateGatewayVmInstances(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.zmigrate.api.GetZMigrateGatewayVmInstancesAction.class) Closure c) { + def a = new org.zstack.sdk.zmigrate.api.GetZMigrateGatewayVmInstancesAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def getZMigrateImages(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.zmigrate.api.GetZMigrateImagesAction.class) Closure c) { + def a = new org.zstack.sdk.zmigrate.api.GetZMigrateImagesAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + + def getZMigrateInfos(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.zmigrate.api.GetZMigrateInfosAction.class) Closure c) { + def a = new org.zstack.sdk.zmigrate.api.GetZMigrateInfosAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + + if (System.getProperty("apipath") != null) { + if (a.apiId == null) { + a.apiId = Platform.uuid + } + + def tracker = new ApiPathTracker(a.apiId) + def out = errorOut(a.call()) + def path = tracker.getApiPath() + if (!path.isEmpty()) { + Test.apiPaths[a.class.name] = path.join(" --->\n") + } + + return out + } else { + return errorOut(a.call()) + } + } + + def addZStone(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.zstone.api.AddZStoneAction.class) Closure c) { def a = new org.zstack.sdk.zstone.api.AddZStoneAction() a.sessionId = Test.currentEnvSpec?.session?.uuid diff --git a/testlib/src/main/java/org/zstack/testlib/CephBackupStorageSpec.groovy b/testlib/src/main/java/org/zstack/testlib/CephBackupStorageSpec.groovy index bc2d88a5e0e..558de7c2dad 100755 --- a/testlib/src/main/java/org/zstack/testlib/CephBackupStorageSpec.groovy +++ b/testlib/src/main/java/org/zstack/testlib/CephBackupStorageSpec.groovy @@ -230,6 +230,35 @@ class CephBackupStorageSpec extends BackupStorageSpec { simulator(CephBackupStorageBase.CEPH_TO_CEPH_MIGRATE_IMAGE_PATH) { HttpEntity entity -> return new CephBackupStorageBase.StorageMigrationRsp() } + + simulator(CephBackupStorageBase.FILE_DOWNLOAD_PATH) { HttpEntity entity -> + def rsp = new CephBackupStorageBase.DownloadFileResponse() + rsp.md5sum = "1234567890" + rsp.size = 3L * 1024 * 1024 * 1024 + rsp.unzipInstallPath = "/root/zstone-software-package/unzipInstallPath" + rsp.filesSize = [:] + rsp.filesSize.put("/root/zstone-software-package/unzipInstallPath/Gateway_Linux_Server_(Treker).zmigrate.fast.10.1.106.qcow2", 1024L * 1024 * 1024) + rsp.filesSize.put("/root/zstone-software-package/unzipInstallPath/BootImage_for_Linux_(TrekerLite)_10.1.106.qcow2", 1024L * 1024 * 1024) + rsp.filesSize.put("/root/zstone-software-package/unzipInstallPath/BootImage_for_Windows_(TrekerLite)_10.1.106.qcow2", 1024L * 1024 * 1024) + return rsp + } + + simulator(CephBackupStorageBase.FILE_UPLOAD_PATH) { HttpEntity entity -> + def rsp = new CephBackupStorageBase.AgentResponse() + return rsp + } + simulator(CephBackupStorageBase.FILE_UPLOAD_PROGRESS_PATH) { HttpEntity entity -> + def rsp = new CephBackupStorageBase.AgentResponse() + return rsp + } + simulator(CephBackupStorageBase.DELETE_FILES_PATH) { HttpEntity entity -> + def rsp = new CephBackupStorageBase.AgentResponse() + return rsp + } + simulator(CephBackupStorageBase.COPY_FILES_TO_HOST_PATH) { HttpEntity entity -> + def rsp = new CephBackupStorageBase.AgentResponse() + return rsp + } } }