Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / test / ispy / client / boto_bucket.py
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.
4
5 """Implementation of CloudBucket using Google Cloud Storage as the backend."""
6 import os
7 import sys
8
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'))
16 import boto
17
18 from ispy.common import cloud_bucket
19
20
21 class BotoCloudBucket(cloud_bucket.BaseCloudBucket):
22   """Interfaces with GS using the boto library."""
23
24   def __init__(self, key, secret, bucket_name):
25     """Initializes the bucket with a key, secret, and bucket_name.
26
27     Args:
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.
31     """
32     uri = boto.storage_uri('', 'gs')
33     conn = uri.connect(key, secret)
34     self.bucket = conn.get_bucket(bucket_name)
35
36   def _GetKey(self, path):
37     key = boto.gs.key.Key(self.bucket)
38     key.key = path
39     return key
40
41   # override
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') 
49
50   # override
51   def DownloadFile(self, path):
52     key = self._GetKey(path)
53     if key.exists():
54       return key.get_contents_as_string()
55     else:
56       raise cloud_bucket.FileNotFoundError
57
58   # override
59   def UpdateFile(self, path, contents):
60     key = self._GetKey(path)
61     if key.exists():
62       key.set_contents_from_string(contents)
63     else:
64       raise cloud_bucket.FileNotFoundError
65
66   # override
67   def RemoveFile(self, path):
68     key = self._GetKey(path)
69     key.delete()
70
71   # override
72   def FileExists(self, path):
73     key = self._GetKey(path)
74     return key.exists()
75
76   # override
77   def GetImageURL(self, path):
78     key = self._GetKey(path)
79     if key.exists():
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')
83     else:
84       raise cloud_bucket.FileNotFoundError(path)
85
86   # override
87   def GetAllPaths(self, prefix):
88     return (key.key for key in self.bucket.get_all_keys(prefix=prefix))