From 8b9a743bf4aadf3c9370f2acf5631265c6a4cd2b Mon Sep 17 00:00:00 2001 From: "haidong.pang" Date: Sat, 28 Feb 2026 03:04:01 +0000 Subject: [PATCH] [vm_local_volume_cache]: vm local volume cache imp Related: ZSTAC-81715 Change-Id: I6d747a786b73746a6f756a6c72787479726e6765 --- .../org/zstack/compute/host/HostBase.java | 22 ++ .../vm/InstantiateVmFromNewCreatedStruct.java | 55 ++++ .../zstack/compute/vm/VmAllocateHostFlow.java | 54 ++++ .../compute/vm/VmAllocateVolumeFlow.java | 29 +- .../org/zstack/compute/vm/VmInstanceBase.java | 5 + .../compute/vm/VmInstanceManagerImpl.java | 5 + .../zstack/compute/vm/VmInstanceUtils.java | 5 + .../vm/VmInstantiateOtherDiskFlow.java | 36 +++ conf/db/upgrade/V5.5.12__schema.sql | 46 +++ conf/globalConfig/vmLocalVolumeCachePool.xml | 27 ++ conf/persistence.xml | 3 + conf/serviceConfig/host.xml | 4 + conf/serviceConfig/vmLocalVolumeCache.xml | 12 + conf/serviceConfig/vmLocalVolumeCachePool.xml | 37 +++ conf/springConfigXml/localVolumeCache.xml | 42 +++ conf/zstack.xml | 1 + .../header/host/APIGetBlockDevicesEvent.java | 45 +++ .../APIGetBlockDevicesEventDoc_zh_cn.groovy | 32 ++ .../header/host/APIGetBlockDevicesMsg.java | 35 ++ .../APIGetBlockDevicesMsgDoc_zh_cn.groovy | 58 ++++ .../header/host/GetBlockDevicesOnHostMsg.java | 16 + .../host/GetBlockDevicesOnHostReply.java | 17 + .../header/host/HostBlockDeviceStruct.java | 144 +++++++++ .../HostBlockDeviceStructDoc_zh_cn.groovy | 81 +++++ .../org/zstack/header/host/HostInventory.java | 23 +- .../java/org/zstack/header/host/HostVO.java | 18 ++ .../localVolumeCache/CachePoolMetadata.java | 186 +++++++++++ .../VmLocalVolumeCacheConstant.java | 5 + .../VmLocalVolumeCacheInventory.java | 108 +++++++ ...mLocalVolumeCacheInventoryDoc_zh_cn.groovy | 63 ++++ .../VmLocalVolumeCacheMode.java | 5 + .../VmLocalVolumeCacheModeDoc_zh_cn.groovy | 15 + ...LocalVolumeCachePoolCapacityInventory.java | 77 +++++ .../VmLocalVolumeCachePoolCapacityVO.java | 79 +++++ .../VmLocalVolumeCachePoolCapacityVO_.java | 13 + .../VmLocalVolumeCachePoolInventory.java | 193 +++++++++++ ...alVolumeCachePoolInventoryDoc_zh_cn.groovy | 90 ++++++ .../VmLocalVolumeCachePoolState.java | 7 + ...mLocalVolumeCachePoolStateDoc_zh_cn.groovy | 21 ++ .../VmLocalVolumeCachePoolStatus.java | 8 + ...LocalVolumeCachePoolStatusDoc_zh_cn.groovy | 27 ++ .../VmLocalVolumeCachePoolVO.java | 143 +++++++++ .../VmLocalVolumeCachePoolVO_.java | 19 ++ .../VmLocalVolumeCacheState.java | 7 + .../VmLocalVolumeCacheStateDoc_zh_cn.groovy | 27 ++ .../VmLocalVolumeCacheVO.java | 112 +++++++ .../VmLocalVolumeCacheVO_.java | 18 ++ .../header/vm/APICreateVmInstanceMsg.java | 103 ++++++ .../vm/APICreateVmInstanceMsgDoc_zh_cn.groovy | 47 +++ .../zstack/header/vm/CreateVmInstanceMsg.java | 45 +++ .../InstantiateNewCreatedVmInstanceMsg.java | 45 +++ .../org/zstack/header/vm/VmInstanceSpec.java | 72 +++++ .../org/zstack/header/volume/VolumeAO.java | 23 +- .../zstack/header/volume/VolumeInventory.java | 19 ++ .../org/zstack/cbd/kvm/KvmCbdNodeServer.java | 5 + .../primary/CephPrimaryStorageFactory.java | 5 + .../zstack/iscsi/kvm/KvmIscsiNodeServer.java | 5 + .../src/main/java/org/zstack/kvm/CacheTO.java | 51 +++ .../java/org/zstack/kvm/KVMAgentCommands.java | 214 +++++++++++++ .../org/zstack/kvm/KVMApiInterceptor.java | 1 - .../kvm/KVMAttachVolumeExtensionPoint.java | 3 + .../main/java/org/zstack/kvm/KVMConstant.java | 17 + .../org/zstack/kvm/KVMExtensionEmitter.java | 6 + .../src/main/java/org/zstack/kvm/KVMHost.java | 130 ++++++-- .../main/java/org/zstack/kvm/VolumeTO.java | 27 +- .../zstack/vhost/kvm/KvmVhostNodeServer.java | 6 + sdk/src/main/java/SourceClassMap.java | 16 + sdk/src/main/java/org/zstack/sdk/CacheTO.java | 39 +++ ...angeVmLocalVolumeCachePoolStateAction.java | 107 +++++++ ...angeVmLocalVolumeCachePoolStateResult.java | 14 + .../sdk/CreateOvnControllerVmAction.java | 15 + .../zstack/sdk/CreateVmInstanceAction.java | 15 + .../CreateVmLocalVolumeCachePoolAction.java | 119 +++++++ .../CreateVmLocalVolumeCachePoolResult.java | 14 + .../DeleteVmLocalVolumeCachePoolAction.java | 104 ++++++ .../DeleteVmLocalVolumeCachePoolResult.java | 7 + .../zstack/sdk/DisableVolumeCacheAction.java | 101 ++++++ .../zstack/sdk/DisableVolumeCacheResult.java | 14 + .../zstack/sdk/EnableVolumeCacheAction.java | 107 +++++++ .../zstack/sdk/EnableVolumeCacheResult.java | 14 + .../ExtendVmLocalVolumeCachePoolAction.java | 107 +++++++ .../ExtendVmLocalVolumeCachePoolResult.java | 14 + .../org/zstack/sdk/GetBlockDevicesAction.java | 101 ++++++ .../org/zstack/sdk/GetBlockDevicesResult.java | 14 + .../org/zstack/sdk/HostBlockDeviceStruct.java | 111 +++++++ .../java/org/zstack/sdk/HostInventory.java | 8 + .../QueryVmLocalVolumeCachePoolAction.java | 75 +++++ .../QueryVmLocalVolumeCachePoolResult.java | 22 ++ ...ReconnectVmLocalVolumeCachePoolAction.java | 104 ++++++ ...ReconnectVmLocalVolumeCachePoolResult.java | 14 + ...cVmLocalVolumeCachePoolCapacityAction.java | 104 ++++++ ...cVmLocalVolumeCachePoolCapacityResult.java | 14 + .../UpdateVmLocalVolumeCachePoolAction.java | 110 +++++++ .../UpdateVmLocalVolumeCachePoolResult.java | 14 + .../sdk/VmLocalVolumeCacheInventory.java | 72 +++++ .../zstack/sdk/VmLocalVolumeCacheMode.java | 5 + .../sdk/VmLocalVolumeCachePoolInventory.java | 120 +++++++ .../sdk/VmLocalVolumeCachePoolState.java | 6 + .../sdk/VmLocalVolumeCachePoolStatus.java | 7 + .../zstack/sdk/VmLocalVolumeCacheState.java | 7 + .../java/org/zstack/sdk/VolumeInventory.java | 10 +- .../main/java/org/zstack/sdk/VolumeTO.java | 18 +- .../storage/volume/VolumeApiInterceptor.java | 1 - .../storage/volume/VolumeManagerImpl.java | 22 +- .../storage/volume/VolumeSystemTags.java | 8 + .../resources/springConfigXml/license.xml | 20 -- .../java/org/zstack/testlib/ApiHelper.groovy | 299 ++++++++++++++++++ .../CloudOperationsErrorCode.java | 70 ++++ 108 files changed, 5004 insertions(+), 58 deletions(-) create mode 100644 conf/db/upgrade/V5.5.12__schema.sql create mode 100644 conf/globalConfig/vmLocalVolumeCachePool.xml create mode 100644 conf/serviceConfig/vmLocalVolumeCache.xml create mode 100644 conf/serviceConfig/vmLocalVolumeCachePool.xml create mode 100644 conf/springConfigXml/localVolumeCache.xml create mode 100644 header/src/main/java/org/zstack/header/host/APIGetBlockDevicesEvent.java create mode 100644 header/src/main/java/org/zstack/header/host/APIGetBlockDevicesEventDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/host/APIGetBlockDevicesMsg.java create mode 100644 header/src/main/java/org/zstack/header/host/APIGetBlockDevicesMsgDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/host/GetBlockDevicesOnHostMsg.java create mode 100644 header/src/main/java/org/zstack/header/host/GetBlockDevicesOnHostReply.java create mode 100644 header/src/main/java/org/zstack/header/host/HostBlockDeviceStruct.java create mode 100644 header/src/main/java/org/zstack/header/host/HostBlockDeviceStructDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/CachePoolMetadata.java create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheConstant.java create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheInventory.java create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheInventoryDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheMode.java create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheModeDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolCapacityInventory.java create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolCapacityVO.java create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolCapacityVO_.java create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolInventory.java create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolInventoryDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolState.java create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolStateDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolStatus.java create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolStatusDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolVO.java create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolVO_.java create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheState.java create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheStateDoc_zh_cn.groovy create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheVO.java create mode 100644 header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheVO_.java create mode 100644 plugin/kvm/src/main/java/org/zstack/kvm/CacheTO.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CacheTO.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ChangeVmLocalVolumeCachePoolStateAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ChangeVmLocalVolumeCachePoolStateResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateVmLocalVolumeCachePoolAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/CreateVmLocalVolumeCachePoolResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteVmLocalVolumeCachePoolAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DeleteVmLocalVolumeCachePoolResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DisableVolumeCacheAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/DisableVolumeCacheResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/EnableVolumeCacheAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/EnableVolumeCacheResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ExtendVmLocalVolumeCachePoolAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ExtendVmLocalVolumeCachePoolResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GetBlockDevicesAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/GetBlockDevicesResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/HostBlockDeviceStruct.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryVmLocalVolumeCachePoolAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/QueryVmLocalVolumeCachePoolResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ReconnectVmLocalVolumeCachePoolAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/ReconnectVmLocalVolumeCachePoolResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SyncVmLocalVolumeCachePoolCapacityAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/SyncVmLocalVolumeCachePoolCapacityResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateVmLocalVolumeCachePoolAction.java create mode 100644 sdk/src/main/java/org/zstack/sdk/UpdateVmLocalVolumeCachePoolResult.java create mode 100644 sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCacheInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCacheMode.java create mode 100644 sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCachePoolInventory.java create mode 100644 sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCachePoolState.java create mode 100644 sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCachePoolStatus.java create mode 100644 sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCacheState.java delete mode 100755 test/src/test/resources/springConfigXml/license.xml diff --git a/compute/src/main/java/org/zstack/compute/host/HostBase.java b/compute/src/main/java/org/zstack/compute/host/HostBase.java index 38eb654804f..152fd7b6756 100755 --- a/compute/src/main/java/org/zstack/compute/host/HostBase.java +++ b/compute/src/main/java/org/zstack/compute/host/HostBase.java @@ -188,6 +188,8 @@ protected void handleApiMessage(APIMessage msg) { handle((APIPowerResetHostMsg) msg); } else if (msg instanceof APIGetHostPowerStatusMsg) { handle((APIGetHostPowerStatusMsg) msg); + } else if (msg instanceof APIGetBlockDevicesMsg) { + handle((APIGetBlockDevicesMsg) msg); } else { bus.dealWithUnknownMessage(msg); } @@ -214,6 +216,26 @@ public void run(MessageReply reply) { }); } + private void handle(APIGetBlockDevicesMsg msg) { + APIGetBlockDevicesEvent event = new APIGetBlockDevicesEvent(msg.getId()); + GetBlockDevicesOnHostMsg gmsg = new GetBlockDevicesOnHostMsg(); + gmsg.setHostUuid(msg.getHostUuid()); + bus.makeTargetServiceIdByResourceUuid(gmsg, HostConstant.SERVICE_ID, msg.getHostUuid()); + bus.send(gmsg, new CloudBusCallBack(msg) { + @Override + public void run(MessageReply reply) { + if (!reply.isSuccess()) { + event.setSuccess(false); + event.setError(reply.getError()); + } else { + GetBlockDevicesOnHostReply r = reply.castReply(); + event.setBlockDevices(r.getBlockDevices()); + } + bus.publish(event); + } + }); + } + private void handle(APIPowerResetHostMsg msg) { final APIPowerResetHostEvent event = new APIPowerResetHostEvent(msg.getId()); RebootHostMsg rebootHostMsg = new RebootHostMsg(); diff --git a/compute/src/main/java/org/zstack/compute/vm/InstantiateVmFromNewCreatedStruct.java b/compute/src/main/java/org/zstack/compute/vm/InstantiateVmFromNewCreatedStruct.java index 4a0d2ba9627..0d97b12720c 100644 --- a/compute/src/main/java/org/zstack/compute/vm/InstantiateVmFromNewCreatedStruct.java +++ b/compute/src/main/java/org/zstack/compute/vm/InstantiateVmFromNewCreatedStruct.java @@ -29,6 +29,11 @@ public class InstantiateVmFromNewCreatedStruct { private Map> dataVolumeSystemTagsOnIndex; private List disableL3Networks; private List sshKeyPairUuids; + private Boolean enableRootVolumeCache; + private String cacheMode; + private String rootVolumeCachePoolUuid; + private String rootVolumeCacheMode; + private Map dataDiskCacheConfigOnIndex; private final List candidatePrimaryStorageUuidsForRootVolume = new ArrayList<>(); private final List candidatePrimaryStorageUuidsForDataVolume = new ArrayList<>(); @@ -142,6 +147,11 @@ public static InstantiateVmFromNewCreatedStruct fromMessage(InstantiateNewCreate struct.setDataVolumeSystemTagsOnIndex(msg.getDataVolumeSystemTagsOnIndex()); struct.setDisableL3Networks(msg.getDisableL3Networks()); struct.setDiskAOs(msg.getDiskAOs()); + struct.setEnableRootVolumeCache(msg.getEnableRootVolumeCache()); + struct.setCacheMode(msg.getCacheMode()); + struct.setRootVolumeCachePoolUuid(msg.getRootVolumeCachePoolUuid()); + struct.setRootVolumeCacheMode(msg.getRootVolumeCacheMode()); + struct.setDataDiskCacheConfigOnIndex(msg.getDataDiskCacheConfigOnIndex()); return struct; } @@ -161,6 +171,11 @@ public static InstantiateVmFromNewCreatedStruct fromMessage(CreateVmInstanceMsg struct.setDataVolumeSystemTagsOnIndex(msg.getDataVolumeSystemTagsOnIndex()); struct.setDisableL3Networks(msg.getDisableL3Networks()); struct.setDiskAOs(msg.getDiskAOs()); + struct.setEnableRootVolumeCache(msg.getEnableRootVolumeCache()); + struct.setCacheMode(msg.getCacheMode()); + struct.setRootVolumeCachePoolUuid(msg.getRootVolumeCachePoolUuid()); + struct.setRootVolumeCacheMode(msg.getRootVolumeCacheMode()); + struct.setDataDiskCacheConfigOnIndex(msg.getDataDiskCacheConfigOnIndex()); return struct; } @@ -243,4 +258,44 @@ public List getSshKeyPairUuids() { public void setSshKeyPairUuids(List sshKeyPairUuids) { this.sshKeyPairUuids = sshKeyPairUuids; } + + public Boolean getEnableRootVolumeCache() { + return enableRootVolumeCache; + } + + public void setEnableRootVolumeCache(Boolean enableRootVolumeCache) { + this.enableRootVolumeCache = enableRootVolumeCache; + } + + public String getCacheMode() { + return cacheMode; + } + + public void setCacheMode(String cacheMode) { + this.cacheMode = cacheMode; + } + + public String getRootVolumeCachePoolUuid() { + return rootVolumeCachePoolUuid; + } + + public void setRootVolumeCachePoolUuid(String rootVolumeCachePoolUuid) { + this.rootVolumeCachePoolUuid = rootVolumeCachePoolUuid; + } + + public String getRootVolumeCacheMode() { + return rootVolumeCacheMode; + } + + public void setRootVolumeCacheMode(String rootVolumeCacheMode) { + this.rootVolumeCacheMode = rootVolumeCacheMode; + } + + public Map getDataDiskCacheConfigOnIndex() { + return dataDiskCacheConfigOnIndex; + } + + public void setDataDiskCacheConfigOnIndex(Map dataDiskCacheConfigOnIndex) { + this.dataDiskCacheConfigOnIndex = dataDiskCacheConfigOnIndex; + } } diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocateHostFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocateHostFlow.java index ee542fe36ee..04f86381960 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocateHostFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocateHostFlow.java @@ -136,9 +136,63 @@ public String call(L3NetworkInventory arg) { msg.getRequiredPrimaryStorageUuids().addAll(spec.getDiskAOs().stream() .map(APICreateVmInstanceMsg.DiskAO::getPrimaryStorageUuid).filter(Objects::nonNull).collect(Collectors.toList())); } + + // Add cache pool requirements as system tags for host allocation filtering + addCacheSystemTags(spec, msg); + return msg; } + private long getTotalCacheSize(VmInstanceSpec spec) { + long totalCacheSize = 0; + boolean enableRootVolumeCache = Boolean.TRUE.equals(spec.getEnableRootVolumeCache()); + if (enableRootVolumeCache) { + ImageInventory image = spec.getImageSpec() == null ? null : spec.getImageSpec().getInventory(); + boolean nonIsoImage = image != null && !ImageMediaType.ISO.toString().equals(image.getMediaType()); + if (nonIsoImage && image.getSize() > 0) { + totalCacheSize += image.getSize(); + } else if (spec.getRootDiskOffering() != null) { + totalCacheSize += spec.getRootDiskOffering().getDiskSize(); + } + } + Map dataDiskCacheConfigs = spec.getDataDiskCacheConfigOnIndex(); + if (dataDiskCacheConfigs != null && !dataDiskCacheConfigs.isEmpty()) { + for (Integer index : dataDiskCacheConfigs.keySet()) { + APICreateVmInstanceMsg.VolumeCacheConfig dataDiskCacheConfig = dataDiskCacheConfigs.get(index); + totalCacheSize += spec.getDataDiskOfferings().get(index).getDiskSize(); + } + + } + return totalCacheSize; + } + private List getSpecifiedCachePoolUuids(VmInstanceSpec spec) { + List poolUuids = new ArrayList<>(); + if (spec.getRootVolumeCachePoolUuid() != null) { + poolUuids.add(spec.getRootVolumeCachePoolUuid()); + } + Map dataDiskCacheConfigs = spec.getDataDiskCacheConfigOnIndex(); + if (dataDiskCacheConfigs != null && !dataDiskCacheConfigs.isEmpty()) { + for (Integer index : dataDiskCacheConfigs.keySet()) { + APICreateVmInstanceMsg.VolumeCacheConfig dataDiskCacheConfig = dataDiskCacheConfigs.get(index); + if (dataDiskCacheConfig.getCachePoolUuid() != null) { + poolUuids.add(dataDiskCacheConfig.getCachePoolUuid()); + } + } + } + return poolUuids; + } + + private void addCacheSystemTags(VmInstanceSpec spec, AllocateHostMsg msg) { + long totalCacheSize = getTotalCacheSize(spec); + if (totalCacheSize > 0) { + msg.addSystemTag("volumeCache::requiredSize::" + totalCacheSize); + } + List specifiedCachePoolUuids = getSpecifiedCachePoolUuids(spec); + for (String poolUuid : specifiedCachePoolUuids) { + msg.addSystemTag("volumeCache::poolUuid::" + poolUuid); + } + } + @Override public void run(final FlowTrigger chain, Map data) { taskProgress("allocate candidate hosts"); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmAllocateVolumeFlow.java b/compute/src/main/java/org/zstack/compute/vm/VmAllocateVolumeFlow.java index dc8da3fae8a..54a113686e5 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmAllocateVolumeFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmAllocateVolumeFlow.java @@ -23,11 +23,8 @@ import org.zstack.header.image.ImageConstant; import org.zstack.header.image.ImageConstant.ImageMediaType; import org.zstack.header.message.MessageReply; -import org.zstack.header.vm.VmInstanceConstant; -import org.zstack.header.vm.VmInstanceSpec; +import org.zstack.header.vm.*; import org.zstack.header.vm.VmInstanceSpec.VolumeSpec; -import org.zstack.header.vm.VmInstanceVO; -import org.zstack.header.vm.VmInstanceVO_; import org.zstack.header.volume.*; import org.zstack.header.volume.VolumeDeletionPolicyManager.VolumeDeletionPolicy; import org.zstack.identity.AccountManager; @@ -76,6 +73,19 @@ protected List prepareMsg(Map ctx) { } }); } + if (!spec.getDataDiskCacheConfigOnIndex().isEmpty() && !CollectionUtils.isEmpty(spec.getDataDiskOfferings())) { + List dataVolumeSpecs = spec.getVolumeSpecs().stream() + .filter(s -> s.getType().equals(VolumeType.Data.toString())).collect(Collectors.toList()); + + IntStream.range(0, dataVolumeSpecs.size()).forEach(index -> { + APICreateVmInstanceMsg.VolumeCacheConfig config = spec.getDataDiskCacheConfigOnIndex().get(index); + if (config != null) { + dataVolumeSpecs.get(index).setEnableVolumeCache(true); + dataVolumeSpecs.get(index).setCachePoolUuid(config.getCachePoolUuid()); + dataVolumeSpecs.get(index).setCacheMode(config.getCacheMode()); + } + }); + } List volumeSpecs = spec.getVolumeSpecs(); List msgs = new ArrayList<>(volumeSpecs.size()); @@ -93,6 +103,9 @@ protected List prepareMsg(Map ctx) { DebugUtils.Assert(vspec.getType() != null, "VolumeType can not be null!"); if (VolumeType.Root.toString().equals(vspec.getType())) { + vspec.setEnableVolumeCache(spec.getEnableRootVolumeCache()); + vspec.setCachePoolUuid(spec.getRootVolumeCachePoolUuid()); + vspec.setCacheMode(spec.getRootVolumeCacheMode()); msg.setResourceUuid((String) ctx.get("uuid")); msg.setName("ROOT-for-" + spec.getVmInventory().getName()); msg.setDescription(String.format("Root volume for VM[uuid:%s]", spec.getVmInventory().getUuid())); @@ -116,7 +129,13 @@ protected List prepareMsg(Map ctx) { } else { continue; } - + if (vspec.getEnableVolumeCache()) { + tags.add("volumeCache::enable"); + tags.add("volumeCache::cacheMode::" + vspec.getCacheMode()); + if(vspec.getCachePoolUuid() != null) { + tags.add("volumeCache::poolUuid::" + vspec.getCachePoolUuid()); + } + } msg.setSystemTags(new ArrayList<>(tags)); msg.setDiskOfferingUuid(vspec.getDiskOfferingUuid()); msg.setSize(vspec.getSize()); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java index 80ba38486fc..d35254dd756 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceBase.java @@ -7355,6 +7355,11 @@ public DiskOfferingVO call(DiskOfferingVO arg) { } spec.setDiskAOs(struct.getDiskAOs()); + spec.setEnableRootVolumeCache(struct.getEnableRootVolumeCache()); + spec.setCacheMode(struct.getCacheMode()); + spec.setRootVolumeCachePoolUuid(struct.getRootVolumeCachePoolUuid()); + spec.setRootVolumeCacheMode(struct.getRootVolumeCacheMode()); + spec.setDataDiskCacheConfigOnIndex(struct.getDataDiskCacheConfigOnIndex()); List cdRomSpecs = buildVmCdRomSpecsForNewCreated(spec); spec.setCdRomSpecs(cdRomSpecs); diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java index 321c7b3325d..07bd4e5bac6 100755 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceManagerImpl.java @@ -1323,6 +1323,11 @@ public void run(FlowTrigger trigger, Map data) { smsg.setDataVolumeSystemTags(msg.getDataVolumeSystemTags()); smsg.setDataVolumeSystemTagsOnIndex(msg.getDataVolumeSystemTagsOnIndex()); smsg.setDiskAOs(msg.getDiskAOs()); + smsg.setEnableRootVolumeCache(msg.getEnableRootVolumeCache()); + smsg.setCacheMode(msg.getCacheMode()); + smsg.setRootVolumeCachePoolUuid(msg.getRootVolumeCachePoolUuid()); + smsg.setRootVolumeCacheMode(msg.getRootVolumeCacheMode()); + smsg.setDataDiskCacheConfigOnIndex(msg.getDataDiskCacheConfigOnIndex()); bus.makeTargetServiceIdByResourceUuid(smsg, VmInstanceConstant.SERVICE_ID, finalVo.getUuid()); bus.send(smsg, new CloudBusCallBack(smsg) { @Override diff --git a/compute/src/main/java/org/zstack/compute/vm/VmInstanceUtils.java b/compute/src/main/java/org/zstack/compute/vm/VmInstanceUtils.java index f0bdeded2af..9f4f97d06a9 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstanceUtils.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstanceUtils.java @@ -65,6 +65,11 @@ public static CreateVmInstanceMsg fromAPICreateVmInstanceMsg(APICreateVmInstance cmsg.setStrategy(msg.getStrategy()); cmsg.setDiskAOs(msg.getDiskAOs()); + cmsg.setEnableRootVolumeCache(msg.getEnableRootVolumeCache()); + cmsg.setCacheMode(msg.getCacheMode()); + cmsg.setRootVolumeCachePoolUuid(msg.getRootVolumeCachePoolUuid()); + cmsg.setRootVolumeCacheMode(msg.getRootVolumeCacheMode()); + cmsg.setDataDiskCacheConfigOnIndex(msg.getDataDiskCacheConfigOnIndex()); if (CollectionUtils.isNotEmpty(msg.getDataDiskOfferingUuids()) || CollectionUtils.isNotEmpty(msg.getDataDiskSizes())) { cmsg.setPrimaryStorageUuidForDataVolume(getPSUuidForDataVolume(msg.getSystemTags())); 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 19a715c9a87..329999074e0 100644 --- a/compute/src/main/java/org/zstack/compute/vm/VmInstantiateOtherDiskFlow.java +++ b/compute/src/main/java/org/zstack/compute/vm/VmInstantiateOtherDiskFlow.java @@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Configurable; import org.zstack.compute.allocator.HostAllocatorManager; +import org.zstack.core.Platform; import org.zstack.core.cloudbus.CloudBus; import org.zstack.core.cloudbus.CloudBusCallBack; import org.zstack.core.componentloader.PluginRegistry; @@ -18,6 +19,7 @@ import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.image.ImageBackupStorageRefVO; import org.zstack.header.image.ImageVO; +import org.zstack.header.localVolumeCache.*; import org.zstack.header.message.MessageReply; import org.zstack.header.storage.backup.BackupStorageVO; import org.zstack.header.storage.backup.BackupStorageVO_; @@ -60,6 +62,23 @@ public class VmInstantiateOtherDiskFlow implements Flow { this.diskAO = diskAO; } + private VmLocalVolumeCacheVO initCacheRecord() { + VmLocalVolumeCacheVO existing = Q.New(VmLocalVolumeCacheVO.class) + .eq(VmLocalVolumeCacheVO_.volumeUuid, volumeInventory.getUuid()) + .find(); + if (existing != null) { + return existing; + } + VmLocalVolumeCacheVO cacheVO = new VmLocalVolumeCacheVO(); + cacheVO.setUuid(Platform.getUuid()); + cacheVO.setVolumeUuid(volumeInventory.getUuid()); + cacheVO.setState(VmLocalVolumeCacheState.Uninstantiated); + cacheVO.setCacheMode(VmLocalVolumeCacheMode.valueOf(diskAO.getCacheMode())); + cacheVO.setPoolUuid(diskAO.getCachePoolUuid()); + dbf.persist(cacheVO); + return cacheVO; + } + @Override public void run(FlowTrigger trigger, Map data) { VmInstanceInventory instantiateVm = (VmInstanceInventory) data.get(VmInstanceInventory.class.getSimpleName()); @@ -398,6 +417,23 @@ public void run(MessageReply reply) { }); } }); + + // Enable volume cache if requested for this DiskAO + if (Boolean.TRUE.equals(diskAO.getEnableCache())) { + flow(new NoRollbackFlow() { + String __name__ = String.format("create-cache-record-for-diskAO-volume-on-vm-%s", vmUuid); + + @Override + public void run(final FlowTrigger innerTrigger, Map data) { + if (volumeInventory == null) { + innerTrigger.next(); + return; + } + initCacheRecord(); + innerTrigger.next(); + } + }); + } } private void setupAttachOtherDiskFlows() { diff --git a/conf/db/upgrade/V5.5.12__schema.sql b/conf/db/upgrade/V5.5.12__schema.sql new file mode 100644 index 00000000000..788911627aa --- /dev/null +++ b/conf/db/upgrade/V5.5.12__schema.sql @@ -0,0 +1,46 @@ +CREATE TABLE IF NOT EXISTS `VmLocalVolumeCachePoolVO` ( + `uuid` VARCHAR(32) NOT NULL, + `hostUuid` VARCHAR(32) NOT NULL, + `name` VARCHAR(255) DEFAULT NULL, + `description` VARCHAR(2048) DEFAULT NULL, + `metadata` VARCHAR(2048) DEFAULT NULL, + `state` VARCHAR(32) NOT NULL, + `status` VARCHAR(32) NOT NULL, + `createDate` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkVmLocalVolumeCachePoolVOHostEO` + FOREIGN KEY (`hostUuid`) REFERENCES `HostEO` (`uuid`) + ON DELETE CASCADE + ) ENGINE = InnoDB DEFAULT CHARSET = utf8; + +CREATE TABLE IF NOT EXISTS `VmLocalVolumeCachePoolCapacityVO` ( + `uuid` VARCHAR(32) NOT NULL, + `totalCapacity` BIGINT NOT NULL DEFAULT 0, + `availableCapacity` BIGINT NOT NULL DEFAULT 0, + `allocated` BIGINT NOT NULL DEFAULT 0, + `dirty` BIGINT NOT NULL DEFAULT 0, + PRIMARY KEY (`uuid`), + CONSTRAINT `fkVmLocalVolumeCachePoolCapacityVOVmLocalVolumeCachePoolVO` + FOREIGN KEY (`uuid`) REFERENCES `VmLocalVolumeCachePoolVO` (`uuid`) + ON DELETE CASCADE + ) ENGINE = InnoDB DEFAULT CHARSET = utf8; + +CREATE TABLE IF NOT EXISTS `VmLocalVolumeCacheVO` ( + `uuid` VARCHAR(32) NOT NULL, + `volumeUuid` VARCHAR(32) NOT NULL, + `poolUuid` VARCHAR(32) DEFAULT NULL, + `installPath` VARCHAR(2048) DEFAULT NULL, + `cacheMode` VARCHAR(32) NOT NULL, + `state` VARCHAR(32) NOT NULL, + `createDate` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', + `lastOpDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`uuid`), + UNIQUE KEY `uniVmLocalVolumeCacheVOVolumeUuid` (`volumeUuid`), + CONSTRAINT `fkVmLocalVolumeCacheVOVolumeEO` + FOREIGN KEY (`volumeUuid`) REFERENCES `VolumeEO` (`uuid`) + ON DELETE CASCADE, + CONSTRAINT `fkVmLocalVolumeCacheVOPoolUuid` + FOREIGN KEY (`poolUuid`) REFERENCES `VmLocalVolumeCachePoolVO` (`uuid`) + ON DELETE SET NULL + ) ENGINE = InnoDB DEFAULT CHARSET = utf8; diff --git a/conf/globalConfig/vmLocalVolumeCachePool.xml b/conf/globalConfig/vmLocalVolumeCachePool.xml new file mode 100644 index 00000000000..666063156a1 --- /dev/null +++ b/conf/globalConfig/vmLocalVolumeCachePool.xml @@ -0,0 +1,27 @@ + + + + vmLocalVolumeCachePool + capacitySync.interval + Interval in seconds between periodic capacity sync tasks for local volume cache pools. + 300 + java.lang.Long + + + + vmLocalVolumeCachePool + healthCheck.interval + Interval in seconds between periodic health check tasks for local volume cache pools. + 60 + java.lang.Long + + + + vmLocalVolumeCachePool + gc.interval + Interval in seconds between periodic garbage collection tasks for local volume cache pools. + 3600 + java.lang.Long + + + diff --git a/conf/persistence.xml b/conf/persistence.xml index 30c36210dd6..58f63ee6747 100755 --- a/conf/persistence.xml +++ b/conf/persistence.xml @@ -217,6 +217,9 @@ org.zstack.network.hostNetworkInterface.lldp.entity.HostNetworkInterfaceLldpRefVO org.zstack.header.volume.block.BlockVolumeVO org.zstack.header.host.HostHwMonitorStatusVO + org.zstack.header.localVolumeCache.VmLocalVolumeCachePoolVO + org.zstack.header.localVolumeCache.VmLocalVolumeCachePoolCapacityVO + org.zstack.header.localVolumeCache.VmLocalVolumeCacheVO org.zstack.kvm.xmlhook.XmlHookVO org.zstack.kvm.xmlhook.XmlHookVmInstanceRefVO org.zstack.log.server.LogServerVO diff --git a/conf/serviceConfig/host.xml b/conf/serviceConfig/host.xml index bb076932f7e..e46b0a34e30 100755 --- a/conf/serviceConfig/host.xml +++ b/conf/serviceConfig/host.xml @@ -61,6 +61,10 @@ org.zstack.header.host.APIGetHostPowerStatusMsg + + org.zstack.header.host.APIGetBlockDevicesMsg + + org.zstack.header.host.APICreateHostNetworkServiceTypeMsg diff --git a/conf/serviceConfig/vmLocalVolumeCache.xml b/conf/serviceConfig/vmLocalVolumeCache.xml new file mode 100644 index 00000000000..b1ead4b02d2 --- /dev/null +++ b/conf/serviceConfig/vmLocalVolumeCache.xml @@ -0,0 +1,12 @@ + + + vmLocalVolumeCache + + + org.zstack.header.localVolumeCache.APIEnableVolumeCacheMsg + + + + org.zstack.header.localVolumeCache.APIDisableVolumeCacheMsg + + diff --git a/conf/serviceConfig/vmLocalVolumeCachePool.xml b/conf/serviceConfig/vmLocalVolumeCachePool.xml new file mode 100644 index 00000000000..4ea9301967d --- /dev/null +++ b/conf/serviceConfig/vmLocalVolumeCachePool.xml @@ -0,0 +1,37 @@ + + + vmLocalVolumeCachePool + + + org.zstack.header.localVolumeCache.APICreateVmLocalVolumeCachePoolMsg + + + + org.zstack.header.localVolumeCache.APIDeleteVmLocalVolumeCachePoolMsg + + + + org.zstack.header.localVolumeCache.APIUpdateVmLocalVolumeCachePoolMsg + + + + org.zstack.header.localVolumeCache.APIChangeVmLocalVolumeCachePoolStateMsg + + + + org.zstack.header.localVolumeCache.APIReconnectVmLocalVolumeCachePoolMsg + + + + org.zstack.header.localVolumeCache.APIExtendVmLocalVolumeCachePoolMsg + + + + org.zstack.header.localVolumeCache.APISyncVmLocalVolumeCachePoolCapacityMsg + + + + org.zstack.header.localVolumeCache.APIQueryVmLocalVolumeCachePoolMsg + query + + diff --git a/conf/springConfigXml/localVolumeCache.xml b/conf/springConfigXml/localVolumeCache.xml new file mode 100644 index 00000000000..58f18cca0df --- /dev/null +++ b/conf/springConfigXml/localVolumeCache.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/conf/zstack.xml b/conf/zstack.xml index c0a5da2a80f..b723b6eadcc 100755 --- a/conf/zstack.xml +++ b/conf/zstack.xml @@ -122,4 +122,5 @@ + diff --git a/header/src/main/java/org/zstack/header/host/APIGetBlockDevicesEvent.java b/header/src/main/java/org/zstack/header/host/APIGetBlockDevicesEvent.java new file mode 100644 index 00000000000..dcb396d6796 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIGetBlockDevicesEvent.java @@ -0,0 +1,45 @@ +package org.zstack.header.host; + +import org.zstack.header.message.APIEvent; +import org.zstack.header.rest.RestResponse; + +import java.util.Collections; +import java.util.List; + +@RestResponse(fieldsTo = "all") +public class APIGetBlockDevicesEvent extends APIEvent { + private List blockDevices; + + public APIGetBlockDevicesEvent() { + } + + public APIGetBlockDevicesEvent(String apiId) { + super(apiId); + } + + public List getBlockDevices() { + return blockDevices; + } + + public void setBlockDevices(List blockDevices) { + this.blockDevices = blockDevices; + } + + public static APIGetBlockDevicesEvent __example__() { + APIGetBlockDevicesEvent event = new APIGetBlockDevicesEvent(); + HostBlockDeviceStruct struct = new HostBlockDeviceStruct(); + struct.setWwid("3600508b400105e5a0000800001490000"); + struct.setVendor("VMware"); + struct.setModel("Virtual disk"); + struct.setWwn("0x6000c2990b2c19db"); + struct.setSerial("6000c2990b2c19db"); + struct.setHctl("0:0:0:0"); + struct.setType("disk"); + struct.setSize(107374182400L); + struct.setPath("/dev/sda"); + struct.setSource("block"); + struct.setTransport("fc"); + event.setBlockDevices(Collections.singletonList(struct)); + return event; + } +} diff --git a/header/src/main/java/org/zstack/header/host/APIGetBlockDevicesEventDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/APIGetBlockDevicesEventDoc_zh_cn.groovy new file mode 100644 index 00000000000..c0ef654855d --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIGetBlockDevicesEventDoc_zh_cn.groovy @@ -0,0 +1,32 @@ +package org.zstack.header.host + +import org.zstack.header.host.HostBlockDeviceStruct +import org.zstack.header.errorcode.ErrorCode + +doc { + + title "在这里输入结构的名称" + + ref { + name "blockDevices" + path "org.zstack.header.host.APIGetBlockDevicesEvent.blockDevices" + desc "null" + type "List" + since "5.5.6" + clz HostBlockDeviceStruct.class + } + field { + name "success" + desc "" + type "boolean" + since "5.5.6" + } + ref { + name "error" + path "org.zstack.header.host.APIGetBlockDevicesEvent.error" + desc "错误码,若不为null,则表示操作失败, 操作成功时该字段为null",false + type "ErrorCode" + since "5.5.6" + clz ErrorCode.class + } +} diff --git a/header/src/main/java/org/zstack/header/host/APIGetBlockDevicesMsg.java b/header/src/main/java/org/zstack/header/host/APIGetBlockDevicesMsg.java new file mode 100644 index 00000000000..8b5cc35e8b7 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIGetBlockDevicesMsg.java @@ -0,0 +1,35 @@ +package org.zstack.header.host; + +import org.springframework.http.HttpMethod; +import org.zstack.header.message.APIMessage; +import org.zstack.header.message.APIParam; +import org.zstack.header.rest.RestRequest; + +@RestRequest( + path = "/hosts/{uuid}/block-devices", + method = HttpMethod.GET, + responseClass = APIGetBlockDevicesEvent.class +) +public class APIGetBlockDevicesMsg extends APIMessage implements HostMessage { + @APIParam(nonempty = true, resourceType = HostVO.class) + private String uuid; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + @Override + public String getHostUuid() { + return uuid; + } + + public static APIGetBlockDevicesMsg __example__() { + APIGetBlockDevicesMsg msg = new APIGetBlockDevicesMsg(); + msg.setUuid(uuid()); + return msg; + } +} diff --git a/header/src/main/java/org/zstack/header/host/APIGetBlockDevicesMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/APIGetBlockDevicesMsgDoc_zh_cn.groovy new file mode 100644 index 00000000000..41417dc0e75 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/APIGetBlockDevicesMsgDoc_zh_cn.groovy @@ -0,0 +1,58 @@ +package org.zstack.header.host + +import org.zstack.header.host.APIGetBlockDevicesEvent + +doc { + title "GetBlockDevices" + + category "未知类别" + + desc """在这里填写API描述""" + + rest { + request { + url "GET /v1/hosts/{uuid}/block-devices" + + header (Authorization: 'OAuth the-session-uuid') + + clz APIGetBlockDevicesMsg.class + + desc """""" + + params { + + column { + name "uuid" + enclosedIn "" + desc "资源的UUID,唯一标示该资源" + location "url" + type "String" + optional false + since "5.5.6" + } + column { + name "systemTags" + enclosedIn "" + desc "系统标签" + location "query" + type "List" + optional true + since "5.5.6" + } + column { + name "userTags" + enclosedIn "" + desc "用户标签" + location "query" + type "List" + optional true + since "5.5.6" + } + } + } + + response { + clz APIGetBlockDevicesEvent.class + } + } +} \ No newline at end of file diff --git a/header/src/main/java/org/zstack/header/host/GetBlockDevicesOnHostMsg.java b/header/src/main/java/org/zstack/header/host/GetBlockDevicesOnHostMsg.java new file mode 100644 index 00000000000..13e8764068b --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/GetBlockDevicesOnHostMsg.java @@ -0,0 +1,16 @@ +package org.zstack.header.host; + +import org.zstack.header.message.NeedReplyMessage; + +public class GetBlockDevicesOnHostMsg extends NeedReplyMessage implements HostMessage { + private String hostUuid; + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + @Override + public String getHostUuid() { + return hostUuid; + } +} diff --git a/header/src/main/java/org/zstack/header/host/GetBlockDevicesOnHostReply.java b/header/src/main/java/org/zstack/header/host/GetBlockDevicesOnHostReply.java new file mode 100644 index 00000000000..1407c081abf --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/GetBlockDevicesOnHostReply.java @@ -0,0 +1,17 @@ +package org.zstack.header.host; + +import org.zstack.header.message.MessageReply; + +import java.util.List; + +public class GetBlockDevicesOnHostReply extends MessageReply { + private List blockDevices; + + public List getBlockDevices() { + return blockDevices; + } + + public void setBlockDevices(List blockDevices) { + this.blockDevices = blockDevices; + } +} diff --git a/header/src/main/java/org/zstack/header/host/HostBlockDeviceStruct.java b/header/src/main/java/org/zstack/header/host/HostBlockDeviceStruct.java new file mode 100644 index 00000000000..14b35358244 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostBlockDeviceStruct.java @@ -0,0 +1,144 @@ +package org.zstack.header.host; + +import java.io.Serializable; +import java.util.Objects; + +public class HostBlockDeviceStruct implements Serializable { + private String name; + private String wwid; + private String vendor; + private String model; + private String wwn; + private String serial; + private String hctl; + private String type; + private String path; + private Long size; + private String source; + private String transport; + private String targetIdentifier; + + public HostBlockDeviceStruct() { + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + HostBlockDeviceStruct that = (HostBlockDeviceStruct) o; + if (wwid != null && that.wwid != null) { + return wwid.equals(that.wwid); + } + return Objects.equals(path, that.path) && Objects.equals(hctl, that.hctl); + + } + + @Override + public int hashCode() { + return wwid != null ? wwid.hashCode() : Objects.hash(path, hctl); + } + + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + public String getWwid() { + return wwid; + } + + public void setWwid(String wwid) { + this.wwid = wwid; + } + + public String getVendor() { + return vendor; + } + + public void setVendor(String vendor) { + this.vendor = vendor; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getWwn() { + return wwn; + } + + public void setWwn(String wwn) { + this.wwn = wwn; + } + + public String getSerial() { + return serial; + } + + public void setSerial(String serial) { + this.serial = serial; + } + + public String getHctl() { + return hctl; + } + + public void setHctl(String hctl) { + this.hctl = hctl; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public Long getSize() { + return size; + } + + public void setSize(Long size) { + this.size = size; + } + + public String getSource() { + return source; + } + + public void setSource(String source) { + this.source = source; + } + + public String getTransport() { + return transport; + } + + public void setTransport(String transport) { + this.transport = transport; + } + + public String getTargetIdentifier() { + return targetIdentifier; + } + + public void setTargetIdentifier(String targetIdentifier) { + this.targetIdentifier = targetIdentifier; + } +} diff --git a/header/src/main/java/org/zstack/header/host/HostBlockDeviceStructDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/host/HostBlockDeviceStructDoc_zh_cn.groovy new file mode 100644 index 00000000000..40707c0b932 --- /dev/null +++ b/header/src/main/java/org/zstack/header/host/HostBlockDeviceStructDoc_zh_cn.groovy @@ -0,0 +1,81 @@ +package org.zstack.header.host + +import java.lang.Long + +doc { + + title "在这里输入结构的名称" + + field { + name "wwid" + desc "" + type "String" + since "5.5.6" + } + field { + name "vendor" + desc "" + type "String" + since "5.5.6" + } + field { + name "model" + desc "" + type "String" + since "5.5.6" + } + field { + name "wwn" + desc "" + type "String" + since "5.5.6" + } + field { + name "serial" + desc "" + type "String" + since "5.5.6" + } + field { + name "hctl" + desc "" + type "String" + since "5.5.6" + } + field { + name "type" + desc "" + type "String" + since "5.5.6" + } + field { + name "path" + desc "" + type "String" + since "5.5.6" + } + field { + name "size" + desc "" + type "Long" + since "5.5.6" + } + field { + name "source" + desc "" + type "String" + since "5.5.6" + } + field { + name "transport" + desc "" + type "String" + since "5.5.6" + } + field { + name "targetIdentifier" + desc "" + type "String" + since "5.5.6" + } +} diff --git a/header/src/main/java/org/zstack/header/host/HostInventory.java b/header/src/main/java/org/zstack/header/host/HostInventory.java index 35958b05003..6fbfaa2417f 100755 --- a/header/src/main/java/org/zstack/header/host/HostInventory.java +++ b/header/src/main/java/org/zstack/header/host/HostInventory.java @@ -3,6 +3,8 @@ import org.zstack.header.allocator.HostCapacityInventory; import org.zstack.header.cluster.ClusterInventory; import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.localVolumeCache.VmLocalVolumeCachePoolInventory; +import org.zstack.header.localVolumeCache.VmLocalVolumeCachePoolVO; import org.zstack.header.query.ExpandedQueries; import org.zstack.header.query.ExpandedQuery; import org.zstack.header.query.Queryable; @@ -14,9 +16,7 @@ import javax.persistence.JoinColumn; import java.io.Serializable; import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; /** @@ -183,6 +183,8 @@ public class HostInventory implements Serializable { joinColumn = @JoinColumn(name = "uuid", referencedColumnName = "temperatureStatus")) private HwMonitorStatus temperatureStatus; + private Set localVolumeCachePools; + private String architecture; /** @@ -234,6 +236,13 @@ protected HostInventory(HostVO vo) { this.setTemperatureStatus(vo.getHwMonitorStatus().getTemperatureStatus()); } + if (vo.getLocalVolumeCachePools() != null) { + Set cachePoolInventories = new HashSet<>(); + for (VmLocalVolumeCachePoolVO cachePoolVO : vo.getLocalVolumeCachePools()) { + cachePoolInventories.add(cachePoolVO.toInventory()); + } + this.setLocalVolumeCachePools(cachePoolInventories); + } } public HostInventory() { @@ -498,4 +507,12 @@ public HwMonitorStatus getTemperatureStatus() { public void setTemperatureStatus(HwMonitorStatus temperatureStatus) { this.temperatureStatus = temperatureStatus; } + + public Set getLocalVolumeCachePools() { + return localVolumeCachePools; + } + + public void setLocalVolumeCachePools(Set localVolumeCachePools) { + this.localVolumeCachePools = localVolumeCachePools; + } } diff --git a/header/src/main/java/org/zstack/header/host/HostVO.java b/header/src/main/java/org/zstack/header/host/HostVO.java index 319c26750c4..dda2813a5b7 100755 --- a/header/src/main/java/org/zstack/header/host/HostVO.java +++ b/header/src/main/java/org/zstack/header/host/HostVO.java @@ -1,7 +1,10 @@ package org.zstack.header.host; +import org.hibernate.annotations.NotFound; +import org.hibernate.annotations.NotFoundAction; import org.zstack.header.allocator.HostCapacityVO; import org.zstack.header.cluster.ClusterVO; +import org.zstack.header.localVolumeCache.VmLocalVolumeCachePoolVO; import org.zstack.header.tag.AutoDeleteTag; import org.zstack.header.vo.BaseResource; import org.zstack.header.vo.EO; @@ -10,6 +13,7 @@ import org.zstack.header.zone.ZoneVO; import javax.persistence.*; +import java.util.Set; @Entity @Table @@ -38,6 +42,11 @@ public class HostVO extends HostAO { @NoView private HostHwMonitorStatusVO hwMonitorStatus; + @OneToMany(fetch = FetchType.EAGER) + @NotFound(action = NotFoundAction.IGNORE) + @JoinColumn(name = "hostUuid", insertable = false, updatable = false) + private Set localVolumeCachePools; + public HostCapacityVO getCapacity() { return capacity; } @@ -62,6 +71,14 @@ public void setHwMonitorStatus(HostHwMonitorStatusVO hwMonitorStatus) { this.hwMonitorStatus = hwMonitorStatus; } + public Set getLocalVolumeCachePools() { + return localVolumeCachePools; + } + + public void setLocalVolumeCachePools(Set localVolumeCachePools) { + this.localVolumeCachePools = localVolumeCachePools; + } + public HostVO() { } @@ -80,6 +97,7 @@ protected HostVO(HostVO vo) { this.setCapacity(vo.getCapacity()); this.setIpmi(vo.getIpmi()); this.setHwMonitorStatus(vo.getHwMonitorStatus()); + this.setLocalVolumeCachePools(vo.getLocalVolumeCachePools()); } } diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/CachePoolMetadata.java b/header/src/main/java/org/zstack/header/localVolumeCache/CachePoolMetadata.java new file mode 100644 index 00000000000..b82229fa282 --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/CachePoolMetadata.java @@ -0,0 +1,186 @@ +package org.zstack.header.localVolumeCache; + +import org.zstack.utils.gson.JSONObjectUtil; + +import java.io.Serializable; +import java.util.List; + +/** + * Strongly-typed representation of the metadata JSON stored in VmLocalVolumeCachePoolVO. + *

+ * VO stores metadata as a JSON String. VmLocalVolumeCachePoolInventory exposes it as a + * LinkedHashMap (following the ExternalPrimaryStorage addonInfo pattern). This POJO + * provides type-safe access for internal business logic. + *

+ * Structure mirrors the Python agent's CachePoolMetadata: + *

+ * {
+ *   "mountPoint": "/mnt/cache-pool-1",
+ *   "pvs": [{"pvUuid": "...", "pvName": "...", "pvDevicePath": "/dev/nvme0n1"}],
+ *   "vg": {"vgUuid": "...", "vgName": "..."},
+ *   "lv": {"lvUuid": "...", "lvName": "...", "lvPath": "..."},
+ *   "filesystem": {"fsUuid": "...", "fsType": "xfs"}
+ * }
+ * 
+ */ +public class CachePoolMetadata implements Serializable { + + public static class PVRef implements Serializable { + private String pvUuid; + private String pvName; + private String pvDevicePath; + + public String getPvUuid() { + return pvUuid; + } + + public void setPvUuid(String pvUuid) { + this.pvUuid = pvUuid; + } + + public String getPvName() { + return pvName; + } + + public void setPvName(String pvName) { + this.pvName = pvName; + } + + public String getPvDevicePath() { + return pvDevicePath; + } + + public void setPvDevicePath(String pvDevicePath) { + this.pvDevicePath = pvDevicePath; + } + } + + public static class VGRef implements Serializable { + private String vgUuid; + private String vgName; + + public String getVgUuid() { + return vgUuid; + } + + public void setVgUuid(String vgUuid) { + this.vgUuid = vgUuid; + } + + public String getVgName() { + return vgName; + } + + public void setVgName(String vgName) { + this.vgName = vgName; + } + } + + public static class LVRef implements Serializable { + private String lvUuid; + private String lvName; + private String lvPath; + + public String getLvUuid() { + return lvUuid; + } + + public void setLvUuid(String lvUuid) { + this.lvUuid = lvUuid; + } + + public String getLvName() { + return lvName; + } + + public void setLvName(String lvName) { + this.lvName = lvName; + } + + public String getLvPath() { + return lvPath; + } + + public void setLvPath(String lvPath) { + this.lvPath = lvPath; + } + } + + public static class FileSystemRef implements Serializable { + private String fsUuid; + private String fsType; + + public String getFsUuid() { + return fsUuid; + } + + public void setFsUuid(String fsUuid) { + this.fsUuid = fsUuid; + } + + public String getFsType() { + return fsType; + } + + public void setFsType(String fsType) { + this.fsType = fsType; + } + } + + private String mountPoint; + private List pvs; + private VGRef vg; + private LVRef lv; + private FileSystemRef filesystem; + + public String getMountPoint() { + return mountPoint; + } + + public void setMountPoint(String mountPoint) { + this.mountPoint = mountPoint; + } + + public List getPvs() { + return pvs; + } + + public void setPvs(List pvs) { + this.pvs = pvs; + } + + public VGRef getVg() { + return vg; + } + + public void setVg(VGRef vg) { + this.vg = vg; + } + + public LVRef getLv() { + return lv; + } + + public void setLv(LVRef lv) { + this.lv = lv; + } + + public FileSystemRef getFilesystem() { + return filesystem; + } + + public void setFilesystem(FileSystemRef filesystem) { + this.filesystem = filesystem; + } + + public static CachePoolMetadata fromJson(String json) { + if (json == null || json.isEmpty()) { + return new CachePoolMetadata(); + } + return JSONObjectUtil.toObject(json, CachePoolMetadata.class); + } + + public String toJson() { + return JSONObjectUtil.toJsonString(this); + } +} diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheConstant.java b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheConstant.java new file mode 100644 index 00000000000..d75cc7e46cb --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheConstant.java @@ -0,0 +1,5 @@ +package org.zstack.header.localVolumeCache; + +public interface VmLocalVolumeCacheConstant { + String CACHE_SERVICE_ID = "vmLocalVolumeCache"; +} diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheInventory.java b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheInventory.java new file mode 100644 index 00000000000..e0d5a306ba7 --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheInventory.java @@ -0,0 +1,108 @@ +package org.zstack.header.localVolumeCache; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.search.Inventory; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@Inventory(mappingVOClass = VmLocalVolumeCacheVO.class) +@PythonClassInventory +public class VmLocalVolumeCacheInventory implements Serializable { + private String uuid; + private String volumeUuid; + private String poolUuid; + private String installPath; + private VmLocalVolumeCacheMode cacheMode; + private VmLocalVolumeCacheState state; + private Timestamp createDate; + private Timestamp lastOpDate; + + public static VmLocalVolumeCacheInventory valueOf(VmLocalVolumeCacheVO vo) { + VmLocalVolumeCacheInventory inv = new VmLocalVolumeCacheInventory(); + inv.setUuid(vo.getUuid()); + inv.setVolumeUuid(vo.getVolumeUuid()); + inv.setPoolUuid(vo.getPoolUuid()); + inv.setInstallPath(vo.getInstallPath()); + inv.setCacheMode(vo.getCacheMode()); + inv.setState(vo.getState()); + inv.setCreateDate(vo.getCreateDate()); + inv.setLastOpDate(vo.getLastOpDate()); + return inv; + } + + public static List valueOf(Collection vos) { + List invs = new ArrayList<>(); + for (VmLocalVolumeCacheVO vo : vos) { + invs.add(valueOf(vo)); + } + return invs; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getVolumeUuid() { + return volumeUuid; + } + + public void setVolumeUuid(String volumeUuid) { + this.volumeUuid = volumeUuid; + } + + public String getPoolUuid() { + return poolUuid; + } + + public void setPoolUuid(String poolUuid) { + this.poolUuid = poolUuid; + } + + public String getInstallPath() { + return installPath; + } + + public void setInstallPath(String installPath) { + this.installPath = installPath; + } + + public VmLocalVolumeCacheMode getCacheMode() { + return cacheMode; + } + + public void setCacheMode(VmLocalVolumeCacheMode cacheMode) { + this.cacheMode = cacheMode; + } + + public VmLocalVolumeCacheState getState() { + return state; + } + + public void setState(VmLocalVolumeCacheState state) { + this.state = state; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..d098f92796a --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheInventoryDoc_zh_cn.groovy @@ -0,0 +1,63 @@ +package org.zstack.header.localVolumeCache + +import org.zstack.header.localVolumeCache.VmLocalVolumeCacheMode +import org.zstack.header.localVolumeCache.VmLocalVolumeCacheState +import java.sql.Timestamp + +doc { + + title "在这里输入结构的名称" + + field { + name "uuid" + desc "资源的UUID,唯一标示该资源" + type "String" + since "5.5.6" + } + field { + name "volumeUuid" + desc "云盘UUID" + type "String" + since "5.5.6" + } + field { + name "poolUuid" + desc "" + type "String" + since "5.5.6" + } + field { + name "installPath" + desc "" + type "String" + since "5.5.6" + } + ref { + name "cacheMode" + path "org.zstack.header.localVolumeCache.VmLocalVolumeCacheInventory.cacheMode" + desc "null" + type "VmLocalVolumeCacheMode" + since "5.5.6" + clz VmLocalVolumeCacheMode.class + } + ref { + name "state" + path "org.zstack.header.localVolumeCache.VmLocalVolumeCacheInventory.state" + desc "null" + type "VmLocalVolumeCacheState" + since "5.5.6" + clz VmLocalVolumeCacheState.class + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "5.5.6" + } + field { + name "lastOpDate" + desc "最后一次修改时间" + type "Timestamp" + since "5.5.6" + } +} diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheMode.java b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheMode.java new file mode 100644 index 00000000000..736262d3433 --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheMode.java @@ -0,0 +1,5 @@ +package org.zstack.header.localVolumeCache; + +public enum VmLocalVolumeCacheMode { + WriteBack, +} diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheModeDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheModeDoc_zh_cn.groovy new file mode 100644 index 00000000000..fcc06bb9590 --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheModeDoc_zh_cn.groovy @@ -0,0 +1,15 @@ +package org.zstack.header.localVolumeCache + + + +doc { + + title "在这里输入结构的名称" + + field { + name "WriteBack" + desc "" + type "VmLocalVolumeCacheMode" + since "5.5.6" + } +} diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolCapacityInventory.java b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolCapacityInventory.java new file mode 100644 index 00000000000..f7bc97d3a65 --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolCapacityInventory.java @@ -0,0 +1,77 @@ +package org.zstack.header.localVolumeCache; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.search.Inventory; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@Inventory(mappingVOClass = VmLocalVolumeCachePoolCapacityVO.class) +@PythonClassInventory +public class VmLocalVolumeCachePoolCapacityInventory implements Serializable { + private String uuid; + private long totalCapacity; + private long availableCapacity; + private long allocated; + private long dirty; + + public static VmLocalVolumeCachePoolCapacityInventory valueOf(VmLocalVolumeCachePoolCapacityVO vo) { + VmLocalVolumeCachePoolCapacityInventory inv = new VmLocalVolumeCachePoolCapacityInventory(); + inv.setUuid(vo.getUuid()); + inv.setTotalCapacity(vo.getTotalCapacity()); + inv.setAvailableCapacity(vo.getAvailableCapacity()); + inv.setAllocated(vo.getAllocated()); + inv.setDirty(vo.getDirty()); + return inv; + } + + public static List valueOf(Collection vos) { + List invs = new ArrayList<>(); + for (VmLocalVolumeCachePoolCapacityVO vo : vos) { + invs.add(valueOf(vo)); + } + return invs; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public long getTotalCapacity() { + return totalCapacity; + } + + public void setTotalCapacity(long totalCapacity) { + this.totalCapacity = totalCapacity; + } + + public long getAvailableCapacity() { + return availableCapacity; + } + + public void setAvailableCapacity(long availableCapacity) { + this.availableCapacity = availableCapacity; + } + + public long getAllocated() { + return allocated; + } + + public void setAllocated(long allocated) { + this.allocated = allocated; + } + + public long getDirty() { + return dirty; + } + + public void setDirty(long dirty) { + this.dirty = dirty; + } +} diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolCapacityVO.java b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolCapacityVO.java new file mode 100644 index 00000000000..4bdd60d387c --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolCapacityVO.java @@ -0,0 +1,79 @@ +package org.zstack.header.localVolumeCache; + +import org.zstack.header.vo.EntityGraph; +import org.zstack.header.vo.ForeignKey; +import org.zstack.header.vo.ForeignKey.ReferenceOption; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table +@EntityGraph( + parents = { + @EntityGraph.Neighbour(type = VmLocalVolumeCachePoolVO.class, myField = "uuid", targetField = "uuid") + } +) +public class VmLocalVolumeCachePoolCapacityVO { + @Id + @Column + @ForeignKey(parentEntityClass = VmLocalVolumeCachePoolVO.class, onDeleteAction = ReferenceOption.CASCADE) + private String uuid; + + @Column + private long totalCapacity; + + @Column + private long availableCapacity; + + @Column + private long allocated; + + @Column + private long dirty; + + public VmLocalVolumeCachePoolCapacityVO() { + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public long getTotalCapacity() { + return totalCapacity; + } + + public void setTotalCapacity(long totalCapacity) { + this.totalCapacity = totalCapacity; + } + + public long getAvailableCapacity() { + return availableCapacity; + } + + public void setAvailableCapacity(long availableCapacity) { + this.availableCapacity = availableCapacity; + } + + public long getAllocated() { + return allocated; + } + + public void setAllocated(long allocated) { + this.allocated = allocated; + } + + public long getDirty() { + return dirty; + } + + public void setDirty(long dirty) { + this.dirty = dirty; + } +} diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolCapacityVO_.java b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolCapacityVO_.java new file mode 100644 index 00000000000..c2012e9f0f7 --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolCapacityVO_.java @@ -0,0 +1,13 @@ +package org.zstack.header.localVolumeCache; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; + +@StaticMetamodel(VmLocalVolumeCachePoolCapacityVO.class) +public class VmLocalVolumeCachePoolCapacityVO_ { + public static volatile SingularAttribute uuid; + public static volatile SingularAttribute totalCapacity; + public static volatile SingularAttribute availableCapacity; + public static volatile SingularAttribute allocated; + public static volatile SingularAttribute dirty; +} diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolInventory.java b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolInventory.java new file mode 100644 index 00000000000..9c3749ccf3a --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolInventory.java @@ -0,0 +1,193 @@ +package org.zstack.header.localVolumeCache; + +import org.zstack.header.configuration.PythonClassInventory; +import org.zstack.header.query.Queryable; +import org.zstack.header.search.Inventory; +import org.zstack.utils.gson.JSONObjectUtil; + +import javax.persistence.JoinColumn; +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.*; + +@Inventory(mappingVOClass = VmLocalVolumeCachePoolVO.class) +@PythonClassInventory +public class VmLocalVolumeCachePoolInventory implements Serializable { + private String uuid; + private String hostUuid; + private String name; + private String description; + private LinkedHashMap metadata; + + @Queryable(mappingClass = VmLocalVolumeCachePoolCapacityInventory.class, + joinColumn = @JoinColumn(name = "uuid", referencedColumnName = "totalCapacity")) + private long totalCapacity; + + @Queryable(mappingClass = VmLocalVolumeCachePoolCapacityInventory.class, + joinColumn = @JoinColumn(name = "uuid", referencedColumnName = "availableCapacity")) + private long availableCapacity; + + @Queryable(mappingClass = VmLocalVolumeCachePoolCapacityInventory.class, + joinColumn = @JoinColumn(name = "uuid", referencedColumnName = "allocated")) + private long allocated; + + @Queryable(mappingClass = VmLocalVolumeCachePoolCapacityInventory.class, + joinColumn = @JoinColumn(name = "uuid", referencedColumnName = "dirty")) + private long dirty; + + private VmLocalVolumeCachePoolState state; + private VmLocalVolumeCachePoolStatus status; + private Set caches; + private Timestamp createDate; + private Timestamp lastOpDate; + + public static VmLocalVolumeCachePoolInventory valueOf(VmLocalVolumeCachePoolVO vo) { + VmLocalVolumeCachePoolInventory inv = new VmLocalVolumeCachePoolInventory(); + inv.setUuid(vo.getUuid()); + inv.setHostUuid(vo.getHostUuid()); + inv.setName(vo.getName()); + inv.setDescription(vo.getDescription()); + if (vo.getMetadata() != null) { + inv.setMetadata(JSONObjectUtil.toObject(vo.getMetadata(), LinkedHashMap.class)); + } + if (vo.getCapacity() != null) { + inv.setTotalCapacity(vo.getCapacity().getTotalCapacity()); + inv.setAvailableCapacity(vo.getCapacity().getAvailableCapacity()); + inv.setAllocated(vo.getCapacity().getAllocated()); + inv.setDirty(vo.getCapacity().getDirty()); + } + inv.setState(vo.getState()); + inv.setStatus(vo.getStatus()); + inv.setCreateDate(vo.getCreateDate()); + inv.setLastOpDate(vo.getLastOpDate()); + if(vo.getCaches() != null) { + Set cacheInventories = new HashSet<>(); + for (VmLocalVolumeCacheVO cacheVO : vo.getCaches()) { + cacheInventories.add(cacheVO.toInventory()); + } + inv.setCaches(cacheInventories); + } + return inv; + } + + public static List valueOf(Collection vos) { + List invs = new ArrayList<>(); + for (VmLocalVolumeCachePoolVO vo : vos) { + invs.add(valueOf(vo)); + } + return invs; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public LinkedHashMap getMetadata() { + return metadata; + } + + public void setMetadata(LinkedHashMap metadata) { + this.metadata = metadata; + } + + public long getTotalCapacity() { + return totalCapacity; + } + + public void setTotalCapacity(long totalCapacity) { + this.totalCapacity = totalCapacity; + } + + public long getAvailableCapacity() { + return availableCapacity; + } + + public void setAvailableCapacity(long availableCapacity) { + this.availableCapacity = availableCapacity; + } + + public long getAllocated() { + return allocated; + } + + public void setAllocated(long allocated) { + this.allocated = allocated; + } + + public long getDirty() { + return dirty; + } + + public void setDirty(long dirty) { + this.dirty = dirty; + } + + public VmLocalVolumeCachePoolState getState() { + return state; + } + + public void setState(VmLocalVolumeCachePoolState state) { + this.state = state; + } + + public VmLocalVolumeCachePoolStatus getStatus() { + return status; + } + + public void setStatus(VmLocalVolumeCachePoolStatus status) { + this.status = status; + } + + public Set getCaches() { + return caches; + } + + public void setCaches(Set caches) { + this.caches = caches; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} + diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolInventoryDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolInventoryDoc_zh_cn.groovy new file mode 100644 index 00000000000..b66843950d6 --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolInventoryDoc_zh_cn.groovy @@ -0,0 +1,90 @@ +package org.zstack.header.localVolumeCache + +import org.zstack.header.localVolumeCache.VmLocalVolumeCachePoolState +import org.zstack.header.localVolumeCache.VmLocalVolumeCachePoolStatus +import org.zstack.header.localVolumeCache.VmLocalVolumeCacheInventory +import java.sql.Timestamp + +doc { + + title "在这里输入结构的名称" + + field { + name "uuid" + desc "资源的UUID,唯一标示该资源" + type "String" + since "5.5.6" + } + field { + name "hostUuid" + desc "物理机UUID" + type "String" + since "5.5.6" + } + field { + name "name" + desc "资源名称" + type "String" + since "5.5.6" + } + field { + name "description" + desc "资源的详细描述" + type "String" + since "5.5.6" + } + field { + name "metadata" + desc "" + type "LinkedHashMap" + since "5.5.6" + } + field { + name "totalCapacity" + desc "" + type "long" + since "5.5.6" + } + field { + name "availableCapacity" + desc "" + type "long" + since "5.5.6" + } + ref { + name "state" + path "org.zstack.header.localVolumeCache.VmLocalVolumeCachePoolInventory.state" + desc "null" + type "VmLocalVolumeCachePoolState" + since "5.5.6" + clz VmLocalVolumeCachePoolState.class + } + ref { + name "status" + path "org.zstack.header.localVolumeCache.VmLocalVolumeCachePoolInventory.status" + desc "null" + type "VmLocalVolumeCachePoolStatus" + since "5.5.6" + clz VmLocalVolumeCachePoolStatus.class + } + ref { + name "caches" + path "org.zstack.header.localVolumeCache.VmLocalVolumeCachePoolInventory.caches" + desc "null" + type "Set" + since "5.5.6" + clz VmLocalVolumeCacheInventory.class + } + field { + name "createDate" + desc "创建时间" + type "Timestamp" + since "5.5.6" + } + field { + name "lastOpDate" + desc "最后一次修改时间" + type "Timestamp" + since "5.5.6" + } +} diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolState.java b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolState.java new file mode 100644 index 00000000000..13f7aeb273e --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolState.java @@ -0,0 +1,7 @@ +package org.zstack.header.localVolumeCache; + +public enum VmLocalVolumeCachePoolState { + Enabled, + Disabled, +} + diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolStateDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolStateDoc_zh_cn.groovy new file mode 100644 index 00000000000..f1525aa58e4 --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolStateDoc_zh_cn.groovy @@ -0,0 +1,21 @@ +package org.zstack.header.localVolumeCache + + + +doc { + + title "在这里输入结构的名称" + + field { + name "Enabled" + desc "" + type "VmLocalVolumeCachePoolState" + since "5.5.6" + } + field { + name "Disabled" + desc "" + type "VmLocalVolumeCachePoolState" + since "5.5.6" + } +} diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolStatus.java b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolStatus.java new file mode 100644 index 00000000000..6028d2c9121 --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolStatus.java @@ -0,0 +1,8 @@ +package org.zstack.header.localVolumeCache; + +public enum VmLocalVolumeCachePoolStatus { + Connecting, + Connected, + Disconnected, +} + diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolStatusDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolStatusDoc_zh_cn.groovy new file mode 100644 index 00000000000..2427adf7c81 --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolStatusDoc_zh_cn.groovy @@ -0,0 +1,27 @@ +package org.zstack.header.localVolumeCache + + + +doc { + + title "在这里输入结构的名称" + + field { + name "Connecting" + desc "" + type "VmLocalVolumeCachePoolStatus" + since "5.5.6" + } + field { + name "Connected" + desc "" + type "VmLocalVolumeCachePoolStatus" + since "5.5.6" + } + field { + name "Disconnected" + desc "" + type "VmLocalVolumeCachePoolStatus" + since "5.5.6" + } +} diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolVO.java b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolVO.java new file mode 100644 index 00000000000..6d1f58e3736 --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolVO.java @@ -0,0 +1,143 @@ +package org.zstack.header.localVolumeCache; + +import org.hibernate.annotations.NotFound; +import org.hibernate.annotations.NotFoundAction; +import org.zstack.header.host.HostEO; +import org.zstack.header.host.HostVO; +import org.zstack.header.vo.EntityGraph; +import org.zstack.header.vo.ForeignKey; +import org.zstack.header.vo.NoView; +import org.zstack.header.vo.ResourceVO; +import org.zstack.header.vo.ToInventory; + +import javax.persistence.*; +import java.sql.Timestamp; +import java.util.Set; + +@Entity +@Table +@EntityGraph( + parents = { + @EntityGraph.Neighbour(type = HostVO.class, myField = "hostUuid", targetField = "uuid") + } +) +public class VmLocalVolumeCachePoolVO extends ResourceVO implements ToInventory { + + @Column + @ForeignKey(parentEntityClass = HostEO.class, onDeleteAction = ForeignKey.ReferenceOption.CASCADE) + private String hostUuid; + + @Column + private String name; + + @Column + private String description; + + @Column(length = 2048) + private String metadata; + + @OneToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "uuid") + @NoView + private VmLocalVolumeCachePoolCapacityVO capacity; + + @Column + @Enumerated(EnumType.STRING) + private VmLocalVolumeCachePoolState state; + + @Column + @Enumerated(EnumType.STRING) + private VmLocalVolumeCachePoolStatus status; + + @OneToMany(fetch = FetchType.EAGER) + @NotFound(action = NotFoundAction.IGNORE) + @JoinColumn(name = "poolUuid", insertable = false, updatable = false) + private Set caches; + + @Column + private Timestamp createDate; + + @Column + private Timestamp lastOpDate; + + @PreUpdate + private void preUpdate() { + lastOpDate = null; + } + + public String getHostUuid() { + return hostUuid; + } + + public void setHostUuid(String hostUuid) { + this.hostUuid = hostUuid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getMetadata() { + return metadata; + } + + public void setMetadata(String metadata) { + this.metadata = metadata; + } + + public VmLocalVolumeCachePoolCapacityVO getCapacity() { + return capacity; + } + + public void setCapacity(VmLocalVolumeCachePoolCapacityVO capacity) { + this.capacity = capacity; + } + + public VmLocalVolumeCachePoolState getState() { + return state; + } + + public void setState(VmLocalVolumeCachePoolState state) { + this.state = state; + } + + public VmLocalVolumeCachePoolStatus getStatus() { + return status; + } + + public void setStatus(VmLocalVolumeCachePoolStatus status) { + this.status = status; + } + + public Set getCaches() { + return caches; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolVO_.java b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolVO_.java new file mode 100644 index 00000000000..3d62bf0f718 --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCachePoolVO_.java @@ -0,0 +1,19 @@ +package org.zstack.header.localVolumeCache; + +import org.zstack.header.vo.ResourceVO_; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; +import java.sql.Timestamp; + +@StaticMetamodel(VmLocalVolumeCachePoolVO.class) +public class VmLocalVolumeCachePoolVO_ extends ResourceVO_ { + public static volatile SingularAttribute hostUuid; + public static volatile SingularAttribute name; + public static volatile SingularAttribute description; + public static volatile SingularAttribute metadata; + public static volatile SingularAttribute state; + public static volatile SingularAttribute status; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; +} diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheState.java b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheState.java new file mode 100644 index 00000000000..ef4344ea151 --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheState.java @@ -0,0 +1,7 @@ +package org.zstack.header.localVolumeCache; + +public enum VmLocalVolumeCacheState { + None, + Uninstantiated, + Instantiated, +} diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheStateDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheStateDoc_zh_cn.groovy new file mode 100644 index 00000000000..a2ec9941de2 --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheStateDoc_zh_cn.groovy @@ -0,0 +1,27 @@ +package org.zstack.header.localVolumeCache + + + +doc { + + title "在这里输入结构的名称" + + field { + name "None" + desc "" + type "VmLocalVolumeCacheState" + since "5.5.6" + } + field { + name "Uninstantiated" + desc "" + type "VmLocalVolumeCacheState" + since "5.5.6" + } + field { + name "Instantiated" + desc "" + type "VmLocalVolumeCacheState" + since "5.5.6" + } +} diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheVO.java b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheVO.java new file mode 100644 index 00000000000..6b32363d39b --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheVO.java @@ -0,0 +1,112 @@ +package org.zstack.header.localVolumeCache; + +import org.zstack.header.vo.EntityGraph; +import org.zstack.header.vo.ForeignKey; +import org.zstack.header.vo.ResourceVO; +import org.zstack.header.vo.ToInventory; +import org.zstack.header.volume.VolumeEO; +import org.zstack.header.volume.VolumeVO; + +import javax.persistence.*; +import java.sql.Timestamp; + +@Entity +@Table(uniqueConstraints = { + @UniqueConstraint(columnNames = "volumeUuid") +}) +@EntityGraph( + parents = { + @EntityGraph.Neighbour(type = VolumeVO.class, myField = "volumeUuid", targetField = "uuid") + } +) +public class VmLocalVolumeCacheVO extends ResourceVO implements ToInventory { + + @Column + @ForeignKey(parentEntityClass = VolumeEO.class, onDeleteAction = ForeignKey.ReferenceOption.CASCADE) + private String volumeUuid; + + /** + * Nullable: null means this cache entry has not been assigned to a pool yet. + * References VmLocalVolumeCachePoolVO in kvm plugin — no @ForeignKey to avoid cross-module dependency. + */ + @Column + private String poolUuid; + + @Column(length = 2048) + private String installPath; + + @Column + @Enumerated(EnumType.STRING) + private VmLocalVolumeCacheMode cacheMode; + + @Column + @Enumerated(EnumType.STRING) + private VmLocalVolumeCacheState state; + + @Column + private Timestamp createDate; + + @Column + private Timestamp lastOpDate; + + @PreUpdate + private void preUpdate() { + lastOpDate = null; + } + + public String getVolumeUuid() { + return volumeUuid; + } + + public void setVolumeUuid(String volumeUuid) { + this.volumeUuid = volumeUuid; + } + + public String getPoolUuid() { + return poolUuid; + } + + public void setPoolUuid(String poolUuid) { + this.poolUuid = poolUuid; + } + + public String getInstallPath() { + return installPath; + } + + public void setInstallPath(String installPath) { + this.installPath = installPath; + } + + public VmLocalVolumeCacheMode getCacheMode() { + return cacheMode; + } + + public void setCacheMode(VmLocalVolumeCacheMode cacheMode) { + this.cacheMode = cacheMode; + } + + public VmLocalVolumeCacheState getState() { + return state; + } + + public void setState(VmLocalVolumeCacheState state) { + this.state = state; + } + + public Timestamp getCreateDate() { + return createDate; + } + + public void setCreateDate(Timestamp createDate) { + this.createDate = createDate; + } + + public Timestamp getLastOpDate() { + return lastOpDate; + } + + public void setLastOpDate(Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } +} diff --git a/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheVO_.java b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheVO_.java new file mode 100644 index 00000000000..a116f09dbe9 --- /dev/null +++ b/header/src/main/java/org/zstack/header/localVolumeCache/VmLocalVolumeCacheVO_.java @@ -0,0 +1,18 @@ +package org.zstack.header.localVolumeCache; + +import org.zstack.header.vo.ResourceVO_; + +import javax.persistence.metamodel.SingularAttribute; +import javax.persistence.metamodel.StaticMetamodel; +import java.sql.Timestamp; + +@StaticMetamodel(VmLocalVolumeCacheVO.class) +public class VmLocalVolumeCacheVO_ extends ResourceVO_ { + public static volatile SingularAttribute volumeUuid; + public static volatile SingularAttribute poolUuid; + public static volatile SingularAttribute installPath; + public static volatile SingularAttribute cacheMode; + public static volatile SingularAttribute state; + public static volatile SingularAttribute createDate; + public static volatile SingularAttribute lastOpDate; +} diff --git a/header/src/main/java/org/zstack/header/vm/APICreateVmInstanceMsg.java b/header/src/main/java/org/zstack/header/vm/APICreateVmInstanceMsg.java index d6c0a4fd7a7..fff482f3f55 100755 --- a/header/src/main/java/org/zstack/header/vm/APICreateVmInstanceMsg.java +++ b/header/src/main/java/org/zstack/header/vm/APICreateVmInstanceMsg.java @@ -209,6 +209,21 @@ public class APICreateVmInstanceMsg extends APICreateMessage implements APIAudit @APIParam(required = false) private Boolean virtio; + @APIParam(required = false) + private Boolean enableRootVolumeCache; + + @APIParam(required = false, validValues = {"WriteBack"}) + private String cacheMode; + + @APIParam(required = false) + private String rootVolumeCachePoolUuid; + + @APIParam(required = false, validValues = {"WriteBack"}) + private String rootVolumeCacheMode; + + @APIParam(required = false) + private Map dataDiskCacheConfigOnIndex; + @PythonClassInventory public static class DiskAO { private boolean boot; @@ -223,6 +238,9 @@ public static class DiskAO { private String sourceUuid; private List systemTags; private String name; + private Boolean enableCache; + private String cachePoolUuid; + private String cacheMode; public boolean isBoot() { return boot; @@ -319,6 +337,51 @@ public String getName() { public void setName(String name) { this.name = name; } + + public Boolean getEnableCache() { + return enableCache; + } + + public void setEnableCache(Boolean enableCache) { + this.enableCache = enableCache; + } + + public String getCachePoolUuid() { + return cachePoolUuid; + } + + public void setCachePoolUuid(String cachePoolUuid) { + this.cachePoolUuid = cachePoolUuid; + } + + public String getCacheMode() { + return cacheMode; + } + + public void setCacheMode(String cacheMode) { + this.cacheMode = cacheMode; + } + } + + public static class VolumeCacheConfig { + private String cachePoolUuid; + private String cacheMode; + + public String getCachePoolUuid() { + return cachePoolUuid; + } + + public void setCachePoolUuid(String cachePoolUuid) { + this.cachePoolUuid = cachePoolUuid; + } + + public String getCacheMode() { + return cacheMode; + } + + public void setCacheMode(String cacheMode) { + this.cacheMode = cacheMode; + } } @APIParam(required = false) @@ -561,6 +624,46 @@ public void setVirtio(boolean virtio) { this.virtio = virtio; } + public Boolean getEnableRootVolumeCache() { + return enableRootVolumeCache; + } + + public void setEnableRootVolumeCache(Boolean enableRootVolumeCache) { + this.enableRootVolumeCache = enableRootVolumeCache; + } + + public String getCacheMode() { + return cacheMode; + } + + public void setCacheMode(String cacheMode) { + this.cacheMode = cacheMode; + } + + public String getRootVolumeCachePoolUuid() { + return rootVolumeCachePoolUuid; + } + + public void setRootVolumeCachePoolUuid(String rootVolumeCachePoolUuid) { + this.rootVolumeCachePoolUuid = rootVolumeCachePoolUuid; + } + + public String getRootVolumeCacheMode() { + return rootVolumeCacheMode; + } + + public void setRootVolumeCacheMode(String rootVolumeCacheMode) { + this.rootVolumeCacheMode = rootVolumeCacheMode; + } + + public Map getDataDiskCacheConfigOnIndex() { + return dataDiskCacheConfigOnIndex; + } + + public void setDataDiskCacheConfigOnIndex(Map dataDiskCacheConfigOnIndex) { + this.dataDiskCacheConfigOnIndex = dataDiskCacheConfigOnIndex; + } + public static APICreateVmInstanceMsg __example__() { APICreateVmInstanceMsg msg = new APICreateVmInstanceMsg(); msg.setName("vm1"); diff --git a/header/src/main/java/org/zstack/header/vm/APICreateVmInstanceMsgDoc_zh_cn.groovy b/header/src/main/java/org/zstack/header/vm/APICreateVmInstanceMsgDoc_zh_cn.groovy index 2242d207b84..da5532b3872 100755 --- a/header/src/main/java/org/zstack/header/vm/APICreateVmInstanceMsgDoc_zh_cn.groovy +++ b/header/src/main/java/org/zstack/header/vm/APICreateVmInstanceMsgDoc_zh_cn.groovy @@ -329,6 +329,53 @@ doc { optional true since "4.7.0" } + column { + name "enableRootVolumeCache" + enclosedIn "params" + desc "" + location "body" + type "Boolean" + optional true + since "5.5.6" + } + column { + name "cacheMode" + enclosedIn "params" + desc "" + location "body" + type "String" + optional true + since "5.5.6" + values ("WriteBack") + } + column { + name "rootVolumeCachePoolUuid" + enclosedIn "params" + desc "" + location "body" + type "String" + optional true + since "5.5.6" + } + column { + name "rootVolumeCacheMode" + enclosedIn "params" + desc "" + location "body" + type "String" + optional true + since "5.5.6" + values ("WriteBack") + } + column { + name "dataDiskCacheConfigOnIndex" + enclosedIn "params" + desc "" + location "body" + type "Map" + optional true + since "5.5.6" + } } } diff --git a/header/src/main/java/org/zstack/header/vm/CreateVmInstanceMsg.java b/header/src/main/java/org/zstack/header/vm/CreateVmInstanceMsg.java index dc364097a8f..056b9f0ebdb 100755 --- a/header/src/main/java/org/zstack/header/vm/CreateVmInstanceMsg.java +++ b/header/src/main/java/org/zstack/header/vm/CreateVmInstanceMsg.java @@ -38,6 +38,11 @@ public class CreateVmInstanceMsg extends NeedReplyMessage implements CreateVmIns private String guestOsType; private String architecture; private Boolean virtio; + private Boolean enableRootVolumeCache; + private String cacheMode; + private String rootVolumeCachePoolUuid; + private String rootVolumeCacheMode; + private Map dataDiskCacheConfigOnIndex; private List rootVolumeSystemTags; private List dataVolumeSystemTags; private Map> dataVolumeSystemTagsOnIndex; @@ -384,4 +389,44 @@ public boolean getVirtio() { public void setVirtio(boolean virtio) { this.virtio = virtio; } + + public Boolean getEnableRootVolumeCache() { + return enableRootVolumeCache; + } + + public void setEnableRootVolumeCache(Boolean enableRootVolumeCache) { + this.enableRootVolumeCache = enableRootVolumeCache; + } + + public String getCacheMode() { + return cacheMode; + } + + public void setCacheMode(String cacheMode) { + this.cacheMode = cacheMode; + } + + public String getRootVolumeCachePoolUuid() { + return rootVolumeCachePoolUuid; + } + + public void setRootVolumeCachePoolUuid(String rootVolumeCachePoolUuid) { + this.rootVolumeCachePoolUuid = rootVolumeCachePoolUuid; + } + + public String getRootVolumeCacheMode() { + return rootVolumeCacheMode; + } + + public void setRootVolumeCacheMode(String rootVolumeCacheMode) { + this.rootVolumeCacheMode = rootVolumeCacheMode; + } + + public Map getDataDiskCacheConfigOnIndex() { + return dataDiskCacheConfigOnIndex; + } + + public void setDataDiskCacheConfigOnIndex(Map dataDiskCacheConfigOnIndex) { + this.dataDiskCacheConfigOnIndex = dataDiskCacheConfigOnIndex; + } } diff --git a/header/src/main/java/org/zstack/header/vm/InstantiateNewCreatedVmInstanceMsg.java b/header/src/main/java/org/zstack/header/vm/InstantiateNewCreatedVmInstanceMsg.java index f27bebf9802..6be4a6dd569 100755 --- a/header/src/main/java/org/zstack/header/vm/InstantiateNewCreatedVmInstanceMsg.java +++ b/header/src/main/java/org/zstack/header/vm/InstantiateNewCreatedVmInstanceMsg.java @@ -47,6 +47,11 @@ public void setCandidatePrimaryStorageUuidsForDataVolume(List candidateP } private List diskAOs; + private Boolean enableRootVolumeCache; + private String cacheMode; + private String rootVolumeCachePoolUuid; + private String rootVolumeCacheMode; + private Map dataDiskCacheConfigOnIndex; public List getDiskAOs() { return diskAOs; @@ -56,6 +61,46 @@ public void setDiskAOs(List diskAOs) { this.diskAOs = diskAOs; } + public Boolean getEnableRootVolumeCache() { + return enableRootVolumeCache; + } + + public void setEnableRootVolumeCache(Boolean enableRootVolumeCache) { + this.enableRootVolumeCache = enableRootVolumeCache; + } + + public String getCacheMode() { + return cacheMode; + } + + public void setCacheMode(String cacheMode) { + this.cacheMode = cacheMode; + } + + public String getRootVolumeCachePoolUuid() { + return rootVolumeCachePoolUuid; + } + + public void setRootVolumeCachePoolUuid(String rootVolumeCachePoolUuid) { + this.rootVolumeCachePoolUuid = rootVolumeCachePoolUuid; + } + + public String getRootVolumeCacheMode() { + return rootVolumeCacheMode; + } + + public void setRootVolumeCacheMode(String rootVolumeCacheMode) { + this.rootVolumeCacheMode = rootVolumeCacheMode; + } + + public Map getDataDiskCacheConfigOnIndex() { + return dataDiskCacheConfigOnIndex; + } + + public void setDataDiskCacheConfigOnIndex(Map dataDiskCacheConfigOnIndex) { + this.dataDiskCacheConfigOnIndex = dataDiskCacheConfigOnIndex; + } + public List getSoftAvoidHostUuids() { return softAvoidHostUuids; } diff --git a/header/src/main/java/org/zstack/header/vm/VmInstanceSpec.java b/header/src/main/java/org/zstack/header/vm/VmInstanceSpec.java index 7007c592aea..777949a5498 100755 --- a/header/src/main/java/org/zstack/header/vm/VmInstanceSpec.java +++ b/header/src/main/java/org/zstack/header/vm/VmInstanceSpec.java @@ -49,6 +49,9 @@ public static class VolumeSpec { private List tags; private String allocatedInstallUrl; private String associatedVolumeUuid; + private boolean enableVolumeCache; + private String cachePoolUuid; + private String cacheMode; public String getAssociatedVolumeUuid() { return associatedVolumeUuid; @@ -118,6 +121,30 @@ public void setTags(List tags) { public boolean isRoot() { return VolumeType.Root.toString().equals(type); } + + public boolean getEnableVolumeCache() { + return enableVolumeCache; + } + + public void setEnableVolumeCache(boolean enableVolumeCache) { + this.enableVolumeCache = enableVolumeCache; + } + + public String getCachePoolUuid() { + return cachePoolUuid; + } + + public void setCachePoolUuid(String cachePoolUuid) { + this.cachePoolUuid = cachePoolUuid; + } + + public String getCacheMode() { + return cacheMode; + } + + public void setCacheMode(String cacheMode) { + this.cacheMode = cacheMode; + } } public static class ImageSpec implements Serializable { @@ -405,6 +432,11 @@ public void setCandidatePrimaryStorageUuidsForDataVolume(List candidateP private List disableL3Networks; private List diskAOs; + private Boolean enableRootVolumeCache; + private String cacheMode; + private String rootVolumeCachePoolUuid; + private String rootVolumeCacheMode; + private Map dataDiskCacheConfigOnIndex; public List getDiskAOs() { return diskAOs; @@ -414,6 +446,46 @@ public void setDiskAOs(List diskAOs) { this.diskAOs = diskAOs; } + public Boolean getEnableRootVolumeCache() { + return enableRootVolumeCache; + } + + public void setEnableRootVolumeCache(Boolean enableRootVolumeCache) { + this.enableRootVolumeCache = enableRootVolumeCache; + } + + public String getCacheMode() { + return cacheMode; + } + + public void setCacheMode(String cacheMode) { + this.cacheMode = cacheMode; + } + + public String getRootVolumeCachePoolUuid() { + return rootVolumeCachePoolUuid; + } + + public void setRootVolumeCachePoolUuid(String rootVolumeCachePoolUuid) { + this.rootVolumeCachePoolUuid = rootVolumeCachePoolUuid; + } + + public String getRootVolumeCacheMode() { + return rootVolumeCacheMode; + } + + public void setRootVolumeCacheMode(String rootVolumeCacheMode) { + this.rootVolumeCacheMode = rootVolumeCacheMode; + } + + public Map getDataDiskCacheConfigOnIndex() { + return dataDiskCacheConfigOnIndex; + } + + public void setDataDiskCacheConfigOnIndex(Map dataDiskCacheConfigOnIndex) { + this.dataDiskCacheConfigOnIndex = dataDiskCacheConfigOnIndex; + } + public boolean isSkipIpAllocation() { return skipIpAllocation; } diff --git a/header/src/main/java/org/zstack/header/volume/VolumeAO.java b/header/src/main/java/org/zstack/header/volume/VolumeAO.java index 3ddcdbccad3..73f65b3d8a1 100755 --- a/header/src/main/java/org/zstack/header/volume/VolumeAO.java +++ b/header/src/main/java/org/zstack/header/volume/VolumeAO.java @@ -1,12 +1,14 @@ package org.zstack.header.volume; +import org.hibernate.annotations.NotFound; +import org.hibernate.annotations.NotFoundAction; import org.zstack.header.configuration.DiskOfferingEO; +import org.zstack.header.localVolumeCache.VmLocalVolumeCacheVO; import org.zstack.header.storage.primary.PrimaryStorageEO; +import org.zstack.header.vo.*; import org.zstack.header.vo.ForeignKey; import org.zstack.header.vo.ForeignKey.ReferenceOption; import org.zstack.header.vo.Index; -import org.zstack.header.vo.ResourceVO; -import org.zstack.header.vo.ShadowEntity; import javax.persistence.*; import java.sql.Timestamp; @@ -86,6 +88,11 @@ public class VolumeAO extends ResourceVO implements ShadowEntity { @Column private String protocol; + @OneToOne(fetch = FetchType.EAGER) + @NotFound(action = NotFoundAction.IGNORE) + @JoinColumn(name = "uuid", referencedColumnName = "volumeUuid", insertable = false, updatable = false) + private VmLocalVolumeCacheVO localVolumeCache; + @Transient private VolumeAO shadow; @@ -199,6 +206,10 @@ public boolean isMemoryVolume() { return type == VolumeType.Memory; } + public boolean isLocalCached() { + return localVolumeCache != null; + } + public long getSize() { return size; } @@ -298,4 +309,12 @@ public String getProtocol() { public void setProtocol(String protocol) { this.protocol = protocol; } + + public VmLocalVolumeCacheVO getLocalVolumeCache() { + return localVolumeCache; + } + + public void setLocalVolumeCache(VmLocalVolumeCacheVO localVolumeCache) { + this.localVolumeCache = localVolumeCache; + } } diff --git a/header/src/main/java/org/zstack/header/volume/VolumeInventory.java b/header/src/main/java/org/zstack/header/volume/VolumeInventory.java index 96d2ae67a62..2dae3c5efb8 100755 --- a/header/src/main/java/org/zstack/header/volume/VolumeInventory.java +++ b/header/src/main/java/org/zstack/header/volume/VolumeInventory.java @@ -4,6 +4,7 @@ import org.zstack.header.configuration.DiskOfferingInventory; import org.zstack.header.configuration.PythonClassInventory; import org.zstack.header.image.ImageInventory; +import org.zstack.header.localVolumeCache.VmLocalVolumeCacheInventory; import org.zstack.header.query.ExpandedQueries; import org.zstack.header.query.ExpandedQuery; import org.zstack.header.search.Inventory; @@ -156,6 +157,8 @@ public class VolumeInventory implements Serializable { private Timestamp lastAttachDate; private String protocol; + private VmLocalVolumeCacheInventory localVolumeCache; + public VolumeInventory() { } @@ -183,6 +186,7 @@ public VolumeInventory(VolumeInventory other) { this.lastVmInstanceUuid = other.lastVmInstanceUuid; this.lastAttachDate = other.lastAttachDate; this.protocol = other.protocol; + this.localVolumeCache = other.localVolumeCache; } @@ -213,6 +217,9 @@ public VolumeInventory(VolumeInventory other) { inv.setLastVmInstanceUuid(vo.getLastVmInstanceUuid()); inv.setLastAttachDate(vo.getLastAttachDate()); inv.setProtocol(vo.getProtocol()); + if(vo.getLocalVolumeCache() != null) { + inv.setLocalVolumeCache(vo.getLocalVolumeCache().toInventory()); + } return inv; } @@ -437,4 +444,16 @@ public String getProtocol() { public void setProtocol(String protocol) { this.protocol = protocol; } + + public VmLocalVolumeCacheInventory getLocalVolumeCache() { + return localVolumeCache; + } + + public void setLocalVolumeCache(VmLocalVolumeCacheInventory localVolumeCache) { + this.localVolumeCache = localVolumeCache; + } + + public boolean isLocalCached() { + return localVolumeCache != null; + } } diff --git a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java index fe0f69a848a..5568791027f 100644 --- a/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java +++ b/plugin/cbd/src/main/java/org/zstack/cbd/kvm/KvmCbdNodeServer.java @@ -281,6 +281,11 @@ private KVMAgentCommands.IsoTO convertIsoIfNeeded( VmInstanceSpec.IsoSpec isoSpe return isoTO; } + @Override + public void preBeforeAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.AttachDataVolumeCmd cmd, Map data, Completion completion) { + completion.success(); + } + @Override public void beforeAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.AttachDataVolumeCmd cmd, Map data) { cmd.setVolume(convertVolumeIfNeeded(volume, host, cmd.getVolume())); diff --git a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java index 682fc9dadf2..108e155a544 100755 --- a/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java +++ b/plugin/ceph/src/main/java/org/zstack/storage/ceph/primary/CephPrimaryStorageFactory.java @@ -446,6 +446,11 @@ public VolumeTO convertVolumeIfNeed(KVMHostInventory host, VolumeInventory inven return convertVolumeToCephIfNeeded(inventory, to); } + @Override + public void preBeforeAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, AttachDataVolumeCmd cmd, Map data, Completion completion) { + completion.success(); + } + @Override public void beforeAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, AttachDataVolumeCmd cmd, Map data) { cmd.setVolume(convertVolumeToCephIfNeeded(volume, cmd.getVolume())); diff --git a/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java b/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java index 66936e05dc0..cae0fec1f16 100644 --- a/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java +++ b/plugin/iscsi/src/main/java/org/zstack/iscsi/kvm/KvmIscsiNodeServer.java @@ -179,6 +179,11 @@ public void afterDetachVolume(KVMHostInventory host, VmInstanceInventory vm, Vol @Override public void detachVolumeFailed(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.DetachDataVolumeCmd cmd, ErrorCode err) { } + @Override + public void preBeforeAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.AttachDataVolumeCmd cmd, Map data, Completion completion) { + completion.success(); + } + @Override public void beforeAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.AttachDataVolumeCmd cmd, Map data) { cmd.setVolume(convertVolumeIfNeeded(volume, host, cmd.getVolume())); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/CacheTO.java b/plugin/kvm/src/main/java/org/zstack/kvm/CacheTO.java new file mode 100644 index 00000000000..b6e98cf271b --- /dev/null +++ b/plugin/kvm/src/main/java/org/zstack/kvm/CacheTO.java @@ -0,0 +1,51 @@ +package org.zstack.kvm; + +import org.zstack.header.localVolumeCache.VmLocalVolumeCacheInventory; + +public class CacheTO extends BaseVirtualDeviceTO { + private String cacheUuid; + private String poolUuid; + private String installPath; + private String cacheMode; + + public String getCacheUuid() { + return cacheUuid; + } + + public void setCacheUuid(String cacheUuid) { + this.cacheUuid = cacheUuid; + } + + public String getPoolUuid() { + return poolUuid; + } + + public void setPoolUuid(String poolUuid) { + this.poolUuid = poolUuid; + } + + public String getInstallPath() { + return installPath; + } + + public void setInstallPath(String installPath) { + this.installPath = installPath; + } + + public String getCacheMode() { + return cacheMode; + } + + public void setCacheMode(String cacheMode) { + this.cacheMode = cacheMode; + } + + public static CacheTO valueOf(VmLocalVolumeCacheInventory inv) { + CacheTO to = new CacheTO(); + to.setCacheUuid(inv.getUuid()); + to.setPoolUuid(inv.getPoolUuid()); + to.setInstallPath(inv.getInstallPath()); + to.setCacheMode(inv.getCacheMode().name()); + return to; + } +} diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index a8a1378288b..c8d545db6aa 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -8,8 +8,10 @@ import org.zstack.header.HasThreadContext; import org.zstack.header.agent.CancelCommand; import org.zstack.header.core.validation.Validation; +import org.zstack.header.host.HostBlockDeviceStruct; import org.zstack.header.host.HostNUMANode; import org.zstack.header.host.VmNicRedirectConfig; +import org.zstack.header.localVolumeCache.CachePoolMetadata; import org.zstack.header.log.NoLogging; import org.zstack.header.vm.*; import org.zstack.header.vm.devices.DeviceAddress; @@ -5185,4 +5187,216 @@ public void setMemoryUsage(long memoryUsage) { } } + // ======================================================================== + // Local Volume Cache — Command Definitions + // ======================================================================== + + public static class InitPoolCmd extends AgentCommand { + public String poolUuid; + public String mountPoint; + public boolean force; + public List pvs; + } + + public static class ConnectPoolCmd extends AgentCommand { + public String poolUuid; + public String mountPoint; + public boolean force; + } + + public static class ExtendPoolCmd extends AgentCommand { + public String poolUuid; + public String mountPoint; + public boolean force; + public List pvs; + } + + public static class DeletePoolCmd extends AgentCommand { + public String poolUuid; + public String mountPoint; + public boolean force; + } + + public static class CheckPoolCmd extends AgentCommand { + public String poolUuid; + public String mountPoint; + public boolean force; + } + + public static class GetPoolCapacityCmd extends AgentCommand { + public String poolUuid; + public String mountPoint; + public boolean force; + } + + public static class GCPoolCmd extends AgentCommand { + public String poolUuid; + public String mountPoint; + public boolean force; + public List volumes; + } + + public static class AllocateCacheCmd extends AgentCommand { + public String poolUuid; + public VolumeTO volume; + } + + public static class DeleteCacheCmd extends AgentCommand { + public String poolUuid; + public VolumeTO volume; + } + + public static class FlushCacheCmd extends AgentCommand { + public String poolUuid; + public VolumeTO volume; + } + + public static class GetCacheCapacityCmd extends AgentCommand { + public String poolUuid; + public VolumeTO volume; + } + + public static class AttachVolumeCacheCmd extends AgentCommand { + public String instanceUuid; + public VolumeTO volume; + } + + public static class DetachVolumeCacheCmd extends AgentCommand implements HasThreadContext { + public String instanceUuid; + public VolumeTO volume; + } + + // ======================================================================== + // Local Volume Cache — Ref Structures + // ======================================================================== + + public static class PVRef { + public String pvUuid; + public String pvName; + public String pvDevicePath; + } + + public static class PVHealthRef extends PVRef { + public Boolean healthy; + } + + public static class VGRef { + public String vgUuid; + public String vgName; + } + + public static class LVRef { + public String lvUuid; + public String lvName; + public String lvPath; + } + + public static class FileSystemRef { + public String fsUuid; + public String fsType; + } + + public static class VolumeRef { + public String volumeUuid; + public String installPath; + public String deviceType; + public String format; + public Long size; + } + + // ======================================================================== + // Local Volume Cache — Response Definitions + // ======================================================================== + + public static class PoolRsp extends AgentResponse { + public String poolUuid; + public String mountPoint; + public List pvs; + public VGRef vg; + public LVRef lv; + public FileSystemRef filesystem; + + public CachePoolMetadata toCachePoolMetadata() { + CachePoolMetadata metadata = new CachePoolMetadata(); + if (pvs != null) { + List pvRefs = pvs.stream().map(pv -> { + CachePoolMetadata.PVRef ref = new CachePoolMetadata.PVRef(); + ref.setPvUuid(pv.pvUuid); + ref.setPvName(pv.pvName); + ref.setPvDevicePath(pv.pvDevicePath); + return ref; + }).collect(Collectors.toList()); + metadata.setPvs(pvRefs); + } + if (vg != null) { + CachePoolMetadata.VGRef vgRef = new CachePoolMetadata.VGRef(); + vgRef.setVgUuid(vg.vgUuid); + vgRef.setVgName(vg.vgName); + metadata.setVg(vgRef); + } + if (lv != null) { + CachePoolMetadata.LVRef lvRef = new CachePoolMetadata.LVRef(); + lvRef.setLvUuid(lv.lvUuid); + lvRef.setLvName(lv.lvName); + lvRef.setLvPath(lv.lvPath); + metadata.setLv(lvRef); + } + if (filesystem != null) { + CachePoolMetadata.FileSystemRef fsRef = new CachePoolMetadata.FileSystemRef(); + fsRef.setFsUuid(filesystem.fsUuid); + fsRef.setFsType(filesystem.fsType); + metadata.setFilesystem(fsRef); + } + return metadata; + } + } + + public static class PoolHealthRsp extends AgentResponse { + public Boolean healthy; + public List pvs; + public Boolean vg; + public Boolean lv; + public Boolean filesystem; + } + + public static class PoolCapacityRsp extends AgentResponse { + public Long total; + public Long used; + public Long available; + public Long allocated; + public Long dirty; + } + + public static class CacheRsp extends AgentResponse { + public String installPath; + public Long virtualSize; + public Long actualSize; + } + + public static class GCPoolRsp extends AgentResponse { + public List gcFiles; + public Integer gcCount; + } + + public static class AttachVolumeCacheRsp extends AgentResponse { + } + + public static class DetachVolumeCacheRsp extends AgentResponse { + } + + public static class GetBlockDevicesCmd extends AgentCommand { + } + + public static class GetBlockDevicesRsp extends AgentResponse { + private List blockDevices; + + public List getBlockDevices() { + return blockDevices; + } + + public void setBlockDevices(List blockDevices) { + this.blockDevices = blockDevices; + } + } + } diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMApiInterceptor.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMApiInterceptor.java index 93fd688935b..408cc0fb0bd 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMApiInterceptor.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMApiInterceptor.java @@ -90,7 +90,6 @@ private void validate(APICreateVmUserDefinedXmlHookScriptMsg msg) { } } - private void validate(APIAddKVMHostMsg msg) { SimpleQuery q = dbf.createQuery(KVMHostVO.class); q.add(KVMHostVO_.managementIp, Op.EQ, msg.getManagementIp()); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAttachVolumeExtensionPoint.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAttachVolumeExtensionPoint.java index 7e3cf475e6c..ab965912748 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAttachVolumeExtensionPoint.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAttachVolumeExtensionPoint.java @@ -1,5 +1,6 @@ package org.zstack.kvm; +import org.zstack.header.core.Completion; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.vm.VmInstanceInventory; import org.zstack.header.volume.VolumeInventory; @@ -11,6 +12,8 @@ * Created by frank on 4/24/2015. */ public interface KVMAttachVolumeExtensionPoint extends KVMConvertVolumeExtensionPoint { + void preBeforeAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, AttachDataVolumeCmd cmd, Map data, Completion completion); + void beforeAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, AttachDataVolumeCmd cmd, Map data); void afterAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, AttachDataVolumeCmd cmd); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java index 1b2df9f8f2a..ef2974bc6d8 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMConstant.java @@ -89,6 +89,7 @@ public interface KVMConstant { String GET_VIRTUALIZER_INFO_PATH = "/vm/getvirtualizerinfo"; String KVM_SCAN_VM_PORT_STATUS = "/host/vm/scanport"; String GET_DEV_CAPACITY = "/host/dev/capacity"; + String KVM_GET_BLOCK_DEVICES_PATH = "/host/blockdevices"; String KVM_CONFIG_PRIMARY_VM_PATH = "/primary/vm/config"; String KVM_CONFIG_SECONDARY_VM_PATH = "/secondary/vm/config"; String KVM_START_COLO_SYNC_PATH = "/start/colo/sync"; @@ -96,6 +97,22 @@ public interface KVMConstant { String CLEAN_FIRMWARE_FLASH = "/clean/firmware/flash"; String FSTRIM_VM_PATH = "/vm/fstrim"; + String LOCAL_VOLUME_CACHE_INIT_POOL_PATH = "/localvolumecache/pool/init"; + String LOCAL_VOLUME_CACHE_CONNECT_POOL_PATH = "/localvolumecache/pool/connect"; + String LOCAL_VOLUME_CACHE_EXTEND_POOL_PATH = "/localvolumecache/pool/extend"; + String LOCAL_VOLUME_CACHE_DELETE_POOL_PATH = "/localvolumecache/pool/delete"; + String LOCAL_VOLUME_CACHE_CHECK_POOL_PATH = "/localvolumecache/pool/check"; + String LOCAL_VOLUME_CACHE_GET_POOL_CAPACITY_PATH = "/localvolumecache/pool/getcapacity"; + String LOCAL_VOLUME_CACHE_GC_POOL_PATH = "/localvolumecache/pool/gc"; + + String LOCAL_VOLUME_CACHE_CREATE_CACHE_PATH = "/localvolumecache/create"; + String LOCAL_VOLUME_CACHE_DELETE_CACHE_PATH = "/localvolumecache/delete"; + String LOCAL_VOLUME_CACHE_FLUSH_CACHE_PATH = "/localvolumecache/flush"; + String LOCAL_VOLUME_CACHE_GET_CACHE_CAPACITY_PATH = "/localvolumecache/getcapacity"; + + String KVM_ATTACH_VOLUME_CACHE_PATH = "/vm/volume/cache/attach"; + String KVM_DETACH_VOLUME_CACHE_PATH = "/vm/volume/cache/detach"; + String ISO_TO = "kvm.isoto"; String ANSIBLE_PLAYBOOK_NAME = "kvm.py"; String ANSIBLE_MODULE_PATH = "ansible/kvm"; diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMExtensionEmitter.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMExtensionEmitter.java index 0e723cd16aa..02edfa4504b 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMExtensionEmitter.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMExtensionEmitter.java @@ -392,6 +392,12 @@ public void afterMergeSnapshotFailed(KVMHostInventory host, MergeVolumeSnapshotO } } + public void preBeforeAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory vol, AttachDataVolumeCmd cmd, Map data, Completion completion) { + for (KVMAttachVolumeExtensionPoint ext : attachVolumeExts) { + ext.preBeforeAttachVolume(host, vm, vol, cmd, data, completion); + } + } + public void beforeAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory vol, AttachDataVolumeCmd cmd, Map data) { for (KVMAttachVolumeExtensionPoint ext : attachVolumeExts) { ext.beforeAttachVolume(host, vm, vol, cmd, data); diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java index a245757517d..82593ed43bc 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMHost.java @@ -1,6 +1,7 @@ package org.zstack.kvm; import okhttp3.Response; + import org.apache.commons.lang.StringUtils; import org.apache.logging.log4j.util.Strings; import org.springframework.beans.factory.annotation.Autowired; @@ -215,6 +216,7 @@ public class KVMHost extends HostBase implements Host { private String getVirtualizerInfo; private String scanVmPortPath; private String getDevCapacityPath; + private String getBlockDevicesPath; private String configPrimaryVmPath; private String configSecondaryVmPath; private String startColoSyncPath; @@ -411,6 +413,10 @@ public KVMHost(KVMHostVO self, KVMHostContext context) { ub.path(KVMConstant.GET_DEV_CAPACITY); getDevCapacityPath = ub.build().toString(); + ub = UriComponentsBuilder.fromHttpUrl(baseUrl); + ub.path(KVMConstant.KVM_GET_BLOCK_DEVICES_PATH); + getBlockDevicesPath = ub.build().toString(); + ub = UriComponentsBuilder.fromHttpUrl(baseUrl); ub.path(KVMConstant.KVM_CONFIG_PRIMARY_VM_PATH); configPrimaryVmPath = ub.build().toString(); @@ -702,11 +708,36 @@ protected void handleLocalMessage(Message msg) { handle((RestartKvmAgentMsg) msg); } else if (msg instanceof UpdateVmConsolePasswordOnHypervisorMsg) { handle((UpdateVmConsolePasswordOnHypervisorMsg) msg); + } else if (msg instanceof GetBlockDevicesOnHostMsg) { + handle((GetBlockDevicesOnHostMsg) msg); } else { super.handleLocalMessage(msg); } } + private void handle(GetBlockDevicesOnHostMsg msg) { + GetBlockDevicesOnHostReply reply = new GetBlockDevicesOnHostReply(); + KVMAgentCommands.GetBlockDevicesCmd cmd = new KVMAgentCommands.GetBlockDevicesCmd(); + new Http<>(getBlockDevicesPath, cmd, KVMAgentCommands.GetBlockDevicesRsp.class) + .call(new ReturnValueCompletion(msg) { + @Override + public void success(KVMAgentCommands.GetBlockDevicesRsp rsp) { + if (!rsp.isSuccess()) { + reply.setError(operr("operation error, because:%s", rsp.getError())); + } else { + reply.setBlockDevices(rsp.getBlockDevices()); + } + bus.reply(msg, reply); + } + + @Override + public void fail(ErrorCode errorCode) { + reply.setError(errorCode); + bus.reply(msg, reply); + } + }); + } + private void handle(RestartKvmAgentMsg msg) { RestartKvmAgentReply reply = new RestartKvmAgentReply(); thdf.singleFlightSubmit(new SingleFlightTask(msg) @@ -3675,31 +3706,86 @@ protected void attachVolume(final AttachVolumeToVmOnHypervisorMsg msg, final NoE cmd.setVmUuid(msg.getVmInventory().getUuid()); cmd.getAddons().put("attachedDataVolumes", VolumeTO.valueOf(msg.getAttachedDataVolumes(), host)); Map data = new HashMap(); - extEmitter.beforeAttachVolume((KVMHostInventory) getSelfInventory(), vm, vol, cmd, data); - new Http<>(attachDataVolumePath, cmd, AttachDataVolumeResponse.class).call(new ReturnValueCompletion(msg, completion) { - @Override - public void success(AttachDataVolumeResponse ret) { - if (!ret.isSuccess()) { - reply.setError(operr(ORG_ZSTACK_KVM_10069, "failed to attach data volume[uuid:%s, installPath:%s] to vm[uuid:%s, name:%s]" + - " on kvm host[uuid:%s, ip:%s], because %s", vol.getUuid(), vol.getInstallPath(), vm.getUuid(), vm.getName(), - getSelf().getUuid(), getSelf().getManagementIp(), ret.getError())); - extEmitter.attachVolumeFailed((KVMHostInventory) getSelfInventory(), vm, vol, cmd, reply.getError(), data); - } else { - extEmitter.afterAttachVolume((KVMHostInventory) getSelfInventory(), vm, vol, cmd); - reply.setVirtualDeviceInfoList(ret.getVirtualDeviceInfoList()); - } - bus.reply(msg, reply); - completion.done(); - } + FlowChain chain = FlowChainBuilder.newSimpleFlowChain(); + chain.setName(String.format("attach-volume-%s", msg.getInventory().getUuid())); + chain.then(new ShareFlow() { @Override - public void fail(ErrorCode err) { - extEmitter.attachVolumeFailed((KVMHostInventory) getSelfInventory(), vm, vol, cmd, err, data); - reply.setError(err); - bus.reply(msg, reply); - completion.done(); + public void setup() { + flow(new NoRollbackFlow() { + String __name__ = String.format("execute-pre-before-attach-volume-extension-point-for-volume-%s", vol.getUuid()); + @Override + public void run(FlowTrigger trigger, Map flowData) { + extEmitter.preBeforeAttachVolume((KVMHostInventory) getSelfInventory(), vm, vol, cmd, data, new Completion(trigger) { + @Override + public void success() { + trigger.next(); + } + + @Override + public void fail(ErrorCode errorCode) { + trigger.fail(errorCode); + } + }); + } + }); + + flow(new NoRollbackFlow() { + String __name__ = String.format("execute-before-attach-volume-extension-point-for-volume-%s", vol.getUuid()); + @Override + public void run(FlowTrigger trigger, Map flowData) { + extEmitter.beforeAttachVolume((KVMHostInventory) getSelfInventory(), vm, vol, cmd, data); + trigger.next(); + } + }); + + flow(new NoRollbackFlow() { + String __name__ = String.format("attach-volume-%s-on-kvm-host-%s", vol.getUuid(), getSelf().getUuid()); + @Override + public void run(FlowTrigger trigger, Map flowData) { + new Http<>(attachDataVolumePath, cmd, AttachDataVolumeResponse.class).call(new ReturnValueCompletion(msg, trigger) { + @Override + public void success(AttachDataVolumeResponse ret) { + if (!ret.isSuccess()) { + trigger.fail(operr(ORG_ZSTACK_KVM_10069, "failed to attach data volume[uuid:%s, installPath:%s] to vm[uuid:%s, name:%s]" + + " on kvm host[uuid:%s, ip:%s], because %s", vol.getUuid(), vol.getInstallPath(), vm.getUuid(), vm.getName(), + getSelf().getUuid(), getSelf().getManagementIp(), ret.getError())); + } else { + flowData.put("virtualDeviceInfoList", ret.getVirtualDeviceInfoList()); + trigger.next(); + } + } + + @Override + public void fail(ErrorCode err) { + trigger.fail(err); + } + }); + } + }); + + done(new FlowDoneHandler(completion) { + @Override + public void handle(Map flowData) { + extEmitter.afterAttachVolume((KVMHostInventory) getSelfInventory(), vm, vol, cmd); + List virtualDeviceInfoList = (List) flowData.get("virtualDeviceInfoList"); + reply.setVirtualDeviceInfoList(virtualDeviceInfoList); + bus.reply(msg, reply); + completion.done(); + } + }); + + error(new FlowErrorHandler(completion) { + @Override + public void handle(ErrorCode errCode, Map flowData) { + extEmitter.attachVolumeFailed((KVMHostInventory) getSelfInventory(), vm, vol, cmd, errCode, data); + reply.setError(errCode); + bus.reply(msg, reply); + completion.done(); + } + }); } - }); + }).start(); } private void handle(final DestroyVmOnHypervisorMsg msg) { diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/VolumeTO.java b/plugin/kvm/src/main/java/org/zstack/kvm/VolumeTO.java index 2ea9238f167..3ee4a80e0ea 100644 --- a/plugin/kvm/src/main/java/org/zstack/kvm/VolumeTO.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/VolumeTO.java @@ -4,6 +4,7 @@ import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.Q; import org.zstack.header.image.ImagePlatform; +import org.zstack.header.localVolumeCache.VmLocalVolumeCacheInventory; import org.zstack.header.storage.primary.PrimaryStorageVO; import org.zstack.header.storage.primary.PrimaryStorageVO_; import org.zstack.header.vm.VmInstanceVO; @@ -32,6 +33,7 @@ public class VolumeTO extends BaseVirtualDeviceTO { public static List exts; private String installPath; + private Long size; private int deviceId; private String deviceType = FILE; private String volumeUuid; @@ -52,6 +54,8 @@ public class VolumeTO extends BaseVirtualDeviceTO { private int ioThreadId; private String ioThreadPin; private int controllerIndex; + private CacheTO cache; + static { deviceTypes.put(VolumeProtocol.Vhost, VHOST); @@ -63,6 +67,7 @@ public VolumeTO() { public VolumeTO(VolumeTO other) { this.installPath = other.installPath; + this.size = other.size; this.deviceId = other.deviceId; this.deviceType = other.deviceType; this.volumeUuid = other.volumeUuid; @@ -81,6 +86,7 @@ public VolumeTO(VolumeTO other) { this.ioThreadId = other.ioThreadId; this.ioThreadPin = other.ioThreadPin; this.controllerIndex = other.controllerIndex; + this.cache = other.cache; } public static List valueOf(List vols, KVMHostInventory host) { @@ -99,6 +105,7 @@ public static VolumeTO valueOf(VolumeInventory vol, KVMHostInventory host, Strin VolumeTO to = new VolumeTO(); to.setResourceUuid(vol.getUuid()); to.setInstallPath(vol.getInstallPath()); + to.setSize(vol.getSize()); if (vol.getDeviceId() != null) { to.setDeviceId(vol.getDeviceId()); } @@ -136,7 +143,13 @@ public static VolumeTO valueOf(VolumeInventory vol, KVMHostInventory host, Strin } for (KVMConvertVolumeExtensionPoint ext : exts) { to = ext.convertVolumeIfNeed(host, vol, to); - } + } + + VmLocalVolumeCacheInventory cacheInv = vol.getLocalVolumeCache(); + if (cacheInv != null){ + CacheTO cacheTO = CacheTO.valueOf(cacheInv); + to.setCache(cacheTO); + } return to; } @@ -202,6 +215,10 @@ public void setInstallPath(String installPath) { this.installPath = installPath; } + public Long getSize() { return size; } + + public void setSize(Long size) { this.size = size; } + public int getDeviceId() { return deviceId; } @@ -297,4 +314,12 @@ public int getControllerIndex() { public void setControllerIndex(int controllerIndex) { this.controllerIndex = controllerIndex; } + + public CacheTO getCache() { + return cache; + } + + public void setCache(CacheTO cache) { + this.cache = cache; + } } diff --git a/plugin/vhost/src/main/java/org/zstack/vhost/kvm/KvmVhostNodeServer.java b/plugin/vhost/src/main/java/org/zstack/vhost/kvm/KvmVhostNodeServer.java index 8de40283c07..3d2a57cf394 100644 --- a/plugin/vhost/src/main/java/org/zstack/vhost/kvm/KvmVhostNodeServer.java +++ b/plugin/vhost/src/main/java/org/zstack/vhost/kvm/KvmVhostNodeServer.java @@ -6,6 +6,7 @@ import org.zstack.core.componentloader.PluginRegistry; import org.zstack.core.db.DatabaseFacade; import org.zstack.header.Component; +import org.zstack.header.core.Completion; import org.zstack.header.errorcode.ErrorCode; import org.zstack.header.errorcode.OperationFailureException; import org.zstack.header.host.HostInventory; @@ -160,6 +161,11 @@ public void afterDetachVolume(KVMHostInventory host, VmInstanceInventory vm, Vol @Override public void detachVolumeFailed(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.DetachDataVolumeCmd cmd, ErrorCode err) {} + @Override + public void preBeforeAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.AttachDataVolumeCmd cmd, Map data, Completion completion) { + completion.success(); + } + @Override public void beforeAttachVolume(KVMHostInventory host, VmInstanceInventory vm, VolumeInventory volume, KVMAgentCommands.AttachDataVolumeCmd cmd, Map data) { cmd.setVolume(convertVolumeIfNeeded(volume, host, cmd.getVolume())); diff --git a/sdk/src/main/java/SourceClassMap.java b/sdk/src/main/java/SourceClassMap.java index 4bbd9238f98..9c9948250b3 100644 --- a/sdk/src/main/java/SourceClassMap.java +++ b/sdk/src/main/java/SourceClassMap.java @@ -264,6 +264,7 @@ public class SourceClassMap { put("org.zstack.header.flowMeter.NetworkRouterFlowMeterRefInventory", "org.zstack.sdk.NetworkRouterFlowMeterRefInventory"); put("org.zstack.header.host.AddHostFromFileResult", "org.zstack.sdk.AddHostFromFileResult"); put("org.zstack.header.host.CpuArchitecture", "org.zstack.sdk.CpuArchitecture"); + put("org.zstack.header.host.HostBlockDeviceStruct", "org.zstack.sdk.HostBlockDeviceStruct"); put("org.zstack.header.host.HostInventory", "org.zstack.sdk.HostInventory"); put("org.zstack.header.host.HostIpmiInventory", "org.zstack.sdk.HostIpmiInventory"); put("org.zstack.header.host.HostNUMANode", "org.zstack.sdk.HostNUMANode"); @@ -309,6 +310,12 @@ public class SourceClassMap { put("org.zstack.header.image.ImageGroupInventory", "org.zstack.sdk.ImageGroupInventory"); put("org.zstack.header.image.ImageGroupRefInventory", "org.zstack.sdk.ImageGroupRefInventory"); put("org.zstack.header.image.ImageInventory", "org.zstack.sdk.ImageInventory"); + put("org.zstack.header.localVolumeCache.VmLocalVolumeCacheInventory", "org.zstack.sdk.VmLocalVolumeCacheInventory"); + put("org.zstack.header.localVolumeCache.VmLocalVolumeCacheMode", "org.zstack.sdk.VmLocalVolumeCacheMode"); + put("org.zstack.header.localVolumeCache.VmLocalVolumeCachePoolInventory", "org.zstack.sdk.VmLocalVolumeCachePoolInventory"); + put("org.zstack.header.localVolumeCache.VmLocalVolumeCachePoolState", "org.zstack.sdk.VmLocalVolumeCachePoolState"); + put("org.zstack.header.localVolumeCache.VmLocalVolumeCachePoolStatus", "org.zstack.sdk.VmLocalVolumeCachePoolStatus"); + put("org.zstack.header.localVolumeCache.VmLocalVolumeCacheState", "org.zstack.sdk.VmLocalVolumeCacheState"); put("org.zstack.header.longjob.LongJobInventory", "org.zstack.sdk.LongJobInventory"); put("org.zstack.header.longjob.LongJobState", "org.zstack.sdk.LongJobState"); put("org.zstack.header.managementnode.ManagementNodeInventory", "org.zstack.sdk.ManagementNodeInventory"); @@ -480,6 +487,7 @@ public class SourceClassMap { put("org.zstack.ipsec.IPsecPeerCidrInventory", "org.zstack.sdk.IPsecPeerCidrInventory"); put("org.zstack.kvm.APIKvmRunShellEvent$ShellResult", "org.zstack.sdk.ShellResult"); put("org.zstack.kvm.BaseVirtualDeviceTO", "org.zstack.sdk.BaseVirtualDeviceTO"); + put("org.zstack.kvm.CacheTO", "org.zstack.sdk.CacheTO"); put("org.zstack.kvm.KVMAgentCommands$CdRomTO", "org.zstack.sdk.CdRomTO"); put("org.zstack.kvm.KVMAgentCommands$IsoTO", "org.zstack.sdk.IsoTO"); put("org.zstack.kvm.KVMAgentCommands$NicTO", "org.zstack.sdk.NicTO"); @@ -978,6 +986,7 @@ public class SourceClassMap { put("org.zstack.sdk.CCSCertificateUserRefInventory", "org.zstack.crypto.ccs.CCSCertificateUserRefInventory"); put("org.zstack.sdk.CCSCertificateUserState", "org.zstack.crypto.ccs.CCSCertificateUserState"); put("org.zstack.sdk.CSPSecretResourcePoolInventory", "org.zstack.crypto.securitymachine.thirdparty.csp.CSPSecretResourcePoolInventory"); + put("org.zstack.sdk.CacheTO", "org.zstack.kvm.CacheTO"); put("org.zstack.sdk.CasClientInventory", "org.zstack.sso.header.CasClientInventory"); put("org.zstack.sdk.CasState", "org.zstack.sso.header.CasState"); put("org.zstack.sdk.CbtTaskInventory", "org.zstack.header.cbt.CbtTaskInventory"); @@ -1097,6 +1106,7 @@ public class SourceClassMap { put("org.zstack.sdk.HardwareL2VxlanNetworkInventory", "org.zstack.sdnController.header.HardwareL2VxlanNetworkInventory"); put("org.zstack.sdk.HardwareL2VxlanNetworkPoolInventory", "org.zstack.sdnController.header.HardwareL2VxlanNetworkPoolInventory"); put("org.zstack.sdk.HbaDeviceInventory", "org.zstack.storage.device.hba.HbaDeviceInventory"); + put("org.zstack.sdk.HostBlockDeviceStruct", "org.zstack.header.host.HostBlockDeviceStruct"); put("org.zstack.sdk.HostConnectedStatus", "org.zstack.zops.HostConnectedStatus"); put("org.zstack.sdk.HostDiskCapacity", "org.zstack.storage.primary.local.APIGetLocalStorageHostDiskCapacityReply$HostDiskCapacity"); put("org.zstack.sdk.HostInventory", "org.zstack.header.host.HostInventory"); @@ -1533,6 +1543,12 @@ public class SourceClassMap { put("org.zstack.sdk.VmInstanceInventory", "org.zstack.header.vm.VmInstanceInventory"); put("org.zstack.sdk.VmInstanceMdevDeviceSpecRefInventory", "org.zstack.pciDevice.specification.mdev.VmInstanceMdevDeviceSpecRefInventory"); put("org.zstack.sdk.VmInstancePciDeviceSpecRefInventory", "org.zstack.pciDevice.specification.pci.VmInstancePciDeviceSpecRefInventory"); + put("org.zstack.sdk.VmLocalVolumeCacheInventory", "org.zstack.header.localVolumeCache.VmLocalVolumeCacheInventory"); + put("org.zstack.sdk.VmLocalVolumeCacheMode", "org.zstack.header.localVolumeCache.VmLocalVolumeCacheMode"); + put("org.zstack.sdk.VmLocalVolumeCachePoolInventory", "org.zstack.header.localVolumeCache.VmLocalVolumeCachePoolInventory"); + put("org.zstack.sdk.VmLocalVolumeCachePoolState", "org.zstack.header.localVolumeCache.VmLocalVolumeCachePoolState"); + put("org.zstack.sdk.VmLocalVolumeCachePoolStatus", "org.zstack.header.localVolumeCache.VmLocalVolumeCachePoolStatus"); + put("org.zstack.sdk.VmLocalVolumeCacheState", "org.zstack.header.localVolumeCache.VmLocalVolumeCacheState"); put("org.zstack.sdk.VmMemoryBillingInventory", "org.zstack.billing.generator.vm.memory.VmMemoryBillingInventory"); put("org.zstack.sdk.VmMemorySpendingDetails", "org.zstack.billing.spendingcalculator.vm.VmMemorySpendingDetails"); put("org.zstack.sdk.VmNicBandwidthSpendingDetails", "org.zstack.billing.spendingcalculator.vmnic.VmNicBandwidthSpendingDetails"); diff --git a/sdk/src/main/java/org/zstack/sdk/CacheTO.java b/sdk/src/main/java/org/zstack/sdk/CacheTO.java new file mode 100644 index 00000000000..6439de03034 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CacheTO.java @@ -0,0 +1,39 @@ +package org.zstack.sdk; + + + +public class CacheTO extends org.zstack.sdk.BaseVirtualDeviceTO { + + public java.lang.String cacheUuid; + public void setCacheUuid(java.lang.String cacheUuid) { + this.cacheUuid = cacheUuid; + } + public java.lang.String getCacheUuid() { + return this.cacheUuid; + } + + public java.lang.String poolUuid; + public void setPoolUuid(java.lang.String poolUuid) { + this.poolUuid = poolUuid; + } + public java.lang.String getPoolUuid() { + return this.poolUuid; + } + + public java.lang.String installPath; + public void setInstallPath(java.lang.String installPath) { + this.installPath = installPath; + } + public java.lang.String getInstallPath() { + return this.installPath; + } + + public java.lang.String cacheMode; + public void setCacheMode(java.lang.String cacheMode) { + this.cacheMode = cacheMode; + } + public java.lang.String getCacheMode() { + return this.cacheMode; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeVmLocalVolumeCachePoolStateAction.java b/sdk/src/main/java/org/zstack/sdk/ChangeVmLocalVolumeCachePoolStateAction.java new file mode 100644 index 00000000000..d664d85a80a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ChangeVmLocalVolumeCachePoolStateAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ChangeVmLocalVolumeCachePoolStateAction 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.ChangeVmLocalVolumeCachePoolStateResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = true, validValues = {"enable","disable"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String stateEvent; + + @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.ChangeVmLocalVolumeCachePoolStateResult value = res.getResult(org.zstack.sdk.ChangeVmLocalVolumeCachePoolStateResult.class); + ret.value = value == null ? new org.zstack.sdk.ChangeVmLocalVolumeCachePoolStateResult() : 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 = "PUT"; + info.path = "/hosts/{hostUuid}/local-volume-cache-pools/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "changeVmLocalVolumeCachePoolState"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ChangeVmLocalVolumeCachePoolStateResult.java b/sdk/src/main/java/org/zstack/sdk/ChangeVmLocalVolumeCachePoolStateResult.java new file mode 100644 index 00000000000..d4f1c9d6b10 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ChangeVmLocalVolumeCachePoolStateResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmLocalVolumeCachePoolInventory; + +public class ChangeVmLocalVolumeCachePoolStateResult { + public VmLocalVolumeCachePoolInventory inventory; + public void setInventory(VmLocalVolumeCachePoolInventory inventory) { + this.inventory = inventory; + } + public VmLocalVolumeCachePoolInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmAction.java b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmAction.java index c7ccc7e2c19..0a74ea0e314 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateOvnControllerVmAction.java @@ -109,6 +109,21 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Boolean virtio; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean enableRootVolumeCache; + + @Param(required = false, validValues = {"WriteBack"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String cacheMode; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootVolumeCachePoolUuid; + + @Param(required = false, validValues = {"WriteBack"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootVolumeCacheMode; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map dataDiskCacheConfigOnIndex; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List diskAOs; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceAction.java index a6c9c4cd2c4..51581e11e75 100644 --- a/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceAction.java +++ b/sdk/src/main/java/org/zstack/sdk/CreateVmInstanceAction.java @@ -109,6 +109,21 @@ public Result throwExceptionIfError() { @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.lang.Boolean virtio; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.Boolean enableRootVolumeCache; + + @Param(required = false, validValues = {"WriteBack"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String cacheMode; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootVolumeCachePoolUuid; + + @Param(required = false, validValues = {"WriteBack"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String rootVolumeCacheMode; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.util.Map dataDiskCacheConfigOnIndex; + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) public java.util.List diskAOs; diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVmLocalVolumeCachePoolAction.java b/sdk/src/main/java/org/zstack/sdk/CreateVmLocalVolumeCachePoolAction.java new file mode 100644 index 00000000000..3c3283758a5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateVmLocalVolumeCachePoolAction.java @@ -0,0 +1,119 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class CreateVmLocalVolumeCachePoolAction 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.CreateVmLocalVolumeCachePoolResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = true, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List pvs; + + @Param(required = true, maxLength = 1024, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String mountPoint; + + @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.CreateVmLocalVolumeCachePoolResult value = res.getResult(org.zstack.sdk.CreateVmLocalVolumeCachePoolResult.class); + ret.value = value == null ? new org.zstack.sdk.CreateVmLocalVolumeCachePoolResult() : 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 = "/hosts/{hostUuid}/local-volume-cache-pools"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "params"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/CreateVmLocalVolumeCachePoolResult.java b/sdk/src/main/java/org/zstack/sdk/CreateVmLocalVolumeCachePoolResult.java new file mode 100644 index 00000000000..f39fed20bae --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/CreateVmLocalVolumeCachePoolResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmLocalVolumeCachePoolInventory; + +public class CreateVmLocalVolumeCachePoolResult { + public VmLocalVolumeCachePoolInventory inventory; + public void setInventory(VmLocalVolumeCachePoolInventory inventory) { + this.inventory = inventory; + } + public VmLocalVolumeCachePoolInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVmLocalVolumeCachePoolAction.java b/sdk/src/main/java/org/zstack/sdk/DeleteVmLocalVolumeCachePoolAction.java new file mode 100644 index 00000000000..31d24e83c4c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVmLocalVolumeCachePoolAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DeleteVmLocalVolumeCachePoolAction 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.DeleteVmLocalVolumeCachePoolResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @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.DeleteVmLocalVolumeCachePoolResult value = res.getResult(org.zstack.sdk.DeleteVmLocalVolumeCachePoolResult.class); + ret.value = value == null ? new org.zstack.sdk.DeleteVmLocalVolumeCachePoolResult() : 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 = "DELETE"; + info.path = "/hosts/{hostUuid}/local-volume-cache-pools/{uuid}"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DeleteVmLocalVolumeCachePoolResult.java b/sdk/src/main/java/org/zstack/sdk/DeleteVmLocalVolumeCachePoolResult.java new file mode 100644 index 00000000000..5449db3bcc0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DeleteVmLocalVolumeCachePoolResult.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + + + +public class DeleteVmLocalVolumeCachePoolResult { + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DisableVolumeCacheAction.java b/sdk/src/main/java/org/zstack/sdk/DisableVolumeCacheAction.java new file mode 100644 index 00000000000..1a748074582 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DisableVolumeCacheAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class DisableVolumeCacheAction 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.DisableVolumeCacheResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String volumeUuid; + + @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.DisableVolumeCacheResult value = res.getResult(org.zstack.sdk.DisableVolumeCacheResult.class); + ret.value = value == null ? new org.zstack.sdk.DisableVolumeCacheResult() : 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 = "PUT"; + info.path = "/volumes/{volumeUuid}/local-volume-cache/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "disableVolumeCache"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/DisableVolumeCacheResult.java b/sdk/src/main/java/org/zstack/sdk/DisableVolumeCacheResult.java new file mode 100644 index 00000000000..a0e0615ae44 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/DisableVolumeCacheResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmLocalVolumeCacheInventory; + +public class DisableVolumeCacheResult { + public VmLocalVolumeCacheInventory inventory; + public void setInventory(VmLocalVolumeCacheInventory inventory) { + this.inventory = inventory; + } + public VmLocalVolumeCacheInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/EnableVolumeCacheAction.java b/sdk/src/main/java/org/zstack/sdk/EnableVolumeCacheAction.java new file mode 100644 index 00000000000..19c2eb5eef4 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/EnableVolumeCacheAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class EnableVolumeCacheAction 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.EnableVolumeCacheResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String volumeUuid; + + @Param(required = false, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String poolUuid; + + @Param(required = false, validValues = {"WriteBack"}, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String cacheMode = "WriteBack"; + + @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.EnableVolumeCacheResult value = res.getResult(org.zstack.sdk.EnableVolumeCacheResult.class); + ret.value = value == null ? new org.zstack.sdk.EnableVolumeCacheResult() : 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 = "PUT"; + info.path = "/volumes/{volumeUuid}/local-volume-cache/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "enableVolumeCache"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/EnableVolumeCacheResult.java b/sdk/src/main/java/org/zstack/sdk/EnableVolumeCacheResult.java new file mode 100644 index 00000000000..855e7901cb2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/EnableVolumeCacheResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmLocalVolumeCacheInventory; + +public class EnableVolumeCacheResult { + public VmLocalVolumeCacheInventory inventory; + public void setInventory(VmLocalVolumeCacheInventory inventory) { + this.inventory = inventory; + } + public VmLocalVolumeCacheInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ExtendVmLocalVolumeCachePoolAction.java b/sdk/src/main/java/org/zstack/sdk/ExtendVmLocalVolumeCachePoolAction.java new file mode 100644 index 00000000000..4dbcb0b5a22 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ExtendVmLocalVolumeCachePoolAction.java @@ -0,0 +1,107 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ExtendVmLocalVolumeCachePoolAction 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.ExtendVmLocalVolumeCachePoolResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.util.List pvs; + + @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.ExtendVmLocalVolumeCachePoolResult value = res.getResult(org.zstack.sdk.ExtendVmLocalVolumeCachePoolResult.class); + ret.value = value == null ? new org.zstack.sdk.ExtendVmLocalVolumeCachePoolResult() : 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 = "PUT"; + info.path = "/hosts/{hostUuid}/local-volume-cache-pools/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "extendVmLocalVolumeCachePool"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ExtendVmLocalVolumeCachePoolResult.java b/sdk/src/main/java/org/zstack/sdk/ExtendVmLocalVolumeCachePoolResult.java new file mode 100644 index 00000000000..6812129c6d7 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ExtendVmLocalVolumeCachePoolResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmLocalVolumeCachePoolInventory; + +public class ExtendVmLocalVolumeCachePoolResult { + public VmLocalVolumeCachePoolInventory inventory; + public void setInventory(VmLocalVolumeCachePoolInventory inventory) { + this.inventory = inventory; + } + public VmLocalVolumeCachePoolInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetBlockDevicesAction.java b/sdk/src/main/java/org/zstack/sdk/GetBlockDevicesAction.java new file mode 100644 index 00000000000..04a46543803 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetBlockDevicesAction.java @@ -0,0 +1,101 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class GetBlockDevicesAction 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.GetBlockDevicesResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = true, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @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.GetBlockDevicesResult value = res.getResult(org.zstack.sdk.GetBlockDevicesResult.class); + ret.value = value == null ? new org.zstack.sdk.GetBlockDevicesResult() : 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 = "/hosts/{uuid}/block-devices"; + info.needSession = true; + info.needPoll = true; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/GetBlockDevicesResult.java b/sdk/src/main/java/org/zstack/sdk/GetBlockDevicesResult.java new file mode 100644 index 00000000000..2a0a7c3d6f0 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/GetBlockDevicesResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + + + +public class GetBlockDevicesResult { + public java.util.List blockDevices; + public void setBlockDevices(java.util.List blockDevices) { + this.blockDevices = blockDevices; + } + public java.util.List getBlockDevices() { + return this.blockDevices; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/HostBlockDeviceStruct.java b/sdk/src/main/java/org/zstack/sdk/HostBlockDeviceStruct.java new file mode 100644 index 00000000000..a898e35d7a8 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/HostBlockDeviceStruct.java @@ -0,0 +1,111 @@ +package org.zstack.sdk; + + + +public class HostBlockDeviceStruct { + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String wwid; + public void setWwid(java.lang.String wwid) { + this.wwid = wwid; + } + public java.lang.String getWwid() { + return this.wwid; + } + + public java.lang.String vendor; + public void setVendor(java.lang.String vendor) { + this.vendor = vendor; + } + public java.lang.String getVendor() { + return this.vendor; + } + + public java.lang.String model; + public void setModel(java.lang.String model) { + this.model = model; + } + public java.lang.String getModel() { + return this.model; + } + + public java.lang.String wwn; + public void setWwn(java.lang.String wwn) { + this.wwn = wwn; + } + public java.lang.String getWwn() { + return this.wwn; + } + + public java.lang.String serial; + public void setSerial(java.lang.String serial) { + this.serial = serial; + } + public java.lang.String getSerial() { + return this.serial; + } + + public java.lang.String hctl; + public void setHctl(java.lang.String hctl) { + this.hctl = hctl; + } + public java.lang.String getHctl() { + return this.hctl; + } + + public java.lang.String type; + public void setType(java.lang.String type) { + this.type = type; + } + public java.lang.String getType() { + return this.type; + } + + public java.lang.String path; + public void setPath(java.lang.String path) { + this.path = path; + } + public java.lang.String getPath() { + return this.path; + } + + public java.lang.Long size; + public void setSize(java.lang.Long size) { + this.size = size; + } + public java.lang.Long getSize() { + return this.size; + } + + public java.lang.String source; + public void setSource(java.lang.String source) { + this.source = source; + } + public java.lang.String getSource() { + return this.source; + } + + public java.lang.String transport; + public void setTransport(java.lang.String transport) { + this.transport = transport; + } + public java.lang.String getTransport() { + return this.transport; + } + + public java.lang.String targetIdentifier; + public void setTargetIdentifier(java.lang.String targetIdentifier) { + this.targetIdentifier = targetIdentifier; + } + public java.lang.String getTargetIdentifier() { + return this.targetIdentifier; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/HostInventory.java b/sdk/src/main/java/org/zstack/sdk/HostInventory.java index 1fce8a8b39d..be632ead393 100644 --- a/sdk/src/main/java/org/zstack/sdk/HostInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/HostInventory.java @@ -236,6 +236,14 @@ public HwMonitorStatus getTemperatureStatus() { return this.temperatureStatus; } + public java.util.Set localVolumeCachePools; + public void setLocalVolumeCachePools(java.util.Set localVolumeCachePools) { + this.localVolumeCachePools = localVolumeCachePools; + } + public java.util.Set getLocalVolumeCachePools() { + return this.localVolumeCachePools; + } + public java.lang.String architecture; public void setArchitecture(java.lang.String architecture) { this.architecture = architecture; diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmLocalVolumeCachePoolAction.java b/sdk/src/main/java/org/zstack/sdk/QueryVmLocalVolumeCachePoolAction.java new file mode 100644 index 00000000000..0973b4128f2 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmLocalVolumeCachePoolAction.java @@ -0,0 +1,75 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class QueryVmLocalVolumeCachePoolAction extends QueryAction { + + 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.QueryVmLocalVolumeCachePoolResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + + + private Result makeResult(ApiResult res) { + Result ret = new Result(); + if (res.error != null) { + ret.error = res.error; + return ret; + } + + org.zstack.sdk.QueryVmLocalVolumeCachePoolResult value = res.getResult(org.zstack.sdk.QueryVmLocalVolumeCachePoolResult.class); + ret.value = value == null ? new org.zstack.sdk.QueryVmLocalVolumeCachePoolResult() : 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 = "/hosts/local-volume-cache-pools"; + info.needSession = true; + info.needPoll = false; + info.parameterName = ""; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/QueryVmLocalVolumeCachePoolResult.java b/sdk/src/main/java/org/zstack/sdk/QueryVmLocalVolumeCachePoolResult.java new file mode 100644 index 00000000000..1bbeb747635 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/QueryVmLocalVolumeCachePoolResult.java @@ -0,0 +1,22 @@ +package org.zstack.sdk; + + + +public class QueryVmLocalVolumeCachePoolResult { + public java.util.List inventories; + public void setInventories(java.util.List inventories) { + this.inventories = inventories; + } + public java.util.List getInventories() { + return this.inventories; + } + + public java.lang.Long total; + public void setTotal(java.lang.Long total) { + this.total = total; + } + public java.lang.Long getTotal() { + return this.total; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectVmLocalVolumeCachePoolAction.java b/sdk/src/main/java/org/zstack/sdk/ReconnectVmLocalVolumeCachePoolAction.java new file mode 100644 index 00000000000..8e559b77031 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectVmLocalVolumeCachePoolAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class ReconnectVmLocalVolumeCachePoolAction 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.ReconnectVmLocalVolumeCachePoolResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @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.ReconnectVmLocalVolumeCachePoolResult value = res.getResult(org.zstack.sdk.ReconnectVmLocalVolumeCachePoolResult.class); + ret.value = value == null ? new org.zstack.sdk.ReconnectVmLocalVolumeCachePoolResult() : 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 = "PUT"; + info.path = "/hosts/{hostUuid}/local-volume-cache-pools/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "reconnectVmLocalVolumeCachePool"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/ReconnectVmLocalVolumeCachePoolResult.java b/sdk/src/main/java/org/zstack/sdk/ReconnectVmLocalVolumeCachePoolResult.java new file mode 100644 index 00000000000..4bf7ed7fb4c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/ReconnectVmLocalVolumeCachePoolResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmLocalVolumeCachePoolInventory; + +public class ReconnectVmLocalVolumeCachePoolResult { + public VmLocalVolumeCachePoolInventory inventory; + public void setInventory(VmLocalVolumeCachePoolInventory inventory) { + this.inventory = inventory; + } + public VmLocalVolumeCachePoolInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SyncVmLocalVolumeCachePoolCapacityAction.java b/sdk/src/main/java/org/zstack/sdk/SyncVmLocalVolumeCachePoolCapacityAction.java new file mode 100644 index 00000000000..f040ecef8fb --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SyncVmLocalVolumeCachePoolCapacityAction.java @@ -0,0 +1,104 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class SyncVmLocalVolumeCachePoolCapacityAction 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.SyncVmLocalVolumeCachePoolCapacityResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @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.SyncVmLocalVolumeCachePoolCapacityResult value = res.getResult(org.zstack.sdk.SyncVmLocalVolumeCachePoolCapacityResult.class); + ret.value = value == null ? new org.zstack.sdk.SyncVmLocalVolumeCachePoolCapacityResult() : 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 = "PUT"; + info.path = "/hosts/{hostUuid}/local-volume-cache-pools/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "syncVmLocalVolumeCachePoolCapacity"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/SyncVmLocalVolumeCachePoolCapacityResult.java b/sdk/src/main/java/org/zstack/sdk/SyncVmLocalVolumeCachePoolCapacityResult.java new file mode 100644 index 00000000000..4a0e7560833 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/SyncVmLocalVolumeCachePoolCapacityResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmLocalVolumeCachePoolInventory; + +public class SyncVmLocalVolumeCachePoolCapacityResult { + public VmLocalVolumeCachePoolInventory inventory; + public void setInventory(VmLocalVolumeCachePoolInventory inventory) { + this.inventory = inventory; + } + public VmLocalVolumeCachePoolInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVmLocalVolumeCachePoolAction.java b/sdk/src/main/java/org/zstack/sdk/UpdateVmLocalVolumeCachePoolAction.java new file mode 100644 index 00000000000..59bfc38e480 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVmLocalVolumeCachePoolAction.java @@ -0,0 +1,110 @@ +package org.zstack.sdk; + +import java.util.HashMap; +import java.util.Map; +import org.zstack.sdk.*; + +public class UpdateVmLocalVolumeCachePoolAction 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.UpdateVmLocalVolumeCachePoolResult value; + + public Result throwExceptionIfError() { + if (error != null) { + throw new ApiException( + String.format("error[code: %s, description: %s, details: %s, globalErrorCode: %s]", error.code, error.description, error.details, error.globalErrorCode) + ); + } + + return this; + } + } + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String uuid; + + @Param(required = true, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String hostUuid; + + @Param(required = false, maxLength = 255, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String name; + + @Param(required = false, maxLength = 2048, nonempty = false, nullElements = false, emptyString = true, noTrim = false) + public java.lang.String description; + + @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.UpdateVmLocalVolumeCachePoolResult value = res.getResult(org.zstack.sdk.UpdateVmLocalVolumeCachePoolResult.class); + ret.value = value == null ? new org.zstack.sdk.UpdateVmLocalVolumeCachePoolResult() : 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 = "PUT"; + info.path = "/hosts/{hostUuid}/local-volume-cache-pools/{uuid}/actions"; + info.needSession = true; + info.needPoll = true; + info.parameterName = "updateVmLocalVolumeCachePool"; + return info; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/UpdateVmLocalVolumeCachePoolResult.java b/sdk/src/main/java/org/zstack/sdk/UpdateVmLocalVolumeCachePoolResult.java new file mode 100644 index 00000000000..e736da0650a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/UpdateVmLocalVolumeCachePoolResult.java @@ -0,0 +1,14 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmLocalVolumeCachePoolInventory; + +public class UpdateVmLocalVolumeCachePoolResult { + public VmLocalVolumeCachePoolInventory inventory; + public void setInventory(VmLocalVolumeCachePoolInventory inventory) { + this.inventory = inventory; + } + public VmLocalVolumeCachePoolInventory getInventory() { + return this.inventory; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCacheInventory.java b/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCacheInventory.java new file mode 100644 index 00000000000..cded043590a --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCacheInventory.java @@ -0,0 +1,72 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmLocalVolumeCacheMode; +import org.zstack.sdk.VmLocalVolumeCacheState; + +public class VmLocalVolumeCacheInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String volumeUuid; + public void setVolumeUuid(java.lang.String volumeUuid) { + this.volumeUuid = volumeUuid; + } + public java.lang.String getVolumeUuid() { + return this.volumeUuid; + } + + public java.lang.String poolUuid; + public void setPoolUuid(java.lang.String poolUuid) { + this.poolUuid = poolUuid; + } + public java.lang.String getPoolUuid() { + return this.poolUuid; + } + + public java.lang.String installPath; + public void setInstallPath(java.lang.String installPath) { + this.installPath = installPath; + } + public java.lang.String getInstallPath() { + return this.installPath; + } + + public VmLocalVolumeCacheMode cacheMode; + public void setCacheMode(VmLocalVolumeCacheMode cacheMode) { + this.cacheMode = cacheMode; + } + public VmLocalVolumeCacheMode getCacheMode() { + return this.cacheMode; + } + + public VmLocalVolumeCacheState state; + public void setState(VmLocalVolumeCacheState state) { + this.state = state; + } + public VmLocalVolumeCacheState getState() { + return this.state; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCacheMode.java b/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCacheMode.java new file mode 100644 index 00000000000..d52c60dc1e5 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCacheMode.java @@ -0,0 +1,5 @@ +package org.zstack.sdk; + +public enum VmLocalVolumeCacheMode { + WriteBack, +} diff --git a/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCachePoolInventory.java b/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCachePoolInventory.java new file mode 100644 index 00000000000..9f2bdc8599c --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCachePoolInventory.java @@ -0,0 +1,120 @@ +package org.zstack.sdk; + +import org.zstack.sdk.VmLocalVolumeCachePoolState; +import org.zstack.sdk.VmLocalVolumeCachePoolStatus; + +public class VmLocalVolumeCachePoolInventory { + + public java.lang.String uuid; + public void setUuid(java.lang.String uuid) { + this.uuid = uuid; + } + public java.lang.String getUuid() { + return this.uuid; + } + + public java.lang.String hostUuid; + public void setHostUuid(java.lang.String hostUuid) { + this.hostUuid = hostUuid; + } + public java.lang.String getHostUuid() { + return this.hostUuid; + } + + public java.lang.String name; + public void setName(java.lang.String name) { + this.name = name; + } + public java.lang.String getName() { + return this.name; + } + + public java.lang.String description; + public void setDescription(java.lang.String description) { + this.description = description; + } + public java.lang.String getDescription() { + return this.description; + } + + public java.util.LinkedHashMap metadata; + public void setMetadata(java.util.LinkedHashMap metadata) { + this.metadata = metadata; + } + public java.util.LinkedHashMap getMetadata() { + return this.metadata; + } + + public long totalCapacity; + public void setTotalCapacity(long totalCapacity) { + this.totalCapacity = totalCapacity; + } + public long getTotalCapacity() { + return this.totalCapacity; + } + + public long availableCapacity; + public void setAvailableCapacity(long availableCapacity) { + this.availableCapacity = availableCapacity; + } + public long getAvailableCapacity() { + return this.availableCapacity; + } + + public long allocated; + public void setAllocated(long allocated) { + this.allocated = allocated; + } + public long getAllocated() { + return this.allocated; + } + + public long dirty; + public void setDirty(long dirty) { + this.dirty = dirty; + } + public long getDirty() { + return this.dirty; + } + + public VmLocalVolumeCachePoolState state; + public void setState(VmLocalVolumeCachePoolState state) { + this.state = state; + } + public VmLocalVolumeCachePoolState getState() { + return this.state; + } + + public VmLocalVolumeCachePoolStatus status; + public void setStatus(VmLocalVolumeCachePoolStatus status) { + this.status = status; + } + public VmLocalVolumeCachePoolStatus getStatus() { + return this.status; + } + + public java.util.Set caches; + public void setCaches(java.util.Set caches) { + this.caches = caches; + } + public java.util.Set getCaches() { + return this.caches; + } + + public java.sql.Timestamp createDate; + public void setCreateDate(java.sql.Timestamp createDate) { + this.createDate = createDate; + } + public java.sql.Timestamp getCreateDate() { + return this.createDate; + } + + public java.sql.Timestamp lastOpDate; + public void setLastOpDate(java.sql.Timestamp lastOpDate) { + this.lastOpDate = lastOpDate; + } + public java.sql.Timestamp getLastOpDate() { + return this.lastOpDate; + } + +} diff --git a/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCachePoolState.java b/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCachePoolState.java new file mode 100644 index 00000000000..0d21999167e --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCachePoolState.java @@ -0,0 +1,6 @@ +package org.zstack.sdk; + +public enum VmLocalVolumeCachePoolState { + Enabled, + Disabled, +} diff --git a/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCachePoolStatus.java b/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCachePoolStatus.java new file mode 100644 index 00000000000..e0b5b46e695 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCachePoolStatus.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + +public enum VmLocalVolumeCachePoolStatus { + Connecting, + Connected, + Disconnected, +} diff --git a/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCacheState.java b/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCacheState.java new file mode 100644 index 00000000000..540e0ca3358 --- /dev/null +++ b/sdk/src/main/java/org/zstack/sdk/VmLocalVolumeCacheState.java @@ -0,0 +1,7 @@ +package org.zstack.sdk; + +public enum VmLocalVolumeCacheState { + None, + Uninstantiated, + Instantiated, +} diff --git a/sdk/src/main/java/org/zstack/sdk/VolumeInventory.java b/sdk/src/main/java/org/zstack/sdk/VolumeInventory.java index da7652e9ca4..8103e777ce9 100644 --- a/sdk/src/main/java/org/zstack/sdk/VolumeInventory.java +++ b/sdk/src/main/java/org/zstack/sdk/VolumeInventory.java @@ -1,6 +1,6 @@ package org.zstack.sdk; - +import org.zstack.sdk.VmLocalVolumeCacheInventory; public class VolumeInventory { @@ -188,4 +188,12 @@ public java.lang.String getProtocol() { return this.protocol; } + public VmLocalVolumeCacheInventory localVolumeCache; + public void setLocalVolumeCache(VmLocalVolumeCacheInventory localVolumeCache) { + this.localVolumeCache = localVolumeCache; + } + public VmLocalVolumeCacheInventory getLocalVolumeCache() { + return this.localVolumeCache; + } + } diff --git a/sdk/src/main/java/org/zstack/sdk/VolumeTO.java b/sdk/src/main/java/org/zstack/sdk/VolumeTO.java index 84eb1d8518f..adaa44f8fe7 100644 --- a/sdk/src/main/java/org/zstack/sdk/VolumeTO.java +++ b/sdk/src/main/java/org/zstack/sdk/VolumeTO.java @@ -1,6 +1,6 @@ package org.zstack.sdk; - +import org.zstack.sdk.CacheTO; public class VolumeTO extends org.zstack.sdk.BaseVirtualDeviceTO { @@ -12,6 +12,14 @@ public java.lang.String getInstallPath() { return this.installPath; } + public java.lang.Long size; + public void setSize(java.lang.Long size) { + this.size = size; + } + public java.lang.Long getSize() { + return this.size; + } + public int deviceId; public void setDeviceId(int deviceId) { this.deviceId = deviceId; @@ -156,4 +164,12 @@ public int getControllerIndex() { return this.controllerIndex; } + public CacheTO cache; + public void setCache(CacheTO cache) { + this.cache = cache; + } + public CacheTO getCache() { + return this.cache; + } + } diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeApiInterceptor.java b/storage/src/main/java/org/zstack/storage/volume/VolumeApiInterceptor.java index d1485039388..8001dcd0613 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeApiInterceptor.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeApiInterceptor.java @@ -78,7 +78,6 @@ import org.zstack.header.volume.VolumeType; import org.zstack.header.volume.VolumeVO; import org.zstack.header.volume.VolumeVO_; - import javax.persistence.Tuple; import java.util.ArrayList; import java.util.Arrays; 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 248ff279765..c8a83ec637a 100755 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeManagerImpl.java @@ -33,6 +33,9 @@ import org.zstack.header.identity.AccountResourceRefInventory; import org.zstack.header.identity.ResourceOwnerAfterChangeExtensionPoint; import org.zstack.header.image.*; +import org.zstack.header.localVolumeCache.VmLocalVolumeCacheMode; +import org.zstack.header.localVolumeCache.VmLocalVolumeCacheState; +import org.zstack.header.localVolumeCache.VmLocalVolumeCacheVO; import org.zstack.header.managementnode.ManagementNodeReadyExtensionPoint; import org.zstack.header.message.APIMessage; import org.zstack.header.message.Message; @@ -604,6 +607,21 @@ private VolumeInventory createVolume(CreateVolumeMsg msg) { vo.setShareable(true); } + VmLocalVolumeCacheVO cacheVO = null; + if (msg.getSystemTag(VolumeSystemTags.VOLUME_CACHE_ENABLE::isMatch) != null) { + cacheVO = new VmLocalVolumeCacheVO(); + cacheVO.setUuid(Platform.getUuid()); + cacheVO.setVolumeUuid(vo.getUuid()); + cacheVO.setState(VmLocalVolumeCacheState.Uninstantiated); + String cacheModeTag = msg.getSystemTag(VolumeSystemTags.VOLUME_CACHE_MODE::isMatch); + String CachePoolTag = msg.getSystemTag(VolumeSystemTags.VOLUME_CACHE_POOL_UUID::isMatch); + if (cacheModeTag != null) { + cacheVO.setCacheMode(VmLocalVolumeCacheMode.valueOf(VolumeSystemTags.VOLUME_CACHE_MODE.getTokenByTag(cacheModeTag, VolumeSystemTags.CACHE_MODE_TOKEN))); + } + if (CachePoolTag != null) { + cacheVO.setPoolUuid(VolumeSystemTags.VOLUME_CACHE_POOL_UUID.getTokenByTag(CachePoolTag, VolumeSystemTags.CACHE_POOL_UUID_TOKEN)); + } + } if (msg.getSystemTags() != null) { Iterator iterators = msg.getSystemTags().iterator(); while (iterators.hasNext()) { @@ -639,7 +657,9 @@ protected VolumeVO scripts() { ext.afterCreateVolume(vo); } vo = dbf.reload(vo); - + if (cacheVO != null) { + dbf.persist(cacheVO); + } new FireVolumeCanonicalEvent().fireVolumeStatusChangedEvent(null, VolumeInventory.valueOf(vo)); VolumeInventory inv = VolumeInventory.valueOf(vo); diff --git a/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java b/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java index d20cebd9592..2686c8949cc 100644 --- a/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java +++ b/storage/src/main/java/org/zstack/storage/volume/VolumeSystemTags.java @@ -52,4 +52,12 @@ public class VolumeSystemTags { public static PatternedSystemTag VOLUME_QOS = new PatternedSystemTag(String.format("%s::{%s}", VOLUME_QOS_TOKEN, VOLUME_QOS_TOKEN), VolumeVO.class); public static SystemTag FAST_REVERT = new SystemTag("fast::revert", VolumeVO.class); + + public static PatternedSystemTag VOLUME_CACHE_ENABLE = new PatternedSystemTag("volumeCache::enable", VolumeVO.class); + + public static String CACHE_POOL_UUID_TOKEN = "poolUuid"; + public static PatternedSystemTag VOLUME_CACHE_POOL_UUID = new PatternedSystemTag(String.format("volumeCache::%s::{%s}", CACHE_POOL_UUID_TOKEN, CACHE_POOL_UUID_TOKEN), VolumeVO.class); + + public static String CACHE_MODE_TOKEN = "cacheMode"; + public static PatternedSystemTag VOLUME_CACHE_MODE = new PatternedSystemTag(String.format("volumeCache::%s::{%s}", CACHE_MODE_TOKEN, CACHE_MODE_TOKEN ), VolumeVO.class); } diff --git a/test/src/test/resources/springConfigXml/license.xml b/test/src/test/resources/springConfigXml/license.xml deleted file mode 100755 index 981f89749f4..00000000000 --- a/test/src/test/resources/springConfigXml/license.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - diff --git a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy index f8470e35bd3..6602a7fc2ed 100644 --- a/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy +++ b/testlib/src/main/java/org/zstack/testlib/ApiHelper.groovy @@ -6578,6 +6578,33 @@ abstract class ApiHelper { } + def changeVmLocalVolumeCachePoolState(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ChangeVmLocalVolumeCachePoolStateAction.class) Closure c) { + def a = new org.zstack.sdk.ChangeVmLocalVolumeCachePoolStateAction() + 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 changeVmNicNetwork(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ChangeVmNicNetworkAction.class) Closure c) { def a = new org.zstack.sdk.ChangeVmNicNetworkAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -11978,6 +12005,33 @@ abstract class ApiHelper { } + def createVmLocalVolumeCachePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmLocalVolumeCachePoolAction.class) Closure c) { + def a = new org.zstack.sdk.CreateVmLocalVolumeCachePoolAction() + 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 createVmNic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.CreateVmNicAction.class) Closure c) { def a = new org.zstack.sdk.CreateVmNicAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -17405,6 +17459,33 @@ abstract class ApiHelper { } + def deleteVmLocalVolumeCachePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmLocalVolumeCachePoolAction.class) Closure c) { + def a = new org.zstack.sdk.DeleteVmLocalVolumeCachePoolAction() + 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 deleteVmNic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DeleteVmNicAction.class) Closure c) { def a = new org.zstack.sdk.DeleteVmNicAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -19592,6 +19673,33 @@ abstract class ApiHelper { } + def disableVolumeCache(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DisableVolumeCacheAction.class) Closure c) { + def a = new org.zstack.sdk.DisableVolumeCacheAction() + 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 discoverExternalPrimaryStorage(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.DiscoverExternalPrimaryStorageAction.class) Closure c) { def a = new org.zstack.sdk.DiscoverExternalPrimaryStorageAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -19727,6 +19835,33 @@ abstract class ApiHelper { } + def enableVolumeCache(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.EnableVolumeCacheAction.class) Closure c) { + def a = new org.zstack.sdk.EnableVolumeCacheAction() + 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 executeAutoScalingRule(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExecuteAutoScalingRuleAction.class) Closure c) { def a = new org.zstack.sdk.ExecuteAutoScalingRuleAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -20105,6 +20240,33 @@ abstract class ApiHelper { } + def extendVmLocalVolumeCachePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ExtendVmLocalVolumeCachePoolAction.class) Closure c) { + def a = new org.zstack.sdk.ExtendVmLocalVolumeCachePoolAction() + 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 failoverFaultToleranceVm(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.FailoverFaultToleranceVmAction.class) Closure c) { def a = new org.zstack.sdk.FailoverFaultToleranceVmAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -20996,6 +21158,33 @@ abstract class ApiHelper { } + def getBlockDevices(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBlockDevicesAction.class) Closure c) { + def a = new org.zstack.sdk.GetBlockDevicesAction() + 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 getBlockPrimaryStorageMetadata(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.GetBlockPrimaryStorageMetadataAction.class) Closure c) { def a = new org.zstack.sdk.GetBlockPrimaryStorageMetadataAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -35882,6 +36071,35 @@ abstract class ApiHelper { } + def queryVmLocalVolumeCachePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmLocalVolumeCachePoolAction.class) Closure c) { + def a = new org.zstack.sdk.QueryVmLocalVolumeCachePoolAction() + a.sessionId = Test.currentEnvSpec?.session?.uuid + c.resolveStrategy = Closure.OWNER_FIRST + c.delegate = a + c() + + a.conditions = a.conditions.collect { it.toString() } + + + 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 queryVmNic(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.QueryVmNicAction.class) Closure c) { def a = new org.zstack.sdk.QueryVmNicAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -37296,6 +37514,33 @@ abstract class ApiHelper { } + def reconnectVmLocalVolumeCachePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectVmLocalVolumeCachePoolAction.class) Closure c) { + def a = new org.zstack.sdk.ReconnectVmLocalVolumeCachePoolAction() + 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 reconnectZdfs(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.ReconnectZdfsAction.class) Closure c) { def a = new org.zstack.sdk.ReconnectZdfsAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -41751,6 +41996,33 @@ abstract class ApiHelper { } + def syncVmLocalVolumeCachePoolCapacity(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncVmLocalVolumeCachePoolCapacityAction.class) Closure c) { + def a = new org.zstack.sdk.SyncVmLocalVolumeCachePoolCapacityAction() + 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 syncVolumeSize(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.SyncVolumeSizeAction.class) Closure c) { def a = new org.zstack.sdk.SyncVolumeSizeAction() a.sessionId = Test.currentEnvSpec?.session?.uuid @@ -47205,6 +47477,33 @@ abstract class ApiHelper { } + def updateVmLocalVolumeCachePool(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmLocalVolumeCachePoolAction.class) Closure c) { + def a = new org.zstack.sdk.UpdateVmLocalVolumeCachePoolAction() + 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 updateVmNetworkConfig(@DelegatesTo(strategy = Closure.OWNER_FIRST, value = org.zstack.sdk.UpdateVmNetworkConfigAction.class) Closure c) { def a = new org.zstack.sdk.UpdateVmNetworkConfigAction() a.sessionId = Test.currentEnvSpec?.session?.uuid diff --git a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java index a0f09d4f1e9..ec5d455fb01 100644 --- a/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java +++ b/utils/src/main/java/org/zstack/utils/clouderrorcode/CloudOperationsErrorCode.java @@ -15871,4 +15871,74 @@ public class CloudOperationsErrorCode { public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10005 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10005"; public static final String ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10006 = "ORG_ZSTACK_CRYPTO_SECURITYMACHINE_THIRDPARTY_PLUGIN_10006"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10001 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10001"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10002 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10002"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10003 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10003"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10004 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10004"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10005 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10005"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10006 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10006"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10007 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10007"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10008 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10008"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10009 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10009"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10010 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10010"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10011 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10011"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10012 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10012"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10013 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10013"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10014 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10014"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10015 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10015"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10016 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10016"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10017 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10017"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10018 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10018"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10019 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10019"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10020 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10020"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10021 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10021"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10022 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10022"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10023 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10023"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10024 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10024"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10025 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10025"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10026 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10026"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10027 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10027"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10028 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10028"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10029 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10029"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10030 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10030"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10031 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10031"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10032 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10032"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10033 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10033"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10034 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10034"; + + public static final String ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10035 = "ORG_ZSTACK_STORAGE_LOCALVOLUMECACHE_10035"; }