5.101. ImageTransfer


该服务提供了一种控制镜像传输的机制。客户端必须通过 添加 第 5.102 节 “ImageTransfers” 服务来创建传输,表示要将数据传送到/从中传输数据。

执行此操作后,转让由此服务管理。

例如,要上传到 ID 为 52cb593f-837c-4633-a444-35a0a0383706 的磁盘镜像,客户端可以使用 oVirt 的 Python SDK,如下所示:

transfers_service = system_service.image_transfers_service()
transfer = transfers_service.add(
   types.ImageTransfer(
      image=types.Image(
         id='52cb593f-837c-4633-a444-35a0a0383706'
      )
   )
)
Copy to Clipboard Toggle word wrap

传输具有阶段,用于管理上传/下载的流程。实施此类流的客户端应轮询/检查传输的阶段,并相应地执行操作。所有可能阶段均可在 ImageTransferPhase 中找到。

添加新传输后,其阶段将为初始化。客户端必须轮询到传输的阶段,直到其更改为止。当阶段传输时,会话就可以开始传输。???

例如:

transfer_service = transfers_service.image_transfer_service(transfer.id)
while transfer.phase == types.ImageTransferPhase.INITIALIZING:
   time.sleep(3)
   transfer = transfer_service.get()
Copy to Clipboard Toggle word wrap

在该阶段,如果传输的阶段是 paused_system,则不成功建立会话。其中一个可能的原因是,ovirt-imageio-daemon 没有在为传输选择的主机中运行。通过调用管理它的服务的 恢复,可以恢复转让。

如果会话成功建立 - 返回的传输实体将包含 proxy_urlsigned_ticket 属性,客户端需要使用该属性来传输所需的数据。客户端可以选择使用镜像的数据发送 HTTPS 请求的任何技术和工具。

  • proxy_url 是镜像要执行 I/O 的代理服务器的地址。
  • signed_ticket 是需要添加到 HTTPS 请求中的 Authentication 标头中的内容,以执行可信通信。

例如,可以使用 Python 的 HTTPSConnection 来执行上传,因此为后续上传设置 upload_headers dict:

upload_headers = {
   'Authorization' :  transfer.signed_ticket,
}
Copy to Clipboard Toggle word wrap

使用 Python 的 HTTPSConnection 时,会建立一个新的连接:

# Extract the URI, port, and path from the transfer's proxy_url.
url = urlparse(transfer.proxy_url)

# Create a new instance of the connection.
proxy_connection = HTTPSConnection(
   url.hostname,
   url.port,
   context=ssl.SSLContext(ssl.PROTOCOL_SSLv23)
)
Copy to Clipboard Toggle word wrap

要发送的特定内容范围必须在 Content-Range HTTPS 标头中记录。这可用于将传输分成多个请求,以获得更灵活的流程。

为此,客户端必须重复扩展传输会话,使频道保持打开。否则,会话将终止,传输将进入 paused_system 阶段,对服务器的 HTTPS 请求将被拒绝。

例如,客户端可以迭代文件的块,并在要求服务扩展会话时将它们发送到代理服务器:

path = "/path/to/image"
MB_per_request = 32
with open(path, "rb") as disk:
   size = os.path.getsize(path)
   chunk_size = 1024*1024*MB_per_request
   pos = 0
   while (pos < size):
      transfer_service.extend()
      upload_headers['Content-Range'] = "bytes %d-%d/%d" % (pos, min(pos + chunk_size, size)-1, size)
      proxy_connection.request(
         'PUT',
         url.path,
         disk.read(chunk_size),
         headers=upload_headers
      )
      r = proxy_connection.getresponse()
      print r.status, r.reason, "Completed", "{:.0%}".format(pos/ float(size))
      pos += chunk_size
Copy to Clipboard Toggle word wrap

完成转让后,用户应调用 finalize。这将进行最终的调整和验证来完成传输过程。

例如:

transfer_service.finalize()
Copy to Clipboard Toggle word wrap

如果出现错误,传输的阶段将更改为 finished_failure,磁盘的状态将变为 Illegal。否则,它将更改为 completed_success,磁盘将准备就绪。在这两种情况下,传输实体将在后不久删除。

Expand
表 5.313. 方法概述
名称概述

extend

扩展镜像传输会话。

完成

完成传输数据后,完成传输。

get

获取镜像传输实体。

pause

暂停镜像传输会话。

resume

恢复镜像传输会话。

5.101.1. 扩展 POST

扩展镜像传输会话。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat