1# Copyright (c) 2013 Amazon.com, Inc. or its affiliates.  All Rights Reserved
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#
22from boto.compat import json
23from boto.exception import JSONResponseError
24from boto.connection import AWSAuthConnection
25from boto.regioninfo import RegionInfo
26from boto.elastictranscoder import exceptions
27
28
29class ElasticTranscoderConnection(AWSAuthConnection):
30    """
31    AWS Elastic Transcoder Service
32    The AWS Elastic Transcoder Service.
33    """
34    APIVersion = "2012-09-25"
35    DefaultRegionName = "us-east-1"
36    DefaultRegionEndpoint = "elastictranscoder.us-east-1.amazonaws.com"
37    ResponseError = JSONResponseError
38
39    _faults = {
40        "IncompatibleVersionException": exceptions.IncompatibleVersionException,
41        "LimitExceededException": exceptions.LimitExceededException,
42        "ResourceInUseException": exceptions.ResourceInUseException,
43        "AccessDeniedException": exceptions.AccessDeniedException,
44        "ResourceNotFoundException": exceptions.ResourceNotFoundException,
45        "InternalServiceException": exceptions.InternalServiceException,
46        "ValidationException": exceptions.ValidationException,
47    }
48
49
50    def __init__(self, **kwargs):
51        region = kwargs.get('region')
52        if not region:
53            region = RegionInfo(self, self.DefaultRegionName,
54                                self.DefaultRegionEndpoint)
55        else:
56            del kwargs['region']
57        kwargs['host'] = region.endpoint
58        super(ElasticTranscoderConnection, self).__init__(**kwargs)
59        self.region = region
60
61    def _required_auth_capability(self):
62        return ['hmac-v4']
63
64    def cancel_job(self, id=None):
65        """
66        The CancelJob operation cancels an unfinished job.
67        You can only cancel a job that has a status of `Submitted`. To
68        prevent a pipeline from starting to process a job while you're
69        getting the job identifier, use UpdatePipelineStatus to
70        temporarily pause the pipeline.
71
72        :type id: string
73        :param id: The identifier of the job that you want to cancel.
74        To get a list of the jobs (including their `jobId`) that have a status
75            of `Submitted`, use the ListJobsByStatus API action.
76
77        """
78        uri = '/2012-09-25/jobs/{0}'.format(id)
79        return self.make_request('DELETE', uri, expected_status=202)
80
81    def create_job(self, pipeline_id=None, input_name=None, output=None,
82                   outputs=None, output_key_prefix=None, playlists=None):
83        """
84        When you create a job, Elastic Transcoder returns JSON data
85        that includes the values that you specified plus information
86        about the job that is created.
87
88        If you have specified more than one output for your jobs (for
89        example, one output for the Kindle Fire and another output for
90        the Apple iPhone 4s), you currently must use the Elastic
91        Transcoder API to list the jobs (as opposed to the AWS
92        Console).
93
94        :type pipeline_id: string
95        :param pipeline_id: The `Id` of the pipeline that you want Elastic
96            Transcoder to use for transcoding. The pipeline determines several
97            settings, including the Amazon S3 bucket from which Elastic
98            Transcoder gets the files to transcode and the bucket into which
99            Elastic Transcoder puts the transcoded files.
100
101        :type input_name: dict
102        :param input_name: A section of the request body that provides
103            information about the file that is being transcoded.
104
105        :type output: dict
106        :param output: The `CreateJobOutput` structure.
107
108        :type outputs: list
109        :param outputs: A section of the request body that provides information
110            about the transcoded (target) files. We recommend that you use the
111            `Outputs` syntax instead of the `Output` syntax.
112
113        :type output_key_prefix: string
114        :param output_key_prefix: The value, if any, that you want Elastic
115            Transcoder to prepend to the names of all files that this job
116            creates, including output files, thumbnails, and playlists.
117
118        :type playlists: list
119        :param playlists: If you specify a preset in `PresetId` for which the
120            value of `Container` is ts (MPEG-TS), Playlists contains
121            information about the master playlists that you want Elastic
122            Transcoder to create.
123        We recommend that you create only one master playlist. The maximum
124            number of master playlists in a job is 30.
125
126        """
127        uri = '/2012-09-25/jobs'
128        params = {}
129        if pipeline_id is not None:
130            params['PipelineId'] = pipeline_id
131        if input_name is not None:
132            params['Input'] = input_name
133        if output is not None:
134            params['Output'] = output
135        if outputs is not None:
136            params['Outputs'] = outputs
137        if output_key_prefix is not None:
138            params['OutputKeyPrefix'] = output_key_prefix
139        if playlists is not None:
140            params['Playlists'] = playlists
141        return self.make_request('POST', uri, expected_status=201,
142                                 data=json.dumps(params))
143
144    def create_pipeline(self, name=None, input_bucket=None,
145                        output_bucket=None, role=None, notifications=None,
146                        content_config=None, thumbnail_config=None):
147        """
148        The CreatePipeline operation creates a pipeline with settings
149        that you specify.
150
151        :type name: string
152        :param name: The name of the pipeline. We recommend that the name be
153            unique within the AWS account, but uniqueness is not enforced.
154        Constraints: Maximum 40 characters.
155
156        :type input_bucket: string
157        :param input_bucket: The Amazon S3 bucket in which you saved the media
158            files that you want to transcode.
159
160        :type output_bucket: string
161        :param output_bucket: The Amazon S3 bucket in which you want Elastic
162            Transcoder to save the transcoded files. (Use this, or use
163            ContentConfig:Bucket plus ThumbnailConfig:Bucket.)
164        Specify this value when all of the following are true:
165
166        + You want to save transcoded files, thumbnails (if any), and playlists
167              (if any) together in one bucket.
168        + You do not want to specify the users or groups who have access to the
169              transcoded files, thumbnails, and playlists.
170        + You do not want to specify the permissions that Elastic Transcoder
171              grants to the files. When Elastic Transcoder saves files in
172              `OutputBucket`, it grants full control over the files only to the
173              AWS account that owns the role that is specified by `Role`.
174        + You want to associate the transcoded files and thumbnails with the
175              Amazon S3 Standard storage class.
176
177
178
179        If you want to save transcoded files and playlists in one bucket and
180            thumbnails in another bucket, specify which users can access the
181            transcoded files or the permissions the users have, or change the
182            Amazon S3 storage class, omit `OutputBucket` and specify values for
183            `ContentConfig` and `ThumbnailConfig` instead.
184
185        :type role: string
186        :param role: The IAM Amazon Resource Name (ARN) for the role that you
187            want Elastic Transcoder to use to create the pipeline.
188
189        :type notifications: dict
190        :param notifications:
191        The Amazon Simple Notification Service (Amazon SNS) topic that you want
192            to notify to report job status.
193        To receive notifications, you must also subscribe to the new topic in
194            the Amazon SNS console.
195
196        + **Progressing**: The topic ARN for the Amazon Simple Notification
197              Service (Amazon SNS) topic that you want to notify when Elastic
198              Transcoder has started to process a job in this pipeline. This is
199              the ARN that Amazon SNS returned when you created the topic. For
200              more information, see Create a Topic in the Amazon Simple
201              Notification Service Developer Guide.
202        + **Completed**: The topic ARN for the Amazon SNS topic that you want
203              to notify when Elastic Transcoder has finished processing a job in
204              this pipeline. This is the ARN that Amazon SNS returned when you
205              created the topic.
206        + **Warning**: The topic ARN for the Amazon SNS topic that you want to
207              notify when Elastic Transcoder encounters a warning condition while
208              processing a job in this pipeline. This is the ARN that Amazon SNS
209              returned when you created the topic.
210        + **Error**: The topic ARN for the Amazon SNS topic that you want to
211              notify when Elastic Transcoder encounters an error condition while
212              processing a job in this pipeline. This is the ARN that Amazon SNS
213              returned when you created the topic.
214
215        :type content_config: dict
216        :param content_config:
217        The optional `ContentConfig` object specifies information about the
218            Amazon S3 bucket in which you want Elastic Transcoder to save
219            transcoded files and playlists: which bucket to use, which users
220            you want to have access to the files, the type of access you want
221            users to have, and the storage class that you want to assign to the
222            files.
223
224        If you specify values for `ContentConfig`, you must also specify values
225            for `ThumbnailConfig`.
226
227        If you specify values for `ContentConfig` and `ThumbnailConfig`, omit
228            the `OutputBucket` object.
229
230
231        + **Bucket**: The Amazon S3 bucket in which you want Elastic Transcoder
232              to save transcoded files and playlists.
233        + **Permissions** (Optional): The Permissions object specifies which
234              users you want to have access to transcoded files and the type of
235              access you want them to have. You can grant permissions to a
236              maximum of 30 users and/or predefined Amazon S3 groups.
237        + **Grantee Type**: Specify the type of value that appears in the
238              `Grantee` object:
239
240            + **Canonical**: The value in the `Grantee` object is either the
241                  canonical user ID for an AWS account or an origin access identity
242                  for an Amazon CloudFront distribution. For more information about
243                  canonical user IDs, see Access Control List (ACL) Overview in the
244                  Amazon Simple Storage Service Developer Guide. For more information
245                  about using CloudFront origin access identities to require that
246                  users use CloudFront URLs instead of Amazon S3 URLs, see Using an
247                  Origin Access Identity to Restrict Access to Your Amazon S3
248                  Content. A canonical user ID is not the same as an AWS account
249                  number.
250            + **Email**: The value in the `Grantee` object is the registered email
251                  address of an AWS account.
252            + **Group**: The value in the `Grantee` object is one of the following
253                  predefined Amazon S3 groups: `AllUsers`, `AuthenticatedUsers`, or
254                  `LogDelivery`.
255
256        + **Grantee**: The AWS user or group that you want to have access to
257              transcoded files and playlists. To identify the user or group, you
258              can specify the canonical user ID for an AWS account, an origin
259              access identity for a CloudFront distribution, the registered email
260              address of an AWS account, or a predefined Amazon S3 group
261        + **Access**: The permission that you want to give to the AWS user that
262              you specified in `Grantee`. Permissions are granted on the files
263              that Elastic Transcoder adds to the bucket, including playlists and
264              video files. Valid values include:
265
266            + `READ`: The grantee can read the objects and metadata for objects
267                  that Elastic Transcoder adds to the Amazon S3 bucket.
268            + `READ_ACP`: The grantee can read the object ACL for objects that
269                  Elastic Transcoder adds to the Amazon S3 bucket.
270            + `WRITE_ACP`: The grantee can write the ACL for the objects that
271                  Elastic Transcoder adds to the Amazon S3 bucket.
272            + `FULL_CONTROL`: The grantee has `READ`, `READ_ACP`, and `WRITE_ACP`
273                  permissions for the objects that Elastic Transcoder adds to the
274                  Amazon S3 bucket.
275
276        + **StorageClass**: The Amazon S3 storage class, `Standard` or
277              `ReducedRedundancy`, that you want Elastic Transcoder to assign to
278              the video files and playlists that it stores in your Amazon S3
279              bucket.
280
281        :type thumbnail_config: dict
282        :param thumbnail_config:
283        The `ThumbnailConfig` object specifies several values, including the
284            Amazon S3 bucket in which you want Elastic Transcoder to save
285            thumbnail files, which users you want to have access to the files,
286            the type of access you want users to have, and the storage class
287            that you want to assign to the files.
288
289        If you specify values for `ContentConfig`, you must also specify values
290            for `ThumbnailConfig` even if you don't want to create thumbnails.
291
292        If you specify values for `ContentConfig` and `ThumbnailConfig`, omit
293            the `OutputBucket` object.
294
295
296        + **Bucket**: The Amazon S3 bucket in which you want Elastic Transcoder
297              to save thumbnail files.
298        + **Permissions** (Optional): The `Permissions` object specifies which
299              users and/or predefined Amazon S3 groups you want to have access to
300              thumbnail files, and the type of access you want them to have. You
301              can grant permissions to a maximum of 30 users and/or predefined
302              Amazon S3 groups.
303        + **GranteeType**: Specify the type of value that appears in the
304              Grantee object:
305
306            + **Canonical**: The value in the `Grantee` object is either the
307                  canonical user ID for an AWS account or an origin access identity
308                  for an Amazon CloudFront distribution. A canonical user ID is not
309                  the same as an AWS account number.
310            + **Email**: The value in the `Grantee` object is the registered email
311                  address of an AWS account.
312            + **Group**: The value in the `Grantee` object is one of the following
313                  predefined Amazon S3 groups: `AllUsers`, `AuthenticatedUsers`, or
314                  `LogDelivery`.
315
316        + **Grantee**: The AWS user or group that you want to have access to
317              thumbnail files. To identify the user or group, you can specify the
318              canonical user ID for an AWS account, an origin access identity for
319              a CloudFront distribution, the registered email address of an AWS
320              account, or a predefined Amazon S3 group.
321        + **Access**: The permission that you want to give to the AWS user that
322              you specified in `Grantee`. Permissions are granted on the
323              thumbnail files that Elastic Transcoder adds to the bucket. Valid
324              values include:
325
326            + `READ`: The grantee can read the thumbnails and metadata for objects
327                  that Elastic Transcoder adds to the Amazon S3 bucket.
328            + `READ_ACP`: The grantee can read the object ACL for thumbnails that
329                  Elastic Transcoder adds to the Amazon S3 bucket.
330            + `WRITE_ACP`: The grantee can write the ACL for the thumbnails that
331                  Elastic Transcoder adds to the Amazon S3 bucket.
332            + `FULL_CONTROL`: The grantee has `READ`, `READ_ACP`, and `WRITE_ACP`
333                  permissions for the thumbnails that Elastic Transcoder adds to the
334                  Amazon S3 bucket.
335
336        + **StorageClass**: The Amazon S3 storage class, `Standard` or
337              `ReducedRedundancy`, that you want Elastic Transcoder to assign to
338              the thumbnails that it stores in your Amazon S3 bucket.
339
340        """
341        uri = '/2012-09-25/pipelines'
342        params = {}
343        if name is not None:
344            params['Name'] = name
345        if input_bucket is not None:
346            params['InputBucket'] = input_bucket
347        if output_bucket is not None:
348            params['OutputBucket'] = output_bucket
349        if role is not None:
350            params['Role'] = role
351        if notifications is not None:
352            params['Notifications'] = notifications
353        if content_config is not None:
354            params['ContentConfig'] = content_config
355        if thumbnail_config is not None:
356            params['ThumbnailConfig'] = thumbnail_config
357        return self.make_request('POST', uri, expected_status=201,
358                                 data=json.dumps(params))
359
360    def create_preset(self, name=None, description=None, container=None,
361                      video=None, audio=None, thumbnails=None):
362        """
363        The CreatePreset operation creates a preset with settings that
364        you specify.
365        Elastic Transcoder checks the CreatePreset settings to ensure
366        that they meet Elastic Transcoder requirements and to
367        determine whether they comply with H.264 standards. If your
368        settings are not valid for Elastic Transcoder, Elastic
369        Transcoder returns an HTTP 400 response (
370        `ValidationException`) and does not create the preset. If the
371        settings are valid for Elastic Transcoder but aren't strictly
372        compliant with the H.264 standard, Elastic Transcoder creates
373        the preset and returns a warning message in the response. This
374        helps you determine whether your settings comply with the
375        H.264 standard while giving you greater flexibility with
376        respect to the video that Elastic Transcoder produces.
377        Elastic Transcoder uses the H.264 video-compression format.
378        For more information, see the International Telecommunication
379        Union publication Recommendation ITU-T H.264: Advanced video
380        coding for generic audiovisual services .
381
382        :type name: string
383        :param name: The name of the preset. We recommend that the name be
384            unique within the AWS account, but uniqueness is not enforced.
385
386        :type description: string
387        :param description: A description of the preset.
388
389        :type container: string
390        :param container: The container type for the output file. Valid values
391            include `mp3`, `mp4`, `ogg`, `ts`, and `webm`.
392
393        :type video: dict
394        :param video: A section of the request body that specifies the video
395            parameters.
396
397        :type audio: dict
398        :param audio: A section of the request body that specifies the audio
399            parameters.
400
401        :type thumbnails: dict
402        :param thumbnails: A section of the request body that specifies the
403            thumbnail parameters, if any.
404
405        """
406        uri = '/2012-09-25/presets'
407        params = {}
408        if name is not None:
409            params['Name'] = name
410        if description is not None:
411            params['Description'] = description
412        if container is not None:
413            params['Container'] = container
414        if video is not None:
415            params['Video'] = video
416        if audio is not None:
417            params['Audio'] = audio
418        if thumbnails is not None:
419            params['Thumbnails'] = thumbnails
420        return self.make_request('POST', uri, expected_status=201,
421                                 data=json.dumps(params))
422
423    def delete_pipeline(self, id=None):
424        """
425        The DeletePipeline operation removes a pipeline.
426
427        You can only delete a pipeline that has never been used or
428        that is not currently in use (doesn't contain any active
429        jobs). If the pipeline is currently in use, `DeletePipeline`
430        returns an error.
431
432        :type id: string
433        :param id: The identifier of the pipeline that you want to delete.
434
435        """
436        uri = '/2012-09-25/pipelines/{0}'.format(id)
437        return self.make_request('DELETE', uri, expected_status=202)
438
439    def delete_preset(self, id=None):
440        """
441        The DeletePreset operation removes a preset that you've added
442        in an AWS region.
443
444        You can't delete the default presets that are included with
445        Elastic Transcoder.
446
447        :type id: string
448        :param id: The identifier of the preset for which you want to get
449            detailed information.
450
451        """
452        uri = '/2012-09-25/presets/{0}'.format(id)
453        return self.make_request('DELETE', uri, expected_status=202)
454
455    def list_jobs_by_pipeline(self, pipeline_id=None, ascending=None,
456                              page_token=None):
457        """
458        The ListJobsByPipeline operation gets a list of the jobs
459        currently in a pipeline.
460
461        Elastic Transcoder returns all of the jobs currently in the
462        specified pipeline. The response body contains one element for
463        each job that satisfies the search criteria.
464
465        :type pipeline_id: string
466        :param pipeline_id: The ID of the pipeline for which you want to get
467            job information.
468
469        :type ascending: string
470        :param ascending: To list jobs in chronological order by the date and
471            time that they were submitted, enter `True`. To list jobs in
472            reverse chronological order, enter `False`.
473
474        :type page_token: string
475        :param page_token: When Elastic Transcoder returns more than one page
476            of results, use `pageToken` in subsequent `GET` requests to get
477            each successive page of results.
478
479        """
480        uri = '/2012-09-25/jobsByPipeline/{0}'.format(pipeline_id)
481        params = {}
482        if pipeline_id is not None:
483            params['PipelineId'] = pipeline_id
484        if ascending is not None:
485            params['Ascending'] = ascending
486        if page_token is not None:
487            params['PageToken'] = page_token
488        return self.make_request('GET', uri, expected_status=200,
489                                 params=params)
490
491    def list_jobs_by_status(self, status=None, ascending=None,
492                            page_token=None):
493        """
494        The ListJobsByStatus operation gets a list of jobs that have a
495        specified status. The response body contains one element for
496        each job that satisfies the search criteria.
497
498        :type status: string
499        :param status: To get information about all of the jobs associated with
500            the current AWS account that have a given status, specify the
501            following status: `Submitted`, `Progressing`, `Complete`,
502            `Canceled`, or `Error`.
503
504        :type ascending: string
505        :param ascending: To list jobs in chronological order by the date and
506            time that they were submitted, enter `True`. To list jobs in
507            reverse chronological order, enter `False`.
508
509        :type page_token: string
510        :param page_token: When Elastic Transcoder returns more than one page
511            of results, use `pageToken` in subsequent `GET` requests to get
512            each successive page of results.
513
514        """
515        uri = '/2012-09-25/jobsByStatus/{0}'.format(status)
516        params = {}
517        if status is not None:
518            params['Status'] = status
519        if ascending is not None:
520            params['Ascending'] = ascending
521        if page_token is not None:
522            params['PageToken'] = page_token
523        return self.make_request('GET', uri, expected_status=200,
524                                 params=params)
525
526    def list_pipelines(self, ascending=None, page_token=None):
527        """
528        The ListPipelines operation gets a list of the pipelines
529        associated with the current AWS account.
530
531        :type ascending: string
532        :param ascending: To list pipelines in chronological order by the date
533            and time that they were created, enter `True`. To list pipelines in
534            reverse chronological order, enter `False`.
535
536        :type page_token: string
537        :param page_token: When Elastic Transcoder returns more than one page
538            of results, use `pageToken` in subsequent `GET` requests to get
539            each successive page of results.
540
541        """
542        uri = '/2012-09-25/pipelines'.format()
543        params = {}
544        if ascending is not None:
545            params['Ascending'] = ascending
546        if page_token is not None:
547            params['PageToken'] = page_token
548        return self.make_request('GET', uri, expected_status=200,
549                                 params=params)
550
551    def list_presets(self, ascending=None, page_token=None):
552        """
553        The ListPresets operation gets a list of the default presets
554        included with Elastic Transcoder and the presets that you've
555        added in an AWS region.
556
557        :type ascending: string
558        :param ascending: To list presets in chronological order by the date
559            and time that they were created, enter `True`. To list presets in
560            reverse chronological order, enter `False`.
561
562        :type page_token: string
563        :param page_token: When Elastic Transcoder returns more than one page
564            of results, use `pageToken` in subsequent `GET` requests to get
565            each successive page of results.
566
567        """
568        uri = '/2012-09-25/presets'.format()
569        params = {}
570        if ascending is not None:
571            params['Ascending'] = ascending
572        if page_token is not None:
573            params['PageToken'] = page_token
574        return self.make_request('GET', uri, expected_status=200,
575                                 params=params)
576
577    def read_job(self, id=None):
578        """
579        The ReadJob operation returns detailed information about a
580        job.
581
582        :type id: string
583        :param id: The identifier of the job for which you want to get detailed
584            information.
585
586        """
587        uri = '/2012-09-25/jobs/{0}'.format(id)
588        return self.make_request('GET', uri, expected_status=200)
589
590    def read_pipeline(self, id=None):
591        """
592        The ReadPipeline operation gets detailed information about a
593        pipeline.
594
595        :type id: string
596        :param id: The identifier of the pipeline to read.
597
598        """
599        uri = '/2012-09-25/pipelines/{0}'.format(id)
600        return self.make_request('GET', uri, expected_status=200)
601
602    def read_preset(self, id=None):
603        """
604        The ReadPreset operation gets detailed information about a
605        preset.
606
607        :type id: string
608        :param id: The identifier of the preset for which you want to get
609            detailed information.
610
611        """
612        uri = '/2012-09-25/presets/{0}'.format(id)
613        return self.make_request('GET', uri, expected_status=200)
614
615    def test_role(self, role=None, input_bucket=None, output_bucket=None,
616                  topics=None):
617        """
618        The TestRole operation tests the IAM role used to create the
619        pipeline.
620
621        The `TestRole` action lets you determine whether the IAM role
622        you are using has sufficient permissions to let Elastic
623        Transcoder perform tasks associated with the transcoding
624        process. The action attempts to assume the specified IAM role,
625        checks read access to the input and output buckets, and tries
626        to send a test notification to Amazon SNS topics that you
627        specify.
628
629        :type role: string
630        :param role: The IAM Amazon Resource Name (ARN) for the role that you
631            want Elastic Transcoder to test.
632
633        :type input_bucket: string
634        :param input_bucket: The Amazon S3 bucket that contains media files to
635            be transcoded. The action attempts to read from this bucket.
636
637        :type output_bucket: string
638        :param output_bucket: The Amazon S3 bucket that Elastic Transcoder will
639            write transcoded media files to. The action attempts to read from
640            this bucket.
641
642        :type topics: list
643        :param topics: The ARNs of one or more Amazon Simple Notification
644            Service (Amazon SNS) topics that you want the action to send a test
645            notification to.
646
647        """
648        uri = '/2012-09-25/roleTests'
649        params = {}
650        if role is not None:
651            params['Role'] = role
652        if input_bucket is not None:
653            params['InputBucket'] = input_bucket
654        if output_bucket is not None:
655            params['OutputBucket'] = output_bucket
656        if topics is not None:
657            params['Topics'] = topics
658        return self.make_request('POST', uri, expected_status=200,
659                                 data=json.dumps(params))
660
661    def update_pipeline(self, id, name=None, input_bucket=None, role=None,
662                        notifications=None, content_config=None,
663                        thumbnail_config=None):
664        """
665        Use the `UpdatePipeline` operation to update settings for a
666        pipeline. When you change pipeline settings, your changes take
667        effect immediately. Jobs that you have already submitted and
668        that Elastic Transcoder has not started to process are
669        affected in addition to jobs that you submit after you change
670        settings.
671
672        :type id: string
673        :param id: The ID of the pipeline that you want to update.
674
675        :type name: string
676        :param name: The name of the pipeline. We recommend that the name be
677            unique within the AWS account, but uniqueness is not enforced.
678        Constraints: Maximum 40 characters
679
680        :type input_bucket: string
681        :param input_bucket: The Amazon S3 bucket in which you saved the media
682            files that you want to transcode and the graphics that you want to
683            use as watermarks.
684
685        :type role: string
686        :param role: The IAM Amazon Resource Name (ARN) for the role that you
687            want Elastic Transcoder to use to transcode jobs for this pipeline.
688
689        :type notifications: dict
690        :param notifications:
691        The Amazon Simple Notification Service (Amazon SNS) topic or topics to
692            notify in order to report job status.
693        To receive notifications, you must also subscribe to the new topic in
694            the Amazon SNS console.
695
696        :type content_config: dict
697        :param content_config:
698        The optional `ContentConfig` object specifies information about the
699            Amazon S3 bucket in which you want Elastic Transcoder to save
700            transcoded files and playlists: which bucket to use, which users
701            you want to have access to the files, the type of access you want
702            users to have, and the storage class that you want to assign to the
703            files.
704
705        If you specify values for `ContentConfig`, you must also specify values
706            for `ThumbnailConfig`.
707
708        If you specify values for `ContentConfig` and `ThumbnailConfig`, omit
709            the `OutputBucket` object.
710
711
712        + **Bucket**: The Amazon S3 bucket in which you want Elastic Transcoder
713              to save transcoded files and playlists.
714        + **Permissions** (Optional): The Permissions object specifies which
715              users you want to have access to transcoded files and the type of
716              access you want them to have. You can grant permissions to a
717              maximum of 30 users and/or predefined Amazon S3 groups.
718        + **Grantee Type**: Specify the type of value that appears in the
719              `Grantee` object:
720
721            + **Canonical**: The value in the `Grantee` object is either the
722                  canonical user ID for an AWS account or an origin access identity
723                  for an Amazon CloudFront distribution. For more information about
724                  canonical user IDs, see Access Control List (ACL) Overview in the
725                  Amazon Simple Storage Service Developer Guide. For more information
726                  about using CloudFront origin access identities to require that
727                  users use CloudFront URLs instead of Amazon S3 URLs, see Using an
728                  Origin Access Identity to Restrict Access to Your Amazon S3
729                  Content. A canonical user ID is not the same as an AWS account
730                  number.
731            + **Email**: The value in the `Grantee` object is the registered email
732                  address of an AWS account.
733            + **Group**: The value in the `Grantee` object is one of the following
734                  predefined Amazon S3 groups: `AllUsers`, `AuthenticatedUsers`, or
735                  `LogDelivery`.
736
737        + **Grantee**: The AWS user or group that you want to have access to
738              transcoded files and playlists. To identify the user or group, you
739              can specify the canonical user ID for an AWS account, an origin
740              access identity for a CloudFront distribution, the registered email
741              address of an AWS account, or a predefined Amazon S3 group
742        + **Access**: The permission that you want to give to the AWS user that
743              you specified in `Grantee`. Permissions are granted on the files
744              that Elastic Transcoder adds to the bucket, including playlists and
745              video files. Valid values include:
746
747            + `READ`: The grantee can read the objects and metadata for objects
748                  that Elastic Transcoder adds to the Amazon S3 bucket.
749            + `READ_ACP`: The grantee can read the object ACL for objects that
750                  Elastic Transcoder adds to the Amazon S3 bucket.
751            + `WRITE_ACP`: The grantee can write the ACL for the objects that
752                  Elastic Transcoder adds to the Amazon S3 bucket.
753            + `FULL_CONTROL`: The grantee has `READ`, `READ_ACP`, and `WRITE_ACP`
754                  permissions for the objects that Elastic Transcoder adds to the
755                  Amazon S3 bucket.
756
757        + **StorageClass**: The Amazon S3 storage class, `Standard` or
758              `ReducedRedundancy`, that you want Elastic Transcoder to assign to
759              the video files and playlists that it stores in your Amazon S3
760              bucket.
761
762        :type thumbnail_config: dict
763        :param thumbnail_config:
764        The `ThumbnailConfig` object specifies several values, including the
765            Amazon S3 bucket in which you want Elastic Transcoder to save
766            thumbnail files, which users you want to have access to the files,
767            the type of access you want users to have, and the storage class
768            that you want to assign to the files.
769
770        If you specify values for `ContentConfig`, you must also specify values
771            for `ThumbnailConfig` even if you don't want to create thumbnails.
772
773        If you specify values for `ContentConfig` and `ThumbnailConfig`, omit
774            the `OutputBucket` object.
775
776
777        + **Bucket**: The Amazon S3 bucket in which you want Elastic Transcoder
778              to save thumbnail files.
779        + **Permissions** (Optional): The `Permissions` object specifies which
780              users and/or predefined Amazon S3 groups you want to have access to
781              thumbnail files, and the type of access you want them to have. You
782              can grant permissions to a maximum of 30 users and/or predefined
783              Amazon S3 groups.
784        + **GranteeType**: Specify the type of value that appears in the
785              Grantee object:
786
787            + **Canonical**: The value in the `Grantee` object is either the
788                  canonical user ID for an AWS account or an origin access identity
789                  for an Amazon CloudFront distribution. A canonical user ID is not
790                  the same as an AWS account number.
791            + **Email**: The value in the `Grantee` object is the registered email
792                  address of an AWS account.
793            + **Group**: The value in the `Grantee` object is one of the following
794                  predefined Amazon S3 groups: `AllUsers`, `AuthenticatedUsers`, or
795                  `LogDelivery`.
796
797        + **Grantee**: The AWS user or group that you want to have access to
798              thumbnail files. To identify the user or group, you can specify the
799              canonical user ID for an AWS account, an origin access identity for
800              a CloudFront distribution, the registered email address of an AWS
801              account, or a predefined Amazon S3 group.
802        + **Access**: The permission that you want to give to the AWS user that
803              you specified in `Grantee`. Permissions are granted on the
804              thumbnail files that Elastic Transcoder adds to the bucket. Valid
805              values include:
806
807            + `READ`: The grantee can read the thumbnails and metadata for objects
808                  that Elastic Transcoder adds to the Amazon S3 bucket.
809            + `READ_ACP`: The grantee can read the object ACL for thumbnails that
810                  Elastic Transcoder adds to the Amazon S3 bucket.
811            + `WRITE_ACP`: The grantee can write the ACL for the thumbnails that
812                  Elastic Transcoder adds to the Amazon S3 bucket.
813            + `FULL_CONTROL`: The grantee has `READ`, `READ_ACP`, and `WRITE_ACP`
814                  permissions for the thumbnails that Elastic Transcoder adds to the
815                  Amazon S3 bucket.
816
817        + **StorageClass**: The Amazon S3 storage class, `Standard` or
818              `ReducedRedundancy`, that you want Elastic Transcoder to assign to
819              the thumbnails that it stores in your Amazon S3 bucket.
820
821        """
822        uri = '/2012-09-25/pipelines/{0}'.format(id)
823        params = {}
824        if name is not None:
825            params['Name'] = name
826        if input_bucket is not None:
827            params['InputBucket'] = input_bucket
828        if role is not None:
829            params['Role'] = role
830        if notifications is not None:
831            params['Notifications'] = notifications
832        if content_config is not None:
833            params['ContentConfig'] = content_config
834        if thumbnail_config is not None:
835            params['ThumbnailConfig'] = thumbnail_config
836        return self.make_request('PUT', uri, expected_status=200,
837                                 data=json.dumps(params))
838
839    def update_pipeline_notifications(self, id=None, notifications=None):
840        """
841        With the UpdatePipelineNotifications operation, you can update
842        Amazon Simple Notification Service (Amazon SNS) notifications
843        for a pipeline.
844
845        When you update notifications for a pipeline, Elastic
846        Transcoder returns the values that you specified in the
847        request.
848
849        :type id: string
850        :param id: The identifier of the pipeline for which you want to change
851            notification settings.
852
853        :type notifications: dict
854        :param notifications:
855        The topic ARN for the Amazon Simple Notification Service (Amazon SNS)
856            topic that you want to notify to report job status.
857        To receive notifications, you must also subscribe to the new topic in
858            the Amazon SNS console.
859
860        + **Progressing**: The topic ARN for the Amazon Simple Notification
861              Service (Amazon SNS) topic that you want to notify when Elastic
862              Transcoder has started to process jobs that are added to this
863              pipeline. This is the ARN that Amazon SNS returned when you created
864              the topic.
865        + **Completed**: The topic ARN for the Amazon SNS topic that you want
866              to notify when Elastic Transcoder has finished processing a job.
867              This is the ARN that Amazon SNS returned when you created the
868              topic.
869        + **Warning**: The topic ARN for the Amazon SNS topic that you want to
870              notify when Elastic Transcoder encounters a warning condition. This
871              is the ARN that Amazon SNS returned when you created the topic.
872        + **Error**: The topic ARN for the Amazon SNS topic that you want to
873              notify when Elastic Transcoder encounters an error condition. This
874              is the ARN that Amazon SNS returned when you created the topic.
875
876        """
877        uri = '/2012-09-25/pipelines/{0}/notifications'.format(id)
878        params = {}
879        if id is not None:
880            params['Id'] = id
881        if notifications is not None:
882            params['Notifications'] = notifications
883        return self.make_request('POST', uri, expected_status=200,
884                                 data=json.dumps(params))
885
886    def update_pipeline_status(self, id=None, status=None):
887        """
888        The UpdatePipelineStatus operation pauses or reactivates a
889        pipeline, so that the pipeline stops or restarts the
890        processing of jobs.
891
892        Changing the pipeline status is useful if you want to cancel
893        one or more jobs. You can't cancel jobs after Elastic
894        Transcoder has started processing them; if you pause the
895        pipeline to which you submitted the jobs, you have more time
896        to get the job IDs for the jobs that you want to cancel, and
897        to send a CancelJob request.
898
899        :type id: string
900        :param id: The identifier of the pipeline to update.
901
902        :type status: string
903        :param status:
904        The desired status of the pipeline:
905
906
907        + `Active`: The pipeline is processing jobs.
908        + `Paused`: The pipeline is not currently processing jobs.
909
910        """
911        uri = '/2012-09-25/pipelines/{0}/status'.format(id)
912        params = {}
913        if id is not None:
914            params['Id'] = id
915        if status is not None:
916            params['Status'] = status
917        return self.make_request('POST', uri, expected_status=200,
918                                 data=json.dumps(params))
919
920    def make_request(self, verb, resource, headers=None, data='',
921                     expected_status=None, params=None):
922        if headers is None:
923            headers = {}
924        response = super(ElasticTranscoderConnection, self).make_request(
925            verb, resource, headers=headers, data=data, params=params)
926        body = json.loads(response.read().decode('utf-8'))
927        if response.status == expected_status:
928            return body
929        else:
930            error_type = response.getheader('x-amzn-ErrorType').split(':')[0]
931            error_class = self._faults.get(error_type, self.ResponseError)
932            raise error_class(response.status, response.reason, body)
933