中子组策略抽象

Launchpad蓝图

https://blueprints.launchpad.net/neutron/+spec/group-based-policy-abstraction

该蓝图提出了一种扩展中子 API 的方法,采用声明式策略驱动的连接模型,为用户提供简化的、面向应用的接口。

问题描述

当前中子的网络、端口、子网、路由器和安全组模型提供了构建连接逻辑网络拓扑的必要构建块。然而,它并没有为应用程序管理员提供合适的抽象级别,该管理员了解应用程序的细节(例如应用程序端口号),但不了解基础设施细节,例如网络和路由。不仅如此,当前的抽象将维护网络拓扑一致性的负担放在用户身上。缺乏面向应用程序开发人员/管理员的抽象,并由声明式模型支持,使得这些用户难以将中子用作连接层。

提议的变更

该蓝图描述的策略框架通过端点组之间的策略概念来补充当前中子模型。随着用户超越基本的连接,具有多样实现和网络属性的更丰富的网络服务自然地表示为策略。示例包括服务链、QoS、路径属性、访问控制等。

该提案建议一种模型,允许应用程序管理员使用组和策略抽象来表达他们的网络需求,而策略执行和实现的细节则留给底层的策略驱动程序。该蓝图描述的扩展的主要优势在于,它们允许使用以应用程序为中心的接口来访问中子,从而补充现有的以网络为中心的接口。

更具体地说,新的抽象将实现以下目标

  • 清晰地分离应用程序和基础设施管理员之间的关注点。

    • 应用程序管理员可以处理一个更高层次的抽象,而无需关注网络细节,例如网络/路由器等。

    • 基础设施管理员将处理基础设施特定的策略抽象,而不必了解应用程序特定的关注点,例如已打开的特定端口或哪些端口预计将被限制为安全或不安全的流量。基础设施管理员还将能够指导在渲染中使用的技术和方法。例如,使用 VLAN 或 VxLAN。

    • 允许基础设施管理员引入连接约束,而无需应用程序管理员知晓(例如,审计两个应用程序层之间的所有流量)。

  • 允许提供者/消费者模型,具有延迟绑定和它们之间的多对多关系。

  • 允许自动编排,可以响应策略或基础设施的变化,而无需人工干预将意图转换为具体操作。

  • 通过提供策略标签以供执行来补充 OpenStack Congress 项目中提出的治理模型。

以下新术语正在被引入

端点 (EP): 一个 L2/L3 可寻址的实体。

端点组 (EPG): 一组端点。

契约 (Contract): 它定义了 EPG 提供的应用程序服务如何被访问。实际上,它指定了一个 EPG 如何与其他 EPG 通信。契约由策略规则组成。

策略规则 (Policy Rule): 这些是用于定义 EPG 之间通信标准的单个规则。每个规则包含一个过滤器、分类器和动作。

分类器 (Classifier): 描述了特定策略规则作用的流量的特征。对满足此分类标准的流量采取相应的动作。

动作 (Action): 在契约中定义的匹配策略规则中采取的动作。

过滤器 (Filter): 提供了一种使用能力和角色标签标记策略规则的方法。

能力 (Capability): 这是一个策略标签,定义了 EPG 提供契约的哪个部分。

角色 (Role): 这是一个策略标签,定义了 EPG 希望消费契约的哪个部分。

契约范围 (Contract Scope): EPG 通过定义引用目标契约的契约范围来传达提供或消费契约(或其一部分)的意图。

选择器 (Selector): 契约范围可以定义围绕选择匹配的提供者或消费者 EPG 的额外约束,通过选择器实现。

策略标签 (Policy Labels): 这些标签包含在命名空间层次结构中,用于定义过滤器中使用的能力和角色标签。

桥接域 (Bridge Domain): 用于定义 L2 边界并在该 L2 边界内施加额外的约束(例如,无广播)。

