日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用VMware VSphere WebService SDK进行开发 (一)——基本信息阐述

發布時間:2024/4/11 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用VMware VSphere WebService SDK进行开发 (一)——基本信息阐述 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。

歡迎跳轉到本文的原文鏈接:https://honeypps.com/backend/vmware-vsphere-webservice-sdk-basic/

?

網上對于VSphere WebService SDK的介紹比較少(至少我能查到的資料比較少),官方提供的也是英文版的api,而且沒有注明使用方法。最近接觸到關于VSphere WebService SDK的開發,剛開始也是煩躁,比如要獲取一個cpu使用情況的信息,按照慣例,API應該提供類似:long getCpuUsage() 之類的接口,但是絕逼沒有那么easy,不過很快掌握了規律。我覺得有必要分享一下我所了解到的知識點,希望能夠給各位讀者有那么一點拋磚引玉的作用。

我準備通過幾篇文章來主要講述如何使用VSphere WebService SDK 進行對資源信息的監控和告警的采集。對資源監視的監控主要包括:對虛擬機(Virtual Machine)信息的監控(cpu使用情況、磁盤的寫入以及讀取速度、內存的滯后時間、網絡的丟棄的傳輸和接收的數據報數等待)、對主機(HostSystem)的監控、對集群(Cluster, Compute Resource)信息的監控. 告警也是對這幾個主要的對象進行告警采集。

關于軟件的安裝,譬如vSphere的配置以及vSphere Client的安裝就此略過。我這里使用的版本是VMware-vSphere-SDK-5.0.0-429209。

本篇文章主要先闡述一些基本知識。

VMware vSphere支持健壯的、容錯的虛擬化應用、網絡和存儲。vSphere提供許多可選的組件和模塊,例如VMware High Availability(HA) 和VMware VMotion。VMware?vSphere Web Services SDK提供給Web Services開發者通過編程的方式訪問vSphere組件。

vSphere?API以無關語言的Web Serivce的形式實現,客戶端應用通過遠程調用來訪問ESX/ESXi, VCenter?vSphere systems上的服務和組件。

VMware?vSphere客戶端程序基于一個異步通訊的分布式架構模型,架構的基礎基于server-side managed object, client-side managed object references和data objects.

Managed Object: 在vSphere server(ESX/ESXi 或 vCenter Server system)上,代表著vSphere的服務和組件。服務包括 PropertyCollector, SearchIndex, PerformanceManager和ViewManager。組件包括inventory objects例如VirtualMachine,Datastore和Folder.

Managed Object refereneces:是客戶端應用服務器端managed objects.你的客戶端應用程序通過使用ManagedObjectReference objects來向服務器發送請求操作。在object的生命周期內ManagedObjectReferences是唯一和持久有效地。當一個存在與清單中由于過期sessions或服務器重啟而刪除的object的應用會依然存在。假如你刪除一個object,例如一個虛擬機,然后又找回它,對它的引用將改變。

Data objects:包含著關于managed objects的信息,你的客戶端程序發送data objects和接收data objects與一個vSphere server, 不同的標準和功能object例如VirtualMachineConfigSp和HostCapability.

下圖清楚的說明了這三種數據對象及 vSphere Sever 與 client 的關系。

在這三種數據對象中,MO 代表了服務器端的服務或組件,他們都直接或間接繼承自 ManagedEntity 抽象類。下面的類圖展示了目前 vSphere Infrastructure 中的 7 種最重要的 MO 類型和它們的繼承關系,它們代表了 vSphere Infrastructure 中的 7 種組件或者實體。

使用 SDK 開發自己的 vSphere 客戶端程序,首要的問題就是如何訪問和遍歷在 vSphere Inventory 中的對象。下面我們將介紹這方面的內容。

?

vSphere Inventory 介紹

?

?

vSphere inventory 其實就是 vSphere datacenter 及其管理的對象。在 vSphere inventory 中包含了以下三種類型的對象:

在 datacenter 中被管理的系統,比如 Host、VirtualMachine、VirtualApp 等。

具有一定功能的組件,比如 ComputeResource、DataStore,、Network 等。

負責組織歸類的組件,它們負責把 datacenter 中的對象按照層級關系組織起來形成了一個樹狀結構,比如 Folder 和 DataCenter。

ESX/ESXi server 和 vCenter 的 inventory 結構是類似的,只是在 ESX server 中,有些對象的數量有限制,比如在一個 ESX server 的 inventory 中只能有一個 Host 實體。下面兩張圖分別給出了 vCenter 這 ESX server 的 inventory 的結構。

