用法¶
在项目中如何使用 oslo.limit
from oslo_limit import limit
概念概述¶
此库旨在帮助服务开发者执行资源使用情况检查,这些资源由他们的服务管理。它通过明确定义正在声明的内容、资源在哪里被声明以及将强制逻辑封装在易于使用的工具中来实现这一点。以下子部分介绍了在分布式系统的使用情况强制执行的上下文中,用于沟通的常用术语和概念。
用法¶
用法是某人或某物拥有的资源的实时分配。假定它们是存在的,或者被创建的,因此被计入。
就 OpenStack 而言,作为一个分布式系统,负责资源的的服务被认为是该资源的用法授权机构。确保准确的用法几乎总是需要服务执行查找并可能聚合结果,以明确地提供用法信息。
限制¶
限制是某人或某物应该拥有的资源的總數。
就 OpenStack 而言,拥有特定资源的的服务也可能拥有该资源的限制。相反,限制信息可以集中在共享服务中。后者是本库的使用模式所暗示的。将资源限制从各个服务中解耦的理由是,无论资源如何,都能更轻松地为用户或操作员提供一致的设置和强制限制的体验。
声明¶
声明代表某人请求的资源数量。声明受到资源使用情况和限制之间关系的约束。成功的声明被汇总到用法中。
在 OpenStack 生态系统中,可以根据资源对特定目标提出声明。例如,用户可以为她的项目请求额外的两台服务器。由此产生的声明可能是两台实例、两台实例之间的内核总数、两台实例消耗的总内存,或者所有这些。该声明还针对特定的项目,这会影响本库请求用法信息的方式。
强制执行¶
强制执行是收集用法数据、限制信息和声明的过程,以便做出关于用户是否应该能够获得更多资源的决定。
将 oslo.limit 添加到服务¶
配置¶
默认情况下,oslo.limit 库将在服务的配置文件中查找一个 [oslo_limit] 部分。此部分必须包含针对 Keystone 服务的标准身份验证信息,以便查询统一限制 API。
请注意,服务帐户至少需要分配在系统范围内具有读取角色才能强制执行限制,并且身份验证信息不应包含项目信息,因为 keystoneauth 库将使用它而不是 system_scope。
除了身份验证信息外,oslo_limit 配置部分必须包含一种识别服务的方法,以便按服务过滤限制。这可以是 service_name、service_type 和 region_name 的组合,或者只是 endpoint_id。
这是一个 oslo_limit 配置示例
[oslo_limit]
auth_url = http://controller:5000
auth_type = password
user_domain_id = default
username = MY_SERVICE
system_scope = reader
password = MY_PASSWORD
service_name = my_service
region_name = RegionOne
创建注册限制¶
在强制执行给定资源的限制之前,应该为该资源存在一个注册限制。注册限制例如可以在服务部署期间配置。
注意
您的用户帐户必须在系统范围内分配有 admin 角色才能创建注册限制。
强制执行限制¶
使用 enforcer 主要包括定义一个回调函数来处理给定项目的当前用法,然后使用您希望为项目消耗的每种资源的数量调用 enforce 函数,并处理可能的配额超出异常。
这是一个限制强制执行的简单用法
import logging
from oslo_limit import limit
from oslo_limit import exception as limit_exceptions
# Callback function who need to return resource usage for each
# resource asked in resources_names, for a given project_id
def callback(project_id, resource_names):
return {x: get_resource_usage_by_project(x, project_id) for x in resource_names}
enforcer = limit.Enforcer(callback)
try:
# Check a limit for a given project for a set of resources, resource
# unit are delta to be consumed
enforcer.enforce('project_uuid', {'my_resource': 1})
except limit_exceptions.ProjectOverLimit as e:
# What to do in case of limit exception, e contain a list of
# resource over quota
logging.error(e)
检查限制¶
另一种用法模式是在强制执行范围之外,检查给定项目的限制和用法。这在报告 API 中可能很有用,以便能够向用户公开 enforcer 将用于判断资源消耗事件的限制和用法信息。传递到此 API 的任何未在 keystone 中注册的限制都将被视为零,这与 enforcer 假设“未注册意味着没有配额”的行为保持一致。
注意
理想情况下,不应将其用于提供您自己对限制的强制执行,而是用于报告或计划目的。
这是一个限制报告的简单用法
import logging
from oslo_limit import limit
# Callback function who need to return resource usage for each
# resource asked in resources_names, for a given project_id
def callback(project_id, resource_names):
return {x: get_resource_usage_by_project(x, project_id) for x in resource_names}
enforcer = limit.Enforcer(callback)
usage = enforcer.calculate_usage('project_uuid', ['my_resource'])
logging.info('%s using %i out of %i allowed %s resource' % (
'project_uuid',
usage['my_resource'].usage,
usage['my_resource'].limit,
'my_resource'))