本文主要包含nova list,nova service list,ftpclient.listfiles,client list,the client list等服务器相关知识,网友希望可以进行参考
Nova client源码分析---nova list命令,nova---nova
个人见解,可能会有错误。刚刚开始学习nova,就先从api入手学习吧。
1、D:\代码\python-novaclient\python-novaclient\novaclient\v1_1\shell.py,最上边怎么调用不太清楚了,先从这里开始。
def do_list(cs, args):
"""List active servers."""
imageid = None
flavorid = None
#查找镜像
if args.image:
imageid = _find_image(cs, args.image).id
#查找套餐类型
if args.flavor:
flavorid = _find_flavor(cs, args.flavor).id
search_opts</span> = {
'all_tenants': args.all_tenants,
'reservation_id': args.reservation_id,
'ip': args.ip,
'ip6': args.ip6,
'name': args.name,
'image': imageid,
'flavor': flavorid,
'status': args.status,
'tenant_id': args.tenant, #租赁人id
'host': args.host,
'instance_name': args.instance_name}
#过滤条件
filters = {'flavor': lambda f: f['id'],
'security_groups': utils._format_security_groups}
#存放过滤后的结果
formatters = {}
<span style="font-family: Arial, Helvetica, sans-serif;">#formatters 字典的关键字</span>
field_titles = []
if args.fields:
for field in args.fields.split(','):
#让field 格式化成某种字符串
field_title, formatter = utils._make_field_formatter(field,
filters)
field_titles.append(field_title)
formatters[field_title] = formatter
id_col = 'ID'
#同一目录下 servers.py里面的list方法,下一个函数讲解这里。
#这里的返回值是server 的列表
servers = cs.servers.list(search_opts=search_opts)</span></strong>
convert = [('OS-EXT-SRV-ATTR:host', 'host'),
('OS-EXT-STS:task_state', 'task_state'),
('OS-EXT-SRV-ATTR:instance_name', 'instance_name'),
('hostId', 'host_id')]
_translate_keys(servers, convert)
#这个columns 应该是列的意思,和打印有关吧。
if field_titles:
columns = [id_col] + field_titles
else:
columns = [id_col, 'Name', 'Status', 'Networks']
formatters['Networks'] = utils._format_servers_list_networks
#这里负责具体输出nova list 命令的输出。
utils.print_list(servers, columns,
formatters, sortby_index=1)
def list(self, detailed=True, search_opts=None):
"""
# detailed 负责是否返回详细服务器信息,reservation_id仅仅返回对应id的。
Get a list of servers.
Optional detailed returns details server info.
Optional reservation_id only returns instances with that
reservation_id.
:rtype: list of :class:`Server`
"""
#search_opt 的内容见上一个函数的绿色字体,是一个字典。
if search_opts is None:
search_opts = {}
qparams = {}
#这里吧search_opt 的字典内容拷贝到qparams
for opt, val in search_opts.iteritems():
if val:
qparams[opt] = val
#这里把我们的选项进行url编码,因为要发送http请求嘛
query_string = "?%s" % urllib.urlencode(qparams) if qparams else ""
detail = ""
if detailed:
detail = "/detail"
#这里继续调用_list方法,该函数下边继续分析。这个函数第一个参数是url,第二个参数是response_key
return self._list("/servers%s%s" % (detail, query_string), "servers")
3、D:\代码\python-novaclient\python-novaclient\novaclient\base.py ----- _list 方法
def _list(self, url, response_key, obj_class=None, body=None):
#根据body是否为空调用post或者get方法,这两个函数都调用一个函数,只不过传参不太一样---_cs_request
if body:
_resp, body = self.api.client.post(url, body=body)
else:
_resp, body = self.api.client.get(url)
if obj_class is None:
obj_class = self.resource_class
#参考上边的传参,可以发现这个response_key的内容应该是“servers”
#到这里我们获取了数据。
data = body[response_key]
# NOTE(ja): keystone returns values as list as {'values': [ ... ]}
# unlike other services which just return the list...
#上边的注释讲的很清楚,如果data是个字典,具体的server的内容是里面的对应key='values'的字段值,结果是一个list
if isinstance(data, dict):
try:
data = data['values']
except KeyError:
pass
#这里没有仔细看了,最后一句话是返回结果。with语句和try finally 一样能够处理异常情况的上下文清理工作。
with self.completion_cache('human_id', obj_class, mode="w"):
with self.completion_cache('uuid', obj_class, mode="w"):
return [obj_class(self, res, loaded=True)
for res in data if res]

