5.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' ) ) )
転送には、アップロード/ダウンロードのフローを管理するフェーズがあります。このようなフローを実装するクライアントは、転送のフェーズをポーリング/チェックし、それに応じて動作する必要があります。想定されるすべてのフェーズは、ImageTransferPhase にあります。
新しい転送を追加した後、そのフェーズは 初期化 されます。クライアントは、転送が変更されるまで、転送のフェーズをポーリングする必要があります。フェーズが 転送中 になると、セッションは転送を開始できる状態になります。
以下に例を示します。
transfer_service = transfers_service.image_transfer_service(transfer.id) while transfer.phase == types.ImageTransferPhase.INITIALIZING: time.sleep(3) transfer = transfer_service.get()
その段階で、転送のフェーズが paused_system である場合は、セッションが正常に確立されていないことになります。その原因として考えられるのは、転送対象として選択されたホストで ovirt-imageio-daemon が動作していないことです。転送は、それを管理するサービスの resume を呼び出すことによって再開できます。
セッションが正常に確立された場合:返される転送エンティティーには proxy_url および signed_ticket 属性が含まれます。これは、クライアントが必要なデータを転送するために使用する必要があります。クライアントは、イメージのデータで HTTPS 要求を送信するための手法およびツールを選択できます。
-
proxy_url
は、I/O を行うイメージへのプロキシーサーバーのアドレスです。 -
signed_ticket
は、信頼できる通信を実行するために HTTPS リクエストのAuthentication
ヘッダーに追加する必要があるコンテンツです。
たとえば、アップロードを実行するために Python の HTTPSConnection を使用すると、今後アップロード用に upload_headers
dict が設定されます。
upload_headers = { 'Authorization' : transfer.signed_ticket, }
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) )
送信される特定のコンテンツ範囲は、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
転送を終了すると、ユーザーは finalize を呼び出す必要があります。これにより、転送プロセスを完了する最終の調整と検証が行われます。
以下に例を示します。
transfer_service.finalize()
エラーの場合は、転送のフェーズが finished_failure に変更され、ディスクのステータスが Illegal
に変更されます。それ以外の場合は、finished_success に変更され、ディスクを使用する準備が整います。どちらの場合も、転送エンティティーはすぐに削除されます。
Name | 概要 |
---|---|
| イメージ転送セッションを延長します。 |
| データの転送が終了したら、転送を完了します。 |
| イメージ転送エンティティーを取得します。 |
| イメージ転送セッションを一時停止します。 |
| イメージ転送セッションを再開します。 |
5.101.1. extend POST
イメージ転送セッションを延長します。