5.101. ImageTransfer
이 서비스는 이미지 전송을 제어하는 메커니즘을 제공합니다. 클라이언트는 5.102절. “ImageTransfers” 서비스 추가를 사용하여 전송을 생성해야 하며, 데이터를 전송할 이미지를 나타냅니다.
그 후 전송은 이 서비스에 의해 관리됩니다.
예를 들어, 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 로 변경되고 디스크를 사용할 준비가 되었습니다. 두 경우 모두 전송 엔티티는 잠시 후에 제거됩니다.
이름 | 요약 |
---|---|
| 이미지 전송 세션을 확장합니다. |
| 데이터 전송을 완료한 후 전송을 종료합니다. |
| 이미지 전송 엔티티를 가져옵니다. |
| 이미지 전송 세션을 일시 중지합니다. |
| 이미지 전송 세션을 다시 시작합니다. |
5.101.1. POST확장
이미지 전송 세션을 확장합니다.