?

vCenter Inventory 結構

?

?

?

上面這個關系圖很關鍵,對于系統中關鍵信息的檢索,首先要根據這張圖搜尋相關的ManagedObjectReference對象,然后根據此對象的屬性樹進行遍歷。比如搜尋DataCenter對象的相關信息:

?

private static TraversalSpec getDatacenterTraversalSpec(){SelectionSpec sSpec = new SelectionSpec();sSpec.setName("VisitFolders");TraversalSpec traversalSpec = new TraversalSpec();traversalSpec.setName("VisitFolders");traversalSpec.setType("Folder");traversalSpec.setPath("childEntity");traversalSpec.setSkip(false);traversalSpec.getSelectSet().add(sSpec);return traversalSpec;}

?

private static ManagedObjectReference getDatacenterByName(String datacenterName){ManagedObjectReference retVal = null;ManagedObjectReference rootFolder = serviceContent.getRootFolder();try{TraversalSpec tSpec = getDatacenterTraversalSpec();PropertySpec propertySpec = new PropertySpec();propertySpec.setAll(Boolean.FALSE);propertySpec.getPathSet().add("name");propertySpec.setType("Datacenter");ObjectSpec objectSpec = new ObjectSpec();objectSpec.setObj(rootFolder);objectSpec.setSkip(Boolean.TRUE);objectSpec.getSelectSet().add(tSpec);PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec();propertyFilterSpec.getPropSet().add(propertySpec);propertyFilterSpec.getObjectSet().add(objectSpec);List<PropertyFilterSpec> listfps = new ArrayList<PropertyFilterSpec>(1);listfps.add(propertyFilterSpec);List<ObjectContent> listobcont = retrievePropertiesAllObjects(listfps);if (listobcont != null){for (ObjectContent oc : listobcont){ManagedObjectReference mr = oc.getObj();String dcnm = null;List<DynamicProperty> dps = oc.getPropSet();if (dps != null){for (DynamicProperty dp : dps){dcnm = (String) dp.getVal();}}if (dcnm != null && dcnm.equals(datacenterName)){retVal = mr;break;}}}}catch (SOAPFaultException sfe){printSoapFaultException(sfe);}catch (Exception e){e.printStackTrace();}return retVal;}

上面的方法getDatacenterTraversalSpec()就是Datacenter的遍歷路徑代碼,然后方法getDatacenterByName(String datacenterName)才能根據獲得的遍歷路徑進行遍歷,獲取相應的Datacenter的對象。

對于Datacenter的遍歷路徑代碼,比較簡單,而對于VirtualMachine或者集群(ComputeResource)之類的遍歷路徑代碼相對復雜,之后再一一羅列。

?

?

ESX Server Inventory 結構

?

想要訪問 vCenter 或者 ESX server 中的某個對象或者調用其方法,就必須首先根據這個對象在 inventory 中的位置找個這個對象。從上圖可知,ServiceInstance 對象在 inventory 的結構樹中處于根位置,因此遍歷整個 inventory 或者要查找 inventory 中的某個對象,必須先從 ServiceInstance 開始。ServiceInstance 類中最重要的一個屬性(property,可以理解為類的成員變量)是 content,它指向數據類型(Data Object)ServiceContent 的一個實例。ServiceContent 類含有很多該 vSphere 服務實例的重要屬性和服務的引用,比如整個 inventory 的 root folder,session manager,property collector(用于查找和遍歷對象),以及 EventManager, TaskManager 等。下面的類圖展示了 ServiceInstance 和 ServiceContent 的部分屬性。

?

ServiceInstance 和 ServiceContent

?

以上資料在網上或者vSphere sdk自帶的API或者自帶的用例demo中可以找到相關的信息。本人只是挑一些重要概念陳述,接下去才主要講解如何通過編碼實現實時監控私有云的狀態,譬如虛擬機cpu使用情況等性能指標。

?

下面羅列一些主要的關鍵代碼(可以在vSphere sdk自帶的demo中找到相關代碼),包括認證、連接、斷開之類的操作。

?

