LiYanandYanan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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/。

posted on 2017-03-04 17:48  LiYanandYanan  阅读(252)  评论(0编辑  收藏  举报