首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取VMWare DataStore库存数据(库存遍历)

获取VMWare DataStore库存数据(库存遍历)
EN

Stack Overflow用户
提问于 2013-07-02 00:38:57
回答 1查看 5.4K关注 0票数 2

我正在尝试从我的VMware ESXi服务器中的DataStores获取典型属性(容量、可用空间、名称)。我在获取TraversalSpec、ObjectSpec和PropertySpecs时遇到了麻烦。

有人能告诉我我哪里做错了吗?

代码语言:javascript
复制
public void GetDataStoreValues()
{
    PropertyFilterSpec spec = GetDataStoreQuery();

    ObjectContent[] objectContent = _service.RetrieveProperties(_sic.propertyCollector, new[] { spec } );
    foreach (ObjectContent content in objectContent)
    {
        if (content.obj.type == "DataStore")
        {
            //... get values
        }
    }
}

private PropertyFilterSpec GetDataStoreQuery()
{
    try
    {
        // Traversal to get to the host from ComputeResource
        TraversalSpec tSpec = new TraversalSpec
        {
            name = "HStoDS",
            type = "HostSystem",
            path = "dataStore",
            skip = false
        };

        // Now create Object Spec
        var objectSpec = new ObjectSpec
        {
            obj = _sic.rootFolder,
            skip = true,
            selectSet = new SelectionSpec[] { tSpec }
        };
        var objectSpecs = new[] { objectSpec };

        // Create PropertyFilterSpec using the PropertySpec and ObjectPec
        // created above.
        // Create Property Spec
        string[] propertyArray = new[] {
                                        "summary.capacity"
                                        ,"summary.freeSpace"
                                        ,"summary.name"
                                      };
        var propertySpec = new PropertySpec
        {
            all = true,
            pathSet = propertyArray,
            type = "DataStore"
        };
        var propertySpecs = new[] { propertySpec };

        var propertyFilterSpec = new PropertyFilterSpec
        {
            propSet = propertySpecs,
            objectSet = objectSpecs
        };

        return propertyFilterSpec;
    }
    catch (Exception)
    {
    }
    return null;
}

另外,对象类型名称是否区分大小写?当我看样本的时候,我似乎看到了各种各样的案例。

谢谢你的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-25 19:19:00

第一个问题:您可以使用以下代码来获取DataStore的属性。我在vCenter 5.1上测试了这段代码

代码语言:javascript
复制
public void Test()
{
    var properties = GetProperties(
        new ManagedObjectReference { type = "Datastore", Value = "<your_datastore_key>" },
        new[] {"summary.capacity", "summary.freeSpace", "summary.name"});
}

private List<DynamicProperty> GetProperties(ManagedObjectReference objectRef, string[] properties)
{
    var typesAndProperties = new Dictionary<string, string[]> { { objectRef.type, properties } };
    var objectContents = RetrieveResults(typesAndProperties, new List<ManagedObjectReference> { objectRef });
    return ExtractDynamicProperties(objectRef, objectContents);
}

private List<ObjectContent> RetrieveResults(Dictionary<string, string[]> typesAndProperties, List<ManagedObjectReference> objectReferences)
{
    var result = new List<ObjectContent>();
    var tSpec = new TraversalSpec { path = "view", skip = false };
    var oSpec = new ObjectSpec { skip = true, selectSet = new SelectionSpec[] { tSpec } };
    oSpec.obj = service.CreateListView(serviceContent.viewManager, objectReferences.ToArray());
    tSpec.type = "ListView";

    var fSpec = new PropertyFilterSpec
    {
        objectSet = new[] { oSpec },
        propSet = typesAndProperties.Keys.Select(typeName => new PropertySpec { type = typeName, pathSet = typesAndProperties[typeName] }).ToArray()
    };

    PropertyFilterSpec[] pfs = { fSpec };
    var retrieveResult = service.RetrievePropertiesEx(serviceContent.propertyCollector, pfs, new RetrieveOptions());
    if (retrieveResult != null)
    {
        result.AddRange(retrieveResult.objects);
        while (!String.IsNullOrEmpty(retrieveResult.token))
        {
            retrieveResult = service.ContinueRetrievePropertiesEx(serviceContent.propertyCollector, retrieveResult.token);
            result.AddRange(retrieveResult.objects);
        }
        service.DestroyView(oSpec.obj);
    }
    return result;
}

private static List<DynamicProperty> ExtractDynamicProperties(ManagedObjectReference objectRef, IEnumerable<ObjectContent> objectContents)
{
    var result = new List<DynamicProperty>();
    foreach (var objectContent in objectContents)
    {
        if (objectContent.propSet == null) continue;
        if (objectContent.obj == null) continue;
        if (objectContent.obj.type != objectRef.type || objectContent.obj.Value != objectRef.Value) continue;
        result.AddRange(objectContent.propSet);
    }
    return result;
}

如何运行示例:

  1. 初始化service by VimService类的对象和serviceContent by ServiceContent类的对象。
  2. 使用数据存储区的密钥登录到vCenter或ESX。您可以使用Managed Object Browser查找其数据存储区的密钥。要获取数据存储对象的描述,请转到MOB中的以下链接: content -> rootFolder -> childEntity -> datastoreFolder -> childEntity。页面顶部的"Managed Object ID“值是正确的键(如datastore-46).

第二个问题:是,ManagedObjectReference的类型区分大小写。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17409487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档