このサービスは、イメージ転送を制御するメカニズムを提供します。クライアントは、「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'
)
)
)
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
Copied!
Toggle word wrap
Toggle overflow
ユーザーがディスクをアップロードではなくダウンロードしたい場合は、転送の 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
)
)
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
Copied!
Toggle word wrap
Toggle overflow
転送には、アップロード/ダウンロードのフローを管理するフェーズがあります。このようなフローを実装するクライアントは、転送のフェーズをポーリング/チェックし、それに応じて動作する必要があります。想定されるすべてのフェーズは、ImageTransferPhase にあります。
新しい転送を追加した後、そのフェーズは 初期化 されます。クライアントは、転送が変更されるまで、転送のフェーズをポーリングする必要があります。フェーズが 転送中 になると、セッションは転送を開始できる状態になります。
以下に例を示します。
transfer_service = transfers_service.image_transfer_service(transfer.id)
while transfer.phase == types.ImageTransferPhase.INITIALIZING:
time.sleep(3)
transfer = transfer_service.get()
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
Copied!
Toggle word wrap
Toggle overflow
その段階で、転送のフェーズが 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,
}
transfer_headers = {
'Authorization' : transfer.signed_ticket,
}
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Python の HTTPSConnection
を使用すると、新しい接続が確立されます。
Extract the URI, port, and path from the transfer's proxy_url.
Create a new instance of the connection.
# 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
Copied!
Toggle word wrap
Toggle overflow
アップロードするには、送信される特定のコンテンツ範囲を 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
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
Copied!
Toggle word wrap
Toggle overflow
同様に、ダウンロード転送では 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
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
Copied!
Toggle word wrap
Toggle overflow
転送を終了すると、ユーザーは finalize を呼び出す必要があります。これにより、転送プロセスを完了する最終の調整と検証が行われます。
以下に例を示します。
transfer_service.finalize()
transfer_service.finalize()
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
エラーの場合は、転送のフェーズが finished_failure に変更され、ディスクのステータスが Illegal
に変更されます。それ以外の場合は、finished_success に変更され、ディスクを使用する準備が整います。どちらの場合も、転送エンティティーはすぐに削除されます。
Expand 表6.312 メソッドの概要 Name 概要
extend
イメージ転送セッションを延長します。
finalize
データの転送が終了したら、転送を完了します。
get
イメージ転送エンティティーを取得します。
pause
イメージ転送セッションを一時停止します。
再開
イメージ転送セッションを再開します。
Show more