跳转到: 导航, 搜索

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


未解决的问题

BoF 议程和讨论