public class MoniterWsInterface {private static String url;private static String userName;private static String password;private static final ManagedObjectReference SVC_INST_REF = new ManagedObjectReference();private static VimService vimService;private static VimPortType vimPort;private static ServiceContent serviceContent;private static final String SVC_INST_NAME = "ServiceInstance";private static Boolean isConnected = false;private static ManagedObjectReference perfManager;private static ManagedObjectReference propCollectorRef;public MoniterWsInterface(String puserName, String ppassWord, String purl){url = purl;userName = puserName;password = ppassWord;}private static class TrustAllTrustManager implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager{public java.security.cert.X509Certificate[] getAcceptedIssuers(){return null;}public boolean isServerTrusted(java.security.cert.X509Certificate[] certs){return true;}public boolean isClientTrusted(java.security.cert.X509Certificate[] certs){return true;}public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException{return;}public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException{return;}}private static void trustAllHttpsCertificates() throws Exception{javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];javax.net.ssl.TrustManager tm = new TrustAllTrustManager();trustAllCerts[0] = tm;javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL");javax.net.ssl.SSLSessionContext sslsc = sc.getServerSessionContext();sslsc.setSessionTimeout(0);sc.init(null, trustAllCerts, null);javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());}public static void connect() throws Exception{HostnameVerifier hv = new HostnameVerifier(){public boolean verify(String urlHostName, SSLSession session){return true;}};trustAllHttpsCertificates();HttpsURLConnection.setDefaultHostnameVerifier(hv);SVC_INST_REF.setType(SVC_INST_NAME);SVC_INST_REF.setValue(SVC_INST_NAME);vimService = new VimService();vimPort = vimService.getVimPort();Map<String, Object> ctxt = ((BindingProvider) vimPort).getRequestContext();ctxt.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, url);ctxt.put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true);serviceContent = vimPort.retrieveServiceContent(SVC_INST_REF);vimPort.login(serviceContent.getSessionManager(), userName, password, null);isConnected = true;perfManager = serviceContent.getPerfManager();propCollectorRef = serviceContent.getPropertyCollector();}public static void disconnect() throws Exception{if (isConnected){vimPort.logout(serviceContent.getSessionManager());}isConnected = false;}private static void printSoapFaultException(SOAPFaultException sfe){System.out.println("Soap fault: ");if (sfe.getFault().hasDetail()){System.out.println(sfe.getFault().getDetail().getFirstChild().getLocalName());}if (sfe.getFault().getFaultString() != null){System.out.println("Message: " + sfe.getFault().getFaultString());}}public static void main(String[] args){new MoniterWsInterface("xxx", "xxx", "xxx");try{connect();}catch (SOAPFaultException sfe){printSoapFaultException(sfe);}catch (Exception e){e.printStackTrace();}finally{try{disconnect();}catch (SOAPFaultException sfe){printSoapFaultException(sfe);}catch (Exception e){e.printStackTrace();}}} }

這樣就可以通過相關連接信息(username,password,url)進行相關連接。

?

由于篇幅原因,接下來的內容在之后的文章中一一呈現。

補充:retrievePropertiesAllObjects的代碼:

?

private static List<ObjectContent> retrievePropertiesAllObjects(List<PropertyFilterSpec> listpfs) throws Exception{RetrieveOptions propObjectRetrieveOpts = new RetrieveOptions();List<ObjectContent> listobjcontent = new ArrayList<ObjectContent>();try{RetrieveResult rslts = vimPort.retrievePropertiesEx(propCollectorRef, listpfs, propObjectRetrieveOpts);if (rslts != null && rslts.getObjects() != null && !rslts.getObjects().isEmpty()){listobjcontent.addAll(rslts.getObjects());}String token = null;if (rslts != null && rslts.getToken() != null){token = rslts.getToken();}while (token != null && !token.isEmpty()){rslts = vimPort.continueRetrievePropertiesEx(propCollectorRef, token);token = null;if (rslts != null){token = rslts.getToken();if (rslts.getObjects() != null && !rslts.getObjects().isEmpty()){listobjcontent.addAll(rslts.getObjects());}}}}catch (SOAPFaultException sfe){printSoapFaultException(sfe);}catch (Exception e){e.printStackTrace();}return listobjcontent;} 歡迎支持筆者新作:《深入理解Kafka:核心設計與實踐原理》和《RabbitMQ實戰指南》,同時歡迎關注筆者的微信公眾號:朱小廝的博客。

歡迎跳轉到本文的原文鏈接:https://honeypps.com/backend/vmware-vsphere-webservice-sdk-basic/?

總結

以上是生活随笔為你收集整理的使用VMware VSphere WebService SDK进行开发 (一)——基本信息阐述的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。