您的位置:首页 > 运维架构

openstack - nova diagonstics 命令流程分析

2013-01-24 09:53 393 查看
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来发送请求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: