OLD | NEW |
1 # Copyright (c) 2010 Mitch Garnaat http://garnaat.org/ | 1 # Copyright (c) 2010 Mitch Garnaat http://garnaat.org/ |
2 # Copyright 2010 Google Inc. | 2 # Copyright 2010 Google Inc. |
3 # Copyright (c) 2010, Eucalyptus Systems, Inc. | 3 # Copyright (c) 2010, Eucalyptus Systems, Inc. |
| 4 # Copyright (c) 2011, Nexenta Systems Inc. |
4 # All rights reserved. | 5 # All rights reserved. |
5 # | 6 # |
6 # Permission is hereby granted, free of charge, to any person obtaining a | 7 # Permission is hereby granted, free of charge, to any person obtaining a |
7 # copy of this software and associated documentation files (the | 8 # copy of this software and associated documentation files (the |
8 # "Software"), to deal in the Software without restriction, including | 9 # "Software"), to deal in the Software without restriction, including |
9 # without limitation the rights to use, copy, modify, merge, publish, dis- | 10 # without limitation the rights to use, copy, modify, merge, publish, dis- |
10 # tribute, sublicense, and/or sell copies of the Software, and to permit | 11 # tribute, sublicense, and/or sell copies of the Software, and to permit |
11 # persons to whom the Software is furnished to do so, subject to the fol- | 12 # persons to whom the Software is furnished to do so, subject to the fol- |
12 # lowing conditions: | 13 # lowing conditions: |
13 # | 14 # |
(...skipping 29 matching lines...) Expand all Loading... |
43 AUTH_HEADER_KEY = 'auth-header' | 44 AUTH_HEADER_KEY = 'auth-header' |
44 COPY_SOURCE_HEADER_KEY = 'copy-source-header' | 45 COPY_SOURCE_HEADER_KEY = 'copy-source-header' |
45 COPY_SOURCE_VERSION_ID_HEADER_KEY = 'copy-source-version-id-header' | 46 COPY_SOURCE_VERSION_ID_HEADER_KEY = 'copy-source-version-id-header' |
46 DELETE_MARKER_HEADER_KEY = 'delete-marker-header' | 47 DELETE_MARKER_HEADER_KEY = 'delete-marker-header' |
47 DATE_HEADER_KEY = 'date-header' | 48 DATE_HEADER_KEY = 'date-header' |
48 METADATA_DIRECTIVE_HEADER_KEY = 'metadata-directive-header' | 49 METADATA_DIRECTIVE_HEADER_KEY = 'metadata-directive-header' |
49 RESUMABLE_UPLOAD_HEADER_KEY = 'resumable-upload-header' | 50 RESUMABLE_UPLOAD_HEADER_KEY = 'resumable-upload-header' |
50 SECURITY_TOKEN_HEADER_KEY = 'security-token-header' | 51 SECURITY_TOKEN_HEADER_KEY = 'security-token-header' |
51 STORAGE_CLASS_HEADER_KEY = 'storage-class' | 52 STORAGE_CLASS_HEADER_KEY = 'storage-class' |
52 MFA_HEADER_KEY = 'mfa-header' | 53 MFA_HEADER_KEY = 'mfa-header' |
| 54 SERVER_SIDE_ENCRYPTION_KEY = 'server-side-encryption-header' |
53 VERSION_ID_HEADER_KEY = 'version-id-header' | 55 VERSION_ID_HEADER_KEY = 'version-id-header' |
54 | 56 |
55 STORAGE_COPY_ERROR = 'StorageCopyError' | 57 STORAGE_COPY_ERROR = 'StorageCopyError' |
56 STORAGE_CREATE_ERROR = 'StorageCreateError' | 58 STORAGE_CREATE_ERROR = 'StorageCreateError' |
57 STORAGE_DATA_ERROR = 'StorageDataError' | 59 STORAGE_DATA_ERROR = 'StorageDataError' |
58 STORAGE_PERMISSIONS_ERROR = 'StoragePermissionsError' | 60 STORAGE_PERMISSIONS_ERROR = 'StoragePermissionsError' |
59 STORAGE_RESPONSE_ERROR = 'StorageResponseError' | 61 STORAGE_RESPONSE_ERROR = 'StorageResponseError' |
60 | 62 |
61 | 63 |
62 class Provider(object): | 64 class Provider(object): |
(...skipping 11 matching lines...) Expand all Loading... |
74 CannedAclsMap = { | 76 CannedAclsMap = { |
75 'aws' : CannedS3ACLStrings, | 77 'aws' : CannedS3ACLStrings, |
76 'google' : CannedGSACLStrings | 78 'google' : CannedGSACLStrings |
77 } | 79 } |
78 | 80 |
79 HostKeyMap = { | 81 HostKeyMap = { |
80 'aws' : 's3', | 82 'aws' : 's3', |
81 'google' : 'gs' | 83 'google' : 'gs' |
82 } | 84 } |
83 | 85 |
| 86 ChunkedTransferSupport = { |
| 87 'aws' : False, |
| 88 'google' : True |
| 89 } |
| 90 |
| 91 # If you update this map please make sure to put "None" for the |
| 92 # right-hand-side for any headers that don't apply to a provider, rather |
| 93 # than simply leaving that header out (which would cause KeyErrors). |
84 HeaderInfoMap = { | 94 HeaderInfoMap = { |
85 'aws' : { | 95 'aws' : { |
86 HEADER_PREFIX_KEY : AWS_HEADER_PREFIX, | 96 HEADER_PREFIX_KEY : AWS_HEADER_PREFIX, |
87 METADATA_PREFIX_KEY : AWS_HEADER_PREFIX + 'meta-', | 97 METADATA_PREFIX_KEY : AWS_HEADER_PREFIX + 'meta-', |
88 ACL_HEADER_KEY : AWS_HEADER_PREFIX + 'acl', | 98 ACL_HEADER_KEY : AWS_HEADER_PREFIX + 'acl', |
89 AUTH_HEADER_KEY : 'AWS', | 99 AUTH_HEADER_KEY : 'AWS', |
90 COPY_SOURCE_HEADER_KEY : AWS_HEADER_PREFIX + 'copy-source', | 100 COPY_SOURCE_HEADER_KEY : AWS_HEADER_PREFIX + 'copy-source', |
91 COPY_SOURCE_VERSION_ID_HEADER_KEY : AWS_HEADER_PREFIX + | 101 COPY_SOURCE_VERSION_ID_HEADER_KEY : AWS_HEADER_PREFIX + |
92 'copy-source-version-id', | 102 'copy-source-version-id', |
93 DATE_HEADER_KEY : AWS_HEADER_PREFIX + 'date', | 103 DATE_HEADER_KEY : AWS_HEADER_PREFIX + 'date', |
94 DELETE_MARKER_HEADER_KEY : AWS_HEADER_PREFIX + 'delete-marker', | 104 DELETE_MARKER_HEADER_KEY : AWS_HEADER_PREFIX + 'delete-marker', |
95 METADATA_DIRECTIVE_HEADER_KEY : AWS_HEADER_PREFIX + | 105 METADATA_DIRECTIVE_HEADER_KEY : AWS_HEADER_PREFIX + |
96 'metadata-directive', | 106 'metadata-directive', |
97 RESUMABLE_UPLOAD_HEADER_KEY : None, | 107 RESUMABLE_UPLOAD_HEADER_KEY : None, |
98 SECURITY_TOKEN_HEADER_KEY : AWS_HEADER_PREFIX + 'security-token', | 108 SECURITY_TOKEN_HEADER_KEY : AWS_HEADER_PREFIX + 'security-token', |
| 109 SERVER_SIDE_ENCRYPTION_KEY : AWS_HEADER_PREFIX + 'server-side-encryp
tion', |
99 VERSION_ID_HEADER_KEY : AWS_HEADER_PREFIX + 'version-id', | 110 VERSION_ID_HEADER_KEY : AWS_HEADER_PREFIX + 'version-id', |
100 STORAGE_CLASS_HEADER_KEY : AWS_HEADER_PREFIX + 'storage-class', | 111 STORAGE_CLASS_HEADER_KEY : AWS_HEADER_PREFIX + 'storage-class', |
101 MFA_HEADER_KEY : AWS_HEADER_PREFIX + 'mfa', | 112 MFA_HEADER_KEY : AWS_HEADER_PREFIX + 'mfa', |
102 }, | 113 }, |
103 'google' : { | 114 'google' : { |
104 HEADER_PREFIX_KEY : GOOG_HEADER_PREFIX, | 115 HEADER_PREFIX_KEY : GOOG_HEADER_PREFIX, |
105 METADATA_PREFIX_KEY : GOOG_HEADER_PREFIX + 'meta-', | 116 METADATA_PREFIX_KEY : GOOG_HEADER_PREFIX + 'meta-', |
106 ACL_HEADER_KEY : GOOG_HEADER_PREFIX + 'acl', | 117 ACL_HEADER_KEY : GOOG_HEADER_PREFIX + 'acl', |
107 AUTH_HEADER_KEY : 'GOOG1', | 118 AUTH_HEADER_KEY : 'GOOG1', |
108 COPY_SOURCE_HEADER_KEY : GOOG_HEADER_PREFIX + 'copy-source', | 119 COPY_SOURCE_HEADER_KEY : GOOG_HEADER_PREFIX + 'copy-source', |
109 COPY_SOURCE_VERSION_ID_HEADER_KEY : GOOG_HEADER_PREFIX + | 120 COPY_SOURCE_VERSION_ID_HEADER_KEY : GOOG_HEADER_PREFIX + |
110 'copy-source-version-id', | 121 'copy-source-version-id', |
111 DATE_HEADER_KEY : GOOG_HEADER_PREFIX + 'date', | 122 DATE_HEADER_KEY : GOOG_HEADER_PREFIX + 'date', |
112 DELETE_MARKER_HEADER_KEY : GOOG_HEADER_PREFIX + 'delete-marker', | 123 DELETE_MARKER_HEADER_KEY : GOOG_HEADER_PREFIX + 'delete-marker', |
113 METADATA_DIRECTIVE_HEADER_KEY : GOOG_HEADER_PREFIX + | 124 METADATA_DIRECTIVE_HEADER_KEY : GOOG_HEADER_PREFIX + |
114 'metadata-directive', | 125 'metadata-directive', |
115 RESUMABLE_UPLOAD_HEADER_KEY : GOOG_HEADER_PREFIX + 'resumable', | 126 RESUMABLE_UPLOAD_HEADER_KEY : GOOG_HEADER_PREFIX + 'resumable', |
116 SECURITY_TOKEN_HEADER_KEY : GOOG_HEADER_PREFIX + 'security-token', | 127 SECURITY_TOKEN_HEADER_KEY : GOOG_HEADER_PREFIX + 'security-token', |
| 128 SERVER_SIDE_ENCRYPTION_KEY : None, |
| 129 # Note that this version header is not to be confused with |
| 130 # the Google Cloud Storage 'x-goog-api-version' header. |
117 VERSION_ID_HEADER_KEY : GOOG_HEADER_PREFIX + 'version-id', | 131 VERSION_ID_HEADER_KEY : GOOG_HEADER_PREFIX + 'version-id', |
118 STORAGE_CLASS_HEADER_KEY : None, | 132 STORAGE_CLASS_HEADER_KEY : None, |
119 MFA_HEADER_KEY : None, | 133 MFA_HEADER_KEY : None, |
120 } | 134 } |
121 } | 135 } |
122 | 136 |
123 ErrorMap = { | 137 ErrorMap = { |
124 'aws' : { | 138 'aws' : { |
125 STORAGE_COPY_ERROR : boto.exception.S3CopyError, | 139 STORAGE_COPY_ERROR : boto.exception.S3CopyError, |
126 STORAGE_CREATE_ERROR : boto.exception.S3CreateError, | 140 STORAGE_CREATE_ERROR : boto.exception.S3CreateError, |
127 STORAGE_DATA_ERROR : boto.exception.S3DataError, | 141 STORAGE_DATA_ERROR : boto.exception.S3DataError, |
128 STORAGE_PERMISSIONS_ERROR : boto.exception.S3PermissionsError, | 142 STORAGE_PERMISSIONS_ERROR : boto.exception.S3PermissionsError, |
129 STORAGE_RESPONSE_ERROR : boto.exception.S3ResponseError, | 143 STORAGE_RESPONSE_ERROR : boto.exception.S3ResponseError, |
130 }, | 144 }, |
131 'google' : { | 145 'google' : { |
132 STORAGE_COPY_ERROR : boto.exception.GSCopyError, | 146 STORAGE_COPY_ERROR : boto.exception.GSCopyError, |
133 STORAGE_CREATE_ERROR : boto.exception.GSCreateError, | 147 STORAGE_CREATE_ERROR : boto.exception.GSCreateError, |
134 STORAGE_DATA_ERROR : boto.exception.GSDataError, | 148 STORAGE_DATA_ERROR : boto.exception.GSDataError, |
135 STORAGE_PERMISSIONS_ERROR : boto.exception.GSPermissionsError, | 149 STORAGE_PERMISSIONS_ERROR : boto.exception.GSPermissionsError, |
136 STORAGE_RESPONSE_ERROR : boto.exception.GSResponseError, | 150 STORAGE_RESPONSE_ERROR : boto.exception.GSResponseError, |
137 } | 151 } |
138 } | 152 } |
139 | 153 |
140 def __init__(self, name, access_key=None, secret_key=None): | 154 def __init__(self, name, access_key=None, secret_key=None, |
| 155 security_token=None): |
141 self.host = None | 156 self.host = None |
142 self.access_key = access_key | 157 self.access_key = access_key |
143 self.secret_key = secret_key | 158 self.secret_key = secret_key |
| 159 self.security_token = security_token |
144 self.name = name | 160 self.name = name |
145 self.acl_class = self.AclClassMap[self.name] | 161 self.acl_class = self.AclClassMap[self.name] |
146 self.canned_acls = self.CannedAclsMap[self.name] | 162 self.canned_acls = self.CannedAclsMap[self.name] |
147 self.get_credentials(access_key, secret_key) | 163 self.get_credentials(access_key, secret_key) |
148 self.configure_headers() | 164 self.configure_headers() |
149 self.configure_errors() | 165 self.configure_errors() |
150 # allow config file to override default host | 166 # allow config file to override default host |
151 host_opt_name = '%s_host' % self.HostKeyMap[self.name] | 167 host_opt_name = '%s_host' % self.HostKeyMap[self.name] |
152 if config.has_option('Credentials', host_opt_name): | 168 if config.has_option('Credentials', host_opt_name): |
153 self.host = config.get('Credentials', host_opt_name) | 169 self.host = config.get('Credentials', host_opt_name) |
(...skipping 27 matching lines...) Expand all Loading... |
181 self.copy_source_header = header_info_map[COPY_SOURCE_HEADER_KEY] | 197 self.copy_source_header = header_info_map[COPY_SOURCE_HEADER_KEY] |
182 self.copy_source_version_id = header_info_map[ | 198 self.copy_source_version_id = header_info_map[ |
183 COPY_SOURCE_VERSION_ID_HEADER_KEY] | 199 COPY_SOURCE_VERSION_ID_HEADER_KEY] |
184 self.date_header = header_info_map[DATE_HEADER_KEY] | 200 self.date_header = header_info_map[DATE_HEADER_KEY] |
185 self.delete_marker = header_info_map[DELETE_MARKER_HEADER_KEY] | 201 self.delete_marker = header_info_map[DELETE_MARKER_HEADER_KEY] |
186 self.metadata_directive_header = ( | 202 self.metadata_directive_header = ( |
187 header_info_map[METADATA_DIRECTIVE_HEADER_KEY]) | 203 header_info_map[METADATA_DIRECTIVE_HEADER_KEY]) |
188 self.security_token_header = header_info_map[SECURITY_TOKEN_HEADER_KEY] | 204 self.security_token_header = header_info_map[SECURITY_TOKEN_HEADER_KEY] |
189 self.resumable_upload_header = ( | 205 self.resumable_upload_header = ( |
190 header_info_map[RESUMABLE_UPLOAD_HEADER_KEY]) | 206 header_info_map[RESUMABLE_UPLOAD_HEADER_KEY]) |
| 207 self.server_side_encryption_header = header_info_map[SERVER_SIDE_ENCRYPT
ION_KEY] |
191 self.storage_class_header = header_info_map[STORAGE_CLASS_HEADER_KEY] | 208 self.storage_class_header = header_info_map[STORAGE_CLASS_HEADER_KEY] |
192 self.version_id = header_info_map[VERSION_ID_HEADER_KEY] | 209 self.version_id = header_info_map[VERSION_ID_HEADER_KEY] |
193 self.mfa_header = header_info_map[MFA_HEADER_KEY] | 210 self.mfa_header = header_info_map[MFA_HEADER_KEY] |
194 | 211 |
195 def configure_errors(self): | 212 def configure_errors(self): |
196 error_map = self.ErrorMap[self.name] | 213 error_map = self.ErrorMap[self.name] |
197 self.storage_copy_error = error_map[STORAGE_COPY_ERROR] | 214 self.storage_copy_error = error_map[STORAGE_COPY_ERROR] |
198 self.storage_create_error = error_map[STORAGE_CREATE_ERROR] | 215 self.storage_create_error = error_map[STORAGE_CREATE_ERROR] |
199 self.storage_data_error = error_map[STORAGE_DATA_ERROR] | 216 self.storage_data_error = error_map[STORAGE_DATA_ERROR] |
200 self.storage_permissions_error = error_map[STORAGE_PERMISSIONS_ERROR] | 217 self.storage_permissions_error = error_map[STORAGE_PERMISSIONS_ERROR] |
201 self.storage_response_error = error_map[STORAGE_RESPONSE_ERROR] | 218 self.storage_response_error = error_map[STORAGE_RESPONSE_ERROR] |
202 | 219 |
203 def get_provider_name(self): | 220 def get_provider_name(self): |
204 return self.HostKeyMap[self.name] | 221 return self.HostKeyMap[self.name] |
205 | 222 |
| 223 def supports_chunked_transfer(self): |
| 224 return self.ChunkedTransferSupport[self.name] |
| 225 |
206 # Static utility method for getting default Provider. | 226 # Static utility method for getting default Provider. |
207 def get_default(): | 227 def get_default(): |
208 return Provider('aws') | 228 return Provider('aws') |
OLD | NEW |