1 # Copyright 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
5 """Implementation of CloudBucket using Google Cloud Storage as the backend."""
9 # boto requires depot_tools/third_party be in the path. Use
10 # src/tools/find_depot_tools.py to add this directory.
11 sys
.path
.append(os
.path
.join(os
.path
.dirname(__file__
), os
.pardir
, os
.pardir
,
12 os
.pardir
, os
.pardir
, 'tools'))
13 import find_depot_tools
14 DEPOT_TOOLS_PATH
= find_depot_tools
.add_depot_tools_to_path()
15 sys
.path
.append(os
.path
.join(os
.path
.abspath(DEPOT_TOOLS_PATH
), 'third_party'))
18 from ispy
.common
import cloud_bucket
21 class BotoCloudBucket(cloud_bucket
.BaseCloudBucket
):
22 """Interfaces with GS using the boto library."""
24 def __init__(self
, key
, secret
, bucket_name
):
25 """Initializes the bucket with a key, secret, and bucket_name.
28 key: the API key to access GS.
29 secret: the API secret to access GS.
30 bucket_name: the name of the bucket to connect to.
32 uri
= boto
.storage_uri('', 'gs')
33 conn
= uri
.connect(key
, secret
)
34 self
.bucket
= conn
.get_bucket(bucket_name
)
36 def _GetKey(self
, path
):
37 key
= boto
.gs
.key
.Key(self
.bucket
)
42 def UploadFile(self
, path
, contents
, content_type
):
43 key
= self
._GetKey
(path
)
44 key
.set_metadata('Content-Type', content_type
)
45 key
.set_contents_from_string(contents
)
46 # Open permissions for the appengine account to read/write.
47 key
.add_email_grant('FULL_CONTROL',
48 'ispy.google.com@appspot.gserviceaccount.com')
51 def DownloadFile(self
, path
):
52 key
= self
._GetKey
(path
)
54 return key
.get_contents_as_string()
56 raise cloud_bucket
.FileNotFoundError
59 def UpdateFile(self
, path
, contents
):
60 key
= self
._GetKey
(path
)
62 key
.set_contents_from_string(contents
)
64 raise cloud_bucket
.FileNotFoundError
67 def RemoveFile(self
, path
):
68 key
= self
._GetKey
(path
)
72 def FileExists(self
, path
):
73 key
= self
._GetKey
(path
)
77 def GetImageURL(self
, path
):
78 key
= self
._GetKey
(path
)
80 # Corrects a bug in boto that incorrectly generates a url
81 # to a resource in Google Cloud Storage.
82 return key
.generate_url(3600).replace('AWSAccessKeyId', 'GoogleAccessId')
84 raise cloud_bucket
.FileNotFoundError(path
)
87 def GetAllPaths(self
, prefix
):
88 return (key
.key
for key
in self
.bucket
.get_all_keys(prefix
=prefix
))