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);