neutron/ipam/request.py
- Ipam(ip address management,ip 地址管理)中两种请求:
- 一种是从子网池(subnet pool)中为网络(network)分配子网(subnet)的请求
- 另一种是从子网(subnet)中为端口(port)分配 ip 地址的请求
- 根据请求的不同,分为两种处理方式:
- 在
Pool.get_subnet_request_factory
调用SubnetRequestFactory.get_request
来处理分配子网的请求 - 在
Pool.get_address_request_factory
调用AddressRequestFactory.get_request
来处理分配地址的请求 - 对于分配子网的请求来说,根据请求数据的不同又可以分为两类:
- 若分配子网的请求数据中包含了
cidr
属性,则调用SpecificSubnetRequest
做进一步的处理 - 若分配子网的请求数据中不包含
cidr
属性,则调用AnySubnetRequest
做进一步的处理 - 对于分配 ip 地址来说,分为四种处理方式
- 若分配 ip 地址的请求数据中包含了
ip_address
属性,则调用SpecificAddressRequest
做进一步的处理 - 若分配 ip 地址的请求数据中包含了
eui64_address
属性,则调用AutomaticAddressRequest
做进一步的处理 - 若分配 ip 地址的请求数据中包含了
device_owner
属性,则调用PreferNextAddressRequest
做进一步的处理 - 若分配 ip 地址的请求数据中不包含以上三种属性,则调用
AnyAddressRequest
做进一步的处理
neutron address-scope-create --shared simple-scope 4 #创建地址范围
neutron subnetpool-create --pool-prefix 10.0.1.0/8 --pool-prefix 10.0.2.0/8 --address-scope simple-scope --min-prefixlen 12 --max-prefixlen 20 --default-prefixlen 16 --shared --description 'This is a test simple subnet pool.' simple-subnetpool #创建子网池
neutron net-create --router:external --provider:physical_network simple --provider:network_type flat --shared --description 'This is a simple network' simple-net #创建网络
neutron subnet-create --name simple-subnet --subnetpool simple-subnetpool --prefixlen 14 simple-net #创建子网
在创建网络的时候,我们会看到这么几个参数:--provider:network_type
、--provider:physical_network
、--provider:segmentation_id
,这几个是创建 provider 网络的。
关于 provider 网络与 tenant 网络的区别请参考: Neutron 中的 Provider Network 和 Tenant Network
vim /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
type_drivers = flat,vlan
tenant_network_types =
mechanism_drivers = openvswitch
extension_drivers = port_security
[ml2_type_flat]
flat_networks = provider
[ml2_type_vlan]
network_vlan_ranges = provider
[securitygroup]
enable_ipset = True
[ovs]
bridge_mappings = provider:br-provider
ovs-vsctl add-br br-provider
ovs-vsctl add-port br-provider PROVIDER_INTERFACE
PROVIDER_INTERFACE
指的是你的物理网卡的名称
OpenStack网络指南(12)BGP动态路由 Neutron 中的 Provider Network 和 Tenant Network
@six.add_metaclass(abc.ABCMeta)
class SubnetRequest(object)
抽象基类,定义了一些实例属性
- 验证
allocation_pool
、gateway_ip
属性是否合法 - 设定实例的
_tanant_id
、_subnet_id
、_gateway_ip
、_allocation_pool
属性方法,返回 self._tenant_id
属性方法,返回 self._subnet_id
属性方法,返回 self._gateway_ip
属性方法,返回 self._allocation_pools
- 验证
_allocation_pools
内的 IP 版本是否和cidr
版本一致 - 验证
_allocation_pools
是否在cidr
内
处理带有 prefixlen
的分配子网请求,若是没有声明 prefixlen
,则使用默认的 default_prefixlen
。
def __init__(self, tenant_id, subnet_id, version, prefixlen, gateway_ip=None, allocation_pools=None)
增加了 _prefixlen
属性
属性方法,返回 self._prefixlen
处理带有 cidr
属性的分配子网的请求,并且从 cidr
属性中推断出 prefixlen
属性。
增加了 _subnet_cidr
属性
属性方法,返回 self._subnet_cidr
属性方法,返回 self._subnet_cidr.prefixlen
空抽象基类
@six.add_metaclass(abc.ABCMeta)
class AddressRequest(object):
"""Abstract base class for address requests"""
处理有明确 Ip 地址的分配请求。
属性方法,返回 self._address
。
空类
空类
处理自动生成 eui64
类型的 Ip 地址的请求
空类