0

我正在编写一个与 VMWare vSphere 客户端交互的应用程序。它使用 vijava 库来做到这一点。我需要使用 NFS 服务器的 IP 地址和导出目录的名称在主机上查找 NAS 数据存储。

我可以使用 HostFileSystemVolume.type 查找该主机上的数据存储并找出 NFS 类型的数据存储,但我现在如何找到此数据存储的 NASDatastoreInfo 对象。文档很庞大,我没有时间阅读所有内容。我知道我需要为我找到的相应 Datastore 对象获取 NASDatastoreInfo 对象,但无法找出任何可能返回 NASDatastoreInfo 对象的方法。您所拥有的只是来自 Datastore 对象的 DatastoreInfo 对象。

任何帮助,将不胜感激。

谢谢...自由

4

2 回答 2

1

除非挂载,否则您将无法获得有关 NAS 的任何卷信息。

我怀疑您的主机上安装了那么多驱动器。

建议:

  1. 只需抓取所有已安装的卷

  2. 检查它们每个的 NASDataStoreInfo 属性

  3. 只需忽略没有它的卷。

于 2012-11-19T01:41:03.723 回答
0

这就是我设法做到的方式。代码可能看起来有点复杂,但要点如下:

查找该主机的所有卷,并找到在其上构建了 NFS 文件系统的卷。对于这些卷中的每一个,使用卷名 = 数据存储名称条件迭代数据存储列表。找到匹配项后,从 DatastoreInfo 对象获取 NASDatastoreInfo 对象并检查远程 NFS 服务器 IP 和导出目录。

我为此主机上的所有卷检查了 HostFileSystemVolume.type=='NFS',然后检查了该卷的远程 NFS 服务器 IP 和导出目录。

代码已经有一个指向 vCenter 的服务实例“si”和一个名为“host”的 HostSystem 对象

     HostDatastoreSystem hds = host.getHostDatastoreSystem();
     HostDatastoreBrowser hdb = host.getDatastoreBrowser();
     Datastore[] allDS = hdb.getDatastores();
     HostConfigInfo hostConfigInfo = host.getConfig();
     HostFileSystemVolumeInfo hostFSVolumeInfo = hostConfigInfo.getFileSystemVolume();
     HostFileSystemMountInfo[] hostFSMountInfo= hostFSVolumeInfo.getMountInfo();
     for (HostFileSystemMountInfo hfsmi : hostFSMountInfo) {
         HostFileSystemVolume hfsv = hfsmi.getVolume();
         if (hfsv.getType().equalsIgnoreCase("nfs")){
             String dsName = hfsv.getName();
             for(Datastore ds: allDS) {
                 DatastoreInfo di = ds.getInfo();
                 if (di.getName().equals(dsName)){
                     HostNasVolume nas = ((NasDatastoreInfo)di).getNas();
                     if (nas.getRemoteHost().equals(nfsServer) & nas.getRemotePath().equals(datastorePathOnNfsServer)) {
                         try {
                        } catch (HostConfigFault e) {
                             logger.error("ERROR : unmountNfsDatastore : Could not remove Datastore named: " + ds.getName() + " on " +  "host: " + hostname , e);
                             ret = 1;
                             return ret;
                        } catch (ResourceInUse e) {
                             logger.error("ERROR : unmountNfsDatastore : Could not remove Datastore named: " + ds.getName() + " on " +  "host: " + hostname , e);
                             ret = 1;
                             return ret;
                        } catch (NotFound e) {
                             logger.error("ERROR : unmountNfsDatastore : Could not remove Datastore named: " + ds.getName() + " on " +  "host: " + hostname , e);
                             ret = 1;
                             return ret;
                        } catch (RuntimeFault e) {
                             logger.error("ERROR : unmountNfsDatastore : Could not remove Datastore named: " + ds.getName() + " on " +  "host: " + hostname , e);
                             ret = 1;
                             return ret;
                        } catch (RemoteException e) {
                             logger.error("ERROR : unmountNfsDatastore : Could not remove Datastore named: " + ds.getName() + " on " +  "host: " + hostname , e);
                             ret = 1;
                             return ret;
                        }
                         return 0;
                     }
                 }
             }
         }
     }
     logger.error("ERROR : unmountNfsDatastore : Could not find Datastore exported by " + nfsServer + " on " +  "host: " + hostname);
     ret = 0;
     return ret;
                            hds.removeDatastore(ds);
于 2012-11-19T19:14:30.943 回答