Просмотр исходного кода

Add blob properties to azure bucket object

FabioRosado 4 лет назад
Родитель
Сommit
3482ecd515
2 измененных файлов с 27 добавлено и 14 удалено
  1. 10 3
      cloudbridge/providers/azure/azure_client.py
  2. 17 11
      cloudbridge/providers/azure/resources.py

+ 10 - 3
cloudbridge/providers/azure/azure_client.py

@@ -436,7 +436,7 @@ class AzureClient(object):
 
     def upload_blob(self, container_name, blob_name, data, length=None):
         blob_client = self.blob_client(container_name, blob_name)
-        blob_client.upload_blob(data=data, length=length)
+        blob_client.upload_blob(data=data, length=length, overwrite=True)
 
     def get_blob(self, container_name, blob_name):
         blob_client = self.blob_client(container_name, blob_name)
@@ -455,11 +455,18 @@ class AzureClient(object):
         blob_client.delete_blob(delete_snapshots)
 
     def get_blob_url(self, container_name, blob_name, expiry_time):
-        expiry_date = datetime.datetime.utcnow() + datetime.timedelta(
+        now = datetime.datetime.utcnow()
+        expiry = now + datetime.timedelta(
             seconds=expiry_time)
+        blob_name = blob_name.name
+        container_name = container_name.name
+        delegation_key = self.blob_service.get_user_delegation_key(
+            key_start_time=now, key_expiry_time=expiry
+        )
         sas = generate_blob_sas(
             self.storage_account, container_name, blob_name,
-            permission=BlobSasPermissions(read=True), expiry=expiry_date
+            permission=BlobSasPermissions(read=True), expiry=expiry,
+            user_delegation_key=delegation_key
         )
         url = (
             f"https://{self.storage_account}.blob.core.windows.net/"

+ 17 - 11
cloudbridge/providers/azure/resources.py

@@ -24,6 +24,7 @@ from azure.common import AzureException
 from azure.core.exceptions import HttpResponseError
 from azure.mgmt.devtestlabs.models import GalleryImageReference
 from azure.mgmt.network.models import NetworkSecurityGroup
+from azure.storage.blob._models import BlobProperties
 
 from . import helpers as azure_helpers
 from .subservices import (AzureBucketObjectSubService,
@@ -163,21 +164,27 @@ class AzureBucketObject(BaseBucketObject):
         super(AzureBucketObject, self).__init__(provider)
         self._container = container
         self._blob_client = blob_client
+        breakpoint()
+        if isinstance(self._blob_client, BlobProperties):
+            self._blob_properties = blob_client
+        else:
+            self._blob_properties = self._blob_client.get_blob_properties()
+
 
     @property
     def id(self):
-        return self._blob_client.blob_name
+        return self._blob_properties.name
 
     @property
     def name(self):
-        return self._blob_client.blob_name
+        return self._blob_properties.name
 
     @property
     def size(self):
         """
         Get this object's size.
         """
-        return self._blob_client.get_blob_properties().content_length
+        return self._blob_properties.size
 
     @property
     def last_modified(self):
@@ -185,15 +192,14 @@ class AzureBucketObject(BaseBucketObject):
         """
         Get the date and time this object was last modified.
         """
-        return self._blob_client.get_blob_properties().last_modified. \
-            strftime("%Y-%m-%dT%H:%M:%S.%f")
+        return self._blob_properties.last_modified.strftime("%Y-%m-%dT%H:%M:%S.%f")
 
     def iter_content(self):
         """
         Returns this object's content as an
         iterable.
         """
-        return self._blob_client.download_blob.chunks()
+        return self._container._bucket.download_blob(self._blob_client).chunks()
 
     def upload(self, data):
         """
@@ -213,8 +219,10 @@ class AzureBucketObject(BaseBucketObject):
         Store the contents of the file pointed by the "path" variable.
         """
         try:
-            with open(path, "rb") as stream:
-                self._blob_client.upload_blob(stream, overwrite=True)
+            self._provider.azure_client.create_blob_from_file(
+                self._container.name, self._blob_client,
+                path
+            )
             return True
         except AzureException as azureEx:
             log.exception(azureEx)
@@ -227,7 +235,7 @@ class AzureBucketObject(BaseBucketObject):
         :rtype: bool
         :return: True if successful
         """
-        self._blob_client.delete_blob()
+        self._provider.azure_client.delete_blob(self._container.name, self.name)
 
     def generate_url(self, expires_in):
         """
@@ -279,8 +287,6 @@ class AzureBucket(BaseBucket):
     def objects(self):
         return self._object_container
 
-
-
 class AzureVolume(BaseVolume):
     VOLUME_STATE_MAP = {
         'InProgress': VolumeState.CREATING,