I was recently working on a script for a friend that collects some basic information about VMFS based Datastores. While going through the vSphere API 5.5 Reference, I noticed a new property was introduced in vSphere 5.5 API called "local". It looks like we now have a simple way of checking whether a given VMFS Datastore is local or not. In the past, the only semi-reliable method for checking whether a VMFS datastore was local or not was to see if the "multipleHostAccess" property was set to true, which meant it was a shared VMFS. This was not very reliable as it could be a remote VMFS Datastore but only exported to one host so far and the other major caveat is that this property was only available when connecting to a vCenter Server.
To demonstrate this new API property, I have created an example vSphere SDK for Python (pyvmomi) sample called: list_datastore_info.py
Here is a screenshot running the script directly against an ESXi host (you can also connect to vCenter Server as well):
The script also supports a --json|-j output option, here is an example of that:
If you want to be able to format the JSON output in a more friendly manner, you can pipe the string output to python -mjson.tool
Awesome post! I have a question... I see you can get the total capacity for each datastore. Is there any way of getting the used/free disk space for each datastore?
I upgraded my lab to 5.5 U2 today to support vaai unmap with powershell get-esxcli, was going to use the 'local' property to check to see if the datastore was on the SAN:
I was surprised to see that the default local VMFS datastore (the one on the internal RAID-1 OS disks) is showing local = false (incorrect) while showing MultipleHostAccess = False (correct):
PS C:\> $datastores.ExtensionData.info.vmfs.local
PS C:\> $datastores.ExtensionData.Summary.MultipleHostAccess
William Lam says
I've seen internal RAID devices show miss-reporting as ESXi can't tell if the device is in fact remote or local, if I were to guess the device is most likely connected via SAS Controller? This is challenge for some devices that are truly local and the only way to get them to be recognized as a local device is by adding an ESXCLI claimrule.