抽取Vcenter資料之抽取100條以外的額外所有資料
阿新 • • 發佈:2018-12-04
遇到的問題
當我們利用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; }