neutronclient的启动脚本是/usr/bin/neutron
def main(argv=sys.argv[1:]):
try:
return NeutronShell(NEUTRON_API_VERSION).<font color=red size=4 face=“黑体”>run</font>(
list(map(encodeutils.safe_decode, argv)))
except KeyboardInterrupt:
print("... terminating neutron client", file=sys.stderr)
return 130
except exc.NeutronClientException:
return 1
except Exception as e:
print(e)
return 1
![](http://images2017.cnblogs.com/blog/1061633/201710/1061633-20171010194703215-1540616046.png)
执行流程如图1所示,先执行shell.py中的main函数,在main函数中,构造一个neutronshell对象,然后调用该对象的run()函数,之后调用run_subcommand()函数
在run_subcommand()函数中,通过self.command_manager.find_command(argv)查找到用户所输入命令对应的执行类(比如我们命令的执行类就是CreateVPNCredential),这个类是怎么找到的呢?Shell.py中有COMMAND_V2字典
图2
构造对应Command对象,如图3所示,之后调用Command(CreateVPNCredential)对象的run()函数,即\neutronclient\neutron\v2_0\vpn\vpn_credential.py文件中CreateVPNCredential类的run()方法,这个时候你会发现该类中怎么没有run()方法,这个时候子类没有就从父类中中寻找,直到找到为止,我们找到的父类是OpenStackCommand类,如图4所示。
图3
图4
之后OpenStackCommand类中super(OpenStackCommand, self).run(parsed_args)的run()方法会调用neutronclient.v2_0.client.Client类的相应方法进行RESTAPI调用。
至此neutronclient解析完毕。
如果想添加新的命令Neutronclient主要涉及三个文件的修改。可以参考https://review.openstack.org/#/c/70254/。