github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/aws/resource_aws_elastic_transcoder_preset.go (about)

     1  package aws
     2  
     3  import (
     4  	"fmt"
     5  	"log"
     6  
     7  	"github.com/aws/aws-sdk-go/aws"
     8  	"github.com/aws/aws-sdk-go/aws/awserr"
     9  	"github.com/aws/aws-sdk-go/service/elastictranscoder"
    10  	"github.com/hashicorp/terraform/helper/resource"
    11  	"github.com/hashicorp/terraform/helper/schema"
    12  )
    13  
    14  func resourceAwsElasticTranscoderPreset() *schema.Resource {
    15  	return &schema.Resource{
    16  		Create: resourceAwsElasticTranscoderPresetCreate,
    17  		Read:   resourceAwsElasticTranscoderPresetRead,
    18  		Delete: resourceAwsElasticTranscoderPresetDelete,
    19  
    20  		Schema: map[string]*schema.Schema{
    21  			"arn": &schema.Schema{
    22  				Type:     schema.TypeString,
    23  				Computed: true,
    24  			},
    25  
    26  			"audio": &schema.Schema{
    27  				Type:     schema.TypeSet,
    28  				Optional: true,
    29  				ForceNew: true,
    30  				MaxItems: 1,
    31  				Elem: &schema.Resource{
    32  					// elastictranscoder.AudioParameters
    33  					Schema: map[string]*schema.Schema{
    34  						"audio_packing_mode": &schema.Schema{
    35  							Type:     schema.TypeString,
    36  							Optional: true,
    37  							ForceNew: true,
    38  						},
    39  						"bit_rate": &schema.Schema{
    40  							Type:     schema.TypeString,
    41  							Optional: true,
    42  							ForceNew: true,
    43  						},
    44  						"channels": &schema.Schema{
    45  							Type:     schema.TypeString,
    46  							Optional: true,
    47  							ForceNew: true,
    48  						},
    49  						"codec": &schema.Schema{
    50  							Type:     schema.TypeString,
    51  							Optional: true,
    52  							ForceNew: true,
    53  						},
    54  						"sample_rate": &schema.Schema{
    55  							Type:     schema.TypeString,
    56  							Optional: true,
    57  							ForceNew: true,
    58  						},
    59  					},
    60  				},
    61  			},
    62  			"audio_codec_options": &schema.Schema{
    63  				Type:     schema.TypeSet,
    64  				MaxItems: 1,
    65  				Optional: true,
    66  				ForceNew: true,
    67  				Elem: &schema.Resource{
    68  					Schema: map[string]*schema.Schema{
    69  						"bit_depth": &schema.Schema{
    70  							Type:     schema.TypeString,
    71  							Optional: true,
    72  							ForceNew: true,
    73  						},
    74  						"bit_order": &schema.Schema{
    75  							Type:     schema.TypeString,
    76  							Optional: true,
    77  							ForceNew: true,
    78  						},
    79  						"profile": &schema.Schema{
    80  							Type:     schema.TypeString,
    81  							Optional: true,
    82  							ForceNew: true,
    83  						},
    84  						"signed": &schema.Schema{
    85  							Type:     schema.TypeString,
    86  							Optional: true,
    87  							ForceNew: true,
    88  						},
    89  					},
    90  				},
    91  			},
    92  
    93  			"container": &schema.Schema{
    94  				Type:     schema.TypeString,
    95  				Required: true,
    96  				ForceNew: true,
    97  			},
    98  
    99  			"description": &schema.Schema{
   100  				Type:     schema.TypeString,
   101  				Optional: true,
   102  				ForceNew: true,
   103  			},
   104  
   105  			"name": &schema.Schema{
   106  				Type:     schema.TypeString,
   107  				Optional: true,
   108  				Computed: true,
   109  				ForceNew: true,
   110  			},
   111  
   112  			"thumbnails": &schema.Schema{
   113  				Type:     schema.TypeSet,
   114  				MaxItems: 1,
   115  				Optional: true,
   116  				ForceNew: true,
   117  				Elem: &schema.Resource{
   118  					// elastictranscoder.Thumbnails
   119  					Schema: map[string]*schema.Schema{
   120  						"aspect_ratio": &schema.Schema{
   121  							Type:     schema.TypeString,
   122  							Optional: true,
   123  							ForceNew: true,
   124  						},
   125  						"format": &schema.Schema{
   126  							Type:     schema.TypeString,
   127  							Optional: true,
   128  							ForceNew: true,
   129  						},
   130  						"interval": &schema.Schema{
   131  							Type:     schema.TypeString,
   132  							Optional: true,
   133  							ForceNew: true,
   134  						},
   135  						"max_height": &schema.Schema{
   136  							Type:     schema.TypeString,
   137  							Optional: true,
   138  							ForceNew: true,
   139  						},
   140  						"max_width": &schema.Schema{
   141  							Type:     schema.TypeString,
   142  							Optional: true,
   143  							ForceNew: true,
   144  						},
   145  						"padding_policy": &schema.Schema{
   146  							Type:     schema.TypeString,
   147  							Optional: true,
   148  							ForceNew: true,
   149  						},
   150  						"resolution:": &schema.Schema{
   151  							Type:     schema.TypeString,
   152  							Optional: true,
   153  							ForceNew: true,
   154  						},
   155  						"sizing_policy": &schema.Schema{
   156  							Type:     schema.TypeString,
   157  							Optional: true,
   158  							ForceNew: true,
   159  						},
   160  					},
   161  				},
   162  			},
   163  
   164  			"type": &schema.Schema{
   165  				Type:     schema.TypeString,
   166  				Optional: true,
   167  				Computed: true,
   168  			},
   169  
   170  			"video": &schema.Schema{
   171  				Type:     schema.TypeSet,
   172  				Optional: true,
   173  				ForceNew: true,
   174  				MaxItems: 1,
   175  				Elem: &schema.Resource{
   176  					// elastictranscoder.VideoParameters
   177  					Schema: map[string]*schema.Schema{
   178  						"aspect_ratio": &schema.Schema{
   179  							Type:     schema.TypeString,
   180  							Optional: true,
   181  							ForceNew: true,
   182  						},
   183  						"bit_rate": &schema.Schema{
   184  							Type:     schema.TypeString,
   185  							Optional: true,
   186  							ForceNew: true,
   187  						},
   188  						"codec": &schema.Schema{
   189  							Type:     schema.TypeString,
   190  							Optional: true,
   191  							ForceNew: true,
   192  						},
   193  						"display_aspect_ratio": &schema.Schema{
   194  							Type:     schema.TypeString,
   195  							Optional: true,
   196  							ForceNew: true,
   197  						},
   198  						"fixed_gop": &schema.Schema{
   199  							Type:     schema.TypeString,
   200  							Optional: true,
   201  							ForceNew: true,
   202  						},
   203  						"frame_rate": &schema.Schema{
   204  							Type:     schema.TypeString,
   205  							Optional: true,
   206  							ForceNew: true,
   207  						},
   208  						"keyframes_max_dist": &schema.Schema{
   209  							Type:     schema.TypeString,
   210  							Optional: true,
   211  							ForceNew: true,
   212  						},
   213  						"max_frame_rate": &schema.Schema{
   214  							Type:     schema.TypeString,
   215  							Optional: true,
   216  							Default:  "30",
   217  							ForceNew: true,
   218  						},
   219  						"max_height": &schema.Schema{
   220  							Type:     schema.TypeString,
   221  							Optional: true,
   222  							ForceNew: true,
   223  						},
   224  						"max_width": &schema.Schema{
   225  							Type:     schema.TypeString,
   226  							Optional: true,
   227  							ForceNew: true,
   228  						},
   229  						"padding_policy": &schema.Schema{
   230  							Type:     schema.TypeString,
   231  							Optional: true,
   232  							ForceNew: true,
   233  						},
   234  						"resolution": &schema.Schema{
   235  							Type:     schema.TypeString,
   236  							Optional: true,
   237  							ForceNew: true,
   238  						},
   239  						"sizing_policy": &schema.Schema{
   240  							Type:     schema.TypeString,
   241  							Default:  "Fit",
   242  							Optional: true,
   243  							ForceNew: true,
   244  						},
   245  					},
   246  				},
   247  			},
   248  
   249  			"video_watermarks": &schema.Schema{
   250  				Type:     schema.TypeSet,
   251  				Optional: true,
   252  				ForceNew: true,
   253  				Elem: &schema.Resource{
   254  					// elastictranscoder.PresetWatermark
   255  					Schema: map[string]*schema.Schema{
   256  						"horizontal_align": &schema.Schema{
   257  							Type:     schema.TypeString,
   258  							Optional: true,
   259  							ForceNew: true,
   260  						},
   261  						"horizontal_offset": &schema.Schema{
   262  							Type:     schema.TypeString,
   263  							Optional: true,
   264  							ForceNew: true,
   265  						},
   266  						"id": &schema.Schema{
   267  							Type:     schema.TypeString,
   268  							Optional: true,
   269  							ForceNew: true,
   270  						},
   271  						"max_height": &schema.Schema{
   272  							Type:     schema.TypeString,
   273  							Optional: true,
   274  							ForceNew: true,
   275  						},
   276  						"max_width": &schema.Schema{
   277  							Type:     schema.TypeString,
   278  							Optional: true,
   279  							ForceNew: true,
   280  						},
   281  						"opacity": &schema.Schema{
   282  							Type:     schema.TypeString,
   283  							Optional: true,
   284  							ForceNew: true,
   285  						},
   286  						"sizing_policy": &schema.Schema{
   287  							Type:     schema.TypeString,
   288  							Optional: true,
   289  							ForceNew: true,
   290  						},
   291  						"target": &schema.Schema{
   292  							Type:     schema.TypeString,
   293  							Optional: true,
   294  							ForceNew: true,
   295  						},
   296  						"vertical_align": &schema.Schema{
   297  							Type:     schema.TypeString,
   298  							Optional: true,
   299  							ForceNew: true,
   300  						},
   301  						"vertical_offset": &schema.Schema{
   302  							Type:     schema.TypeString,
   303  							Optional: true,
   304  							ForceNew: true,
   305  						},
   306  					},
   307  				},
   308  			},
   309  
   310  			"video_codec_options": &schema.Schema{
   311  				Type:     schema.TypeMap,
   312  				Optional: true,
   313  				ForceNew: true,
   314  			},
   315  		},
   316  	}
   317  }
   318  
   319  func resourceAwsElasticTranscoderPresetCreate(d *schema.ResourceData, meta interface{}) error {
   320  	elastictranscoderconn := meta.(*AWSClient).elastictranscoderconn
   321  
   322  	req := &elastictranscoder.CreatePresetInput{
   323  		Audio:       expandETAudioParams(d),
   324  		Container:   aws.String(d.Get("container").(string)),
   325  		Description: getStringPtr(d, "description"),
   326  		Thumbnails:  expandETThumbnails(d),
   327  		Video:       exapandETVideoParams(d),
   328  	}
   329  
   330  	if name, ok := d.GetOk("name"); ok {
   331  		req.Name = aws.String(name.(string))
   332  	} else {
   333  		name := resource.PrefixedUniqueId("tf-et-preset-")
   334  		d.Set("name", name)
   335  		req.Name = aws.String(name)
   336  	}
   337  
   338  	log.Printf("[DEBUG] Elastic Transcoder Preset create opts: %s", req)
   339  	resp, err := elastictranscoderconn.CreatePreset(req)
   340  	if err != nil {
   341  		return fmt.Errorf("Error creating Elastic Transcoder Preset: %s", err)
   342  	}
   343  
   344  	if resp.Warning != nil && *resp.Warning != "" {
   345  		log.Printf("[WARN] Elastic Transcoder Preset: %s", *resp.Warning)
   346  	}
   347  
   348  	d.SetId(*resp.Preset.Id)
   349  	d.Set("arn", *resp.Preset.Arn)
   350  
   351  	return nil
   352  }
   353  
   354  func expandETThumbnails(d *schema.ResourceData) *elastictranscoder.Thumbnails {
   355  	set, ok := d.GetOk("thumbnails")
   356  	if !ok {
   357  		return nil
   358  	}
   359  
   360  	s := set.(*schema.Set)
   361  	if s == nil || s.Len() == 0 {
   362  		return nil
   363  	}
   364  	t := s.List()[0].(map[string]interface{})
   365  
   366  	return &elastictranscoder.Thumbnails{
   367  		AspectRatio:   getStringPtr(t, "aspect_ratio"),
   368  		Format:        getStringPtr(t, "format"),
   369  		Interval:      getStringPtr(t, "interval"),
   370  		MaxHeight:     getStringPtr(t, "max_height"),
   371  		MaxWidth:      getStringPtr(t, "max_width"),
   372  		PaddingPolicy: getStringPtr(t, "padding_policy"),
   373  		Resolution:    getStringPtr(t, "resolution"),
   374  		SizingPolicy:  getStringPtr(t, "sizing_policy"),
   375  	}
   376  }
   377  
   378  func expandETAudioParams(d *schema.ResourceData) *elastictranscoder.AudioParameters {
   379  	set, ok := d.GetOk("audio")
   380  	if !ok {
   381  		return nil
   382  	}
   383  
   384  	s := set.(*schema.Set)
   385  	if s == nil || s.Len() == 0 {
   386  		return nil
   387  	}
   388  	audio := s.List()[0].(map[string]interface{})
   389  
   390  	return &elastictranscoder.AudioParameters{
   391  		AudioPackingMode: getStringPtr(audio, "audio_packing_mode"),
   392  		BitRate:          getStringPtr(audio, "bit_rate"),
   393  		Channels:         getStringPtr(audio, "channels"),
   394  		Codec:            getStringPtr(audio, "codec"),
   395  		CodecOptions:     expandETAudioCodecOptions(d),
   396  		SampleRate:       getStringPtr(audio, "sample_rate"),
   397  	}
   398  }
   399  
   400  func expandETAudioCodecOptions(d *schema.ResourceData) *elastictranscoder.AudioCodecOptions {
   401  	s := d.Get("audio_codec_options").(*schema.Set)
   402  	if s == nil || s.Len() == 0 {
   403  		return nil
   404  	}
   405  
   406  	codec := s.List()[0].(map[string]interface{})
   407  
   408  	codecOpts := &elastictranscoder.AudioCodecOptions{
   409  		BitDepth: getStringPtr(codec, "bit_depth"),
   410  		BitOrder: getStringPtr(codec, "bit_order"),
   411  		Profile:  getStringPtr(codec, "profile"),
   412  		Signed:   getStringPtr(codec, "signed"),
   413  	}
   414  
   415  	return codecOpts
   416  }
   417  
   418  func exapandETVideoParams(d *schema.ResourceData) *elastictranscoder.VideoParameters {
   419  	s := d.Get("video").(*schema.Set)
   420  	if s == nil || s.Len() == 0 {
   421  		return nil
   422  	}
   423  	p := s.List()[0].(map[string]interface{})
   424  
   425  	return &elastictranscoder.VideoParameters{
   426  		AspectRatio:        getStringPtr(p, "aspect_ratio"),
   427  		BitRate:            getStringPtr(p, "bit_rate"),
   428  		Codec:              getStringPtr(p, "codec"),
   429  		CodecOptions:       stringMapToPointers(d.Get("video_codec_options").(map[string]interface{})),
   430  		DisplayAspectRatio: getStringPtr(p, "display_aspect_ratio"),
   431  		FixedGOP:           getStringPtr(p, "fixed_gop"),
   432  		FrameRate:          getStringPtr(p, "frame_rate"),
   433  		KeyframesMaxDist:   getStringPtr(p, "keyframes_max_dist"),
   434  		MaxFrameRate:       getStringPtr(p, "max_frame_rate"),
   435  		MaxHeight:          getStringPtr(p, "max_height"),
   436  		MaxWidth:           getStringPtr(p, "max_width"),
   437  		PaddingPolicy:      getStringPtr(p, "padding_policy"),
   438  		Resolution:         getStringPtr(p, "resolution"),
   439  		SizingPolicy:       getStringPtr(p, "sizing_policy"),
   440  		Watermarks:         expandETVideoWatermarks(d),
   441  	}
   442  }
   443  
   444  func expandETVideoWatermarks(d *schema.ResourceData) []*elastictranscoder.PresetWatermark {
   445  	s := d.Get("video_watermarks").(*schema.Set)
   446  	if s == nil || s.Len() == 0 {
   447  		return nil
   448  	}
   449  	var watermarks []*elastictranscoder.PresetWatermark
   450  
   451  	for _, w := range s.List() {
   452  		watermark := &elastictranscoder.PresetWatermark{
   453  			HorizontalAlign:  getStringPtr(w, "horizontal_align"),
   454  			HorizontalOffset: getStringPtr(w, "horizontal_offset"),
   455  			Id:               getStringPtr(w, "id"),
   456  			MaxHeight:        getStringPtr(w, "max_height"),
   457  			MaxWidth:         getStringPtr(w, "max_width"),
   458  			Opacity:          getStringPtr(w, "opacity"),
   459  			SizingPolicy:     getStringPtr(w, "sizing_policy"),
   460  			Target:           getStringPtr(w, "target"),
   461  			VerticalAlign:    getStringPtr(w, "vertical_align"),
   462  			VerticalOffset:   getStringPtr(w, "vertical_offset"),
   463  		}
   464  		watermarks = append(watermarks, watermark)
   465  	}
   466  
   467  	return watermarks
   468  }
   469  
   470  func resourceAwsElasticTranscoderPresetRead(d *schema.ResourceData, meta interface{}) error {
   471  	elastictranscoderconn := meta.(*AWSClient).elastictranscoderconn
   472  
   473  	resp, err := elastictranscoderconn.ReadPreset(&elastictranscoder.ReadPresetInput{
   474  		Id: aws.String(d.Id()),
   475  	})
   476  
   477  	if err != nil {
   478  		if err, ok := err.(awserr.Error); ok && err.Code() == "ResourceNotFoundException" {
   479  			d.SetId("")
   480  			return nil
   481  		}
   482  		return err
   483  	}
   484  
   485  	log.Printf("[DEBUG] Elastic Transcoder Preset Read response: %#v", resp)
   486  
   487  	preset := resp.Preset
   488  	d.Set("arn", *preset.Arn)
   489  
   490  	if preset.Audio != nil {
   491  		err := d.Set("audio", flattenETAudioParameters(preset.Audio))
   492  		if err != nil {
   493  			return err
   494  		}
   495  
   496  		if preset.Audio.CodecOptions != nil {
   497  			d.Set("audio_codec_options", flattenETAudioCodecOptions(preset.Audio.CodecOptions))
   498  		}
   499  	}
   500  
   501  	d.Set("container", *preset.Container)
   502  	d.Set("name", *preset.Name)
   503  
   504  	if preset.Thumbnails != nil {
   505  		err := d.Set("thumbnails", flattenETThumbnails(preset.Thumbnails))
   506  		if err != nil {
   507  			return err
   508  		}
   509  	}
   510  
   511  	d.Set("type", *preset.Type)
   512  
   513  	if preset.Video != nil {
   514  		err := d.Set("video", flattenETVideoParams(preset.Video))
   515  		if err != nil {
   516  			return err
   517  		}
   518  
   519  		if preset.Video.CodecOptions != nil {
   520  			d.Set("video_codec_options", flattenETVideoCodecOptions(preset.Video.CodecOptions))
   521  		}
   522  
   523  		if preset.Video.Watermarks != nil {
   524  			d.Set("video_watermarks", flattenETWatermarks(preset.Video.Watermarks))
   525  		}
   526  	}
   527  
   528  	return nil
   529  }
   530  
   531  func flattenETAudioParameters(audio *elastictranscoder.AudioParameters) []map[string]interface{} {
   532  	m := setMap(make(map[string]interface{}))
   533  
   534  	m.SetString("audio_packing_mode", audio.AudioPackingMode)
   535  	m.SetString("bit_rate", audio.BitRate)
   536  	m.SetString("channels", audio.Channels)
   537  	m.SetString("codec", audio.Codec)
   538  	m.SetString("sample_rate", audio.SampleRate)
   539  
   540  	return m.MapList()
   541  }
   542  
   543  func flattenETAudioCodecOptions(opts *elastictranscoder.AudioCodecOptions) []map[string]interface{} {
   544  	if opts == nil {
   545  		return nil
   546  	}
   547  
   548  	m := setMap(make(map[string]interface{}))
   549  
   550  	m.SetString("bit_depth", opts.BitDepth)
   551  	m.SetString("bit_order", opts.BitOrder)
   552  	m.SetString("profile", opts.Profile)
   553  	m.SetString("signed", opts.Signed)
   554  
   555  	return m.MapList()
   556  }
   557  
   558  func flattenETThumbnails(thumbs *elastictranscoder.Thumbnails) []map[string]interface{} {
   559  	m := setMap(make(map[string]interface{}))
   560  
   561  	m.SetString("aspect_ratio", thumbs.AspectRatio)
   562  	m.SetString("format", thumbs.Format)
   563  	m.SetString("interval", thumbs.Interval)
   564  	m.SetString("max_height", thumbs.MaxHeight)
   565  	m.SetString("max_width", thumbs.MaxWidth)
   566  	m.SetString("padding_policy", thumbs.PaddingPolicy)
   567  	m.SetString("resolution", thumbs.Resolution)
   568  	m.SetString("sizing_policy", thumbs.SizingPolicy)
   569  
   570  	return m.MapList()
   571  }
   572  
   573  func flattenETVideoParams(video *elastictranscoder.VideoParameters) []map[string]interface{} {
   574  	m := setMap(make(map[string]interface{}))
   575  
   576  	m.SetString("aspect_ratio", video.AspectRatio)
   577  	m.SetString("bit_rate", video.BitRate)
   578  	m.SetString("codec", video.Codec)
   579  	m.SetString("display_aspect_ratio", video.DisplayAspectRatio)
   580  	m.SetString("fixed_gop", video.FixedGOP)
   581  	m.SetString("frame_rate", video.FrameRate)
   582  	m.SetString("keyframes_max_dist", video.KeyframesMaxDist)
   583  	m.SetString("max_frame_rate", video.MaxFrameRate)
   584  	m.SetString("max_height", video.MaxHeight)
   585  	m.SetString("max_width", video.MaxWidth)
   586  	m.SetString("padding_policy", video.PaddingPolicy)
   587  	m.SetString("resolution", video.Resolution)
   588  	m.SetString("sizing_policy", video.SizingPolicy)
   589  
   590  	return m.MapList()
   591  }
   592  
   593  func flattenETVideoCodecOptions(opts map[string]*string) []map[string]interface{} {
   594  	codecOpts := setMap(make(map[string]interface{}))
   595  
   596  	for k, v := range opts {
   597  		codecOpts.SetString(k, v)
   598  	}
   599  
   600  	return codecOpts.MapList()
   601  }
   602  
   603  func flattenETWatermarks(watermarks []*elastictranscoder.PresetWatermark) []map[string]interface{} {
   604  	var watermarkSet []map[string]interface{}
   605  
   606  	for _, w := range watermarks {
   607  		watermark := setMap(make(map[string]interface{}))
   608  
   609  		watermark.SetString("horizontal_align", w.HorizontalAlign)
   610  		watermark.SetString("horizontal_offset", w.HorizontalOffset)
   611  		watermark.SetString("id", w.Id)
   612  		watermark.SetString("max_height", w.MaxHeight)
   613  		watermark.SetString("max_width", w.MaxWidth)
   614  		watermark.SetString("opacity", w.Opacity)
   615  		watermark.SetString("sizing_policy", w.SizingPolicy)
   616  		watermark.SetString("target", w.Target)
   617  		watermark.SetString("vertical_align", w.VerticalAlign)
   618  		watermark.SetString("vertical_offset", w.VerticalOffset)
   619  
   620  		watermarkSet = append(watermarkSet, watermark.Map())
   621  	}
   622  
   623  	return watermarkSet
   624  }
   625  
   626  func resourceAwsElasticTranscoderPresetDelete(d *schema.ResourceData, meta interface{}) error {
   627  	elastictranscoderconn := meta.(*AWSClient).elastictranscoderconn
   628  
   629  	log.Printf("[DEBUG] Elastic Transcoder Delete Preset: %s", d.Id())
   630  	_, err := elastictranscoderconn.DeletePreset(&elastictranscoder.DeletePresetInput{
   631  		Id: aws.String(d.Id()),
   632  	})
   633  
   634  	if err != nil {
   635  		return fmt.Errorf("error deleting Elastic Transcoder Preset: %s", err)
   636  	}
   637  
   638  	return nil
   639  }