openstack - nova diagonstics 命令流程分析

来源:互联网 发布:淘宝卖单机游戏赚钱吗 编辑:程序博客网 时间:2024/06/08 01:20
nova diagonstics ubuntu12.04 流程分析

1. 获取基本的parser,使用python的argparser模块

   1. NovaClientArgumentParser:__init__
      super: argparse.ArgumentParser
   2. argparse.ArgumentParser:__init__
      super: _ActionsContainer 中注册action 和函数之间的对应关系
      例如:self.register('action', 'help', _HelpAction)
   3. 在parser中增加argument
      例如:parser.add_argument('--os-username',
            metavar='<auth-user-name>',
            default=utils.env('OS_USERNAME', 'NOVA_USERNAME'),
            help='Defaults to env[OS_USERNAME].')

2. parse已知的参数:result: (options, args)

   1. 列出args
   2. bind默认的namespace
   3. 将action(即parser.add_argument)赋值给namespace.
   4. 将parser._defults action 赋值给namespace.
   5. parse args
      a 替换args,如果它和文件相关
      b 迭代args,区分为A|O
      c 获取argument的位置信息
      d 解析完成得到:namespace,extras

3. 设置debug

4. 创建可利用的subcommands,基于版本。

5. 预留hooks by self._run_extension_hooks('__pre_parse_args__')

6. 设置endpoint_type和service_type

7. 判断授权情况 by os_username;os_password;os_tenant_name

8. 判断api版本

9. 使用client.Client创建请求,novaclient.client.py

   a 基于版本获取client class by get_client_class
   其中1.1: novaclient.v1_1.client.Client
       2: novaclient.v1_1.client.Client
   b import novaclient.v1_1.client.Client
     (1) 初始化Client,创建不同资源的管理类default 和 extensions.
         为什么extensions都会找到contrib中的所有文件呢?
         例如:self.flavors = flavors.FlavorManager(self)
   c 使用client.HTTPClient创建http请求。
     (1) 初始化HTTPClient
     (2) 初始化logging haddler:StreamHandler

10. 检查是否授权,调用client.authenticat()

   a 解析keys为list
   b 查看cache
   c 使用urlparse解析url,得到对应的数据scheme, netloc, path, query, frag
   d 拼接出admin_url
   e 使用_v2_auth来做授权检查,其中self.auth_system='keystone'|plugin_auth。
   f 在_v2_auth中url和body,使用_authenticate()发送。
   g 使用_time_request中的self.request来发送请求,并获取json格式的{'access':....}响应。
   h 设置has_keyring为以后的request.

11. 执行args对应的函数,使用args.func,很神奇的。。。

    它会找到do_${args}的命令。此处为do_diagnostics()
    a 调用_find_server中的find_resource(),分别传入serverManager 和name
    b 使用manager的find方法获取匹配的server信息
    c 调用serverManager.diagnostics(server)来获取诊断信息
      (1) uri: /servers/%s/diagnostics
      (2) self.api.client.get()方法发送请求
      (3) 在client.py 的HTTPClient 类中,存在get,post,put,delete犯法
      (4) 使用_cs_request中的_time_request来发送请求。

原创粉丝点击