1. 程式人生 > >抽取Vcenter資料之抽取100條以外的額外所有資料

抽取Vcenter資料之抽取100條以外的額外所有資料

遇到的問題

當我們利用Vsphere Web SDK獲取Vsphere資料的時候,當資源資訊大於100條的時候,我們利用最基本的API的時候只能抽取到了100條資料。例如一個Vcenter管理了1000個虛擬機器,當我們用SDK去獲取所有虛擬機器的時候,我們利用最基本的API只能獲取到100個虛擬機器資訊,其餘的是獲取不到的。那麼這個問題怎麼解決呢?這個時候我們就該用到另一個高階的方法來配合基本的API來完成所有資料的抽取工作。以下資訊是我個人做的簡單的總結,只為大家提供一個簡單的思路,具體的完整程式碼就不方便展示出來了。如果有問題可以下邊留言給我。

最基本的API來抽取最多100條資料


Map<ManagedObjectReference, Map<String, Object>> result = conn.getMoref().inContainerByType(
				conn.getServiceContent().getRootFolder(), "VirtualMachine", new String[] { "name" });
				

public Map<ManagedObjectReference, Map<String, Object>> inContainerByType(ManagedObjectReference container,
                                                                              	String morefType, String[] strings) throws InvalidPropertyFaultMsg, 										RuntimeFaultFaultMsg {
        return inContainerByType(container, morefType, strings, new RetrieveOptions());
}



public Map<ManagedObjectReference, Map<String, Object>> inContainerByType(ManagedObjectReference container,
                                                                              String morefType, String[]
																					  morefProperties, RetrieveOptions
																					  retrieveOptions)
            throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg {
        //這個方法就是獲取雲平臺數據的。但是他的返回的個數是100個,不是所有的資料
        RetrieveResult rslts = containerViewByType(container, morefType, retrieveOptions,
                morefProperties);

        List<ObjectContent> oCont = rslts.getObjects();

        Map<ManagedObjectReference, Map<String, Object>> tgtMoref = new HashMap<ManagedObjectReference, Map<String,
				Object>>();
        if (oCont != null) {
            for (ObjectContent oc : oCont) {
                Map<String, Object> propMap = new HashMap<String, Object>();
                List<DynamicProperty> dps = oc.getPropSet();
                if (dps != null) {
                    for (DynamicProperty dp : dps) {
                        propMap.put(dp.getName(), dp.getVal());
                    }
                }
                tgtMoref.put(oc.getObj(), propMap);
            }
        }
        return tgtMoref;
}


基本API配合高階API抽取全部資訊資料

Map<ManagedObjectReference, Map<String, Object>> result = conn.getMoref().inContainerByType(
				conn.getServiceContent().getRootFolder(), "VirtualMachine", new String[] { "name" });
}



public Map<ManagedObjectReference, Map<String, Object>> inContainerByType(ManagedObjectReference container,
                                                                              	String morefType, String[] strings) throws InvalidPropertyFaultMsg, 										RuntimeFaultFaultMsg {
        return inContainerByType(container, morefType, strings, new RetrieveOptions());
}


 public Map<ManagedObjectReference, Map<String, Object>> inContainerByType(ManagedObjectReference container,
                                                                              String morefType, String[]
																					  morefProperties, RetrieveOptions
																					  retrieveOptions)
            throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg {
        RetrieveResult rslts = containerViewByType(container, morefType, retrieveOptions,
                morefProperties);

        List<ObjectContent> oCont = rslts.getObjects();

        //為了收集所有資料進行的原始碼改動地方,這個就是配合基本API的高階API,繼續獲取其餘剩下的全部資料資訊
        String token = null;
        if (rslts != null && rslts.getToken() != null) {
            token = rslts.getToken();
        }
        while (token != null && !token.isEmpty()) {
            rslts = vimPort.continueRetrievePropertiesEx(serviceContent.getPropertyCollector(),
                    token);
            token = null;
            if (rslts != null) {
                token = rslts.getToken();
                if (rslts.getObjects() != null && !rslts.getObjects().isEmpty()) {
                    oCont.addAll(rslts.getObjects());
                }
            }
        }
        //改動結束
        Map<ManagedObjectReference, Map<String, Object>> tgtMoref = new HashMap<ManagedObjectReference, Map<String,
				Object>>();
        if (oCont != null) {
            for (ObjectContent oc : oCont) {
                Map<String, Object> propMap = new HashMap<String, Object>();
                List<DynamicProperty> dps = oc.getPropSet();
                if (dps != null) {
                    for (DynamicProperty dp : dps) {
                        propMap.put(dp.getName(), dp.getVal());
                    }
                }
                tgtMoref.put(oc.getObj(), propMap);
            }
        }
        return tgtMoref;
}