diff --git a/conf/errorCodes/ZMigratePlugin.xml b/conf/errorCodes/ZMigratePlugin.xml
new file mode 100644
index 00000000000..7af46c8ab07
--- /dev/null
+++ b/conf/errorCodes/ZMigratePlugin.xml
@@ -0,0 +1,23 @@
+
+ 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
+ }
}
}