路由域 (Routing Domain): 用于定义不重叠的 IP 地址空间。

以下是一个三层应用程序的外观示例

+–––––––––+          +–––––––+          +–––––––+          +–––––––+
|         |          | Web   |          | App   |          |DB     |
| Outside |          | EPG   |          | EPG   |          |EPG    |
| Public  | +––––––––+  +––+ | +––––––––+  +––+ | +––––––––+  +––+ |
| Network +–+Web     |  |VM| +–+App     |  |VM| +–+DB      |  |VM| |
| EPG     | |Contract|  +––+ | |Contract|  +––+ | |Contract|  +––+ |
|         | +––––––––+       | +––––––––+       | +––––––––+       |
|         |          |  +––+ |          |  +––+ |          |  +––+ |
|         |          |  |VM| |          |  |VM| |          |  |VM| |
|         |          |  +––+ |          |  +––+ |          |  +––+ |
+–––––––––+          +–––––––+          +–––––––+          +–––––––+

示例 CLI

(示例仅显示从外部网络访问 Web 服务器层)

创建分类器

neutron classifier-create Insecure-Web-Access --port 80 --protocol TCP
--direction IN

使用分类器创建契约

neutron contract-create Web-Server-Contract --classifier Insecure-Web-Access
--action ALLOW

创建提供契约的 EPG

neutron epg-create Web-Server-EPG --provides-contract Web-Server-Contract

在 EPG 中创建端点

neutron ep-create --epg Web-Server-EPG

使用 EPG 中的端点启动 Web 服务器 VM

nova boot --image cirros --flavor m1.nano --nic port-id=<EP-NAME> Web-Server

指定外部世界 VM 到 Web 服务器的连接

neutron epg-create Outside-EPG --consumes-contract Web-Server-Contract

请注意,契约提供者/消费者范围未在上述图中明确显示,但定义了 EPG 和契约之间的每个提供和消费关系,如下所示

        +––––––––––+
        |Web       |
        |Contract  |
        |Consuming |
        |Scope     |
        +–––+––––––+
+–––––––––+ |               +––––––––––+
|         | |               | Web      |
| Outside | |               | EPG      |
| Public  | | +––––––––+    |  +––+    |
| Network +–+–+Web     +––+–+  |VM|EP  |
| EPG     |   |Contract|  | |  +––+    |
|         |   +––––––––+  | |          |
|         |               | |  +––+    |
|         |               | |  |VM|EP  |
|         |               | |  +––+    |
+–––––––––+               | |          |
                          | +––––––––––+
                          +
                     +––––+–––––+
                     |Web       |
                     |Contract  |
                     |Providing |
                     |Scope     |
                     +––––––––––+

备选方案

由于这里提出了一种新的抽象层,因此当前模型中不存在直接的替代方案。

数据模型影响

支持组策略的新数据库对象

+–––––––––––––+     +–––––––––––––––+      +–––––––––––+
|             |     |   Contract    |      |Contracts  |
|   Endpoint  |     |   Providing/  |      |           |
|   Groups    +–––––+   Consuming   +––––––+           |
|             |     |   Scopes      |      +–––––+–––––+
+––––––+––––––+     +–––––––––––––––+            |
       |                                   +–––––+–––––+
       |                                   |Policy     |
+––––––+––––––+                            |Rules      |
|             |                            |           |
|  Endpoints  |                      +–––––+––––––+––––+––––––––+
|             |                      |            |             |
+–––––––––––––+                      |            |             |
                                     |            |             |
                               +–––––+––+  +––––––+–––––+ +–––––+––+
                               |Filters |  |Classifiers | |Actions |
                               |        |  |            | |        |
                               +––––––––+  +––––––––––––+ +––––––––+
所有对象都具有以下通用属性
  • id - 标准对象 uuid

  • name - 可选名称

  • description - 可选注释

端点
  • epg_id - 此端点 (EP) 属于的端点组 (EPG) 的 UUID

