8.15 Neutron 源码解读

neutron api 的入口是在这里image0

在这里会校验并打印请求的信息image1

而对网络、子网、port操作的逻辑处理代码的入口都是从这里开始的image2

8.15.1 创建Port

从 neutron api 请求过来后,就会经过这里image3

把 port 信息打印一下image4

点进上面的self._create_port_db(),可以看到这里先是创建了一个空壳的port

image5

再分配ipimage6

上图有一个函数 _allocate_ips_for_port,相当重要,一般人只要从这里关注即可

image7

它会先根据port创建请求里的内容,去数据库中一一比对,找出符合条件的子网,当然在找的过程中,会校验请求参数的准确性,比如它是指定ip和subnet创建的port,那么会检查这个ip是否在subnet内。

对于一个port,可能会有多个ip。

校验完参数后,会把创建这个port所需的信息都整理到最后返回的 fixed_ip_list 里。如果指定了ip,这个list里的元素就会有 ip_address,否则就只有 subnet_id。

image8

image9


当不指定子网、也不指定ip时(也就是不传fixed_ip),而且 cluster 里 即 有ipv4 的子网也有ipv6的子网,这时候 neutron 会去创建一个既有ipv4也有ipv6的port,只要有一个version的子网里没有可用ip,都会失败。

image10

这里是遍历一个version的所有的子网列表,只要能找到一个子网有可用ip,就返回,如果遍历完都没有找到ip,那就要抛出异常了。

image11

class IpAddressGenerationFailureAllSubnets(IpAddressGenerationFailure):
    message = _("No more IP addresses available.")