歡迎您光臨本站 註冊首頁

使用代理技術解決 Openwsman 項目中的參數類型問題

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  
Openwsman 是一個是實現了 Web Services Management Specification 的開源項目,當前的版本支持通用信息模型 (CIM),使得用戶可以通過 Web 服務獲取以 CIM 模型表示的系統管理對象信息。藉助於 Openwsman,CIM 擴展了其應用場景和範圍,並且通過 Web Services 的形式簡化了客戶端。 Openwsman 最新的代碼版本基本上支持了所有的 WS-Management 標準中的操作定義,然而有一個非常重要的缺陷依然存在,那就是對於遠程方法調用時的參數類型支持不夠,當前其只支持字元串類型的參數,然而在 CIM 中的類型多種多樣,如何解決這個問題成為了 Openwsman 能否被廣泛應用的一個重要基礎。在本文中,作者將介紹一種通過代理技術解決這個參數類型問題的方案,同時對 Openwsman 和 Web Service Management specification 做進一步的介紹。

WS-Management 協議和 Openwsman 項目

在計算機系統管理領域,如何提高各個不同廠家和系統平台之間信息的可互操作性,在強調系統整合概念的今天顯得尤為重要。 WS-Management 是一個基於 HTTP/SOAP 格式的傳輸協議,提供了跨平台系統之間以 Web Services 的形式發布信息的能力,通過 WS-Management 定義的標準數據包格式,系統可以相互發送和接收管理信息,並且可以在要管理的目標系統上執行任務。 WS-Management 協議標準由 DMTF 制定發布,DMTF 是一家非營利性的業界成員合作組織,目的是推動系統管理領域的互通性和標準化。 Openwsman 是一個實現了 WS-Management 協議的開源項目,在 Linux 操作系統上,它可以使用 WS-Mangement 協議來發布系統管理信息。

如何使用 Openwsman 管理通用信息模型 (CIM) 數據

通用信息模型是 DMTF 組織制定發布的另一個標準,用來描述系統管理對象信息,簡單來說就是對計算機系統管理領域的對象進行了統一的定義和規範,現在,很多業界的大公司如 IBM,HP,Microsoft 等都在其產品中廣泛地採用了 CIM 標準。 Openwsman 已經實現了支持系統管理數據為通用信息模型 (CIM) 的對象,它通過一個插件可以把 CIM 對象信息封裝進 SOAP 包,通過 Web Services 發布。 DMTF 的標準 CIM binding guidelines 定義了 CIM 信息到 WS-Management 數據信息的對應關係。下圖所表示的,就是網路用戶通過網路服務獲取到目標系統的 CIM 信息流程模塊圖。


圖 1. 整體流程模塊

整體的流程模塊包括以下幾個方面:

  • 系統管理員 (Web user):系統管理員可以通過任何的網頁瀏覽器發送和接收 HTTP/SOAP 數據,這些 SOAP 數據應該完全符合 WS-Management 協議標準的定義;
  • Web Server 與 Openwsman:開源項目 Openwsman 依照 WS-Management 協議對下層的信息數據進行 SOAP 格式的封裝,並通過 Web Server 發布;或者從 Web Server 獲取 HTTP/SOAP 的請求,對請求進行解釋和應答。 Openwsman 實現了一個 CIM 插件,依照 CIM-Binging 協議進行 CIM 對象和 WS-Management 格式的轉換;
  • CIMOM:CIM 對象管理器,用來和底層的 CIM 對象提供者進行交互,獲取 CIM 對象,並接收上層用戶請求返回結果。當前有多個已經實現了的開源項目,如 Open Pegasus, Open WBEM 以及 SFCB 等;
  • CIM Provider:CIM 對象提供者,和底層系統進行直接交互,獲取信息,執行管理命令,它把異構的系統信息進行抽象和封裝,以 CIM 對象的形式和 CIMOM 通訊,提供服務。




Openwsman 中存在的參數類型問題

在前面的介紹中提到過,WS-Management 協議提供 web 用戶遠程調用目標系統上方法的能力,這種方法調用將被 Openwsman 傳遞給 CIMOM,CIMOM 再去調用相應的 CIM 提供者完成最終的任務。 CIM 定義的方法參數類型多種多樣,包括 INT, DATETIME, REFERENC 等等,但是當前的 Openwsman 只支持 String 類型參數,而在實際中對於其他類型參數的需求是廣泛的,這樣的話 Openwsman 的應用能力就被嚴重製約了。下面的代碼來自 Openwsman,可以看到 Openwsman 在處理方法參數的時候並沒有進行類型判斷,而是直接選擇把參數都歸為 String 類型。


清單 1. Openwsman 代碼片段
static void cim_add_keys(CMPIObjectPath * objectpath, hash_t * keys)    {   	 hscan_t hs;   	 hnode_t *hn;   	 if (keys == NULL) {   		 return;   	 }   	 hash_scan_begin(&hs, keys);   	 while ((hn = hash_scan_next(&hs))) {   		 CMAddKey(objectpath, (char *) hnode_getkey(hn),   			 (char *) hnode_get(hn), CMPI_chars);   	 }    }

從上面的代碼中,可以看到所有的方法類型參數都被硬編碼成 CMPI_chars ,就是 CIM 中的 String 類型。下面我們通過一個測試來實際演示一下這個問題。KVM_ComputerSystem是一個 CIM 方法提供者,這個類包含了一個方法RequestStateChange,這個方法的作用是改變 KVM 虛擬機的電源狀態,定義如下所示:


清單 2. RequestStateChange 方法的 MOF 定義
uint32RequestStateChange(       uint16 RequestedState       CIM_ConcreteJob REF Job   	 datetime TimeoutPeriod    )

這個方法至少需要提供兩個參數,RequestedState,TimeoutPeriod,類型分別是 uint16 和 datetime 類型。為了簡化實例,突出重點,我們採用 Openwsman 自帶的一個客戶端程序來調用上面的方法,省略了 Web server 和 web 頁面的構建。這個客戶端可以通過命令行參數構建符合 WS-Management 協議的 SOAP 包,直接和 Openwsman 自帶的 8889 埠通信。命令如下所示:


清單 3. 使用 Openwsman 客戶端程序調用 RequestStateChange 方法
wsman invoke -N root/virt -a RequestStateChange -k RequestedState=1 – k    TimeoutPeriod=0 -h localhost -P 8889 -u wsman -p password    'http://vsm.net/kvm/KVM_ComputerSystem'

http://vsm.net/kvm/KVM_ComputerSystem是我們要調用的目標系統對象,其它參數意義為:

  • -N: CIM 信息提供者的名稱空間
  • -a: 方法名
  • -k: 方法參數名和值
  • -h: Openwsman 所在的目標系統地址
  • -P: 監聽埠
  • -u: Openwsman 用戶名
  • -p: Openwsman 密碼

上面的客戶端程序將創建 SOAP 請求,其中方法參數的 XML 片段如下所示:


清單 4. RequestStateChange 方法參數的 XML 片段
<n1:RequestStateChange_INPUT>         <n1:RequestedState>1</n1:RequestedState>         <n1:TimeoutPeriod>0</n1:TimeoutPeriod>    </n1:RequestStateChange_INPUT>

可見所有的參數都沒有帶任何的類型信息。這段 SOAP 請求經過 Openwsman 的解析和重構,將以 CIM-XML 的格式發往下面的 CIMOM,我們使用 SFCB 作為本次實驗的 CIMOM,下面的圖片顯示了發給 SFCB 的 CIM-XML 文件信息:


圖 2. Openwsman 創建的 CIM-XML 文件

上圖中用紅筆標出來的欄位顯示了 Openwsman 將兩個方法參數都設置為 String 類型。 SFCB 在收到這個錯誤的請求后調用下面的 CIM 方法提供者也會出錯,出錯信息返回給 Openwsman,顯示為下圖所示:


圖 3. Openwsman 報告的錯誤日誌

如上圖所示,方法的參數類型錯誤會導致方法無法執行。在實際應用中,方法參數類型全部為 String 的情況只佔很小一部分,同時因為開源代碼的版權問題,應用者不能隨意進行修改,以免出現任何開源代碼污染的問題。如果想提高 Openwsman 的可用性,同時又不用修改開源代碼,有什麼好的解決辦法呢?答案之一就是可以使用代理技術,通過創建代理 CIM 方法提供者,接受單一的 String 類型參數,根據 MOF 定義轉換為正確的類型,再調用實際的 CIM 方法提供者。下面我們來進行詳細介紹。

使用代理技術解決問題

在計算機科學中代理模式可以用下面的圖表示:


圖 4. 代理模式

Proxy 類和 RealSubject 類將實現共同的介面,客戶程序調用 Proxy 對象,Proxy 對象再將請求解析封裝發給真實的接收者。這個過程中,Proxy 對象需要滿足的就是客戶的調用介面,並且有能力對數據請求進行轉換,以滿足真實接收者的要求。把這種設計模式應用在我們的方案中,可以有下面的對應關係:

  • Client:CIMOM
  • Subject:CMPI 介面
  • Proxy:CIM 代理提供者
  • RealProxy:真實的 CIM 提供者

這樣,加入新的代理層之後,整體流程模塊可以表述如下


圖 5. 新的整體流程模塊

CIM 代理提供者應該滿足的介面標準為 DMTF 組織定義的 CMPI 介面,創建 CIM 代理提供者應該至少包括下面兩個步驟 :

  1. 為這個 CIM 代理提供者定義 MOF 格式的類定義
  2. 為這個 CIM 代理提供者編寫代碼

清單 5. CIM 代理提供者的 MOF 格式類定義
class Proxy_ComputerSystem: CIM_ComputerSystem    {           uint32 RequestStateChangeAdapter(   			 [In]string Name,   			 [In]string CreationClassName,   			 [In]string RequestedState,   			 [In]string TimeoutPeriod);    };

上述方法有四個參數,其中 Name 為真實 CIM 提供者對象的關鍵字,CreationClassName 為真實 CIM 提供者的類名,代理 CIM 提供者將由這兩個參數找到真實的 CIM 提供者,注意關鍵字參數根據不同的代理目標而有不同。另外兩個參數就是我們熟悉的真實 CIM 提供者的方法參數了,只不過類型都被定義為 String 類型,代理 CIM 提供者將負責把這兩個參數轉換成正確的方法參數類型,傳遞給真實的 CIM 提供者。這個過程不會涉及到任何對 Openwsman 的修改。 CIM 代理提供者的程序實現如下:


[火星人 ] 使用代理技術解決 Openwsman 項目中的參數類型問題已經有1065次圍觀

http://coctec.com/docs/linux/show-post-68842.html