6.101. ImageTransfer


このサービスは、イメージ転送を制御するメカニズムを提供します。クライアントは、「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

ユーザーがディスクをアップロードではなくダウンロードしたい場合は、転送の direction 属性として download を指定する必要があります。これにより、書き込み権限ではなく、イメージからの読み取り権限が付与されます。

例:

transfers_service = system_service.image_transfers_service()
transfer = transfers_service.add(
   types.ImageTransfer(
      image=types.Image(
         id='52cb593f-837c-4633-a444-35a0a0383706'
      ),
      direction=types.ImageTransferDirection.DOWNLOAD
   )
)
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 が動作していないことです。転送は、それを管理するサービスの resume を呼び出すことによって再開できます。

セッションが正常に確立された場合:返される転送エンティティーには proxy_url および signed_ticket 属性が含まれます。これは、クライアントが必要なデータを転送するために使用する必要があります。クライアントは、イメージのデータで HTTPS 要求を送信するための手法およびツールを選択できます。

  • proxy_url は、I/O を行うイメージへのプロキシーサーバーのアドレスです。
  • signed_ticket は、信頼できる通信を実行するために HTTPS リクエストの Authentication ヘッダーに追加する必要があるコンテンツです。

たとえば、転送の実行には Python の HTTPSConnection を使用することができます。そのため、転送する転送には transfer_headers dict が設定されます。

transfer_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.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()
      transfer_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=transfer_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

同様に、ダウンロード転送では Range ヘッダーを送信し、ディスクをチャンクにダウンロードすることでダウンロードプロセスをより簡単に管理できるようにする必要があります。

たとえば、クライアントはディスクイメージのチャンクを繰り返し処理しますが、今回は独自のファイルをイメージにアップロードするのではなく、ローカルファイルにダウンロードします。

output_file = "/home/user/downloaded_image"
MiB_per_request = 32
chunk_size = 1024*1024*MiB_per_request
total = disk_size

with open(output_file, "wb") as disk:
   pos = 0
   while pos < total:
      transfer_service.extend()
      transfer_headers['Range'] = "bytes=%d-%d" %  (pos, min(total, pos + chunk_size) - 1)
      proxy_connection.request('GET', proxy_url.path, headers=transfer_headers)
      r = proxy_connection.getresponse()
      disk.write(r.read())
      print "Completed", "{:.0%}".format(pos/ float(total))
      pos += chunk_size
Copy to Clipboard Toggle word wrap

転送を終了すると、ユーザーは finalize を呼び出す必要があります。これにより、転送プロセスを完了する最終の調整と検証が行われます。

以下に例を示します。

transfer_service.finalize()
Copy to Clipboard Toggle word wrap

エラーの場合は、転送のフェーズが finished_failure に変更され、ディスクのステータスが Illegal に変更されます。それ以外の場合は、finished_success に変更され、ディスクを使用する準備が整います。どちらの場合も、転送エンティティーはすぐに削除されます。

Expand
表6.312 メソッドの概要
Name概要

extend

イメージ転送セッションを延長します。

finalize

データの転送が終了したら、転送を完了します。

get

イメージ転送エンティティーを取得します。

pause

イメージ転送セッションを一時停止します。

再開

イメージ転送セッションを再開します。

6.101.1. extend POST

イメージ転送セッションを延長します。

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat