Mercurial > repos > guerler > springsuite
comparison planemo/lib/python3.7/site-packages/boto/cloudfront/__init__.py @ 0:d30785e31577 draft
"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
| author | guerler |
|---|---|
| date | Fri, 31 Jul 2020 00:18:57 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:d30785e31577 |
|---|---|
| 1 # Copyright (c) 2006-2009 Mitch Garnaat http://garnaat.org/ | |
| 2 # | |
| 3 # Permission is hereby granted, free of charge, to any person obtaining a | |
| 4 # copy of this software and associated documentation files (the | |
| 5 # "Software"), to deal in the Software without restriction, including | |
| 6 # without limitation the rights to use, copy, modify, merge, publish, dis- | |
| 7 # tribute, sublicense, and/or sell copies of the Software, and to permit | |
| 8 # persons to whom the Software is furnished to do so, subject to the fol- | |
| 9 # lowing conditions: | |
| 10 # | |
| 11 # The above copyright notice and this permission notice shall be included | |
| 12 # in all copies or substantial portions of the Software. | |
| 13 # | |
| 14 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
| 15 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- | |
| 16 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT | |
| 17 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
| 18 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| 19 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |
| 20 # IN THE SOFTWARE. | |
| 21 # | |
| 22 | |
| 23 import xml.sax | |
| 24 import time | |
| 25 import boto | |
| 26 from boto.connection import AWSAuthConnection | |
| 27 from boto import handler | |
| 28 from boto.cloudfront.distribution import Distribution, DistributionSummary, DistributionConfig | |
| 29 from boto.cloudfront.distribution import StreamingDistribution, StreamingDistributionSummary, StreamingDistributionConfig | |
| 30 from boto.cloudfront.identity import OriginAccessIdentity | |
| 31 from boto.cloudfront.identity import OriginAccessIdentitySummary | |
| 32 from boto.cloudfront.identity import OriginAccessIdentityConfig | |
| 33 from boto.cloudfront.invalidation import InvalidationBatch, InvalidationSummary, InvalidationListResultSet | |
| 34 from boto.resultset import ResultSet | |
| 35 from boto.cloudfront.exception import CloudFrontServerError | |
| 36 | |
| 37 | |
| 38 class CloudFrontConnection(AWSAuthConnection): | |
| 39 | |
| 40 DefaultHost = 'cloudfront.amazonaws.com' | |
| 41 Version = '2010-11-01' | |
| 42 | |
| 43 def __init__(self, aws_access_key_id=None, aws_secret_access_key=None, | |
| 44 port=None, proxy=None, proxy_port=None, | |
| 45 host=DefaultHost, debug=0, security_token=None, | |
| 46 validate_certs=True, profile_name=None, https_connection_factory=None): | |
| 47 super(CloudFrontConnection, self).__init__(host, | |
| 48 aws_access_key_id, aws_secret_access_key, | |
| 49 True, port, proxy, proxy_port, debug=debug, | |
| 50 security_token=security_token, | |
| 51 validate_certs=validate_certs, | |
| 52 https_connection_factory=https_connection_factory, | |
| 53 profile_name=profile_name) | |
| 54 | |
| 55 def get_etag(self, response): | |
| 56 response_headers = response.msg | |
| 57 for key in response_headers.keys(): | |
| 58 if key.lower() == 'etag': | |
| 59 return response_headers[key] | |
| 60 return None | |
| 61 | |
| 62 def _required_auth_capability(self): | |
| 63 return ['cloudfront'] | |
| 64 | |
| 65 # Generics | |
| 66 | |
| 67 def _get_all_objects(self, resource, tags, result_set_class=None, | |
| 68 result_set_kwargs=None): | |
| 69 if not tags: | |
| 70 tags = [('DistributionSummary', DistributionSummary)] | |
| 71 response = self.make_request('GET', '/%s/%s' % (self.Version, | |
| 72 resource)) | |
| 73 body = response.read() | |
| 74 boto.log.debug(body) | |
| 75 if response.status >= 300: | |
| 76 raise CloudFrontServerError(response.status, response.reason, body) | |
| 77 rs_class = result_set_class or ResultSet | |
| 78 rs_kwargs = result_set_kwargs or dict() | |
| 79 rs = rs_class(tags, **rs_kwargs) | |
| 80 h = handler.XmlHandler(rs, self) | |
| 81 xml.sax.parseString(body, h) | |
| 82 return rs | |
| 83 | |
| 84 def _get_info(self, id, resource, dist_class): | |
| 85 uri = '/%s/%s/%s' % (self.Version, resource, id) | |
| 86 response = self.make_request('GET', uri) | |
| 87 body = response.read() | |
| 88 boto.log.debug(body) | |
| 89 if response.status >= 300: | |
| 90 raise CloudFrontServerError(response.status, response.reason, body) | |
| 91 d = dist_class(connection=self) | |
| 92 response_headers = response.msg | |
| 93 for key in response_headers.keys(): | |
| 94 if key.lower() == 'etag': | |
| 95 d.etag = response_headers[key] | |
| 96 h = handler.XmlHandler(d, self) | |
| 97 xml.sax.parseString(body, h) | |
| 98 return d | |
| 99 | |
| 100 def _get_config(self, id, resource, config_class): | |
| 101 uri = '/%s/%s/%s/config' % (self.Version, resource, id) | |
| 102 response = self.make_request('GET', uri) | |
| 103 body = response.read() | |
| 104 boto.log.debug(body) | |
| 105 if response.status >= 300: | |
| 106 raise CloudFrontServerError(response.status, response.reason, body) | |
| 107 d = config_class(connection=self) | |
| 108 d.etag = self.get_etag(response) | |
| 109 h = handler.XmlHandler(d, self) | |
| 110 xml.sax.parseString(body, h) | |
| 111 return d | |
| 112 | |
| 113 def _set_config(self, distribution_id, etag, config): | |
| 114 if isinstance(config, StreamingDistributionConfig): | |
| 115 resource = 'streaming-distribution' | |
| 116 else: | |
| 117 resource = 'distribution' | |
| 118 uri = '/%s/%s/%s/config' % (self.Version, resource, distribution_id) | |
| 119 headers = {'If-Match': etag, 'Content-Type': 'text/xml'} | |
| 120 response = self.make_request('PUT', uri, headers, config.to_xml()) | |
| 121 body = response.read() | |
| 122 boto.log.debug(body) | |
| 123 if response.status != 200: | |
| 124 raise CloudFrontServerError(response.status, response.reason, body) | |
| 125 return self.get_etag(response) | |
| 126 | |
| 127 def _create_object(self, config, resource, dist_class): | |
| 128 response = self.make_request('POST', '/%s/%s' % (self.Version, | |
| 129 resource), | |
| 130 {'Content-Type': 'text/xml'}, | |
| 131 data=config.to_xml()) | |
| 132 body = response.read() | |
| 133 boto.log.debug(body) | |
| 134 if response.status == 201: | |
| 135 d = dist_class(connection=self) | |
| 136 h = handler.XmlHandler(d, self) | |
| 137 xml.sax.parseString(body, h) | |
| 138 d.etag = self.get_etag(response) | |
| 139 return d | |
| 140 else: | |
| 141 raise CloudFrontServerError(response.status, response.reason, body) | |
| 142 | |
| 143 def _delete_object(self, id, etag, resource): | |
| 144 uri = '/%s/%s/%s' % (self.Version, resource, id) | |
| 145 response = self.make_request('DELETE', uri, {'If-Match': etag}) | |
| 146 body = response.read() | |
| 147 boto.log.debug(body) | |
| 148 if response.status != 204: | |
| 149 raise CloudFrontServerError(response.status, response.reason, body) | |
| 150 | |
| 151 # Distributions | |
| 152 | |
| 153 def get_all_distributions(self): | |
| 154 tags = [('DistributionSummary', DistributionSummary)] | |
| 155 return self._get_all_objects('distribution', tags) | |
| 156 | |
| 157 def get_distribution_info(self, distribution_id): | |
| 158 return self._get_info(distribution_id, 'distribution', Distribution) | |
| 159 | |
| 160 def get_distribution_config(self, distribution_id): | |
| 161 return self._get_config(distribution_id, 'distribution', | |
| 162 DistributionConfig) | |
| 163 | |
| 164 def set_distribution_config(self, distribution_id, etag, config): | |
| 165 return self._set_config(distribution_id, etag, config) | |
| 166 | |
| 167 def create_distribution(self, origin, enabled, caller_reference='', | |
| 168 cnames=None, comment='', trusted_signers=None): | |
| 169 config = DistributionConfig(origin=origin, enabled=enabled, | |
| 170 caller_reference=caller_reference, | |
| 171 cnames=cnames, comment=comment, | |
| 172 trusted_signers=trusted_signers) | |
| 173 return self._create_object(config, 'distribution', Distribution) | |
| 174 | |
| 175 def delete_distribution(self, distribution_id, etag): | |
| 176 return self._delete_object(distribution_id, etag, 'distribution') | |
| 177 | |
| 178 # Streaming Distributions | |
| 179 | |
| 180 def get_all_streaming_distributions(self): | |
| 181 tags = [('StreamingDistributionSummary', StreamingDistributionSummary)] | |
| 182 return self._get_all_objects('streaming-distribution', tags) | |
| 183 | |
| 184 def get_streaming_distribution_info(self, distribution_id): | |
| 185 return self._get_info(distribution_id, 'streaming-distribution', | |
| 186 StreamingDistribution) | |
| 187 | |
| 188 def get_streaming_distribution_config(self, distribution_id): | |
| 189 return self._get_config(distribution_id, 'streaming-distribution', | |
| 190 StreamingDistributionConfig) | |
| 191 | |
| 192 def set_streaming_distribution_config(self, distribution_id, etag, config): | |
| 193 return self._set_config(distribution_id, etag, config) | |
| 194 | |
| 195 def create_streaming_distribution(self, origin, enabled, | |
| 196 caller_reference='', | |
| 197 cnames=None, comment='', | |
| 198 trusted_signers=None): | |
| 199 config = StreamingDistributionConfig(origin=origin, enabled=enabled, | |
| 200 caller_reference=caller_reference, | |
| 201 cnames=cnames, comment=comment, | |
| 202 trusted_signers=trusted_signers) | |
| 203 return self._create_object(config, 'streaming-distribution', | |
| 204 StreamingDistribution) | |
| 205 | |
| 206 def delete_streaming_distribution(self, distribution_id, etag): | |
| 207 return self._delete_object(distribution_id, etag, | |
| 208 'streaming-distribution') | |
| 209 | |
| 210 # Origin Access Identity | |
| 211 | |
| 212 def get_all_origin_access_identity(self): | |
| 213 tags = [('CloudFrontOriginAccessIdentitySummary', | |
| 214 OriginAccessIdentitySummary)] | |
| 215 return self._get_all_objects('origin-access-identity/cloudfront', tags) | |
| 216 | |
| 217 def get_origin_access_identity_info(self, access_id): | |
| 218 return self._get_info(access_id, 'origin-access-identity/cloudfront', | |
| 219 OriginAccessIdentity) | |
| 220 | |
| 221 def get_origin_access_identity_config(self, access_id): | |
| 222 return self._get_config(access_id, | |
| 223 'origin-access-identity/cloudfront', | |
| 224 OriginAccessIdentityConfig) | |
| 225 | |
| 226 def set_origin_access_identity_config(self, access_id, | |
| 227 etag, config): | |
| 228 return self._set_config(access_id, etag, config) | |
| 229 | |
| 230 def create_origin_access_identity(self, caller_reference='', comment=''): | |
| 231 config = OriginAccessIdentityConfig(caller_reference=caller_reference, | |
| 232 comment=comment) | |
| 233 return self._create_object(config, 'origin-access-identity/cloudfront', | |
| 234 OriginAccessIdentity) | |
| 235 | |
| 236 def delete_origin_access_identity(self, access_id, etag): | |
| 237 return self._delete_object(access_id, etag, | |
| 238 'origin-access-identity/cloudfront') | |
| 239 | |
| 240 # Object Invalidation | |
| 241 | |
| 242 def create_invalidation_request(self, distribution_id, paths, | |
| 243 caller_reference=None): | |
| 244 """Creates a new invalidation request | |
| 245 :see: http://goo.gl/8vECq | |
| 246 """ | |
| 247 # We allow you to pass in either an array or | |
| 248 # an InvalidationBatch object | |
| 249 if not isinstance(paths, InvalidationBatch): | |
| 250 paths = InvalidationBatch(paths) | |
| 251 paths.connection = self | |
| 252 uri = '/%s/distribution/%s/invalidation' % (self.Version, | |
| 253 distribution_id) | |
| 254 response = self.make_request('POST', uri, | |
| 255 {'Content-Type': 'text/xml'}, | |
| 256 data=paths.to_xml()) | |
| 257 body = response.read() | |
| 258 if response.status == 201: | |
| 259 h = handler.XmlHandler(paths, self) | |
| 260 xml.sax.parseString(body, h) | |
| 261 return paths | |
| 262 else: | |
| 263 raise CloudFrontServerError(response.status, response.reason, body) | |
| 264 | |
| 265 def invalidation_request_status(self, distribution_id, | |
| 266 request_id, caller_reference=None): | |
| 267 uri = '/%s/distribution/%s/invalidation/%s' % (self.Version, | |
| 268 distribution_id, | |
| 269 request_id) | |
| 270 response = self.make_request('GET', uri, {'Content-Type': 'text/xml'}) | |
| 271 body = response.read() | |
| 272 if response.status == 200: | |
| 273 paths = InvalidationBatch([]) | |
| 274 h = handler.XmlHandler(paths, self) | |
| 275 xml.sax.parseString(body, h) | |
| 276 return paths | |
| 277 else: | |
| 278 raise CloudFrontServerError(response.status, response.reason, body) | |
| 279 | |
| 280 def get_invalidation_requests(self, distribution_id, marker=None, | |
| 281 max_items=None): | |
| 282 """ | |
| 283 Get all invalidation requests for a given CloudFront distribution. | |
| 284 This returns an instance of an InvalidationListResultSet that | |
| 285 automatically handles all of the result paging, etc. from CF - you just | |
| 286 need to keep iterating until there are no more results. | |
| 287 | |
| 288 :type distribution_id: string | |
| 289 :param distribution_id: The id of the CloudFront distribution | |
| 290 | |
| 291 :type marker: string | |
| 292 :param marker: Use this only when paginating results and only in | |
| 293 follow-up request after you've received a response where | |
| 294 the results are truncated. Set this to the value of the | |
| 295 Marker element in the response you just received. | |
| 296 | |
| 297 :type max_items: int | |
| 298 :param max_items: Use this only when paginating results and only in a | |
| 299 follow-up request to indicate the maximum number of | |
| 300 invalidation requests you want in the response. You | |
| 301 will need to pass the next_marker property from the | |
| 302 previous InvalidationListResultSet response in the | |
| 303 follow-up request in order to get the next 'page' of | |
| 304 results. | |
| 305 | |
| 306 :rtype: :class:`boto.cloudfront.invalidation.InvalidationListResultSet` | |
| 307 :returns: An InvalidationListResultSet iterator that lists invalidation | |
| 308 requests for a given CloudFront distribution. Automatically | |
| 309 handles paging the results. | |
| 310 """ | |
| 311 uri = 'distribution/%s/invalidation' % distribution_id | |
| 312 params = dict() | |
| 313 if marker: | |
| 314 params['Marker'] = marker | |
| 315 if max_items: | |
| 316 params['MaxItems'] = max_items | |
| 317 if params: | |
| 318 uri += '?%s=%s' % params.popitem() | |
| 319 for k, v in params.items(): | |
| 320 uri += '&%s=%s' % (k, v) | |
| 321 tags=[('InvalidationSummary', InvalidationSummary)] | |
| 322 rs_class = InvalidationListResultSet | |
| 323 rs_kwargs = dict(connection=self, distribution_id=distribution_id, | |
| 324 max_items=max_items, marker=marker) | |
| 325 return self._get_all_objects(uri, tags, result_set_class=rs_class, | |
| 326 result_set_kwargs=rs_kwargs) |
