Skip to content

Commit 86b6ed8

Browse files
hohaichiJon Wayne Parrott
authored and
Jon Wayne Parrott
committed
Add google cloud storage samples using gcloud. (#397)
1 parent 5d278e5 commit 86b6ed8

File tree

2 files changed

+135
-0
lines changed

2 files changed

+135
-0
lines changed
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
#!/usr/bin/env python
2+
3+
# Copyright 2016 Google Inc. All rights reserved.
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the 'License');
6+
# you may not use this file except in compliance with the License.
7+
# You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an 'AS IS' BASIS,
13+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
# See the License for the specific language governing permissions and
15+
# limitations under the License.
16+
"""Command-line sample app demonstrating customer-supplied encryption keys.
17+
18+
This sample demonstrates uploading an object while supplying an encryption key,
19+
and retrieving that object's contents using gcloud API. The sample uses
20+
the default credential and project. To review their values, run this command:
21+
$ gcloud info
22+
23+
This sample is used on this page:
24+
https://cloud.google.com/storage/docs/encryption#customer-supplied
25+
26+
For more information, see the README.md under /storage.
27+
"""
28+
29+
import argparse
30+
import base64
31+
import filecmp
32+
import os
33+
import tempfile
34+
35+
from gcloud import storage
36+
37+
# An AES256 encryption key. It must be exactly 256 bits (32 bytes). You can
38+
# (and should) generate your own encryption key. os.urandom(32) is a good way
39+
# to accomplish this with Python.
40+
#
41+
# Although these keys are provided here for simplicity, please remember
42+
# that it is a bad idea to store your encryption keys in your source code.
43+
ENCRYPTION_KEY = os.urandom(32)
44+
45+
46+
def upload_object(storage_client,
47+
bucket_name,
48+
filename,
49+
object_name,
50+
encryption_key):
51+
"""Uploads an object, specifying a custom encryption key.
52+
53+
Args:
54+
storage_client: gcloud client to access cloud storage
55+
bucket_name: name of the destination bucket
56+
filename: name of file to be uploaded
57+
object_name: name of resulting object
58+
encryption_key: encryption key to encrypt the object,
59+
either 32 raw bytes or a string of 32 bytes.
60+
"""
61+
bucket = storage_client.get_bucket(bucket_name)
62+
blob = bucket.blob(object_name)
63+
with open(filename, 'rb') as f:
64+
blob.upload_from_file(f, encryption_key=encryption_key)
65+
66+
67+
def download_object(storage_client,
68+
bucket_name,
69+
object_name,
70+
filename,
71+
encryption_key):
72+
"""Downloads an object protected by a custom encryption key.
73+
74+
Args:
75+
storage_client: gcloud client to access cloud storage
76+
bucket_name: name of the source bucket
77+
object_name: name of the object to be downloaded
78+
filename: name of the resulting file
79+
encryption_key: the encryption key that the object is encrypted by,
80+
either 32 raw bytes or a string of 32 bytes.
81+
"""
82+
bucket = storage_client.get_bucket(bucket_name)
83+
blob = bucket.blob(object_name)
84+
with open(filename, 'wb') as f:
85+
blob.download_to_file(f, encryption_key=encryption_key)
86+
87+
88+
def main(bucket, filename):
89+
storage_client = storage.Client()
90+
print('Uploading object gs://{}/{} using encryption key (base64 formatted)'
91+
' {}'.format(bucket, filename, base64.encodestring(ENCRYPTION_KEY)))
92+
upload_object(storage_client, bucket, filename, filename, ENCRYPTION_KEY)
93+
print('Downloading it back')
94+
with tempfile.NamedTemporaryFile(mode='w+b') as tmpfile:
95+
download_object(storage_client, bucket, object_name=filename,
96+
filename=tmpfile.name, encryption_key=ENCRYPTION_KEY)
97+
assert filecmp.cmp(filename, tmpfile.name), \
98+
'Downloaded file has different content from the original file.'
99+
print('Done')
100+
101+
102+
if __name__ == '__main__':
103+
parser = argparse.ArgumentParser(
104+
description=__doc__,
105+
formatter_class=argparse.RawDescriptionHelpFormatter)
106+
parser.add_argument('bucket', help='Your Cloud Storage bucket.')
107+
parser.add_argument('filename', help='A file to upload and download.')
108+
109+
args = parser.parse_args()
110+
111+
main(args.bucket, args.filename)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Copyright 2016, Google, Inc.
2+
# Licensed under the Apache License, Version 2.0 (the "License");
3+
# you may not use this file except in compliance with the License.
4+
# You may obtain a copy of the License at
5+
#
6+
# http://www.apache.org/licenses/LICENSE-2.0
7+
#
8+
# Unless required by applicable law or agreed to in writing, software
9+
# distributed under the License is distributed on an "AS IS" BASIS,
10+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
# See the License for the specific language governing permissions and
12+
# limitations under the License.
13+
14+
import re
15+
16+
from customer_supplied_keys import main
17+
18+
19+
def test_main(cloud_config, capsys):
20+
main(cloud_config.storage_bucket, __file__)
21+
out, err = capsys.readouterr()
22+
23+
assert not re.search(r'Downloaded file [!]=', out)
24+
assert re.search(r'Uploading.*Downloading.*Done', out, re.DOTALL)

0 commit comments

Comments
 (0)