diff --git a/core/src/main/java/com/cloud/agent/api/ModifyStoragePoolAnswer.java b/core/src/main/java/com/cloud/agent/api/ModifyStoragePoolAnswer.java index 6e6dadc67f7..a5f7c53214b 100644 --- a/core/src/main/java/com/cloud/agent/api/ModifyStoragePoolAnswer.java +++ b/core/src/main/java/com/cloud/agent/api/ModifyStoragePoolAnswer.java @@ -27,6 +27,7 @@ public class ModifyStoragePoolAnswer extends Answer { private StoragePoolInfo poolInfo; private Map templateInfo; private String localDatastoreName; + private String poolType; public ModifyStoragePoolAnswer(ModifyStoragePoolCommand cmd, long capacityBytes, long availableBytes, Map tInfo) { super(cmd); @@ -61,4 +62,13 @@ public class ModifyStoragePoolAnswer extends Answer { public String getLocalDatastoreName() { return localDatastoreName; } + + + public String getPoolType() { + return poolType; + } + + public void setPoolType(String poolType) { + this.poolType = poolType; + } } diff --git a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java index 64533d54d2f..1b9682a2fa3 100644 --- a/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java +++ b/engine/storage/volume/src/main/java/org/apache/cloudstack/storage/datastore/provider/DefaultHostListener.java @@ -22,6 +22,9 @@ import java.util.List; import javax.inject.Inject; +import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO; +import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao; +import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; @@ -53,6 +56,8 @@ public class DefaultHostListener implements HypervisorHostListener { StoragePoolHostDao storagePoolHostDao; @Inject PrimaryDataStoreDao primaryStoreDao; + @Inject + StoragePoolDetailsDao storagePoolDetailsDao; @Override public boolean hostAdded(long hostId) { @@ -102,6 +107,10 @@ public class DefaultHostListener implements HypervisorHostListener { StoragePoolVO poolVO = this.primaryStoreDao.findById(poolId); poolVO.setUsedBytes(mspAnswer.getPoolInfo().getCapacityBytes() - mspAnswer.getPoolInfo().getAvailableBytes()); poolVO.setCapacityBytes(mspAnswer.getPoolInfo().getCapacityBytes()); + if(StringUtils.isNotEmpty(mspAnswer.getPoolType())) { + StoragePoolDetailVO storagePoolDetailVO = new StoragePoolDetailVO(poolId, "pool_type", mspAnswer.getPoolType(), false); + storagePoolDetailsDao.persist(storagePoolDetailVO); + } primaryStoreDao.update(pool.getId(), poolVO); s_logger.info("Connection established between storage pool " + pool + " and host " + hostId); diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java index 50b95c14a72..1230fa8fe1a 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -4908,7 +4908,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa ManagedObjectReference morDatastore = HypervisorHostHelper.findDatastoreWithBackwardsCompatibility(hyperHost, pool.getUuid()); if (morDatastore == null) { - morDatastore = hyperHost.mountDatastore(pool.getType() == StoragePoolType.VMFS, pool.getHost(), pool.getPort(), pool.getPath(), pool.getUuid().replace("-", "")); + morDatastore = hyperHost.mountDatastore((pool.getType() == StoragePoolType.VMFS || pool.getType() == StoragePoolType.PreSetup), pool.getHost(), pool.getPort(), pool.getPath(), pool.getUuid().replace("-", "")); } assert (morDatastore != null); @@ -4924,6 +4924,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa ModifyStoragePoolAnswer answer = new ModifyStoragePoolAnswer(cmd, capacity, available, tInfo); if (cmd.getAdd() && (pool.getType() == StoragePoolType.VMFS || pool.getType() == StoragePoolType.PreSetup)) { + answer.setPoolType(dsMo.getDatastoreType()); answer.setLocalDatastoreName(morDatastore.getValue()); } diff --git a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java index bdaeddca4c0..84b7bfdf9af 100644 --- a/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java +++ b/plugins/storage/volume/default/src/main/java/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java @@ -29,6 +29,7 @@ import java.util.UUID; import javax.inject.Inject; +import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope; @@ -133,6 +134,7 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements PrimaryDataStore Long zoneId = (Long)dsInfos.get("zoneId"); String url = (String)dsInfos.get("url"); String providerName = (String)dsInfos.get("providerName"); + String hypervisorType = (String)dsInfos.get("hypervisorType"); if (clusterId != null && podId == null) { throw new InvalidParameterValueException("Cluster id requires pod id"); } @@ -327,7 +329,7 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements PrimaryDataStore uuid = (String)existingUuid; } else if (scheme.equalsIgnoreCase("sharedmountpoint") || scheme.equalsIgnoreCase("clvm")) { uuid = UUID.randomUUID().toString(); - } else if (scheme.equalsIgnoreCase("PreSetup")) { + } else if (scheme.equalsIgnoreCase("PreSetup") && !(StringUtils.isNotBlank(hypervisorType) && HypervisorType.getType(hypervisorType).equals(HypervisorType.VMware))) { uuid = hostPath.replace("/", ""); } else { uuid = UUID.nameUUIDFromBytes((storageHost + hostPath).getBytes()).toString(); diff --git a/server/src/main/java/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java index b8b312bd267..a248d71e72c 100644 --- a/server/src/main/java/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java @@ -32,6 +32,8 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreDriver; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailVO; +import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -52,6 +54,9 @@ public class StoragePoolJoinDaoImpl extends GenericDaoBase spSearch; private final SearchBuilder spIdSearch; @@ -94,6 +99,10 @@ public class StoragePoolJoinDaoImpl extends GenericDaoBase details = extractApiParamAsMap(cmd.getDetails()); @@ -716,6 +720,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C params.put("zoneId", zone.getId()); params.put("clusterId", clusterId); params.put("podId", podId); + params.put("hypervisorType", hypervisorType.toString()); params.put("url", cmd.getUrl()); params.put("tags", cmd.getTags()); params.put("name", cmd.getStoragePoolName()); diff --git a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java index 26f8675f226..0d614349235 100644 --- a/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java +++ b/server/src/main/java/org/apache/cloudstack/vm/UnmanagedVMsManagerImpl.java @@ -491,7 +491,7 @@ public class UnmanagedVMsManagerImpl implements UnmanagedVMsManager { final String dsPath = disk.getDatastorePath(); final String dsType = disk.getDatastoreType(); final String dsName = disk.getDatastoreName(); - if (dsType.equals("VMFS")) { + if (dsType.equals(Storage.StoragePoolType.VMFS.toString())) { List pools = primaryDataStoreDao.listPoolsByCluster(cluster.getId()); pools.addAll(primaryDataStoreDao.listByDataCenterId(zone.getId())); for (StoragePool pool : pools) { diff --git a/ui/scripts/docs.js b/ui/scripts/docs.js index 7f29f2b3ac2..a801a6b52e0 100755 --- a/ui/scripts/docs.js +++ b/ui/scripts/docs.js @@ -711,7 +711,7 @@ cloudStack.docs = { externalLink: '' }, helpPrimaryStorageProtocol: { - desc: 'For XenServer, choose NFS, iSCSI, or PreSetup. For KVM, choose NFS, SharedMountPoint, RDB, CLVM or Gluster. For vSphere, choose VMFS (iSCSI or FiberChannel) or NFS. For Hyper-V, choose SMB/CIFS. For LXC, choose NFS or SharedMountPoint. For OVM, choose NFS or ocfs2.', + desc: 'For XenServer, choose NFS, iSCSI, or PreSetup. For KVM, choose NFS, SharedMountPoint, RDB, CLVM or Gluster. For vSphere, choose PreSetup (VMFS or iSCSI or FiberChannel or vSAN or vVols) or NFS. For Hyper-V, choose SMB/CIFS. For LXC, choose NFS or SharedMountPoint. For OVM, choose NFS or ocfs2.', externalLink: '' }, helpPrimaryStorageServer: { diff --git a/ui/scripts/system.js b/ui/scripts/system.js index 418ce53bc4c..ca0eb7e3aeb 100755 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -18735,8 +18735,8 @@ description: "nfs" }); items.push({ - id: "vmfs", - description: "vmfs" + id: "presetup", + description: "presetup" }); items.push({ id: "custom", @@ -18885,7 +18885,7 @@ $form.find('.form-item[rel=rbdsecret]').hide(); $form.find('.form-item[rel=glustervolume]').hide(); - } else if (protocol == "PreSetup") { + } else if (protocol == "PreSetup" && selectedClusterObj.hypervisortype != "VMware") { $form.find('.form-item[rel=server]').hide(); $form.find('.form-item[rel=server]').find(".value").find("input").val("localhost"); @@ -18983,7 +18983,7 @@ $form.find('.form-item[rel=rbdsecret]').hide(); $form.find('.form-item[rel=glustervolume]').hide(); - } else if (protocol == "vmfs") { + } else if (protocol == "presetup" && selectedClusterObj.hypervisortype == "VMware") { $form.find('.form-item[rel=server]').css('display', 'inline-block'); $form.find('.form-item[rel=server]').find(".value").find("input").val(""); @@ -19408,7 +19408,7 @@ array1.push("&details[0].user=" + args.data.smbUsername); array1.push("&details[1].password=" + encodeURIComponent(args.data.smbPassword)); array1.push("&details[2].domain=" + args.data.smbDomain); - } else if (args.data.protocol == "PreSetup") { + } else if (args.data.protocol == "PreSetup" && selectedClusterObj.hypervisortype != "VMware") { var path = args.data.path; if (path.substring(0, 1) != "/") path = "/" + path; @@ -19434,12 +19434,12 @@ var rbdid = args.data.rbdid; var rbdsecret = args.data.rbdsecret; url = rbdURL(rbdmonitor, rbdpool, rbdid, rbdsecret); - } else if (args.data.protocol == "vmfs") { + } else if (args.data.protocol == "presetup" && selectedClusterObj.hypervisortype == "VMware") { var path = args.data.vCenterDataCenter; if (path.substring(0, 1) != "/") path = "/" + path; path += "/" + args.data.vCenterDataStore; - url = vmfsURL("dummy", path); + url = presetupURL("dummy", path); } else if (args.data.protocol == "gluster") { var glustervolume = args.data.glustervolume; diff --git a/ui/scripts/zoneWizard.js b/ui/scripts/zoneWizard.js index f4d0e5db521..b7e5d019ce5 100755 --- a/ui/scripts/zoneWizard.js +++ b/ui/scripts/zoneWizard.js @@ -1434,8 +1434,8 @@ description: "nfs" }); items.push({ - id: "vmfs", - description: "vmfs" + id: "presetup", + description: "presetup" }); args.response.success({ data: items @@ -1576,7 +1576,7 @@ $form.find('[rel=rbdsecret]').hide(); $form.find('[rel=glustervolume]').hide(); - } else if (protocol == "PreSetup") { + } else if (protocol == "PreSetup" && selectedClusterObj.hypervisortype != "VMware") { $form.find('[rel=server]').hide(); $form.find('[rel=server]').find(".value").find("input").val("localhost"); @@ -1649,7 +1649,7 @@ $form.find('[rel=rbdsecret]').hide(); $form.find('[rel=glustervolume]').hide(); - } else if (protocol == "vmfs") { + } else if (protocol == "presetup" && selectedClusterObj.hypervisortype == "VMware") { $form.find('[rel=server]').css('display', 'block'); $form.find('[rel=server]').find(".value").find("input").val(""); @@ -4529,7 +4529,7 @@ array1.push("&details[0].user=" + args.data.primaryStorage.smbUsername); array1.push("&details[1].password=" + encodeURIComponent(args.data.primaryStorage.smbPassword)); array1.push("&details[2].domain=" + args.data.primaryStorage.smbDomain); - } else if (args.data.primaryStorage.protocol == "PreSetup") { + } else if (args.data.primaryStorage.protocol == "PreSetup" && selectedClusterObj.hypervisortype != "VMware") { var path = args.data.primaryStorage.path; if (path.substring(0, 1) != "/") path = "/" + path; @@ -4555,12 +4555,12 @@ var rbdid = args.data.primaryStorage.rbdid; var rbdsecret = args.data.primaryStorage.rbdsecret; url = rbdURL(rbdmonitor, rbdpool, rbdid, rbdsecret); - } else if (args.data.primaryStorage.protocol == "vmfs") { + } else if (args.data.primaryStorage.protocol == "presetup" && selectedClusterObj.hypervisortype == "VMware") { var path = args.data.primaryStorage.vCenterDataCenter; if (path.substring(0, 1) != "/") path = "/" + path; path += "/" + args.data.primaryStorage.vCenterDataStore; - url = vmfsURL("dummy", path); + url = presetupURL("dummy", path); } else { var iqn = args.data.primaryStorage.iqn; if (iqn.substring(0, 1) != "/") diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java index b9eeaeda309..fb98dfd4b9d 100644 --- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java +++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java @@ -441,4 +441,9 @@ public class DatastoreMO extends BaseMO { return isDatastoreCompatible; } + + public String getDatastoreType() throws Exception { + DatastoreSummary summary = _context.getVimClient().getDynamicProperty(getMor(), "summary"); + return summary.getType(); + } } diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareHelper.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareHelper.java index e2513ad6fb5..08b5672760a 100644 --- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareHelper.java +++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/util/VmwareHelper.java @@ -36,7 +36,6 @@ import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; -import com.vmware.vim25.VirtualDiskType; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger;