Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion storage/google/cloud/storage/blob.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ class Blob(_PropertyMixin):
:type encryption_key: bytes
:param encryption_key:
Optional 32 byte encryption key for customer-supplied encryption.
See https://cloud.google.com/storage/docs/encryption#customer-supplied
See https://cloud.google.com/storage/docs/encryption#customer-supplied.
"""

_chunk_size = None # Default value for each instance.
Expand Down
18 changes: 14 additions & 4 deletions storage/google/cloud/storage/bucket.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
from google.cloud.storage._helpers import _validate_name
from google.cloud.storage.acl import BucketACL
from google.cloud.storage.acl import DefaultObjectACL
from google.cloud.storage.blob import Blob
from google.cloud.storage.blob import Blob, _get_encryption_headers

This comment was marked as spam.



def _blobs_page_start(iterator, page, response):
Expand Down Expand Up @@ -228,7 +228,7 @@ def path(self):

return self.path_helper(self.name)

def get_blob(self, blob_name, client=None, **kwargs):
def get_blob(self, blob_name, client=None, encryption_key=None, **kwargs):
"""Get a blob object by name.

This will return None if the blob doesn't exist:
Expand All @@ -245,6 +245,12 @@ def get_blob(self, blob_name, client=None, **kwargs):
:param client: Optional. The client to use. If not passed, falls back
to the ``client`` stored on the current bucket.

:type encryption_key: bytes
:param encryption_key:
Optional 32 byte encryption key for customer-supplied encryption.
See
https://cloud.google.com/storage/docs/encryption#customer-supplied.

:type kwargs: dict
:param kwargs: Keyword arguments to pass to the
:class:`~google.cloud.storage.blob.Blob` constructor.
Expand All @@ -253,10 +259,14 @@ def get_blob(self, blob_name, client=None, **kwargs):
:returns: The blob object if it exists, otherwise None.
"""
client = self._require_client(client)
blob = Blob(bucket=self, name=blob_name, **kwargs)
blob = Blob(bucket=self, name=blob_name, encryption_key=encryption_key,
**kwargs)
try:
headers = _get_encryption_headers(encryption_key)
response = client._connection.api_request(
method='GET', path=blob.path, _target_object=blob)
method='GET', path=blob.path, _target_object=blob,
headers=headers
)

This comment was marked as spam.

# NOTE: We assume response.get('name') matches `blob_name`.
blob._set_properties(response)
# NOTE: This will not fail immediately in a batch. However, when
Expand Down
20 changes: 20 additions & 0 deletions storage/tests/unit/test_bucket.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,26 @@ def test_get_blob_hit(self):
self.assertEqual(kw['method'], 'GET')
self.assertEqual(kw['path'], '/b/%s/o/%s' % (NAME, BLOB_NAME))

def test_get_blob_hit_with_kwargs(self):
NAME = 'name'
BLOB_NAME = 'blob-name'
CHUNK_SIZE = 1024 * 1024
KEY = b'01234567890123456789012345678901' # 32 bytes

connection = _Connection({'name': BLOB_NAME})
client = _Client(connection)
bucket = self._make_one(name=NAME)
blob = bucket.get_blob(
BLOB_NAME, client=client, encryption_key=KEY, chunk_size=CHUNK_SIZE
)
self.assertIs(blob.bucket, bucket)
self.assertEqual(blob.name, BLOB_NAME)
kw, = connection._requested
self.assertEqual(kw['method'], 'GET')
self.assertEqual(kw['path'], '/b/%s/o/%s' % (NAME, BLOB_NAME))

This comment was marked as spam.

self.assertEqual(blob.chunk_size, CHUNK_SIZE)
self.assertEqual(blob._encryption_key, KEY)

def test_list_blobs_defaults(self):
NAME = 'name'
connection = _Connection({'items': []})
Expand Down