Vmware Vsphere WebService SDK開發(第一講)-基本知識學習


剛開始這方面開發的時候,不知道如何下手,能夠查到的資料特別少,而且看到很多網友和我一樣也在找這方面的資料。接下來的一段時間我就結合自己所參與的項目,完成關於Vmware Vsphere WebService SDK開發的一系列教程(java),分享自己在Vmware開發過程中學習到的知識,希望能和大家一起進步。

今天先和大家學習下一些基本知識,我參考官方6.0英文文檔,SDK版本:VMware-vSphere-SDK-6.0.0-2561048。

 

Managed Object: 代表服務端對象,在vSphere server(ESX/ESXi 或 vCenter Server system)上,代表着vSphere的服務和組件,都直接或間接繼承自 ManagedEntity 抽象類。

Managed Object refereneces:代表客戶端對服務端對象的引用,客戶端應用程序通過使用ManagedObjectReference objects來向服務器發送請求操作。

Data objects:包含着關於managed objects的信息,你的客戶端通過發送data objects和接收data objects與服務端進行通信(通過鍵值對的形式)。

圖示為三者之間的關系:

 

接下來貼上認證、連接、斷開vcenter server的代碼(java):這個代碼在官方的例子中也有,直接拿過來用替換掉里面的url、username、password即可,代碼可以直接運行。

  1 import java.util.ArrayList;
  2 import java.util.List;
  3 import java.util.Map;
  4 
  5 import javax.net.ssl.HostnameVerifier;
  6 import javax.net.ssl.HttpsURLConnection;
  7 import javax.net.ssl.SSLSession;
  8 import javax.xml.ws.BindingProvider;
  9 import javax.xml.ws.soap.SOAPFaultException;
 10 
 11 import com.vmware.vim25.ManagedObjectReference;
 12 import com.vmware.vim25.ObjectContent;
 13 import com.vmware.vim25.PropertyFilterSpec;
 14 import com.vmware.vim25.RetrieveOptions;
 15 import com.vmware.vim25.RetrieveResult;
 16 import com.vmware.vim25.ServiceContent;
 17 import com.vmware.vim25.VimPortType;
 18 import com.vmware.vim25.VimService;
 19 
 20 /** 
 21 * @author Di
 22 * @功能描述 服務器的連接、認證、斷開
 23 * @date 創建時間:2016年12月8日 下午3:37:18 
 24 * @version 1.0   
 25 */
 26 public class MoniterWsInterface
 27 {
 28     private static String url = "";
 29     private static String userName = "";
 30     private static String password = "";
 31 
 32     private static final ManagedObjectReference SVC_INST_REF = new ManagedObjectReference();
 33     public static VimService vimService;
 34     public static VimPortType vimPort;
 35 
 36     public static ServiceContent serviceContent;
 37     private static final String SVC_INST_NAME = "ServiceInstance";
 38     private static Boolean isConnected = false;
 39     public static ManagedObjectReference perfManager;
 40     public static ManagedObjectReference propCollectorRef;
 41 
 42     private static class TrustAllTrustManager implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager
 43     {
 44         public java.security.cert.X509Certificate[] getAcceptedIssuers()
 45         {
 46             return null;
 47         }
 48 
 49         public boolean isServerTrusted(java.security.cert.X509Certificate[] certs)
 50         {
 51             return true;
 52         }
 53 
 54         public boolean isClientTrusted(java.security.cert.X509Certificate[] certs)
 55         {
 56             return true;
 57         }
 58 
 59         public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException
 60         {
 61             return;
 62         }
 63 
 64         public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException
 65         {
 66             return;
 67         }
 68     }
 69 
 70     private static void trustAllHttpsCertificates() throws Exception
 71     {
 72         javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
 73         javax.net.ssl.TrustManager tm = new TrustAllTrustManager();
 74         trustAllCerts[0] = tm;
 75         javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL");
 76         javax.net.ssl.SSLSessionContext sslsc = sc.getServerSessionContext();
 77         sslsc.setSessionTimeout(0);
 78         sc.init(null, trustAllCerts, null);
 79         javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
 80     }
 81 
 82     /**
 83      * @功能描述 連接認證
 84      */
 85     public static void connect() throws Exception
 86     {
 87         HostnameVerifier hv = new HostnameVerifier()
 88         {
 89             public boolean verify(String urlHostName, SSLSession session)
 90             {
 91                 return true;
 92             }
 93         };
 94         trustAllHttpsCertificates();
 95 
 96         HttpsURLConnection.setDefaultHostnameVerifier(hv);
 97 
 98         SVC_INST_REF.setType(SVC_INST_NAME);
 99         SVC_INST_REF.setValue(SVC_INST_NAME);
100 
101         vimService = new VimService();
102         vimPort = vimService.getVimPort();
103         Map<String, Object> ctxt = ((BindingProvider) vimPort).getRequestContext();
104 
105         ctxt.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);
106         ctxt.put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true);
107 
108         serviceContent = vimPort.retrieveServiceContent(SVC_INST_REF);
109         vimPort.login(serviceContent.getSessionManager(), userName, password, null);
110         isConnected = true;
111 
112         perfManager = serviceContent.getPerfManager();
113         propCollectorRef = serviceContent.getPropertyCollector();
114         
115         System.out.println(serviceContent.getAbout().getFullName());
116         System.out.println("Server type is " + serviceContent.getAbout().getApiType());
117     }
118 
119     /**
120      * @功能描述 斷開連接
121      * @return
122      * @throws Exception
123      */
124     public static void disconnect() throws Exception
125     {
126         if (isConnected)
127         {
128             vimPort.logout(serviceContent.getSessionManager());
129         }
130         isConnected = false;
131     }
132 
133     /**
134      * @功能描述 打印錯誤信息
135      * @param
136      * @param sfe
137      */
138     public static void printSoapFaultException(SOAPFaultException sfe)
139     {
140         System.out.println("Soap fault: ");
141         if (sfe.getFault().hasDetail())
142         {
143             System.out.println(sfe.getFault().getDetail().getFirstChild().getLocalName());
144         }
145         if (sfe.getFault().getFaultString() != null)
146         {
147             System.out.println("Message: " + sfe.getFault().getFaultString());
148         }
149     }
150         
151     /**
152      * @功能描述 根據屬性檢索要查詢的對象信息
153      * @param listpfs 屬性過濾器集合
154      * @throws Exception
155      */
156     public static List<ObjectContent> retrievePropertiesAllObjects(List<PropertyFilterSpec> listpfs) throws Exception
157     {
158         RetrieveOptions propObjectRetrieveOpts = new RetrieveOptions();
159         List<ObjectContent> listobjcontent = new ArrayList<ObjectContent>();
160         try
161         {
162             RetrieveResult rslts = vimPort.retrievePropertiesEx(propCollectorRef, listpfs, propObjectRetrieveOpts);
163             if (rslts != null && rslts.getObjects() != null && !rslts.getObjects().isEmpty())
164             {
165                 listobjcontent.addAll(rslts.getObjects());
166             }
167             String token = null;
168             if (rslts != null && rslts.getToken() != null)
169             {
170                 token = rslts.getToken();
171             }
172             while (token != null && !token.isEmpty())
173             {
174                 rslts = vimPort.continueRetrievePropertiesEx(propCollectorRef, token);
175                 token = null;
176                 if (rslts != null)
177                 {
178                     token = rslts.getToken();
179                     if (rslts.getObjects() != null && !rslts.getObjects().isEmpty())
180                     {
181                         listobjcontent.addAll(rslts.getObjects());
182                     }
183                 }
184             }
185         }
186         catch (SOAPFaultException sfe)
187         {
188             printSoapFaultException(sfe);
189         }
190         catch (Exception e)
191         {
192             e.printStackTrace();
193         }
194 
195         return listobjcontent;
196     }
197     
198     /**
199      * @see main測試方法
200      * */
201     public static void main(String[] args)
202     {
203         new MoniterWsInterface();
204         try
205         {
206             connect();
207         }
208         catch (SOAPFaultException sfe)
209         {
210             printSoapFaultException(sfe);
211         }
212         catch (Exception e)
213         {
214             e.printStackTrace();
215         }
216         finally
217         {
218             try
219             {
220                 disconnect();
221             }
222             catch (SOAPFaultException sfe)
223             {
224                 printSoapFaultException(sfe);
225             }
226             catch (Exception e)
227             {
228                 e.printStackTrace();
229             }
230         }
231     }
232 }

 

