#!/usr/bin/env /usr/openv/pdde/pdshared/bin/python3 # $Copyright: Copyright (c) 2022 Veritas Technologies LLC. All rights reserved $ from __future__ import absolute_import from system_utils import ssl ssl.enable_fips_140_2() import os, sys from azure.storage.blob import BlobServiceClient from azure.core.exceptions import ResourceExistsError from concurrent.futures import ThreadPoolExecutor from concurrent.futures import wait def get_endpoint(service_host): if service_host.startswith('blob.'): return "https://{}.{}".format(os.getenv("AZURE_STORAGE_ACCOUNT"), service_host) else: return "https://{}.blob.{}".format(os.getenv("AZURE_STORAGE_ACCOUNT"), service_host) def vhd_page_upload(service_host, container_name, blob_name, count): # Instantiate a new BlobServiceClient blob_service_client = BlobServiceClient(account_url=get_endpoint(service_host), credential=os.environ.get('AZURE_STORAGE_KEY')) # Instantiate a new ContainerClient container_client = blob_service_client.get_container_client(container_name) # try: # # Create new container in the service # container_client.create_container() # except ResourceExistsError as exc: # pass # Instantiate a new BlobClient blob_client = container_client.get_blob_client(blob_name) count = int(count) # Create the Page Blob blob_client.create_page_blob(count) stream = sys.stdin.buffer off = 0 blksize = 4*1024*1024 max_workers = 10 executor = ThreadPoolExecutor(max_workers=max_workers) workers = set() while off < count: buf = stream.read(blksize) if buf == b'\0'*len(buf): off += len(buf) continue if len(workers) >= max_workers: # Wait for any workers to finish before submitting next one _, workers = wait(workers, return_when='FIRST_COMPLETED') # Upload content to the Page Blob workers.add(executor.submit(blob_client.upload_page, buf, offset=off, length=len(buf))) off += len(buf) executor.shutdown() def blob_delete(service_host, container_name, blob_name): # Instantiate a new BlobServiceClient blob_service_client = BlobServiceClient(account_url=get_endpoint(service_host), credential=os.environ.get('AZURE_STORAGE_KEY')) # Instantiate a new ContainerClient container_client = blob_service_client.get_container_client(container_name) # Instantiate a new BlobClient blob_client = container_client.get_blob_client(blob_name) # Delete the Page Blob blob_client.delete_blob() if sys.argv[1] == '-upload': vhd_page_upload(*sys.argv[2:]) elif sys.argv[1] == '-delete': blob_delete(*sys.argv[2:]) sys.exit(0)