使用强制执行

概要

操作员可以通过自定义使用强制执行过滤器或外部服务来实现使用强制执行和租赁约束。

描述

使用强制执行过滤器会在 lease_createlease_updateon_end 操作时被调用。这些过滤器会检查租赁值或分配标准是否通过管理员定义的阈值。目前提供了两个开箱即用的过滤器。MaxLeaseDurationFilter 限制租赁的持续时间。ExternalServiceFilter 调用第三方服务,通过在 blazar.conf 中配置的 URL 来实施策略。

选项

所有过滤器都是位于 blazar/enforcement/filter/base_filter.py 中的 BaseFilter 类的子类。自定义过滤器必须实现 check_createcheck_updateon_end 方法。MaxLeaseDurationFilter 是一个很好的参考示例。过滤器在 blazar.conf[enforcement] 组下启用。例如,启用 MaxLeaseDurationFilter 以将租赁持续时间限制为仅一天,可以按如下方式操作

[enforcement]
enabled_filters = MaxLeaseDurationFilter
max_lease_duration = 86400

请注意,过滤器配置选项遵循过滤器名称 - 前缀始终是过滤器名称的小写形式(MaxLeaseDurationFilter 变为 max_lease_duration;在这种情况下,特殊之处在于前缀之后没有其他内容,但也有 max_lease_duration_exempt_project_ids)。

MaxLeaseDurationFilter

此过滤器仅检查租赁的 start_dateend_date 属性,如果其持续时间超过阈值,则拒绝该租赁。它支持两个配置选项

  • max_lease_duration

  • max_lease_duration_exempt_project_ids

请参阅 blazar.conf 页面以获取这些选项的描述。

ExternalServiceFilter

此过滤器将每个 API 的决策委托给外部 HTTP 服务。该服务必须使用基于令牌的身份验证,接受(或忽略)Blazar 在 X-Auth-Token 标头中发送的静态令牌。应实现以下端点

  • POST /check-create

  • POST /check-update

  • POST /on-end

确切的 URL 可以被覆盖,并且并非所有 URL 都必须使用(尽管我们认为适当的实现至少需要两个检查,除非首先禁用了租赁更新)。

外部服务应在参数满足定义的标准时返回 204 No Content,如果不满足则返回 403 Forbidden。该服务可以发送 JSON 响应体,其中包含 403 Forbidden 响应,并在名为 message 的字段中包含拒绝理由,如下所示

{
  "message": "You shall not pass!"
}

外部服务将在请求体中接收的数据示例(请注意,所有日期和时间都以 ISO8601 标准编码的字符串形式编码,JSON 期望用于表示日期和时间)

  • 请求示例

{
  "context": {
    "user_id": "c631173e-dec0-4bb7-a0c3-f7711153c06c",
    "project_id": "a0b86a98-b0d3-43cb-948e-00689182efd4",
    "auth_url": "https://api.example.com:5000/v3",
    "region_name": "RegionOne"
  },
  "current_lease": {
    "start_date": "2020-05-13T00:00:00.012345+02:00",
    "end_time": "2020-05-14T23:59:00.012345+02:00",
    "reservations": [
      {
        "resource_type": "physical:host",
        "min": 1,
        "max": 2,
        "hypervisor_properties": "[]",
        "resource_properties": "[\"==\", \"$availability_zone\", \"az1\"]",
        "allocations": [
          {
            "id": "1",
            "hypervisor_hostname": "32af5a7a-e7a3-4883-a643-828e3f63bf54",
            "extra": {
              "availability_zone": "az1"
            }
          }
        ]
      }
    ]
  },
  "lease": {
    "start_date": "2020-05-13T00:00:00.012345+02:00",
    "end_time": "2020-05-14T23:59:00.012345+02:00",
    "reservations": [
      {
        "resource_type": "physical:host",
        "min": 2,
        "max": 3,
        "hypervisor_properties": "[]",
        "resource_properties": "[\"==\", \"$availability_zone\", \"az1\"]",
        "allocations": [
          {
            "id": "1",
            "hypervisor_hostname": "32af5a7a-e7a3-4883-a643-828e3f63bf54",
            "extra": {
              "availability_zone": "az1"
            }
          },
          {
            "id": "2",
            "hypervisor_hostname": "af69aabd-8386-4053-a6dd-1a983787bd7f",
            "extra": {
              "availability_zone": "az1"
            }
          }
        ]
      }
    ]
  }
}

仅在 check-update 请求中存在 current_lease 字段,用于描述现有的租赁。在两个检查中,lease 字段描述了新的租赁。在 on-end 中,lease 字段描述了刚刚结束的租赁。

无法保证 on-end 事件的传递,应将其视为一种优化,而不是可靠的机制。