現在我們對Vcenter中涉及的三種數據類型有了一定的認識,接下來學習重要的清單遍歷知識。

清單層次和servicetInstance:

Serviceinstance:Serviceinstance是清單根對象,從這里開始訪問清單的各個層次,通常一個serviceinstance會綁定一個session,當開啟session時,vsphere會創建一個具有rootFolder,和四個不同類型Folder的serviceInstance。

rootFolder:清單遍歷根目錄。

Datacenter:rootFolder下就是數據中心,數據中心可以創建多個,一個session會自帶一個。

hostFolder(左一):包含ComputeResource(計算資源)的目錄,ComputeResource下還有HostSystem(主機)、ResourcePool(資源池)對象,如果想獲取計算資源、主機、資源池、集群的對象及其信息,就需要通過此條路徑遍歷獲取。

vmFolder(左二):包含VirtualMachine(虛擬機)、VirtualApp(虛擬應用),如果想獲取虛擬機對象或虛擬機相關信息,就需要通過此遍歷層次遍歷獲取。

networkFolder(右二):包含Network(網絡),此條遍歷路徑便是獲取Network的。

datastoreFolder(右一):包含Datastore(數據存儲),通過此遍歷路徑獲取和數據存儲相關的所有信息。

                         圖一

訪問具體清單元素的遍歷路徑:

