rpc

agentnotifiers

主要负责发出一些rpc的通知给agent,包括三个文件:dhcp_rpc_agent_api.py、l3_rpc_agent_api.py、metering_rpc_agent_api.py。
分别实现向dhcp、l3或者metering的agent发出通知消息。

以dhcp_rpc_agent_api.py为例,定义了DhcpAgentNotifyAPI类,该类继承自neutron.common.rpc.RpcProxy。

首先定义允许对agent操作的资源和方法。

  1. VALID_RESOURCES = ['network', 'subnet', 'port']
  2. VALID_METHOD_NAMES = ['network.create.end',
  3. 'network.update.end',
  4. 'network.delete.end',
  5. 'subnet.create.end',
  6. 'subnet.update.end',
  7. 'subnet.delete.end',
  8. 'port.create.end',
  9. 'port.update.end',
  10. 'port.delete.end']

实现的方法包括agent_updated()、network_added_to_agent()、network_removed_from_agent(),分别cast一条rpc消息到dhcp agent,调用对应方法。

  1. def _cast_message(self, context, method, payload, host,
  2. topic=topics.DHCP_AGENT):
  3. """Cast the payload to the dhcp agent running on the host."""
  4. self.cast(
  5. context, self.make_msg(method, payload=payload),topic='%s.%s' % (topic, host))
  6. def network_removed_from_agent(self, context, network_id, host):
  7. self._cast_message(context, 'network_delete_end',
  8. {'network_id': network_id}, host)
  9. def network_added_to_agent(self, context, network_id, host):
  10. self._cast_message(context, 'network_create_end',
  11. {'network': {'id': network_id}}, host)
  12. def agent_updated(self, context, admin_state_up, host):
  13. self._cast_message(context, 'agent_updated',
  14. {'admin_state_up': admin_state_up}, host)

另外,实现notify()方法,可以调用所允许的方法。
neutron的api中会直接调用notify()方法。

  1. def notify(self, context, data, method_name):
  2. # data is {'key' : 'value'} with only one key
  3. if method_name not in self.VALID_METHOD_NAMES:
  4. return
  5. obj_type = data.keys()[0]
  6. if obj_type not in self.VALID_RESOURCES:
  7. return
  8. obj_value = data[obj_type]
  9. network_id = None
  10. if obj_type == 'network' and 'id' in obj_value:
  11. network_id = obj_value['id']
  12. elif obj_type in ['port', 'subnet'] and 'network_id' in obj_value:
  13. network_id = obj_value['network_id']
  14. if not network_id:
  15. return
  16. method_name = method_name.replace(".", "_")
  17. if method_name.endswith("_delete_end"):
  18. if 'id' in obj_value:
  19. self._notify_agents(context, method_name,
  20. {obj_type + '_id': obj_value['id']},
  21. network_id)
  22. else:
  23. self._notify_agents(context, method_name, data, network_id)

整体API的agent 通知调用的主要调用结构如下图所示。

rpc - 图1

handler

包括dvr_rpc.py文件。
其中定义了对dvr服务两端的rpc的api和callback类,包括DVRServerRpcApiMixin、DVRServerRpcCallbackMixin、DVRAgentRpcApiMixin、DVRAgentRpcCallbackMixin。