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