From ccac1a383fed727877b50a0f171d2db24e032d82 Mon Sep 17 00:00:00 2001 From: DK101010 <57522802+DK101010@users.noreply.github.com> Date: Wed, 20 Apr 2022 04:34:09 +0200 Subject: [PATCH] Feat/add vdisk UUID to list volume (#5848) * get vdisk uuid from vcenter and store it into database * add vdisk uuid as external_uuid to listVolume response * add sql upgrade file * Update vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java Co-authored-by: Daniel Augusto Veronezi Salvador <38945620+GutoVeronezi@users.noreply.github.com> * update sql add column external_uuid * Update server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java Co-authored-by: Wei Zhou * adapt param description for externalUuid * add 'idempotent column add' to create external_uuid col * rename method to getExternalDiskUUID * remove line disk_offering.system_use Co-authored-by: DK101010 Co-authored-by: Daniel Augusto Veronezi Salvador <38945620+GutoVeronezi@users.noreply.github.com> Co-authored-by: Wei Zhou --- .../main/java/com/cloud/storage/Volume.java | 4 ++++ .../apache/cloudstack/api/ApiConstants.java | 1 + .../api/response/VolumeResponse.java | 12 +++++++++++ .../main/java/com/cloud/storage/VolumeVO.java | 15 ++++++++++++++ .../META-INF/db/schema-41610to41700.sql | 20 ++++++++++++++++++- .../storage/volume/VolumeObject.java | 10 ++++++++++ .../resource/VmwareStorageProcessor.java | 2 ++ .../api/query/dao/VolumeJoinDaoImpl.java | 1 + .../com/cloud/api/query/vo/VolumeJoinVO.java | 11 ++++++++++ .../cloud/storage/VolumeApiServiceImpl.java | 6 ++++++ .../vmware/mo/VirtualMachineMO.java | 18 +++++++++++++++++ 11 files changed, 99 insertions(+), 1 deletion(-) diff --git a/api/src/main/java/com/cloud/storage/Volume.java b/api/src/main/java/com/cloud/storage/Volume.java index a863c3e989b..c4a88c99695 100644 --- a/api/src/main/java/com/cloud/storage/Volume.java +++ b/api/src/main/java/com/cloud/storage/Volume.java @@ -243,4 +243,8 @@ public interface Volume extends ControlledEntity, Identity, InternalIdentity, Ba boolean isDisplay(); boolean isDeployAsIs(); + + String getExternalUuid(); + + void setExternalUuid(String externalUuid); } diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java index 788f46aba88..607851d36fe 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -166,6 +166,7 @@ public class ApiConstants { public static final String EXTRA_DHCP_OPTION_CODE = "extradhcpoptioncode"; public static final String EXTRA_DHCP_OPTION_VALUE = "extradhcpvalue"; public static final String EXTERNAL = "external"; + public static final String EXTERNAL_UUID = "externaluuid"; public static final String FENCE = "fence"; public static final String FETCH_LATEST = "fetchlatest"; public static final String FIRSTNAME = "firstname"; diff --git a/api/src/main/java/org/apache/cloudstack/api/response/VolumeResponse.java b/api/src/main/java/org/apache/cloudstack/api/response/VolumeResponse.java index e9254ef164d..b5d9735ffbc 100644 --- a/api/src/main/java/org/apache/cloudstack/api/response/VolumeResponse.java +++ b/api/src/main/java/org/apache/cloudstack/api/response/VolumeResponse.java @@ -280,6 +280,10 @@ public class VolumeResponse extends BaseResponseWithTagInformation implements Co @Param(description = "pod name of the volume") private String podName; + @SerializedName(ApiConstants.EXTERNAL_UUID) + @Param(description = "volume uuid that is given by virtualisation provider (only for VMware)") + private String externalUuid; + public String getPath() { return path; } @@ -793,4 +797,12 @@ public class VolumeResponse extends BaseResponseWithTagInformation implements Co public void setPodName(String podName) { this.podName = podName; } + + public String getExternalUuid() { + return externalUuid; + } + + public void setExternalUuid(String externalUuid) { + this.externalUuid = externalUuid; + } } diff --git a/engine/schema/src/main/java/com/cloud/storage/VolumeVO.java b/engine/schema/src/main/java/com/cloud/storage/VolumeVO.java index 1d8611625b7..2e81b4e0028 100644 --- a/engine/schema/src/main/java/com/cloud/storage/VolumeVO.java +++ b/engine/schema/src/main/java/com/cloud/storage/VolumeVO.java @@ -160,6 +160,9 @@ public class VolumeVO implements Volume { @Column(name = "iso_id") private Long isoId; + @Column(name = "external_uuid") + private String externalUuid = null; + @Transient // @Column(name="reservation") String reservationId; @@ -266,6 +269,7 @@ public class VolumeVO implements Volume { provisioningType = that.getProvisioningType(); uuid = UUID.randomUUID().toString(); deployAsIs = that.isDeployAsIs(); + externalUuid = that.getExternalUuid(); } @Override @@ -648,4 +652,15 @@ public class VolumeVO implements Volume { public String getVolumeDescription(){ return ReflectionToStringBuilderUtils.reflectOnlySelectedFields(this, "name", "uuid"); } + + @Override + public String getExternalUuid() { + return externalUuid; + } + + @Override + public void setExternalUuid(String externalUuid) { + this.externalUuid = externalUuid; + } + } diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql b/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql index 4c56a3b98b8..d597fed0e8c 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql @@ -220,6 +220,24 @@ CREATE VIEW `cloud`.`service_offering_view` AS GROUP BY `service_offering`.`id`; + +--; +-- Stored procedure to do idempotent column add; +-- This is copied from schema-41000to41100.sql +--; +DROP PROCEDURE IF EXISTS `cloud`.`IDEMPOTENT_ADD_COLUMN`; + +CREATE PROCEDURE `cloud`.`IDEMPOTENT_ADD_COLUMN` ( + IN in_table_name VARCHAR(200), + IN in_column_name VARCHAR(200), + IN in_column_definition VARCHAR(1000) +) +BEGIN + + DECLARE CONTINUE HANDLER FOR 1060 BEGIN END; SET @ddl = CONCAT('ALTER TABLE ', in_table_name); SET @ddl = CONCAT(@ddl, ' ', 'ADD COLUMN') ; SET @ddl = CONCAT(@ddl, ' ', in_column_name); SET @ddl = CONCAT(@ddl, ' ', in_column_definition); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; END; + +CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.volumes','external_uuid', 'VARCHAR(40) DEFAULT null '); + DROP VIEW IF EXISTS `cloud`.`volume_view`; CREATE VIEW `cloud`.`volume_view` AS SELECT @@ -240,6 +258,7 @@ CREATE VIEW `cloud`.`volume_view` AS volumes.format, volumes.path, volumes.chain_info, + volumes.external_uuid, account.id account_id, account.uuid account_uuid, account.account_name account_name, @@ -641,7 +660,6 @@ CREATE VIEW `cloud`.`domain_router_view` AS `cloud`.`async_job` ON async_job.instance_id = vm_instance.id and async_job.instance_type = 'DomainRouter' and async_job.job_status = 0; - INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, `sort_order`) SELECT UUID(), 3, 'listConfigurations', 'ALLOW', (SELECT MAX(`sort_order`)+1 FROM `cloud`.`role_permissions`) ON DUPLICATE KEY UPDATE rule=rule; INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, `sort_order`) SELECT UUID(), 3, 'updateConfiguration', 'ALLOW', (SELECT MAX(`sort_order`)+1 FROM `cloud`.`role_permissions`) ON DUPLICATE KEY UPDATE rule=rule; diff --git a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeObject.java b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeObject.java index 4a110d18fe6..3875d8155c0 100644 --- a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeObject.java +++ b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/volume/VolumeObject.java @@ -833,4 +833,14 @@ public class VolumeObject implements VolumeInfo { public Class getEntityType() { return Volume.class; } + + @Override + public String getExternalUuid() { + return volumeVO.getExternalUuid(); + } + + @Override + public void setExternalUuid(String externalUuid) { + volumeVO.setExternalUuid(externalUuid); + } } diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java index 511d51bafc5..d2f7fc88a3b 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java @@ -2149,6 +2149,8 @@ public class VmwareStorageProcessor implements StorageProcessor { VirtualMachineDiskInfo diskInfo = diskInfoBuilder.getDiskInfoByBackingFileBaseName(volumePath, dsMo.getName()); chainInfo = _gson.toJson(diskInfo); + answer.setContextParam("vdiskUuid",vmMo.getExternalDiskUUID(datastoreVolumePath)); + if (isManaged) { expandVirtualDisk(vmMo, datastoreVolumePath, volumeTO.getSize()); } diff --git a/server/src/main/java/com/cloud/api/query/dao/VolumeJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/VolumeJoinDaoImpl.java index f1014daeee8..656e82e672c 100644 --- a/server/src/main/java/com/cloud/api/query/dao/VolumeJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/VolumeJoinDaoImpl.java @@ -269,6 +269,7 @@ public class VolumeJoinDaoImpl extends GenericDaoBaseWithTagInformation getEntityType() { return Volume.class; diff --git a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java index fb05e678948..330f3a78ae8 100644 --- a/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java +++ b/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java @@ -3854,6 +3854,12 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic _volsDao.update(volumeToAttach.getId(), volumeToAttach); } + if (answer.getContextParam("vdiskUuid") != null) { + volumeToAttach = _volsDao.findById(volumeToAttach.getId()); + volumeToAttach.setExternalUuid(answer.getContextParam("vdiskUuid")); + _volsDao.update(volumeToAttach.getId(), volumeToAttach); + } + String chainInfo = answer.getContextParam("chainInfo"); if (chainInfo != null) { volumeToAttach = _volsDao.findById(volumeToAttach.getId()); diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java index c5ec5b4d9d1..a25480f4241 100644 --- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java +++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java @@ -3649,6 +3649,24 @@ public class VirtualMachineMO extends BaseMO { return count; } + public String getExternalDiskUUID(String datastoreVolumePath) throws Exception{ + List devices = (List)_context.getVimClient().getDynamicProperty(_mor, "config.hardware.device"); + if (CollectionUtils.isEmpty(devices) || datastoreVolumePath == null) { + return null; + } + + for (VirtualDevice device : devices) { + if (device instanceof VirtualDisk && device.getBacking() instanceof VirtualDiskFlatVer2BackingInfo){ + VirtualDiskFlatVer2BackingInfo backingInfo = (VirtualDiskFlatVer2BackingInfo) device.getBacking(); + if(backingInfo.getFileName().equals(datastoreVolumePath)){ + return backingInfo.getUuid(); + } + } + } + + return null; + } + public boolean consolidateVmDisks() throws Exception { ManagedObjectReference morTask = _context.getService().consolidateVMDisksTask(_mor); boolean result = _context.getVimClient().waitForTask(morTask);