声明:
本博客欢迎转发,但请保留原作者信息!
博客地址: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.")