openstack client代碼分析

聲明:

本博客歡迎轉發,但請保留原作者信息!

博客地址: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.")

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章