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

Extent

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

finalize

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

get

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

pause

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

resume

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

5.101.1. POST확장

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

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

© 2024 Red Hat, Inc.