openstack neutron源码分析(四)--------port的创建流程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/happyAnger6/article/details/56049300

我们知道nova在创建虚拟机时,会为虚拟机创建port,流程图如下:


前面分析neutron wsgi的文章中有介绍一次restful api的详细请求,可以回顾下:http://blog.csdn.net/happyanger6/article/details/54586463

1.nova发送的port创建请求会以json格式携带关于compute node主机名,创建的网络信息等报文,因此resoure会先进行解包操作。

2.然后Controller会对body对应的操作进行数据格式及一些必须字段的检查,然后进行方法拼装,这里会调用ml2 plugin的create_port方法。

3.ml2 plugin会先将port信息存储到数据库中:

其中Port的模型如下:


class Port(standard_attr.HasStandardAttributes, model_base.BASEV2,
           model_base.HasId, model_base.HasProject):
    """Represents a port on a Neutron v2 network."""

    name = sa.Column(sa.String(attr.NAME_MAX_LEN))
    network_id = sa.Column(sa.String(36), sa.ForeignKey("networks.id"),
                           nullable=False)
    fixed_ips = orm.relationship(IPAllocation, backref='port', lazy='joined',
                                 cascade='all, delete-orphan')

    mac_address = sa.Column(sa.String(32), nullable=False)
    admin_state_up = sa.Column(sa.Boolean(), nullable=False)
    status = sa.Column(sa.String(16), nullable=False)
    device_id = sa.Column(sa.String(attr.DEVICE_ID_MAX_LEN), nullable=False)
    device_owner = sa.Column(sa.String(attr.DEVICE_OWNER_MAX_LEN),
                             nullable=False)
    ip_allocation = sa.Column(sa.String(16))

    __table_args__ = (
        sa.Index(
            'ix_ports_network_id_mac_address', 'network_id', 'mac_address'),
        sa.Index(
            'ix_ports_network_id_device_owner', 'network_id', 'device_owner'),
        sa.Index('ix_ports_device_id', 'device_id'),
        sa.UniqueConstraint(
            network_id, mac_address,
            name='uniq_ports0network_id0mac_address'),
        model_base.BASEV2.__table_args__
    )
    api_collections = [attr.PORTS]

4.然后调用扩展插件和安全组件进行相关处理,并将绑定信息存入数据库。

5.再通过mechanism_manager调用各个插件的'create_port_precommit'方法进行预处理

6.后面还会调用各个插件的'create_port_postcommit'方法进行后续处理

7.然后会进行port绑定的实际操作,这里最多会尝试10次。这里不会实际调用agent处理,只是调用各个mechanism的'bind_port'方法完成个性化处理。

8.最后发送rpc消息到agent,调用agent的'port_update'方法完成实际的port绑定操作。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页