接上一篇,本文记录如何将命令行和nova api进行对接。
已实现接口:http://controller:8774/v2/{tenant-id}/os-server-statistics/{user-id}
考虑新增命令行: nova usage-user 获取指定用户的使用资源统计。
因为命令行的操作都会通过类似:admin-openrc.sh进行用户,项目,密码的环境设定,然后通过keystone获取包含身份的token。所以,通过命令行的session是可以取得调用命令的用户id和项目id的。故,nova usage-user不设定其他参数。直接返回调用此命令的用户在登陆项目中的资源统计。
nova 命令行实现都在novaclient模块中,命令体的定义于文件:
do_XX是此文件中定义命令体和处理命令的函数定义规范。系统会解析XX,映射为nova XX命令,并用do_XX执行命令行的实现。所以,nova usage-user命令的实现定义如下:
def do_usage_user(cs, args): """Show usage data for a single user.""" rows = ["used_vcpus", "used_rams"] auth = cs.client.auth project_id = auth.get_auth_ref(cs.client.session).project_id user_id = auth.get_auth_ref(cs.client.session).user_id usage = cs.usage.get_by_user(user_id) print(_("Usage from user: %s @ %s") % (args.os_username,args.os_tenant_name)) if usage: utils.print_list([usage], rows) else: print(_('None'))首先定义将要打印的行名称。
然后是根据keystone的授权和会话属性,获取到project_id和user_id.
然后是调用定义的get_by_user函数发起对nova-api中的os-server-statistics资源的请求。
最后按格式打印。
utils.print_list是根据rows中的名称,匹配usage中的key,然后把值取出来的。
接下来讲讲cs.usage.get_by_user:
usage对应
这是client中的资源。
可以认为是命令行到调用nova-api的中间层。在其中添加函数;get_by_user:
def get_by_user(self, user_id): """ Get usage for a specific user. :param user_id: USER ID to fetch usage for :rtype: :class:`Usage` """ return self._get("/os-server-statistics/%s" % (user_id), "user_usage")所以,真正发起wrestful请求的是 中的_get函数。
也就是这里调用的self._get
到此,命令行实现完成。