neutron/plugins/openvswitch/agent/ovs_neutron_agent.py:main() plugin = OVSNeutronAgent(**agent_config) self.setup_integration_br() #建立br-int集成網橋並初始化流表 self.setup_rpc() #創建一些agent與server側經常使用的rpc通道 self.plugin_rpc = OVSPluginApi(topics.PLUGIN) #如get_device_details/update_device_down/update_device_up/tunnel_sync
self.sg_plugin_rpc = sg_rpc.SecurityGroupServerRpcApi(topics.PLUGIN) #查詢安全組信息 self.state_rpc = agent_rpc.PluginReportStateAPI(topics.PLUGIN) #處理report_state self.connection = agent_rpc.create_consumers(...)
#建立如下消費者們:port update/delete, tunnel update/delete, security_group update, dvr update, l2population update host heartbeat = loopingcall.FixedIntervalLoopingCall(self._report_state) #週期任務上報agent狀態,如br-int上有多少device,agent當前時間等 self.setup_physical_bridges(bridge_mappings)
#處理物理網橋與br-int的關聯(採用veth對/path對),若是物理網橋不存在則直接退出agent,並初始化流表 self.setup_tunnel_br()/ self.reset_tunnel_br(tun_br)
#建立br-tun,與br-int關聯(採用patch對),並初始化流表
#爲啥要分開處理? self.setup_ancillary_bridges(integ_br, tun_br) # 識別出本host上除了br-int、br-tun和物理網橋以外的網橋,如br-ex self.sg_agent = OVSSecurityGroupAgent(...) # 用於處理安全組
self.connection.consume_in_threads() # 對以上consume開啓各個線程監聽並處理 plugin.daemon_loop() self.rpc_loop() tunnel_sync() #在agent首次啓動或有異常發生時,會進行tunnel同步。
#上報本agent的tunnel ip到neutron server DB中,neutron server同時發送關於該tunnel ip的消息(tunnel_update)給其餘agents
#若是沒有開啓l2pop,則在本agent上會在br-tun上建立tunnel port,其餘agents也會建立相應的remote tunnel port,並建立相應流表
port_info = self.scan_ports() #週期檢測br-int上的端口變化
sync = self.process_network_ports(port_info) #處理增長或刪除的port
neutron-server和neutron-openvswitch-agent的消息隊列以下:安全
neutron-server可能會發生上述幾種消息廣播給neutron-openvswitch-agent。openvswitch agent會先看一下端口是否在本地,若是在本地則進行對應動做。app
首先boot虛機時,nova-compute發消息給neutron-server請求建立port。以後,在driver裏面在br-int上創建port後,neutron-openvswitch-port循環檢測br-int會發現新增端口,對其設定合適的openflow規則以及localvlan,最後將port狀態設置爲ACTIVE。oop
附:ovs啓動流程圖(http://bingotree.cn/wp-content/uploads/2015/05/ovs-agent%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B1.png)spa