6.101. ImageTransfer


이 서비스는 이미지 전송을 제어하는 메커니즘을 제공합니다. 클라이언트는 6.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'
      )
   )
)
Copy to Clipboard Toggle word wrap

사용자가 업로드하지 않고 디스크를 다운로드하려고하면 다운로드 가 전송의 방향 속성으로 지정해야 합니다. 그러면 쓰기 권한이 아니라 이미지에서 읽기 권한을 부여합니다.

E.g:

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_urlsigned_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. 방법 요약
이름요약

Extent

이미지 전송 세션을 확장합니다.

finalize

데이터 전송을 완료한 후 전송을 종료합니다.

get

이미지 전송 엔티티를 가져옵니다.

pause

이미지 전송 세션을 일시 중지합니다.

resume

이미지 전송 세션을 다시 시작합니다.

6.101.1. POST확장

이미지 전송 세션을 확장합니다.

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat