【问题标题】:How to access CreateNasDatastore in the vmware sdk?如何访问 vmware sdk 中的 CreateNasDatastore?
【发布时间】:2019-04-20 09:36:29
【问题描述】:

我正在尝试使用 Vmware Perl SDK 来挂载一个 nfs 数据存储,并且文档...具有挑战性...但是虽然我认为我已经解决了,但我得到了:

无法通过 ./mkds 第 65 行的包“ManagedObjectReference”定位对象方法“CreateNasDatastore”。

我也更新到了最新的 Perl SDK (6.7)...

根据https://pubs.vmware.com/vi3/sdk/ReferenceGuide/vim.host.DatastoreSystem.html

CreateNasDatastore是Managed Object HostDatastoreSystem中的一个方法,它是HostConfigManager的一个属性,所以对于每个主机,我获取HostSystem视图然后使用configManager->datastoreSystem对象:

...
foreach my $host_view (@$host_views) {
...
    print "connected to $host\n";

    my $cf_views = Vim::find_entity_views(view_type => 'HostSystem');
    foreach my $cfv (@$cf_views) {
        my $ds = $cfv->configManager->datastoreSystem;
        print Dumper($ds);
        # no arguments yet, just trying to find out how to invoke it
        $ds->CreateNasDatastore();
        exit 0;
    }
}
connected to vcenter01.ad.casco.net
Hosts found:
1: cvo-esx5.ad.casco.net
connected to cvo-esx5.ad.casco.net
$VAR1 = bless( {
                 'value' => 'ha-datastoresystem',
                 'type' => 'HostDatastoreSystem'
               }, 'ManagedObjectReference' );
Can't locate object method "CreateNasDatastore" via package "ManagedObjectReference" at ./mkds line 65.

我不确定如何访问它,希望其他人比我更了解这个结构...

【问题讨论】:

    标签: perl vmware


    【解决方案1】:

    您链接到的文档不是关于 Perl SDK 的,Perl 绑定可能看起来略有不同(不同的大小写约定、不同的输入顺序等),甚至与另一种语言的绑定有很大不同.

    所以这里有一个一般提示。要查看 ManagedObjectReference 提示支持的方法,请检查存储变量 %ManagedObjectReference::

    print "Symbols in 'ManagedObjectReference' namespace:\n\t";
    print join("\n\t", sort keys %ManagedObjectReference::);
    

    这将列出命名空间中的符号,其中一些将是方法名称,也许它们会提示您正在查找的方法的正确拼写。

    【讨论】:

    • ManagedObjectReference 只是一个基类:Symbols in 'ManagedObjectReference' namespace: BEGIN ISA deserialize get_property_list property_list serialize type
    • 我在 perl 模块中四处寻找,CreateNasDatastore 在 VIM25Runtime 中,它包含在最新的 6.7 SDK 中,但是当我使用它而不是 VIRuntime 时,我得到了Use of inherited AUTOLOAD for non-method Opts::get_option() is deprecated at /usr/share/perl5/VMware/VICommon.pm line 440. connected to vcenter01.ad.casco.net Vim::find_entity_view called, but no global session is defined at ./mkds line 34.
    • 进一步调查发现 VIRuntime 检查服务器 sdk 版本(显然是 2.5)并自行加载 VIM25Runtime,所以这是一个红鲱鱼
    【解决方案2】:

    我发现SDK安装的一些命令行工具是perl,在vicfg-nas中找到了这个解决方案(它也显示了如何构建参数结构):

    use VMware::VIRuntime;
    use VMware::VIExt;
    ...
    eval {
        Vim::login( user_name => $esx_user, password => $esx_pw, service_url => "https://$server/sdk");
    };
    ...
    my $datacenter_view = Vim::find_entity_view(view_type => 'Datacenter');
    my $host_views = Vim::find_entity_views(view_type => 'HostSystem',
                                            begin_entity => $datacenter_view);
    foreach my $host_view (@$host_views) {
        my $host = $host_view->{'name'};
        eval {
            Vim::login( user_name => $esx_user, password => $esx_pw, service_url => "https://$host/sdk");
        };
    
        my $ds_view = Vim::get_view(mo_ref => $host_view->{'configManager.datastoreSystem'});
    
        my $hostNasVolSpec = new HostNasVolumeSpec (remoteHost => $fileserver, 
                                                   remotePath => $share, 
                                                   localPath => $label,
                                                   accessMode => $accessMode); 
        $ds_view->CreateNasDatastore(spec => $hostNasVolSpec);
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      相关资源
      最近更新 更多