前面讲的都是用curl调用,直接call 到ironic的 rest 响应server上,是查看ironic源码得到,如果要自己实现新的模块,往往需要实现对应client端,屏蔽掉直接的url和
繁琐的传入参数,方法,token等等,或者有时候我们会添加自己的client端命令(有些rest api并没有通过client端暴漏出来),看看ironic client是怎么玩儿的,事实上,
就像ironic本身即便采用了pecan的框架,但是和openstack的其他核心模块在调用方式上很类似,ironic client也和其他的client很类似。
ironic client和ironic的service不一样,ironic的service作为wsgi的server或者一个python的线程启动service,是可以用systemctl 启动停止服务的, ironic不一样,
我们查看/usr/bin/ironic(ironicclient的入口),可以发现调用的是ironicclient.shell.main()函数,
在main函数中除了argparser的大量使用,最主要的两句是:
client = iroclient.Client(api_version, endpoint, **kwargs)
args.func(client, args)
其中,client是一个http client,封装了很多http call 相关的方法和参数传递方式,是可以单独拿出来到其他模块使用的,
args.func(client, args)是比较困惑的,翻看代码找到了调用关系如下:
1.main()
2.subcommand_parser = self.get_subcommand_parser(api_version)
3.submodule.enhance_parser(parser, subparsers, self.subcommands)
4. for command_module in COMMAND_MODULES:
utils.define_commands_from_module(subparsers, command_module, cmd_mapper)
其中COMMAND_MODULES包括chassis_shell,node_shell, port_shell,driver_shell
5. define_command(subparsers, command, callback, cmd_mapper)(只添加command module中以“do”开头的方法)
6.subparser.set_defaults(func=callback)
到这里,当我们看到args.func(client, args)时候,对于ironic node-show xxx,命令时便知道是执行了command modules中对应的方法do_node_show(命令参数和名称的转换
在源码中也可以找到),然后调用http的request进行请求并返回响应