Type Driver代码解读

Type Driver最主要的功能是管理网络Segment,提供Provider Segment和Tenant Segment的验证、分配、释放等操作。
命令行中没有指定任何Provider信息时,所创建的就是Tenant Segment,简单的说,Provider Segment之外的Segment都可以称为Tenant Segment。
一 Flat Type Driver
#neutron/plugins/ml2/drivers/type_flat.py
class FlatTypeDriver(api.TypeDriver):
    def validate_provider_segment(self, segment):
        physical_network = segment.get(api.PHYSICAL_NETWORK)
        if not physical_network:
            msg = _("physical_network required for flat provider network")
            raise exc.InvalidInput(error_message=msg)
        if self.flat_networks and physical_network not in self.flat_networks:
            msg = (_("physical_network '%s' unknown for flat provider network")
                   % physical_network)
            raise exc.InvalidInput(error_message=msg)
        for key, value in segment.iteritems():
            if value and key not in [api.NETWORK_TYPE,
                                     api.PHYSICAL_NETWORK]:
                msg = _("%s prohibited for flat provider network") % key
                raise exc.InvalidInput(error_message=msg)
    def reserve_provider_segment(self, session, segment):
        physical_network = segment[api.PHYSICAL_NETWORK]
        with session.begin(subtransactions=True):
            try:
                LOG.debug(_("Reserving flat network on physical "
                            "network %s"), physical_network)
                alloc = FlatAllocation(physical_network=physical_network)
                alloc.save(session)
            except db_exc.DBDuplicateEntry:
                raise exc.FlatNetworkInUse(
                    physical_network=physical_network)
        return segment
Flat网络创建时,必须指定PHYSICAL_NETWORK信息(比如命令行中指定”–provider:network”的值),也就是指定物理网络的名字,而且这个名字还必须符合配置文件的要求。另外,对于Flat网络,没有所谓的SEGMENTATION_ID,这是因为VLAN ID、Tunnel ID等对于Flat网络没有任何意义。Flat Type Driver会根据上述要求对Segment进行验证。
对于Flat类型的网络来说,Segment的分配很简单,就是将Type Manager传递过来的Segment(从network创建的命令提取出来的结果)保存到数据库里。这个过程会检查数据库里是否已经存在相同的条目,如果有,就说明该Segment已经被使用了,这个Flat网络的创建就会失败。如果数据库里并没有存在相同的条目,则还需要检查配置文件,通常我们需要将需要创建的物理网络名称写入配置文件,如果这个名称使用”*“通配符代替,则表示任意的物理网络名称都满足要求。
二 Tunnel Type Driver
1 代码参考(H版)
neutron/plugins/ml2/drivers/type_tunnel.py
neutron/plugins/ml2/drivers/type_gre.py
neutron/plugins/ml2/drivers/type_vxlan.py
2 Vxlan和GRE
Vxlan和GRE都是Tunnel类型的虚拟网络,针对Tunnel网络,ML2又引入了类TunnelTypeDriver,这个类继承自neutron.plugins.ml2.driver_api.TypeDriver,除了实现TypeDriver要求的接口,还针对Tunnel类型网络定义了一些新的接口供Vxlan与GRE Driver去实现。
TunnelRpcCallbackMixin类定义了ML2 Plugin到Agent的接口tunnel_sync
TunnelAgentRpcApiMixin类定义了Agent到ML2 Plugin接口tunnel_update
三 VLAN Type Driver
代码参考:neutron/plugins/ml2/drivers/type_vlan.py
VLAN的管理则与GRE与VxLAN不同,VLAN必须指定PHYSICAL_NETWORK,这是因为VLAN必须在主机的某个网络接口(比如eth0)上配置,而Vxlan和GRE不需要和主机网络接口绑定。
每个物理网络上都可以有4095个可用的VLAN ID,即最多可以有4095个Segment。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值