EndpointGroup
  • endpoints - 端点 uuid 列表

  • contract_providing_scopes - ContractProvidingScope uuid 列表

  • contract_consuming_scopes - ContractConsumingScope uuid 列表

Contract
  • policy_rules - 策略规则 uuid 的有序列表

  • contract_providing_scopes - ContractProvidingScope uuid 列表

  • contract_consuming_scopes - ContractConsumingScope uuid 列表

  • child_contracts - 合同 uuid 的有序列表

ContractProvidingScope
  • contract_id - 提供 EPG 的契约的 uuid

  • selectors - 选择器 uuid 列表

  • capabilites - 策略标签 uuid 列表

  • providing_epg - EndpointGroup uuid

ContractConsumingScope
  • contract_id - EPG 消费的契约的 uuid

  • selectors - 选择器 uuid 列表

  • roles - 策略标签列表

  • consuming_epg - EndpointGroup uuid

Selector
  • scope - 枚举: GLOBAL, TENANT, EPG

  • value - GLOBAL 为 None,或租户/EPG 的 uuid

PolicyLabel
  • namespace - 字符串,策略标签的命名空间标识符

  • name - 字符串,非可选

PolicyRule
  • filter - 过滤器 uuid

  • classifier - 分类器 uuid

  • actions - 动作 uuid 列表

过滤器
  • provider_capablilities - 策略标签 uuid 列表

  • consumer_roles - 策略标签列表

Classifier
  • protocol - 枚举: TCP, IP, ICMP

  • port_range - 单个端口号或范围(如 FWaaS 防火墙规则中所用)

  • direction - 枚举: IN, OUT, BI

操作
  • type - 枚举: ALLOW, REDIRECT, QOS, LOG, MARK, COPY

  • value - 执行动作的资源的 uuid,例如,在 REDIRECT 的情况下,它是 ServiceWrapper 的 uuid

ServiceWrapper
  • neutron_service - 服务或服务链的 uuid

L2Policy
  • endpoint_groups - EndpointGroup uuid 列表

  • l3_policy_id - l3_policy 的 uuid

L3Policy
  • l2_policies - L2Policy uuid 列表

  • ip_version - 枚举,v4 或 v6

  • ip_pool - 字符串,带有掩码的 IPSubnet,用于从用户创建 EPG 而未指定子网时提取子网

  • default_subnet_prefix_length - int,如果用户创建 EPG 而未指定子网,则用作默认子网长度

ip_pool 和 default_subnet_prefix_length 的工作方式如下:创建 L3Policy 时,会创建默认的 ip_pool 和 default_subnet_prefix_length。如果用户创建 EPG,则将使用 default_subnet_prefix_length 从 ip_pool 提取子网。

支持映射到现有中子资源的对象

EndpointPortBinding (扩展 Endpoint)
  • neutron_port_id - 此 EP 映射到的中子端口的 uuid

EndpointGroupNetworkBinding (扩展 EndpointGroup)
  • neutron_subnets - 中子子网 uuid 列表

L2PolicyBinding (扩展 l2_policy)
  • neutron_network_id - 对中子网络的引用

L3PolicyBinding (扩展 l3_policy)
  • neutron_routers - 中子路由器 uuid 列表

将添加适当的外键约束以维护模型的引用完整性。

数据库迁移:正在向模式添加新表,但现有模式保持不变。

REST API 影响

以下新资源正在被引入

gp_supported_actions = [None, 'ALLOW', 'REDIRECT']
gp_supported_directions = [None, 'IN', 'OUT', 'BI']
gp_supported_protocols = [None, 'TCP', 'UDP', 'ICMP']
gp_supported_scopes = [None, 'GLOBAL', 'TENANT', 'EPG']

