性夜影院午夜看片,无码精品久久一区二区三区,婷婷成人丁香五月综合激情,校园春色 qvod,性调教室高h学校

使用Golang開發(fā)OpenStack服務的CLI

由于我們需要編寫自己服務的客戶端,之前參考過magnum的python客戶端,編寫過一個,整體感受就是: 一件簡單的事兒,被他封裝的很復雜,而且還有一個關鍵痛點,部署問題:?1.依賴python環(huán)境 2. 蹩腳的二進制打包方式。因此,作為一個產品的CLI,以二進制方式交付會帶來諸多方便,比如cloud foundry也用golang重寫了他的客戶端部分。

Cobra簡介

在博客的開篇寫過一篇cobra的博客:?如何使用golang編寫漂亮的命令行工具, 很多流行的CLI都基于這個庫開發(fā),比如kubectl, etcdctl, docker等, 基本的概念和用法請參考之前的博客。

基于RESTful的CLI

打造的這個CLI是RESTful的客戶端, 在RESTful里面以資源(Resource)為核心,因此客戶端也需要以資源的形式表現(xiàn), 比如Docker的 Management Commands:

使用Golang開發(fā)OpenStack服務的CLI

該資源允許的操作:

使用Golang開發(fā)OpenStack服務的CLI

因此, 輪廓上我們需要打造這樣一種風格的RESTful CLI

OpenStack服務 CLI

我們的OpenStack服務是自己開發(fā)的, 開發(fā)出來的CLI風格想要和Openstack社區(qū)風格一致(長相相近), 這東西社區(qū)是沒有Golang版本的(有的話給我留言, 我真沒找到), 因此整個架子需要自己構建, 由于cobra架子比較成熟, 如果只用官方的Flag庫來做的話,會有很多重復工作, 因此使用cobra為基礎來進行構建。

要做成和Openstack風格類似的CLI, 在cobra的基礎上我們需要加入2個組件:

keystone認證: 對每一個資源的訪問必須通過keystone認證才能訪問, 因此認證部分是全局的。表格輸出: OpenstackCLI把資源以Table的方式輸出, 這個也需要單獨實現(xiàn)。

搭建CLI架子

初始化app, 添加resourceA和resourceB

使用Golang開發(fā)OpenStack服務的CLI

訪問每一個resource都需要經過keystone的認證,因此認證屬于一個全局都要執(zhí)行的邏輯, 必須放在最前面,這里Cobra提供的一組Hook可以解決這個問題

帶錯誤處理的Hook

當處理過程中如果產生了error可以直接return出來, 從而中斷命令的繼續(xù)執(zhí)行, 因此認證部分我們需要這種帶錯誤處理的Hook, 因為認證失敗需要中斷請求,

其次,cobra 在命令函數(shù)的執(zhí)行前后分別設置了2組Hook, 執(zhí)行的順序如下:

  • PersistentPreRunE: 無論函數(shù) 執(zhí)不執(zhí)行 該函數(shù)都會運行

  • PreRunE: 在函數(shù)執(zhí)行前執(zhí)行

  • RunE: 執(zhí)行函數(shù)

  • PostRunE: 函數(shù)執(zhí)行后執(zhí)行

  • PersistentPostRunE: 無論函數(shù) 執(zhí)不執(zhí)行 該函數(shù)都會執(zhí)行

利用cobra提供的PersistentPreRunE來實現(xiàn)驗證功能

使用Golang開發(fā)OpenStack服務的CLI

auth函數(shù)實現(xiàn)認證并不難, 關鍵是auth過后的token 如何傳遞給后面的子命令使用, 參考etcdctl和docker部分都使用上下文來實現(xiàn)這個需求, cobra里面也沒有地方給我存上下文, 因此需要專門用一個模塊來保持 全局的上下文, 因此需要手動實現(xiàn)一個common包。

使用Golang開發(fā)OpenStack服務的CLI

最后在common包里面添加2個子包: keystone, printTable, keystone 用于實現(xiàn)與keystone認證的過程, printTable用于打印最后結果的表格,具體詳情請看源碼。

添加資源

為每一個資源添加5個基礎的操作:get, list, create, delete, update。另起一個resourceA的包,實現(xiàn)這些方法,添加到子命令即可, 比如:

使用Golang開發(fā)OpenStack服務的CLI

大概效果如下

使用Golang開發(fā)OpenStack服務的CLI

使用效果

和使用openstack一樣,你需要有一個admin_openrc 用于導入環(huán)境變量

使用Golang開發(fā)OpenStack服務的CLI

比如

使用Golang開發(fā)OpenStack服務的CLI

相關新聞

歷經多年發(fā)展,已成為國內好評如潮的Linux云計算運維、SRE、Devops、網絡安全、云原生、Go、Python開發(fā)專業(yè)人才培訓機構!