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 信息流程模塊圖。
整體的流程模塊包括以下幾個方面:
Openwsman 中存在的參數類型問題
在前面的介紹中提到過,WS-Management 協議提供 web 用戶遠程調用目標系統上方法的能力,這種方法調用將被 Openwsman 傳遞給 CIMOM,CIMOM 再去調用相應的 CIM 提供者完成最終的任務。 CIM 定義的方法參數類型多種多樣,包括 INT, DATETIME, REFERENC 等等,但是當前的 Openwsman 只支持 String 類型參數,而在實際中對於其他類型參數的需求是廣泛的,這樣的話 Openwsman 的應用能力就被嚴重製約了。下面的代碼來自 Openwsman,可以看到 Openwsman 在處理方法參數的時候並沒有進行類型判斷,而是直接選擇把參數都歸為 String 類型。
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 虛擬機的電源狀態,定義如下所示:
uint32RequestStateChange( uint16 RequestedState CIM_ConcreteJob REF Job datetime TimeoutPeriod ) |
這個方法至少需要提供兩個參數,RequestedState,TimeoutPeriod,類型分別是 uint16 和 datetime 類型。為了簡化實例,突出重點,我們採用 Openwsman 自帶的一個客戶端程序來調用上面的方法,省略了 Web server 和 web 頁面的構建。這個客戶端可以通過命令行參數構建符合 WS-Management 協議的 SOAP 包,直接和 Openwsman 自帶的 8889 埠通信。命令如下所示:
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是我們要調用的目標系統對象,其它參數意義為:
上面的客戶端程序將創建 SOAP 請求,其中方法參數的 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 文件信息:
上圖中用紅筆標出來的欄位顯示了 Openwsman 將兩個方法參數都設置為 String 類型。 SFCB 在收到這個錯誤的請求后調用下面的 CIM 方法提供者也會出錯,出錯信息返回給 Openwsman,顯示為下圖所示:
如上圖所示,方法的參數類型錯誤會導致方法無法執行。在實際應用中,方法參數類型全部為 String 的情況只佔很小一部分,同時因為開源代碼的版權問題,應用者不能隨意進行修改,以免出現任何開源代碼污染的問題。如果想提高 Openwsman 的可用性,同時又不用修改開源代碼,有什麼好的解決辦法呢?答案之一就是可以使用代理技術,通過創建代理 CIM 方法提供者,接受單一的 String 類型參數,根據 MOF 定義轉換為正確的類型,再調用實際的 CIM 方法提供者。下面我們來進行詳細介紹。
使用代理技術解決問題
在計算機科學中代理模式可以用下面的圖表示:
Proxy 類和 RealSubject 類將實現共同的介面,客戶程序調用 Proxy 對象,Proxy 對象再將請求解析封裝發給真實的接收者。這個過程中,Proxy 對象需要滿足的就是客戶的調用介面,並且有能力對數據請求進行轉換,以滿足真實接收者的要求。把這種設計模式應用在我們的方案中,可以有下面的對應關係:
這樣,加入新的代理層之後,整體流程模塊可以表述如下
CIM 代理提供者應該滿足的介面標準為 DMTF 組織定義的 CMPI 介面,創建 CIM 代理提供者應該至少包括下面兩個步驟 :
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次圍觀