ENDPOINTS = 'endpoints'
ENDPOINT_GROUPS = 'endpoint_groups'
CONTRACTS = 'contracts'
CONTRACT_PROVIDING_SCOPES = 'contract_providing_scopes'
CONTRACT_CONSUMING_SCOPES = 'contract_consuming_scopes'
POLICY_RULES = 'policy_rules'
FILTERS = 'filters'
CLASSIFIERS = 'classifiers'
ACTIONS = 'actions'
SELECTORS = 'selectors'
POLICY_LABELS = 'policy_labels'
L2_POLICIES = 'l2_policies'
L3_POLICIES = 'l3_policies'

RESOURCE_ATTRIBUTE_MAP = {
    ENDPOINTS: {
        'id': {'allow_post': False, 'allow_put': False,
               'validate': {'type:uuid': None}, 'is_visible': True,
               'primary_key': True},
        'name': {'allow_post': True, 'allow_put': True,
                 'validate': {'type:string': None}, 'default': '',
                 'is_visible': True},
        'description': {'allow_post': True, 'allow_put': True,
                        'validate': {'type:string': None},
                        'is_visible': True, 'default': ''},
        'tenant_id': {'allow_post': True, 'allow_put': False,
                      'validate': {'type:string': None},
                      'required_by_policy': True, 'is_visible': True},
        'endpointgroup_id': {'allow_post': True, 'allow_put': True,
                             'validate': {'type:uuid__or_none': None},
                             'required': True, 'is_visible': True},
    },
    ENDPOINT_GROUPS: {
        'id': {'allow_post': False, 'allow_put': False,
               'validate': {'type:uuid': None}, 'is_visible': True,
               'primary_key': True},
        'name': {'allow_post': True, 'allow_put': True,
                 'validate': {'type:string': None},
                 'default': '', 'is_visible': True},
        'description': {'allow_post': True, 'allow_put': True,
                        'validate': {'type:string': None},
                        'is_visible': True, 'default': ''},
        'tenant_id': {'allow_post': True, 'allow_put': False,
                      'validate': {'type:string': None},
                      'required_by_policy': True, 'is_visible': True},
        'endpoints': {'allow_post': False, 'allow_put': False,
                      'validate': {'type:uuid_list': None},
                      'convert_to': attr.convert_none_to_empty_list,
                      'default': None, 'is_visible': True},
        'bridge_domain_id': {'allow_post': True, 'allow_put': True,
                             'validate': {'type:uuid_or_none': None},
                             'default': None, 'is_visible': True},
        'provided_contract_scopes': {'allow_post': True, 'allow_put': True,
                                     'validate': {'type:uuid_list': None},
                                     'convert_to':
                                      attr.convert_none_to_empty_list,
                                      'default': None, 'is_visible': True},
        'consumed_contract_scopes': {'allow_post': True, 'allow_put': True,
                                     'validate': {'type:uuid_list': None},
                                     'convert_to':
                                     attr.convert_none_to_empty_list,
                                     'default': None, 'is_visible': True},
    },
    CONTRACTS: {
        'id': {'allow_post': False, 'allow_put': False,
               'validate': {'type:uuid': None},
               'is_visible': True,
               'primary_key': True},
        'name': {'allow_post': True, 'allow_put': True,
                 'validate': {'type:string': None},
                 'default': '',
                 'is_visible': True},
        'description': {'allow_post': True, 'allow_put': True,
                        'validate': {'type:string': None},
                        'is_visible': True, 'default': ''},
        'tenant_id': {'allow_post': True, 'allow_put': False,
                      'validate': {'type:string': None},
                      'required_by_policy': True,
                      'is_visible': True},
        'child_contracts': {'allow_post': True, 'allow_put': True,
                            'default': None,
                            'validate': {'type:uuid_list': None},
                            'convert_to': attr.convert_none_to_empty_list,
                            'required': True, 'is_visible': True},
        'policy_rules': {'allow_post': True, 'allow_put': True,
                         'default': None,
                         'validate': {'type:uuid_list': None},
                         'convert_to': attr.convert_none_to_empty_list,
                         'required': True, 'is_visible': True},
    },
    CONTRACT_PROVIDING_SCOPES: {
        'id': {'allow_post': False, 'allow_put': False,
               'validate': {'type:uuid': None},
               'is_visible': True,
               'primary_key': True},
        'name': {'allow_post': True, 'allow_put': True,
                 'validate': {'type:string': None},
                 'default': '',
                 'is_visible': True},
        'description': {'allow_post': True, 'allow_put': True,
                        'validate': {'type:string': None},
                        'is_visible': True, 'default': ''},
        'tenant_id': {'allow_post': True, 'allow_put': False,
                      'validate': {'type:string': None},
                      'required_by_policy': True,
                      'is_visible': True},
        'endpointgroup_id': {'allow_post': True, 'allow_put': True,
                             'validate': {'type:uuid': None},
                             'required': True, 'is_visible': True},
        'contract_id': {'allow_post': True, 'allow_put': True,
                        'validate': {'type:uuid': None},
                        'required': True, 'is_visible': True},
        'selector_id': {'allow_post': True, 'allow_put': True,
                        'validate': {'type:uuid_or_none': None},
                        'required': True, 'is_visible': True},
        'capabilities': {'allow_post': True, 'allow_put': True,
                         'default': None,
                         'validate': {'type:uuid_list': None},
                         'convert_to': attr.convert_none_to_empty_list,
                         'required': True, 'is_visible': True},
    },
    CONTRACT_CONSUMING_SCOPES: {
        'id': {'allow_post': False, 'allow_put': False,
               'validate': {'type:uuid': None},
               'is_visible': True, 'primary_key': True},
          'name': {'allow_post': True, 'allow_put': True,
                   'validate': {'type:string': None},
                   'default': '',
                   'is_visible': True},
        'description': {'allow_post': True, 'allow_put': True,
                        'validate': {'type:string': None},
                        'is_visible': True, 'default': ''},
        'tenant_id': {'allow_post': True, 'allow_put': False,
                      'validate': {'type:string': None},
                      'required_by_policy': True,
                      'is_visible': True},
        'endpointgroup_id': {'allow_post': True, 'allow_put': True,
                             'validate': {'type:uuid': None},
                             'required': True, 'is_visible': True},
        'contract_id': {'allow_post': True, 'allow_put': True,
                        'validate': {'type:uuid': None},
                        'required': True, 'is_visible': True},
        'selector_id': {'allow_post': True, 'allow_put': True,
                        'validate': {'type:uuid_or_none': None},
                        'required': True, 'is_visible': True},
        'roles': {'allow_post': True, 'allow_put': True,
                  'default': None,
                  'validate': {'type:uuid_list': None},
                  'convert_to': attr.convert_none_to_empty_list,
                  'required': True, 'is_visible': True},
    },
    POLICY_RULES: {
        'id': {'allow_post': False, 'allow_put': False,
               'validate': {'type:uuid': None},
               'is_visible': True, 'primary_key': True},
        'name': {'allow_post': True, 'allow_put': True,
                 'validate': {'type:string': None},
                 'default': '', 'is_visible': True},
        'description': {'allow_post': True, 'allow_put': True,
                        'validate': {'type:string': None},
                        'is_visible': True, 'default': ''},
        'tenant_id': {'allow_post': True, 'allow_put': False,
                      'validate': {'type:string': None},
                      'required_by_policy': True,
                      'is_visible': True},
        'enabled': {'allow_post': True, 'allow_put': True,
                    'default': True, 'convert_to': attr.convert_to_boolean,
                    'is_visible': True},
        'filter_id': {'allow_post': True, 'allow_put': True,
                      'validate': {'type:uuid_or_none': None},
                      'required': True, 'is_visible': True},
        'classifier_id': {'allow_post': True, 'allow_put': True,
                          'validate': {'type:uuid': None},
                          'required': True, 'is_visible': True},
        'actions': {'allow_post': True, 'allow_put': True,
                    'default': None,
                    'validate': {'type:uuid_list': None},
                    'convert_to': attr.convert_none_to_empty_list,
                    'required': True, 'is_visible': True},
    },
    FILTERS: {
        'id': {'allow_post': False, 'allow_put': False,
               'validate': {'type:uuid': None},
               'is_visible': True, 'primary_key': True},
        'name': {'allow_post': True, 'allow_put': True,
                 'validate': {'type:string': None},
                 'default': '', 'is_visible': True},
        'description': {'allow_post': True, 'allow_put': True,
                        'validate': {'type:string': None},
                        'is_visible': True, 'default': ''},
        'tenant_id': {'allow_post': True, 'allow_put': False,
                      'validate': {'type:string': None},
                      'required_by_policy': True,
                      'is_visible': True},
        'provider_capabilities': {'allow_post': True, 'allow_put': True,
                                  'validate': {'type:uuid_list': None},
                                  'convert_to':
                                  attr.convert_none_to_empty_list,
                                  'required': True, 'is_visible': True},
        'consumer_roles': {'allow_post': True, 'allow_put': True,
                           'validate': {'type:uuid_list': None},
                           'convert_to': attr.convert_none_to_empty_list,
                           'required': True, 'is_visible': True},
    },
    CLASSIFIERS: {
        'id': {'allow_post': False, 'allow_put': False,
               'validate': {'type:uuid': None},
               'is_visible': True, 'primary_key': True},
        'name': {'allow_post': True, 'allow_put': True,
                 'validate': {'type:string': None},
                 'default': '', 'is_visible': True},
        'description': {'allow_post': True, 'allow_put': True,
                        'validate': {'type:string': None},
                        'is_visible': True, 'default': ''},
        'tenant_id': {'allow_post': True, 'allow_put': False,
                      'validate': {'type:string': None},
                      'required_by_policy': True,
                      'is_visible': True},
        'protocol': {'allow_post': True, 'allow_put': True,
                     'is_visible': True, 'default': None,
                     'convert_to': convert_protocol,
                     'validate': {'type:values': gp_supported_protocols}},
        'port_range': {'allow_post': True, 'allow_put': True,
                       'validate': {'type:port_range': None},
                       'convert_to': convert_port_to_string,
                       'default': None, 'is_visible': True},
        'direction': {'allow_post': True, 'allow_put': True,
                      'validate': {'type:string': gp_supported_directions},
                      'default': None, 'is_visible': True},
    },
    ACTIONS: {
        'id': {'allow_post': False, 'allow_put': False,
               'validate': {'type:uuid': None},
               'is_visible': True,
               'primary_key': True},
        'name': {'allow_post': True, 'allow_put': True,
                 'validate': {'type:string': None},
                 'default': '', 'is_visible': True},
        'description': {'allow_post': True, 'allow_put': True,
                        'validate': {'type:string': None},
                        'is_visible': True, 'default': ''},
        'tenant_id': {'allow_post': True, 'allow_put': False,
                      'validate': {'type:string': None},
                      'required_by_policy': True,
                      'is_visible': True},
        'action_type': {'allow_post': True, 'allow_put': True,
                        'convert_to': convert_action_to_case_insensitive,
                        'validate': {'type:values': gp_supported_actions},
                        'is_visible': True, 'default': 'allow'},
        'action_value': {'allow_post': True, 'allow_put': True,
                         'validate': {'type:uuid_or_none': None},
                         'is_visible': True},
    },
    SELECTORS: {
        'id': {'allow_post': False, 'allow_put': False,
               'validate': {'type:uuid': None},
               'is_visible': True,
               'primary_key': True},
        'name': {'allow_post': True, 'allow_put': True,
                 'validate': {'type:string': None},
                 'default': '', 'is_visible': True},
        'description': {'allow_post': True, 'allow_put': True,
                        'validate': {'type:string': None},
                        'is_visible': True, 'default': ''},
        'tenant_id': {'allow_post': True, 'allow_put': False,
                      'validate': {'type:string': None},
                      'required_by_policy': True,
                      'is_visible': True},
        'scope': {'allow_post': True, 'allow_put': True,
                  'convert_to': convert_scope_to_case_insensitive,
                  'validate': {'type:values': gp_supported_scopes},
                  'is_visible': True, 'default': 'tenant'},
        'value': {'allow_post': True, 'allow_put': True,
                  'validate': {'type:uuid_or_none': None},
                  'is_visible': True},
    },
    POLICY_LABELS: {
        'id': {'allow_post': False, 'allow_put': False,
               'validate': {'type:uuid': None},
               'is_visible': True,
               'primary_key': True},
        'name': {'allow_post': True, 'allow_put': True,
                 'validate': {'type:string': None},
                 'default': '', 'is_visible': True},
        'description': {'allow_post': True, 'allow_put': True,
                        'validate': {'type:string': None},
                        'is_visible': True, 'default': ''},
        'tenant_id': {'allow_post': True, 'allow_put': False,
                      'validate': {'type:string': None},
                      'required_by_policy': True,
                      'is_visible': True},
        'namespace': {'allow_post': True, 'allow_put': True,
                      'validate': {'type:string': None},
                      'is_visible': True, 'default': ''},
        'name': {'allow_post': True, 'allow_put': True,
                 'validate': {'type:string': None},
                 'is_visible': True, 'required': True},
    },
    L2_POLICIES: {
        'id': {'allow_post': False, 'allow_put': False,
               'validate': {'type:uuid': None}, 'is_visible': True,
               'primary_key': True},
        'name': {'allow_post': True, 'allow_put': True,
                 'validate': {'type:string': None},
                 'default': '', 'is_visible': True},
        'description': {'allow_post': True, 'allow_put': True,
                        'validate': {'type:string': None},
                        'is_visible': True, 'default': ''},
        'tenant_id': {'allow_post': True, 'allow_put': False,
                      'validate': {'type:string': None},
                      'required_by_policy': True, 'is_visible': True},
        'endpoint_groups': {'allow_post': False, 'allow_put': False,
                            'validate': {'type:uuid_list': None},
                            'convert_to': attr.convert_none_to_empty_list,
                            'default': None, 'is_visible': True},
        'routing_domain_id': {'allow_post': True, 'allow_put': True,
                              'validate': {'type:uuid_or_none': None},
                              'default': None, 'is_visible': True,
                              'required': True},
    },
    L3_POLICIES: {
        'id': {'allow_post': False, 'allow_put': False,
               'validate': {'type:uuid': None}, 'is_visible': True,
               'primary_key': True},
        'name': {'allow_post': True, 'allow_put': True,
                 'validate': {'type:string': None},
                 'default': '', 'is_visible': True},
        'description': {'allow_post': True, 'allow_put': True,
                        'validate': {'type:string': None},
                        'is_visible': True, 'default': ''},
        'tenant_id': {'allow_post': True, 'allow_put': False,
                      'validate': {'type:string': None},
                      'required_by_policy': True, 'is_visible': True},
        'ip_version': {'allow_post': True, 'allow_put': False,
                       'convert_to': attr.convert_to_int,
                       'validate': {'type:values': [4, 6]},
                       'is_visible': True},
        'ip_pool': {'allow_post': True, 'allow_put': False,
                        'validate': {'type:subnet': None},
                        'default': '10.0.0.0/8', 'is_visible': True},
        'default_subnet_prefix_length': {'allow_post': True, 'allow_put': True,
                        'convert_to': attr.convert_to_int,
                        'validate': {
                            # ipv4 specific validation is
                            # performed in the plugin code.
                            'type:values': range(1, 127)},
                        'default': 24, 'is_visible': True},
        'l2_policies': {'allow_post': False, 'allow_put': False,
                           'validate': {'type:uuid_list': None},
                           'convert_to': attr.convert_none_to_empty_list,
                           'default': None, 'is_visible': True},
    },
}

