GuestAgentXenStoreCommunication
- Launchpad 条目:
- 创建: 12/27/2010
- 贡献者: ChrisBehrens
总结
Rackspace 目前使用 XenStore 与客户代理通信。 本规范描述了该“协议”。
发布说明
用户不应注意到任何影响,除了客户镜像应安装客户代理,这将在进程列表中被注意到。 在 Linux 上,该代理当前名为 'agent-smith'。
原理
对于 XenServer 客户的初始客户通信将通过 XenStore 进行,以便满足 Rackspace 的要求,即当前的 Rackspace 客户代理将无需更改即可正常工作。
用户故事
前提条件
将安装一个代理到客户机中进行通信。 请参阅 GuestAgent wiki 条目</a> 以获取有关代理和当前支持的命令的更多信息。
设计
XenAPI 需要扩展以支持通用的 xenstore 读取、写入和删除调用。 计算节点将发出 XenAPI 调用来与实时 xenstore 通信。 <
> 至于通信细节
在 dom0 上,请求被推送到名为 /local/domain/<dom-id>/data/host/<UUID> 的路径中。 <
> 当返回响应时,/local/domain/<dom-id>/data/guest/<UUID> 将存在并包含响应。
(请注意,客户机端将这些路径视为 /data/host/<UUID> 和 /data/guest/<UUID>。)
<dom-id> 是 xen 域编号,需要以某种方式获取。 “xe 方式”如下面的测试中列出。 <UUID> 是某个唯一标识符。 代理当前不检查此 UUID 的格式。
请求和响应都以 JSON 编码。 请求的格式为
"{ "name": "<command_name>", "value": "<command_arguments>"}"
响应的格式为
"{ "returncode": "<value>", "message": "<value>" }"
大多数 'returncode' 返回成功的响应为“0”,除了“keyinit”命令,它返回“D0”作为成功。 'returncode' 的其他值被视为错误。
实现
如上所述,XenAPI 需要扩展。 这可以在当前的 nova 插件中完成。 目前,从该插件执行名为 'xenstore-write'、'xenstore-read' 和 'xenstore-rm' 的 xen 实用程序是最简单的。 最终,应该有一个 Python 绑定,你可以直接调用 libxenstore.so,但这以后可以完成。
可以为从计算节点到客户机的 XenStore 通信创建一个快速的 python 类,其中包含类似
def __init__(self, dom_id):
self.dom_id = dom_id
uuid = pick_unique_id
self.request_path = "/local/domain/%d/data/host/%s" % (dom_id, uuid)
self.response_path = "/local/domain/%d/data/guest/%s" % (dom_id, uuid)
def send_request(self, command_dict):
# Convert data for stuffing into XenStore (this currently should convert a dict to JSON)
encoded_data = self.encode_data(command_dict)
XenAPI.write_to_xenstore(self.request_path, encoded_data)
def recv_response(self)
do_while_some_timer():
if (data = XenAPI.read_from_xenstore(self.response_path)) succeeds:
XenAPI.rm_from_xenstore(self.response_path)
return self.decode_data(data)
return {}
在线程中,可以调用 send_request/recv_request... 也许可以将这些调用合并为一个。
测试/演示计划
可以通过命令行使用今天的客户代理进行测试
# Find a <dom_id>
xe vm-list
# Find the UUID of the guest in question and run:
xe vm-param-get uuid=<uuid> param-name=dom-id
xenstore-write /local/domain/<dom_id>/host/TEST_REQUEST1 "{ 'name': 'version', 'value:' 'agent' }"
repeat until response is found:
xenstore-read /local/domain/<dom_id>/guest/TEST_REQUEST1
xenstore-rm /local/domain/<dom_id>/guest/TEST_REQUEST1