前面讲了mechanism drivers(manager)的用途,剩下个type_drivers 没有说,在setup.cfg的entry_points中:
neutron.ml2.type_drivers =
flat = neutron.plugins.ml2.drivers.type_flat:FlatTypeDriver
local = neutron.plugins.ml2.drivers.type_local:LocalTypeDriver
vlan = neutron.plugins.ml2.drivers.type_vlan:VlanTypeDriver
gre = neutron.plugins.ml2.drivers.type_gre:GreTypeDriver
vxlan = neutron.plugins.ml2.drivers.type_vxlan:VxlanTypeDriver
nexus_vxlan = neutron.plugins.ml2.drivers.cisco.nexus.type_nexus_vxlan:NexusVxlanTypeDriver
一般常用的flat,vlan,gre三种,vxlan有时候也用,不过前面三种我亲自配过并用过。实际上实现一个type_driver只要实现
特定的几个方法就行了,validate_provider_segment,reserve_provider_segment,allocate_tenant_segment,release_segment等,那么type drivers用来干什么呢?
总结一句话:维护数据表,记录和网络类型相关的数据。 还是比较抽象的话,来看看数据库中的几个表格:
| ml2_vlan_allocations | CREATE TABLE `ml2_vlan_allocations` (
`physical_network` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
`vlan_id` int(11) NOT NULL,
`allocated` tinyint(1) NOT NULL,
PRIMARY KEY (`physical_network`,`vlan_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
| ml2_flat_allocations | CREATE TABLE `ml2_flat_allocations` (
`physical_network` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`physical_network`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
| ml2_vxlan_allocations | CREATE TABLE `ml2_vxlan_allocations` (
`vxlan_vni` int(11) NOT NULL,
`allocated` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`vxlan_vni`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
| ml2_gre_allocations | CREATE TABLE `ml2_gre_allocations` (
`gre_id` int(11) NOT NULL,
`allocated` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`gre_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
分别是vlan,flat,vxlan,gre, 而在ML2Plugin中,创建网络时,会根据不同的network_type进行不同的操作
type_drivers 和 mechanism drivers结合使用,灵活性更强
至于最后一个setup.cfg中的service_providers,和core plugin中对应的有type driver 和 mechanism driver, 对于service_plugin来说,
一个service_plugin可能有不同的driver,这些driver就由service_provider提供,不再trace其load 过程
从前面到这里,即使你把neutron的code 都trace一遍,只是和其他的openstack module一样,你知道了wsgi服务怎么运行起来的,知道了
rpc服务怎么用的(neutron的rpc不特别分析,之后会专门说rpc),知道了配置core plugin到manager到driver,到extensions,service_plguins以及service plugin
的driver,你甚至可以写自己的driver了,然而,这仅仅是理论,网络的复杂性在于,作为admin,你得面对真实的网络,你得和真实的网卡,交换机,路由器打交道,因此要对不同的网络类型再深入的分析一下。