以下定义了使用属性扩展到经典(现有)中子资源的映射

EXTENDED_ATTRIBUTES_2_0 = {
    gpolicy.ENDPOINTS: {
        'neutron_port_id': {'allow_post': True, 'allow_put': False,
                            'validate': {'type:uuid_or_none': None},
                            'is_visible': True, 'default': None},
    },
    gpolicy.ENDPOINT_GROUPS: {
        'neutron_subnets': {'allow_post': True, 'allow_put': True,
                            'validate': {'type:uuid_list': None},
                            'convert_to': attr.convert_none_to_empty_list,
                            'default': None, 'is_visible': True},
    },
    gpolicy.L2_POLICIES: {
        'neutron_network_id': {'allow_post': True, 'allow_put': False,
                               'validate': {'type:uuid_or_none': None},
                               'is_visible': True, 'default': None},
    },
    gpolicy.L3_POLICIES: {
        'neutron_routers': {'allow_post': True, 'allow_put': True,
                            'validate': {'type:uuid_list': None},
                            'convert_to': attr.convert_none_to_empty_list,
                            'default': None, 'is_visible': True},
    },
}

安全影响

此处使用的连接模型与 OpenStack/中子的当前白名单模型一致 - 也就是说,除非明确允许,否则没有连接到 EPG 之外的连接。

