Neutron/enable-to-set-dhcp-port-attributes
背景和动机
用户无法指定DHCP端口的IP地址(以及MAC地址等)。对于希望完全控制IP地址分配的用户来说,这非常不方便。
此蓝图基于实际用户的需求。
用例
用例1
当用户将其本地系统迁移到云环境时,有时用户希望为其虚拟机使用相同的IP地址。在这种情况下,用户需要指定DHCP服务器的IP地址,以避免与现有服务器的IP地址冲突。
用例2
用户出于安全原因希望指定DHCP服务器的IP地址。他们不希望DHCP服务器随意漂移。
目标
此蓝图的目标是允许用户显式设置DHCP端口属性(尤其是IP地址)。
提案
在“dhcp-agent-network-add”API中添加“dhcp_port”参数。如果指定了“dhcp_port”参数,则同时创建一个DHCP端口。希望控制DHCP端口属性的用户必须显式分配一个dhcp-agent。我认为对于此类用户,这种限制不会成为问题。
建议的API
在“dhcpagentscheduler”扩展提供的“dhcp-agent-network-add”API中添加“dhcp_port”输入参数。
action: POST
url: /agents/<agent id>/networks
请求体:
- 当前
{'network_id': <network_id>}
- 新增
{'network_id': <network_id>,
'dhcp_port': {'fixed_ips': <fixed ips>, 'mac_address': <mac address>, 'name': <name>}}
注意:'dhcp_port'是可选的。'fixed_ips'、'mac_address'和'name'在'dhcp_port'中是可选的。'fixed_ips'的格式与端口资源相同。
响应体: 无
description:
将dhcp-agent指定给网络,网络ID为<network_id>。如果指定了'dhcp_port',则使用指定的属性创建DHCP端口。
请求体的示例:
{'network_id': "df514142-90f4-4ab2-8d35-aaaf0b5c4dee",
'dhcp_port': {'fixed_ips': [{'subnet_id': "fd3bc91d-70e5-4325-8f19-c52f2998953e", 'ip_address': "20.0.0.10"}]}}
实现分析
当前实现
- DHCP端口由“device_id”和“device_owner”标识。
“device_id”由网络ID和dhcp_agent的主机生成(即,与网络ID和dhcp_agent的主机配对唯一)。“device_owner”为“network:dhcp”。
- 如果端口尚不存在,DHCP端口通过dhcp_agent的“create_dhcp_port”RPC调用创建。
- DHCP端口的创建由将dhcp_agent分配给网络触发。有两种典型情况。
1) 通过API显式分配(例如,当执行“neutron dhcp-agent-network-add”CLI时)。
2) 网络的第一个端口创建(具有一个或多个启用了DHCP的子网)。如果网络尚未分配给dhcp_agent,则强制执行dhcp_agent调度。
(注意:因此,如果用户想显式地将dhcp_agent分配给网络,请在创建第一个端口之前发出“dhcp-agent-network-add”API)。
此蓝图的其他可能选项
除了我们的提案之外,还有几种实现选项可以实现目标。
- 选项1
将“dhcp_ips”属性添加到子网中。(请注意,它必须是一个列表,因为可以向网络分配多个dhcp-agent)。当调用create_dhcp_port时,使用列表中未使用的IP地址之一。此选项的缺点是需要大量的代码添加/修改。
- 选项2
用户通过指定“device_id”和“device_owner”属性显式创建DHCP端口,然后再将dhcp_agent分配给网络。此选项存在两个问题。
1) 如何生成“device_id”尚未公开。
2) 端口创建会强制dhcp_agent调度。可能分配了由指定的“device_id”表示的dhcp_agent以外的dhcp_agent。另一方面,在创建端口之前分配dhcp_agent会导致dhcp_agent通过create_dhcp_port RPC调用创建DHCP端口。
我们的提案解决了这些问题,我们认为这是实现此蓝图的最佳解决方案。
CLI
“dhcp-ip”选项已添加到“neutron dhcp-agent-network-add”CLI。
Usage of dhcp-agent-network-add sub command is as follows:
usage: neutron dhcp-agent-network-add [-h] [--request-format {json,xml}]
[--dhcp-ip ip_address=IP_ADDR]
dhcp_agent network
Add a network to a DHCP agent.
positional arguments:
dhcp_agent ID of the DHCP agent
network Network to add
optional arguments:
-h, --help show this help message and exit
--request-format {json,xml}
The xml or json request format
--dhcp-ip ip_address=IP_ADDR
Desired IP for dhcp port:
subnet_id=<name_or_id>,ip_address=<ip>, (This option
can be repeated.)
例如
neutron dhcp-agent-network-add --dhcp-ip subnet_id=sub1,ip_address=10.0.0.10 76bf2562-2926-412f-92d0-a71f837c8839 net1
如果要指定端口的名称或mac_address,可以使用“values_specs”。
例如
neutron dhcp-agent-network-add --dhcp-ip subnet_id=sub1,ip_address=10.0.0.10 76bf2562-2926-412f-92d0-a71f837c8839 net1 --dhcp_port type=dict name=dhcp1,mac_address=ae:04:0f:ac:17:4c
请注意,需要dhcp-ip选项,因为不能使用“values_specs”指定端口的“fixed_ips”属性。
未创建“mac_address”和“name”的选项,因为它们的优先级较低,并且可以使用“values_specs”指定它们。