聲明:
本博客歡迎轉發,但請保留原作者信息!
博客地址:http://blog.csdn.net/llg8212
內容系本人學習、研究和總結,如有雷同,不勝榮幸!
openstack client端代碼的結構都一致,下面通過python-glanceclient來分析。
1,入口
客戶端安裝後,就可以接收外部的命令了。接收外部命令的文件爲:glance,keystone,nova等,默認的安裝目錄爲:/usr/local/bin/。glance的文件內容爲:
import sys
from glanceclient.shell import main
if __name__ == "__main__":
sys.exit(main())
從文件內容可知,我們在shell命令行輸入glance,真正處理的main函數爲:glanceclient.shell.main()
2,glanceclient.shell.main()
main函數定義如下:
def main():
try:
OpenStackImagesShell().main(map(strutils.safe_decode, sys.argv[1:])) # 構造了 OpenStackImagesShell實例並調用其main方法
except KeyboardInterrupt:
print('... terminating glance client', file=sys.stderr)
sys.exit(1)
except Exception as e:
print(utils.exception_to_str(e), file=sys.stderr)
sys.exit(1)
注:map函數介紹參見http://my.oschina.net/zyzzy/blog/115096,這裏使用map對傳入的參數進行解碼。
3,OpenStackImagesShell的main函數
# 解析參數選項
parser = self.get_base_parser() # 構造參數解析類ArgumentParser的實例parser,然後通過實例調用方法parser.add_argument增加一些固有的參數。其中_get_optional_kwargs會將傳入的參數選項最左邊的‘-’去掉並將中間的‘-’轉換爲‘_’。
(options, args) = parser.parse_known_args(argv) # parse_known_args函數是將解析的參數按屬性的方式存儲到Namespace對象。到用setattr函數,參見http://my.oschina.net/DreamG/blog/138551
# 解析子命令,其中會根據版本號動態加載對應模塊。函數import_versioned_module中的 module = 'glanceclient.v%s' % version。
# 默認加載glanceclient.v1.shell.py,然後通過_find_actions調用,就將所有do_XXX函數加載到self.subcommands中了
subcommand_parser = self.get_subcommand_parser(api_version)
self.parser = subcommand_parser
# 再次解析,將傳入的命令和函數關聯起來。如傳入image-list,返回的args.func爲do_image_list
args = subcommand_parser.parse_args(argv)
# 最後就是執行這個函數了
try:
args.func(client, args)
except exc.Unauthorized:
raise exc.CommandError("Invalid OpenStack Identity credentials.")