所提出的新抽象的渲染通过现有的安全组和防火墙即服务结构进行。因此,没有引入任何将直接影响当前安全框架的新结构或实现。

  • 此更改是否涉及敏感数据,例如令牌、密钥或用户数据?

  • 此更改是否以可能影响安全性的方式更改了 API,例如访问敏感信息的新方式或登录的新方式?

  • 此更改是否涉及密码学或哈希?

  • 此更改是否需要使用 sudo 或任何特权?

  • 此更改是否涉及使用或解析用户提供的数据?这可能是直接在 API 级别,或间接例如更改缓存层。

  • 此更改是否会启用资源耗尽攻击,例如允许单个 API 交互消耗大量的服务器资源?这方面的一些例子包括为每个连接启动子进程,或 XML 中的实体扩展攻击。

    这里的暴露风险与现有的 API 相同,并且在很大程度上取决于策略驱动程序的实现。

通知影响

其他最终用户影响

将需要与以下项目集成

  • python-neutronclient

  • horizon

  • heat

  • devstack

性能影响

正在引入一个新的抽象层。所有与现有中子相关的性能考虑因素都将适用,并在实施过程中加以考虑。但是,应该注意的是,使用这个新的抽象层/扩展是可选的,因此,如果未使用前者,将不会影响现有实现的性能。

其他部署者影响

  • 配置添加

    • 策略插件类

    • 策略插件驱动程序类

开发人员影响

这将是一个新的 API,不会影响现有的 API。

实现

负责人

Sumit Naiksatam (snaiksat) - Launchpad 蓝图负责人

Robert Kukura (rkukura)

Mandeep Dhami (mandeep-dhami)

Mohammad Banikazemi (banix)

Stephen Wong (s3wong)

Prasad Vellanki (prasad-vellanki)

Hemanth Ravi (hemanth-ravi)

Subrahmanyam Ongole (osms69)

Ronak Shah (ronak-malav-shah)

Rudra Rugge (rudrarugge)

Kanzhe Jiang (kanzhe-jiang)

Kevin Benton (kevinbenton)

工作项

策略管理器策略驱动程序

依赖项

测试

将添加功能和系统测试。

文档影响

将更新 API 和管理员指南。

参考资料