This is an automated email from the ASF dual-hosted git repository.

nvazquez pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/main by this push:
     new ccac1a383fe Feat/add vdisk UUID to list volume (#5848)
ccac1a383fe is described below

commit ccac1a383fed727877b50a0f171d2db24e032d82
Author: DK101010 <[email protected]>
AuthorDate: Wed Apr 20 04:34:09 2022 +0200

    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 
<[email protected]>
    
    * update sql add column external_uuid
    
    * Update server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java
    
    Co-authored-by: Wei Zhou <[email protected]>
    
    * 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 <[email protected]>
    Co-authored-by: Daniel Augusto Veronezi Salvador 
<[email protected]>
    Co-authored-by: Wei Zhou <[email protected]>
---
 api/src/main/java/com/cloud/storage/Volume.java      |  4 ++++
 .../java/org/apache/cloudstack/api/ApiConstants.java |  1 +
 .../cloudstack/api/response/VolumeResponse.java      | 12 ++++++++++++
 .../src/main/java/com/cloud/storage/VolumeVO.java    | 15 +++++++++++++++
 .../resources/META-INF/db/schema-41610to41700.sql    | 20 +++++++++++++++++++-
 .../cloudstack/storage/volume/VolumeObject.java      | 10 ++++++++++
 .../storage/resource/VmwareStorageProcessor.java     |  2 ++
 .../com/cloud/api/query/dao/VolumeJoinDaoImpl.java   |  1 +
 .../java/com/cloud/api/query/vo/VolumeJoinVO.java    | 11 +++++++++++
 .../java/com/cloud/storage/VolumeApiServiceImpl.java |  6 ++++++
 .../cloud/hypervisor/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<VolumeJo
         }
 
         volResponse.setObjectName("volume");
+        volResponse.setExternalUuid(volume.getExternalUuid());
         return volResponse;
     }
 
diff --git a/server/src/main/java/com/cloud/api/query/vo/VolumeJoinVO.java 
b/server/src/main/java/com/cloud/api/query/vo/VolumeJoinVO.java
index 0a5f1c9659b..a8d568ff245 100644
--- a/server/src/main/java/com/cloud/api/query/vo/VolumeJoinVO.java
+++ b/server/src/main/java/com/cloud/api/query/vo/VolumeJoinVO.java
@@ -272,6 +272,9 @@ public class VolumeJoinVO extends 
BaseViewWithTagInformationVO implements Contro
     @Column(name = "chain_info", length = 65535)
     String chainInfo;
 
+    @Column(name = "external_uuid")
+    private String externalUuid = null;
+
     public VolumeJoinVO() {
     }
 
@@ -599,6 +602,14 @@ public class VolumeJoinVO extends 
BaseViewWithTagInformationVO implements Contro
         return chainInfo;
     }
 
+    public String getExternalUuid() {
+        return externalUuid;
+    }
+
+    public void setExternalUuid(String externalUuid) {
+        this.externalUuid = externalUuid;
+    }
+
     @Override
     public Class<?> 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<VirtualDevice> devices = 
(List<VirtualDevice>)_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);

Reply via email to