diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateOtherDiskFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateOtherDiskFlow.java index 8ac67cffcd6..b6094f72d57 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateOtherDiskFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateOtherDiskFlow.java @@ -336,6 +336,8 @@ public void run(final FlowTrigger innerTrigger, Map data) { cmsg.setPrimaryStorageUuid(allocatedPrimaryStorageUuid[0]); } cmsg.setEncrypted(Boolean.TRUE.equals(diskAO.getEncrypted())); + cmsg.setEncryptedVolumeBackupRestore(diskAO.isVolumeBackupTemplate() + && Boolean.TRUE.equals(diskAO.getEncrypted())); bus.makeLocalServiceId(cmsg, VolumeConstant.SERVICE_ID); bus.send(cmsg, new CloudBusCallBack(innerTrigger) { diff --git a/header/src/main/java/org/zstack/header/core/encrypt/CryptoServiceConstant.java b/header/src/main/java/org/zstack/header/core/encrypt/CryptoServiceConstant.java new file mode 100644 index 00000000000..2cc66950a5d --- /dev/null +++ b/header/src/main/java/org/zstack/header/core/encrypt/CryptoServiceConstant.java @@ -0,0 +1,5 @@ +package org.zstack.header.core.encrypt; + +public interface CryptoServiceConstant { + String SERVICE_ID = "crypto"; +} diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/DownloadExternalPrimaryStorageEncryptedImageMsg.java b/header/src/main/java/org/zstack/header/storage/addon/primary/DownloadExternalPrimaryStorageEncryptedImageMsg.java new file mode 100644 index 00000000000..41842e6b314 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/DownloadExternalPrimaryStorageEncryptedImageMsg.java @@ -0,0 +1,69 @@ +package org.zstack.header.storage.addon.primary; + +import org.zstack.header.message.NeedReplyMessage; + +public class DownloadExternalPrimaryStorageEncryptedImageMsg extends NeedReplyMessage { + private String primaryStorageUuid; + private String primaryStorageType; + private String imageUuid; + private String backupStorageUuid; + private String backupStorageInstallPath; + private String primaryStorageInstallPath; + private String remoteTargetUrl; + + public String getPrimaryStorageUuid() { + return primaryStorageUuid; + } + + public void setPrimaryStorageUuid(String primaryStorageUuid) { + this.primaryStorageUuid = primaryStorageUuid; + } + + public String getPrimaryStorageType() { + return primaryStorageType; + } + + public void setPrimaryStorageType(String primaryStorageType) { + this.primaryStorageType = primaryStorageType; + } + + public String getImageUuid() { + return imageUuid; + } + + public void setImageUuid(String imageUuid) { + this.imageUuid = imageUuid; + } + + public String getBackupStorageUuid() { + return backupStorageUuid; + } + + public void setBackupStorageUuid(String backupStorageUuid) { + this.backupStorageUuid = backupStorageUuid; + } + + public String getBackupStorageInstallPath() { + return backupStorageInstallPath; + } + + public void setBackupStorageInstallPath(String backupStorageInstallPath) { + this.backupStorageInstallPath = backupStorageInstallPath; + } + + public String getPrimaryStorageInstallPath() { + return primaryStorageInstallPath; + } + + public void setPrimaryStorageInstallPath(String primaryStorageInstallPath) { + this.primaryStorageInstallPath = primaryStorageInstallPath; + } + + public String getRemoteTargetUrl() { + return remoteTargetUrl; + } + + public void setRemoteTargetUrl(String remoteTargetUrl) { + this.remoteTargetUrl = remoteTargetUrl; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/addon/primary/PrepareExternalPrimaryStorageEncryptedImageDownloadMsg.java b/header/src/main/java/org/zstack/header/storage/addon/primary/PrepareExternalPrimaryStorageEncryptedImageDownloadMsg.java new file mode 100644 index 00000000000..04fa2667bb9 --- /dev/null +++ b/header/src/main/java/org/zstack/header/storage/addon/primary/PrepareExternalPrimaryStorageEncryptedImageDownloadMsg.java @@ -0,0 +1,42 @@ +package org.zstack.header.storage.addon.primary; + +import org.zstack.header.message.NeedReplyMessage; + +public class PrepareExternalPrimaryStorageEncryptedImageDownloadMsg extends NeedReplyMessage { + private String primaryStorageType; + private String imageUuid; + private String backupStorageUuid; + private String backupStorageInstallPath; + + public String getPrimaryStorageType() { + return primaryStorageType; + } + + public void setPrimaryStorageType(String primaryStorageType) { + this.primaryStorageType = primaryStorageType; + } + + public String getImageUuid() { + return imageUuid; + } + + public void setImageUuid(String imageUuid) { + this.imageUuid = imageUuid; + } + + public String getBackupStorageUuid() { + return backupStorageUuid; + } + + public void setBackupStorageUuid(String backupStorageUuid) { + this.backupStorageUuid = backupStorageUuid; + } + + public String getBackupStorageInstallPath() { + return backupStorageInstallPath; + } + + public void setBackupStorageInstallPath(String backupStorageInstallPath) { + this.backupStorageInstallPath = backupStorageInstallPath; + } +} diff --git a/header/src/main/java/org/zstack/header/storage/primary/DownloadDataVolumeToPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/DownloadDataVolumeToPrimaryStorageMsg.java index 2dd1e359eed..cdbad842407 100755 --- a/header/src/main/java/org/zstack/header/storage/primary/DownloadDataVolumeToPrimaryStorageMsg.java +++ b/header/src/main/java/org/zstack/header/storage/primary/DownloadDataVolumeToPrimaryStorageMsg.java @@ -12,6 +12,7 @@ public class DownloadDataVolumeToPrimaryStorageMsg extends NeedReplyMessage impl private String volumeUuid; private String hostUuid; private String allocatedInstallUrl; + private boolean encryptedVolumeBackupRestore; public String getAllocatedInstallUrl() { return allocatedInstallUrl; @@ -61,6 +62,14 @@ public void setImage(ImageInventory image) { this.image = image; } + public boolean isEncryptedVolumeBackupRestore() { + return encryptedVolumeBackupRestore; + } + + public void setEncryptedVolumeBackupRestore(boolean encryptedVolumeBackupRestore) { + this.encryptedVolumeBackupRestore = encryptedVolumeBackupRestore; + } + @Override public String getResourceUuid() { return volumeUuid; diff --git a/header/src/main/java/org/zstack/header/storage/primary/InstantiateRootVolumeFromTemplateOnPrimaryStorageMsg.java b/header/src/main/java/org/zstack/header/storage/primary/InstantiateRootVolumeFromTemplateOnPrimaryStorageMsg.java index 2da3ad7a70d..ec93da96c25 100755 --- a/header/src/main/java/org/zstack/header/storage/primary/InstantiateRootVolumeFromTemplateOnPrimaryStorageMsg.java +++ b/header/src/main/java/org/zstack/header/storage/primary/InstantiateRootVolumeFromTemplateOnPrimaryStorageMsg.java @@ -4,6 +4,7 @@ public class InstantiateRootVolumeFromTemplateOnPrimaryStorageMsg extends InstantiateVolumeOnPrimaryStorageMsg implements PrimaryStorageMessage { private ImageSpec templateSpec; + private boolean encryptedVolumeBackupRestore; public ImageSpec getTemplateSpec() { return templateSpec; @@ -12,4 +13,12 @@ public ImageSpec getTemplateSpec() { public void setTemplateSpec(ImageSpec templateSpec) { this.templateSpec = templateSpec; } + + public boolean isEncryptedVolumeBackupRestore() { + return encryptedVolumeBackupRestore; + } + + public void setEncryptedVolumeBackupRestore(boolean encryptedVolumeBackupRestore) { + this.encryptedVolumeBackupRestore = encryptedVolumeBackupRestore; + } } diff --git a/header/src/main/java/org/zstack/header/volume/CreateDataVolumeFromVolumeTemplateMsg.java b/header/src/main/java/org/zstack/header/volume/CreateDataVolumeFromVolumeTemplateMsg.java index 26c316445dd..03a8008b702 100644 --- a/header/src/main/java/org/zstack/header/volume/CreateDataVolumeFromVolumeTemplateMsg.java +++ b/header/src/main/java/org/zstack/header/volume/CreateDataVolumeFromVolumeTemplateMsg.java @@ -19,6 +19,7 @@ public class CreateDataVolumeFromVolumeTemplateMsg extends NeedReplyMessage impl private String resourceUuid; private String accountUuid; private Boolean encrypted; + private boolean encryptedVolumeBackupRestore; private APICreateDataVolumeFromVolumeTemplateMsg apiMsg; public CreateDataVolumeFromVolumeTemplateMsg() { @@ -107,4 +108,12 @@ public Boolean getEncrypted() { public void setEncrypted(Boolean encrypted) { this.encrypted = encrypted; } + + public boolean isEncryptedVolumeBackupRestore() { + return encryptedVolumeBackupRestore; + } + + public void setEncryptedVolumeBackupRestore(boolean encryptedVolumeBackupRestore) { + this.encryptedVolumeBackupRestore = encryptedVolumeBackupRestore; + } } diff --git a/header/src/main/java/org/zstack/header/volume/InstantiateRootVolumeMsg.java b/header/src/main/java/org/zstack/header/volume/InstantiateRootVolumeMsg.java index 03f10ceed7d..8c39d56d5bc 100755 --- a/header/src/main/java/org/zstack/header/volume/InstantiateRootVolumeMsg.java +++ b/header/src/main/java/org/zstack/header/volume/InstantiateRootVolumeMsg.java @@ -7,6 +7,7 @@ */ public class InstantiateRootVolumeMsg extends InstantiateVolumeMsg implements VolumeMessage { private ImageSpec templateSpec; + private boolean encryptedVolumeBackupRestore; public ImageSpec getTemplateSpec() { return templateSpec; @@ -15,4 +16,12 @@ public ImageSpec getTemplateSpec() { public void setTemplateSpec(ImageSpec templateSpec) { this.templateSpec = templateSpec; } + + public boolean isEncryptedVolumeBackupRestore() { + return encryptedVolumeBackupRestore; + } + + public void setEncryptedVolumeBackupRestore(boolean encryptedVolumeBackupRestore) { + this.encryptedVolumeBackupRestore = encryptedVolumeBackupRestore; + } } diff --git a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java index c5ef28c4d5d..d5ed1f4b90e 100644 --- a/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java +++ b/storage/src/main/java/org/zstack/storage/addon/primary/ExternalPrimaryStorage.java @@ -23,6 +23,7 @@ import org.zstack.header.core.NopeCompletion; import org.zstack.header.core.ReturnValueCompletion; import org.zstack.header.core.WhileDoneCompletion; +import org.zstack.header.core.encrypt.CryptoServiceConstant; import org.zstack.header.core.workflow.*; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.ErrorCodeList; @@ -352,7 +353,7 @@ public void setup() { @Override public void run(final FlowTrigger trigger, Map data) { - downloadImageCache(msg.getTemplateSpec().getInventory(), new ReturnValueCompletion(trigger) { + downloadImageCache(msg.getTemplateSpec().getInventory(), msg.isEncryptedVolumeBackupRestore(), new ReturnValueCompletion(trigger) { @Override public void success(ImageCacheInventory returnValue) { pathInCache = ImageCacheUtil.getImageCachePath(returnValue); @@ -1247,7 +1248,9 @@ protected void handle(DownloadDataVolumeToPrimaryStorageMsg msg) { spec.setAllocatedUrl(msg.getAllocatedInstallUrl()); spec.setName(buildVolumeName(msg.getVolumeUuid())); spec.setUuid(msg.getVolumeUuid()); - downloadImageTo(msg.getImage(), spec, VolumeVO.class.getSimpleName(), new ReturnValueCompletion(msg) { + downloadImageTo(msg.getImage(), spec, VolumeVO.class.getSimpleName(), + msg.isEncryptedVolumeBackupRestore(), + new ReturnValueCompletion(msg) { @Override public void success(VolumeStats returnValue) { reply.setInstallPath(returnValue.getInstallPath()); @@ -1265,6 +1268,11 @@ public void fail(ErrorCode errorCode) { } private void downloadImageCache(ImageInventory image, ReturnValueCompletion completion) { + downloadImageCache(image, false, completion); + } + + private void downloadImageCache(ImageInventory image, boolean encryptedVolumeBackupRestore, + ReturnValueCompletion completion) { thdf.chainSubmit(new ChainTask(completion) { @Override public String getSyncSignature() { @@ -1273,7 +1281,7 @@ public String getSyncSignature() { @Override public void run(SyncTaskChain chain) { - doDownloadImageCache(image, new ReturnValueCompletion(chain) { + doDownloadImageCache(image, encryptedVolumeBackupRestore, new ReturnValueCompletion(chain) { @Override public void success(ImageCacheInventory returnValue) { completion.success(returnValue); @@ -1295,7 +1303,8 @@ public String getName() { }); } - private void doDownloadImageCache(ImageInventory image, ReturnValueCompletion completion) { + private void doDownloadImageCache(ImageInventory image, boolean encryptedVolumeBackupRestore, + ReturnValueCompletion completion) { CreateVolumeSpec spec = new CreateVolumeSpec(); spec.setUuid(image.getUuid()); spec.setName(buildImageName(image.getUuid())); @@ -1310,7 +1319,8 @@ private void doDownloadImageCache(ImageInventory image, ReturnValueCompletion(completion) { + downloadImageTo(image, spec, ImageCacheVO.class.getSimpleName(), encryptedVolumeBackupRestore, + new ReturnValueCompletion(completion) { @Override public void success(VolumeStats volStats) { ImageCacheVO cache = new ImageCacheVO(); @@ -1335,7 +1345,9 @@ public void fail(ErrorCode errorCode) { }); } - private void downloadImageTo(ImageInventory image, CreateVolumeSpec spec, String targetClz, ReturnValueCompletion completion) { + private void downloadImageTo(ImageInventory image, CreateVolumeSpec spec, String targetClz, + boolean encryptedVolumeBackupRestore, + ReturnValueCompletion completion) { FlowChain chain = FlowChainBuilder.newShareFlowChain(); chain.setName(String.format("download-image-%s-to-%s", image.getUuid(), spec.getName())); chain.then(new ShareFlow() { @@ -1349,12 +1361,47 @@ private void downloadImageTo(ImageInventory image, CreateVolumeSpec spec, String : rcf.getResourceConfigValue(ExternalPrimaryStorageGlobalConfig.IMAGE_EXPORT_PROTOCOL, self.getUuid(), String.class); @Override public void setup() { + flow(new NoRollbackFlow() { + String __name__ = "prepare-encrypted-image-download"; + + @Override + public boolean skip(Map data) { + return !encryptedVolumeBackupRestore; + } + + @Override + public void run(FlowTrigger trigger, Map data) { + PrepareExternalPrimaryStorageEncryptedImageDownloadMsg pmsg = + new PrepareExternalPrimaryStorageEncryptedImageDownloadMsg(); + pmsg.setPrimaryStorageType(externalVO.getIdentity()); + pmsg.setImageUuid(image.getUuid()); + pmsg.setBackupStorageUuid(bsUuid); + pmsg.setBackupStorageInstallPath(image.getBackupStorageRefs().get(0).getInstallPath()); + bus.makeLocalServiceId(pmsg, CryptoServiceConstant.SERVICE_ID); + bus.send(pmsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + return; + } + + trigger.next(); + } + }); + } + }); flow(new Flow() { String __name__ = "create-volume"; @Override public void run(FlowTrigger trigger, Map data) { spec.setSize(Long.max(image.getActualSize(), image.getSize())); + if (encryptedVolumeBackupRestore) { + spec.setEncrypted(true); + spec.setEncryptionKeyResourceType(ImageVO.class.getSimpleName()); + spec.setEncryptionKeyResourceUuid(image.getUuid()); + } controller.createVolume(spec, new ReturnValueCompletion(trigger) { @Override public void success(VolumeStats stats) { @@ -1433,9 +1480,47 @@ public void fail(ErrorCode errorCode) { } }); + flow(new NoRollbackFlow() { + String __name__ = "download-image-for-encryption"; + + @Override + public boolean skip(Map data) { + return !encryptedVolumeBackupRestore; + } + + @Override + public void run(FlowTrigger trigger, Map data) { + DownloadExternalPrimaryStorageEncryptedImageMsg dmsg = + new DownloadExternalPrimaryStorageEncryptedImageMsg(); + dmsg.setPrimaryStorageUuid(self.getUuid()); + dmsg.setPrimaryStorageType(externalVO.getIdentity()); + dmsg.setImageUuid(image.getUuid()); + dmsg.setBackupStorageUuid(bsUuid); + dmsg.setBackupStorageInstallPath(image.getBackupStorageRefs().get(0).getInstallPath()); + dmsg.setPrimaryStorageInstallPath(volume.getInstallPath()); + dmsg.setRemoteTargetUrl(remoteTarget.getResourceURI()); + bus.makeLocalServiceId(dmsg, CryptoServiceConstant.SERVICE_ID); + bus.send(dmsg, new CloudBusCallBack(trigger) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + trigger.fail(reply.getError()); + } else { + trigger.next(); + } + } + }); + } + }); + flow(new NoRollbackFlow() { String __name__ = "download-image"; + @Override + public boolean skip(Map data) { + return encryptedVolumeBackupRestore; + } + @Override public void run(FlowTrigger trigger, Map data) { UploadImageToRemoteTargetMsg dmsg = new UploadImageToRemoteTargetMsg(); diff --git a/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java b/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java index ff60475d074..2f2e38d6f42 100755 --- a/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java +++ b/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForNewCreatedVmExtension.java @@ -220,6 +220,9 @@ public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) } else if (image.getInventory() != null && ImageMediaType.RootVolumeTemplate.toString().equals(image.getInventory().getMediaType())) { InstantiateVolumeMsg rmsg = fillMsg(new InstantiateRootVolumeMsg(), spec.getDestRootVolume(), spec); ((InstantiateRootVolumeMsg) rmsg).setTemplateSpec(image); + ((InstantiateRootVolumeMsg) rmsg).setEncryptedVolumeBackupRestore( + spec.getRootDisk().isVolumeBackupTemplate() + && Boolean.TRUE.equals(spec.getRootDisk().getEncrypted())); rmsg.setSystemTags(new ArrayList<>(systemTags)); msgs.add(rmsg); } else { @@ -245,7 +248,7 @@ public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) List perImageTags = spec.getDataVolumeFromTemplateSystemTags() == null ? null : spec.getDataVolumeFromTemplateSystemTags().get(imageUuid); msgs.add(buildCreateDataVolumeFromTemplateMsg(spec, imageUuid, defaultPsUuid, perImageTags, - accountUuid, null)); + accountUuid, null, false)); } } @@ -258,7 +261,8 @@ public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) return; } msgs.add(buildCreateDataVolumeFromTemplateMsg(spec, diskAO.getTemplateUuid(), psUuid, - diskAO.getSystemTags(), accountUuid, diskAO.getEncrypted())); + diskAO.getSystemTags(), accountUuid, diskAO.getEncrypted(), + diskAO.isVolumeBackupTemplate() && Boolean.TRUE.equals(diskAO.getEncrypted()))); } } @@ -267,7 +271,7 @@ public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) private CreateDataVolumeFromVolumeTemplateMsg buildCreateDataVolumeFromTemplateMsg( VmInstanceSpec spec, String imageUuid, String psUuid, List systemTags, String accountUuid, - Boolean encrypted) { + Boolean encrypted, boolean encryptedVolumeBackupRestore) { CreateDataVolumeFromVolumeTemplateMsg cmsg = new CreateDataVolumeFromVolumeTemplateMsg(); cmsg.setHostUuid(spec.getDestHost().getUuid()); cmsg.setImageUuid(imageUuid); @@ -280,6 +284,7 @@ private CreateDataVolumeFromVolumeTemplateMsg buildCreateDataVolumeFromTemplateM cmsg.setAccountUuid(accountUuid); cmsg.setSystemTags(systemTags); cmsg.setEncrypted(encrypted); + cmsg.setEncryptedVolumeBackupRestore(encryptedVolumeBackupRestore); bus.makeLocalServiceId(cmsg, VolumeConstant.SERVICE_ID); return cmsg; } diff --git a/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForVmChangeImageExtension.java b/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForVmChangeImageExtension.java index 29a1c198117..ca4816d40e7 100644 --- a/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForVmChangeImageExtension.java +++ b/storage/src/main/java/org/zstack/storage/volume/InstantiateVolumeForVmChangeImageExtension.java @@ -37,6 +37,10 @@ public void preInstantiateVmResource(VmInstanceSpec spec, Completion completion) InstantiateVolumeMsg rmsg = new InstantiateTemporaryRootVolumeMsg(); ((InstantiateRootVolumeMsg)rmsg).setTemplateSpec(image); ((InstantiateTemporaryRootVolumeMsg)rmsg).setOriginVolumeUuid(spec.getVmInventory().getRootVolumeUuid()); + ((InstantiateRootVolumeMsg)rmsg).setEncryptedVolumeBackupRestore( + spec.getRootDisk() != null + && spec.getRootDisk().isVolumeBackupTemplate() + && Boolean.TRUE.equals(spec.getRootDisk().getEncrypted())); rmsg.setPrimaryStorageUuid(spec.getDestRootVolume().getPrimaryStorageUuid()); rmsg.setHostUuid(spec.getDestHost().getUuid()); diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java index ee6f015f4e4..22f147f6113 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeBase.java @@ -596,6 +596,8 @@ private void instantiateTemporaryRootVolume(InstantiateTemporaryRootVolumeMsg ms imsg = new InstantiateTemporaryRootVolumeFromTemplateOnPrimaryStorageMsg(); ((InstantiateTemporaryRootVolumeFromTemplateOnPrimaryStorageMsg)imsg).setOriginVolumeUuid(msg.getOriginVolumeUuid()); ((InstantiateTemporaryRootVolumeFromTemplateOnPrimaryStorageMsg)imsg).setTemplateSpec(msg.getTemplateSpec()); + ((InstantiateTemporaryRootVolumeFromTemplateOnPrimaryStorageMsg)imsg) + .setEncryptedVolumeBackupRestore(msg.isEncryptedVolumeBackupRestore()); } else { imsg = new InstantiateTemporaryVolumeOnPrimaryStorageMsg(); ((InstantiateTemporaryVolumeOnPrimaryStorageMsg)imsg).setOriginVolumeUuid(msg.getOriginVolumeUuid()); @@ -609,6 +611,7 @@ private void instantiateRootVolume(InstantiateRootVolumeMsg msg, FlowTrigger tri InstantiateRootVolumeFromTemplateOnPrimaryStorageMsg imsg = new InstantiateRootVolumeFromTemplateOnPrimaryStorageMsg(); prepareMsg(msg, imsg); imsg.setTemplateSpec(msg.getTemplateSpec()); + imsg.setEncryptedVolumeBackupRestore(msg.isEncryptedVolumeBackupRestore()); doInstantiateVolume(imsg, trigger); } diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java b/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java index 246279580db..7a9b681152a 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java @@ -453,6 +453,7 @@ public void run(final FlowTrigger trigger, Map data) { dmsg.setImage(ImageInventory.valueOf(template)); dmsg.setHostUuid(selectedHostUuid); dmsg.setAllocatedInstallUrl(allocatedInstallUrl); + dmsg.setEncryptedVolumeBackupRestore(msg.isEncryptedVolumeBackupRestore()); bus.makeTargetServiceIdByResourceUuid(dmsg, PrimaryStorageConstant.SERVICE_ID, targetPrimaryStorage.getUuid()); bus.send(dmsg, new CloudBusCallBack(trigger) { @Override