從清單的根元素ServiceInstance開始,通過帶有(Property collector)屬性收集器的TraversalSpec和對象的屬性確定對象在清單中的位置。

ServiceInstance具有content的屬性:content屬性是ServiceContent對象,serviceContent中包含很多重要的屬性和服務的引用。

ServiceContent具有rootFolder屬性:屬性是rootFolder。

rootFolder有childEntity屬性:屬性指向的對象便是Datacenter(數據中心)。

Datacenter用於四個不同的Folder屬性:分別指向四個不同的Folder對象,hostFolder、vmFolder、networkFolder、datastoreFolder(參照圖一)。

每一個Folder對應childEntity屬性:hostFolder對應ComputeResource等,vmFolder對象VirtualMachine等,networkFolder對應NetWork,datastoreFolder對應DataStore等。(可參考圖一)

 前面講了這么多清單遍歷的知識,接下來就和大家演示下如何獲取Datacenter對象及其屬性,代碼可以直接運行。

  1 import java.util.ArrayList;
  2 import java.util.List;
  3 
  4 import javax.xml.ws.soap.SOAPFaultException;
  5 
  6 import com.vmware.vim25.DynamicProperty;
  7 import com.vmware.vim25.ManagedObjectReference;
  8 import com.vmware.vim25.ObjectContent;
  9 import com.vmware.vim25.ObjectSpec;
 10 import com.vmware.vim25.PropertyFilterSpec;
 11 import com.vmware.vim25.PropertySpec;
 12 import com.vmware.vim25.SelectionSpec;
 13 import com.vmware.vim25.TraversalSpec;
 14 
 15 /** 
 16 * @author Di
 17 * @see 獲取數據中心對象引用及name屬性
 18 * @date 創建時間:2016年12月8日 下午4:01:33 
 19 * @version 1.0   
 20 */
 21 public class GetDataCenter {
 22     
 23     /**
 24      * @see 獲取遍歷數據中心的TraversalSpec
 25      * @explain:清單遍歷一定要結合清單遍歷結構圖。
 26      * @return TraversalSpec:清單遍歷對象,明確屬性收集的對象類型,同事提供對象遍歷的路徑。
 27      * */
 28     public static TraversalSpec getDatacenterTraversalSpec()  
 29     {  
 30         //SelectionSpec是TraversalSpec的一個引用。
 31         SelectionSpec sSpec = new SelectionSpec();  
 32         sSpec.setName("VisitFolders");  
 33         
 34         TraversalSpec traversalSpec = new TraversalSpec();  
 35         //給traversalSpec設置名稱
 36         traversalSpec.setName("VisitFolders");    
 37         //從rootFolder開始遍歷,rootFolder類型是Folder
 38         traversalSpec.setType("Folder");  
 39         //rootFolder擁有childEntity屬性,清單結構圖中指向的便是Datacenter
 40         traversalSpec.setPath("childEntity");
 41         //false表示不對其本身進行收集,只對其下對象進行收集
 42         traversalSpec.setSkip(false);
 43         //將sSpec添加到SelectionSpec集合中
 44         traversalSpec.getSelectSet().add(sSpec);  
 45         return traversalSpec;  
 46     }
 47     
 48     /**
 49      * @see 獲取出所有的數據中心
 50      * @return retVal:數據中心對象引用list。
 51      * */
 52     public static List<ManagedObjectReference> getAllDatacenter()
 53     {
 54         List<ManagedObjectReference> retVal = new ArrayList<ManagedObjectReference>();
 55         //獲取根目錄對象引用
 56         ManagedObjectReference rootFolder = MoniterWsInterface.serviceContent.getRootFolder();
 57         try
 58         {
 59             TraversalSpec tSpec = getDatacenterTraversalSpec();
 60             
 61             /** 
 62              * ObjectSpec:定義對象詳述,明確清單導航起始點。
 63              * obj:定義遍歷起始對象為根目錄rootFolder
 64              * true:表示只收集Datacenter的數據,不收集containerView的數據。
 65              * */
 66             ObjectSpec objectSpec = new ObjectSpec();
 67             objectSpec.setObj(rootFolder);
 68             objectSpec.setSkip(Boolean.TRUE);
 69             
 70             /** 添加 tSpec到 ObjectSpec.selectSet隊列中 */
 71             objectSpec.getSelectSet().add(tSpec);
 72 
 73             /**
 74              * PropertySpec:定義一個屬性收集器詳述,明確收集的具體對象(Datacenter)和屬性(Datacenter中的name,可以為多個)
 75              * Type:具體的對象類型為Datacenter
 76              * pathset:明確對象Datacenter中的屬性,可以為多個。
 77              * */
 78             PropertySpec propertySpec = new PropertySpec();
 79             propertySpec.setAll(Boolean.FALSE);
 80             propertySpec.getPathSet().add("name");
 81             propertySpec.setType("Datacenter");
 82             
 83             /**
 84              * PropertyFilterSpec:定義一個屬性過濾器詳述,添加對象詳述和屬性收集器詳述到過率中
 85              * */ 
 86             PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec();
 87             propertyFilterSpec.getPropSet().add(propertySpec);
 88             propertyFilterSpec.getObjectSet().add(objectSpec);
 89 
 90             /** 添加屬性過濾器詳述到屬性過濾器集合中 */
 91             List<PropertyFilterSpec> listfps = new ArrayList<PropertyFilterSpec>(1);
 92             listfps.add(propertyFilterSpec);
 93             
 94             /** 調用方法獲取ObjectContent對象集合 */
 95             List<ObjectContent> listobcont = MoniterWsInterface.retrievePropertiesAllObjects(listfps);
 96 
 97             if (listobcont != null)
 98             {
 99                 for (ObjectContent oc : listobcont)
100                 {
101                     //根據object對象獲得MOR對象
102                     ManagedObjectReference mr = oc.getObj();
103                     
104                     String dcnm = null;
105                     //獲取屬性集合(此處只有一個name屬性)
106                     List<DynamicProperty> dps = oc.getPropSet();
107                     if (dps != null)
108                     {
109                         for (DynamicProperty dp : dps)
110                         {
111                             //獲取到具體的數據中心(Datacenter)的名稱
112                             dcnm = (String) dp.getVal();
113                             //System.out.println("數據中心名稱"+dcnm);
114                             retVal.add(mr);
115                         }
116                     }
117                 }
118             }
119         }
120         catch (SOAPFaultException sfe)
121         {
122             MoniterWsInterface.printSoapFaultException(sfe);
123         }
124         catch (Exception e)
125         {
126             e.printStackTrace();
127         }
128         return retVal;
129     }
130 
131     /**
132      * @see 獲取出所有的數據中心,和上面方法一樣,只是最后返回值取得是Datacenter的屬性name的值,而非Datacenter的對象引用。
133      * @return retVal:數據中心名稱list。
134      * */
135     public static List<String> getDatacenterName()
136     {
137         List<String> retVal = new ArrayList<String>();
138         ManagedObjectReference rootFolder = MoniterWsInterface.serviceContent.getRootFolder();
139         try
140         {
141             TraversalSpec tSpec = getDatacenterTraversalSpec();
142             
143             ObjectSpec objectSpec = new ObjectSpec();
144             objectSpec.setObj(rootFolder);
145             objectSpec.setSkip(Boolean.TRUE);
146             objectSpec.getSelectSet().add(tSpec);
147             
148             PropertySpec propertySpec = new PropertySpec();
149             propertySpec.setAll(Boolean.FALSE);
150             propertySpec.getPathSet().add("name");
151             propertySpec.setType("Datacenter");
152 
153             //添加對象和屬性聲明到 PropertyFilterSpec。 
154             PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec();
155             propertyFilterSpec.getPropSet().add(propertySpec);
156             propertyFilterSpec.getObjectSet().add(objectSpec);
157 
158             List<PropertyFilterSpec> listfps = new ArrayList<PropertyFilterSpec>(1);
159             listfps.add(propertyFilterSpec);
160             
161             List<ObjectContent> listobcont = MoniterWsInterface.retrievePropertiesAllObjects(listfps);
162 
163             if (listobcont != null)
164             {
165                 for (ObjectContent oc : listobcont)
166                 {
167                     //根據object對象獲得MOR對象
168                     ManagedObjectReference mr = oc.getObj();
169                     
170                     String dcnm = null;
171                     List<DynamicProperty> dps = oc.getPropSet();
172                     if (dps != null)
173                     {
174                         for (DynamicProperty dp : dps)
175                         {
176                             dcnm = (String) dp.getVal();
177                             retVal.add(dcnm);
178                         }
179                     }
180                 }
181             }
182         }
183         catch (SOAPFaultException sfe)
184         {
185             MoniterWsInterface.printSoapFaultException(sfe);
186         }
187         catch (Exception e)
188         {
189             e.printStackTrace();
190         }
191         return retVal;
192     }
193     
194     /**
195      * @see main測試方法
196      * */
197     public static void main(String[] args) throws Exception {
198         MoniterWsInterface moniterWsInterface = new MoniterWsInterface();
199         moniterWsInterface.connect();
200         
201        /* List<ManagedObjectReference> allDatacenter = getAllDatacenter();
202         for (ManagedObjectReference dataCenter : allDatacenter) {
203             System.out.println(dataCenter.getType());
204         }*/
205         List<String> datacenterName = getDatacenterName();
206         for (String name : datacenterName) {
207             System.out.println(name);
208         }
209         moniterWsInterface.disconnect();
210     }
211 }

今天的入門知識就先講這么多,新手一定要先學習下文檔掌握基本的知識,然后結合代碼練手,這樣的可以更快的掌握套路。

關於主機、虛擬機、存儲、集群等等其他的操作,我會在之后的文章為大家呈現,敬請期待。如果對哪塊資源的操作需求特別緊急,可以給我評論留言。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM