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

    xiaoxiao2021-03-26  51

    我们知道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绑定操作。

    转载请注明原文地址: https://ju.6miu.com/read-350054.html

    最新回复(0)