新增NOVA接口(二)

     接上一篇,本文记录如何将命令行和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

         到此,命令行实现完成。

          新增NOVA接口(二)_第1张图片

你可能感兴趣的:(cli,nova)