extension 模块:neutron/extensions/agent.py
wsgi 的实现模块、数据库模块:neutron/db/agents_db.py
我前面写过一篇文章 neutron 中 AvailabilityZone 的实现,其中说明了 AvailabilityZone
的查询也是在 Agent
数据库中进行的,今天我们就来看看这个 agents 的 WSGI 实现。
ext_agent.AgentPluginBase
是在个抽象类AgentAvailabilityZoneMixin
则是AvailabilityZone
的 WSGI 实现
测试方法:
curl -s -X GET http://172.16.100.106:9696//v2.0/agents/58ea7075-d9e6-4070-9e57-bbce22335f2c -H 'Content-Type: application/json' -H 'X-Auth-Token: cbc39c33b9334e54b3b561c451da1ee3' | jq
- 调用
_get_agent
方法进行数据库查询 - 调用
_make_agent_dict
将数据库查询结果转化为字典格式
调用公共方法里面的 _get_by_id
根据 id
来获取 Agent
数据库记录。
将数据库查询结果转化为字典格式
测试命令:
curl -s -X DELETE http://172.16.100.106:9696//v2.0/agents/58ea7075-d9e6-4070-9e57-bbce22335f2c -H 'Content-Type: application/json' -H 'X-Auth-Token: cbc39c33b9334e54b3b561c451da1ee3'
- 调用
_get_agent
方法进行数据库查询 - 调用回调系统中的
registry.notify
发出BEFORE_DELETE
的事件通知 - 删除数据库记录
- 调用
_get_agent
方法进行数据库查询 - 更新数据库记录
- 返回更新后的 agent 数据
该方法依然是继承于 AgentPluginBase
,注释中写的很明白,不允许 REST API 中有创建 agent 的操作。
def create_agent(self, context, agent):
"""Create agent.
This operation is not allow in REST API.
@raise exceptions.BadRequest:
"""
raise exceptions.BadRequest()
测试命令:
curl -s -X GET http://172.16.100.106:9696//v2.0/agents -H 'Content-Type: application/json' -H 'X-Auth-Token: cbc39c33b9334e54b3b561c451da1ee3' | jq
- 调用公共方法里面的
_get_collection
获取数据库记录 - 过滤掉非
alive
的记录 - 返回获取的数据
获取某 host 上某一 agent_type 类型的 agent。
根据心跳检测时间(这里是 UTC 时间)判断 agent 是否挂掉了
这三个方法涉及到 RPC 中的资源版本管理,这个我们后面讲解
从 Agents 数据库查询结果中提取 configurations
的相关数据
从 Agents 数据库查询结果中提取 dict_name
的相关数据(get_configuration_dict就是调用的这个方法)
创建或者更新 Agent 数据库记录
- 从
agent_state
中构造 agent 的数据库配置 - 调用
_get_agent_by_type_and_host
查询该 agent 是否已经存在 - 调用
_log_heartbeat
记录心跳检测的日志 - 已经存在的话则更新这个数据库
- 不存在的话则创建数据库
- 调用 Neutron 回调系统的
registry.notify
发送消息
agents 数据库中 load ,具体还待研究,可参考 dhcp_load_type
的配置
在 candidate_hosts
过滤具有访问 network_id
网络权限的主机。