-
Notifications
You must be signed in to change notification settings - Fork 9.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #6957 from sjauld/f/media-package-channel
Added MediaPackage Channel resource
- Loading branch information
Showing
6 changed files
with
380 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,182 @@ | ||
package aws | ||
|
||
import ( | ||
"fmt" | ||
"regexp" | ||
"time" | ||
|
||
"github.com/aws/aws-sdk-go/aws" | ||
"github.com/aws/aws-sdk-go/service/mediapackage" | ||
"github.com/hashicorp/terraform/helper/resource" | ||
"github.com/hashicorp/terraform/helper/schema" | ||
"github.com/hashicorp/terraform/helper/validation" | ||
) | ||
|
||
func resourceAwsMediaPackageChannel() *schema.Resource { | ||
return &schema.Resource{ | ||
Create: resourceAwsMediaPackageChannelCreate, | ||
Read: resourceAwsMediaPackageChannelRead, | ||
Update: resourceAwsMediaPackageChannelUpdate, | ||
Delete: resourceAwsMediaPackageChannelDelete, | ||
Importer: &schema.ResourceImporter{ | ||
State: schema.ImportStatePassthrough, | ||
}, | ||
Schema: map[string]*schema.Schema{ | ||
"arn": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
}, | ||
"channel_id": { | ||
Type: schema.TypeString, | ||
Required: true, | ||
ForceNew: true, | ||
ValidateFunc: validation.StringMatch(regexp.MustCompile(`^[\w-]+$`), "must only contain alphanumeric characters, dashes or underscores"), | ||
}, | ||
"description": { | ||
Type: schema.TypeString, | ||
Optional: true, | ||
Default: "Managed by Terraform", | ||
}, | ||
"hls_ingest": { | ||
Type: schema.TypeList, | ||
Computed: true, | ||
Elem: &schema.Resource{ | ||
Schema: map[string]*schema.Schema{ | ||
"ingest_endpoints": { | ||
Type: schema.TypeList, | ||
Computed: true, | ||
Elem: &schema.Resource{ | ||
Schema: map[string]*schema.Schema{ | ||
"password": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
Sensitive: true, | ||
}, | ||
"url": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
}, | ||
"username": { | ||
Type: schema.TypeString, | ||
Computed: true, | ||
}, | ||
}, | ||
}, | ||
}, | ||
}, | ||
}, | ||
}, | ||
}, | ||
} | ||
} | ||
|
||
func resourceAwsMediaPackageChannelCreate(d *schema.ResourceData, meta interface{}) error { | ||
conn := meta.(*AWSClient).mediapackageconn | ||
|
||
input := &mediapackage.CreateChannelInput{ | ||
Id: aws.String(d.Get("channel_id").(string)), | ||
Description: aws.String(d.Get("description").(string)), | ||
} | ||
|
||
_, err := conn.CreateChannel(input) | ||
if err != nil { | ||
return fmt.Errorf("error creating MediaPackage Channel: %s", err) | ||
} | ||
|
||
d.SetId(d.Get("channel_id").(string)) | ||
return resourceAwsMediaPackageChannelRead(d, meta) | ||
} | ||
|
||
func resourceAwsMediaPackageChannelRead(d *schema.ResourceData, meta interface{}) error { | ||
conn := meta.(*AWSClient).mediapackageconn | ||
|
||
input := &mediapackage.DescribeChannelInput{ | ||
Id: aws.String(d.Id()), | ||
} | ||
resp, err := conn.DescribeChannel(input) | ||
if err != nil { | ||
return fmt.Errorf("error describing MediaPackage Channel: %s", err) | ||
} | ||
d.Set("arn", resp.Arn) | ||
d.Set("channel_id", resp.Id) | ||
d.Set("description", resp.Description) | ||
|
||
if err := d.Set("hls_ingest", flattenMediaPackageHLSIngest(resp.HlsIngest)); err != nil { | ||
return fmt.Errorf("error setting hls_ingest: %s", err) | ||
} | ||
|
||
return nil | ||
} | ||
|
||
func resourceAwsMediaPackageChannelUpdate(d *schema.ResourceData, meta interface{}) error { | ||
conn := meta.(*AWSClient).mediapackageconn | ||
|
||
input := &mediapackage.UpdateChannelInput{ | ||
Id: aws.String(d.Id()), | ||
Description: aws.String(d.Get("description").(string)), | ||
} | ||
|
||
_, err := conn.UpdateChannel(input) | ||
if err != nil { | ||
return fmt.Errorf("error updating MediaPackage Channel: %s", err) | ||
} | ||
|
||
return resourceAwsMediaPackageChannelRead(d, meta) | ||
} | ||
|
||
func resourceAwsMediaPackageChannelDelete(d *schema.ResourceData, meta interface{}) error { | ||
conn := meta.(*AWSClient).mediapackageconn | ||
|
||
input := &mediapackage.DeleteChannelInput{ | ||
Id: aws.String(d.Id()), | ||
} | ||
_, err := conn.DeleteChannel(input) | ||
if err != nil { | ||
if isAWSErr(err, mediapackage.ErrCodeNotFoundException, "") { | ||
return nil | ||
} | ||
return fmt.Errorf("error deleting MediaPackage Channel: %s", err) | ||
} | ||
|
||
err = resource.Retry(5*time.Minute, func() *resource.RetryError { | ||
dcinput := &mediapackage.DescribeChannelInput{ | ||
Id: aws.String(d.Id()), | ||
} | ||
_, err := conn.DescribeChannel(dcinput) | ||
if err != nil { | ||
if isAWSErr(err, mediapackage.ErrCodeNotFoundException, "") { | ||
return nil | ||
} | ||
return resource.NonRetryableError(err) | ||
} | ||
return resource.RetryableError(fmt.Errorf("MediaPackage Channel (%s) still exists", d.Id())) | ||
}) | ||
if err != nil { | ||
return fmt.Errorf("error waiting for MediaPackage Channel (%s) deletion: %s", d.Id(), err) | ||
} | ||
|
||
return nil | ||
} | ||
|
||
func flattenMediaPackageHLSIngest(h *mediapackage.HlsIngest) []map[string]interface{} { | ||
if h.IngestEndpoints == nil { | ||
return []map[string]interface{}{ | ||
{"ingest_endpoints": []map[string]interface{}{}}, | ||
} | ||
} | ||
|
||
var ingestEndpoints []map[string]interface{} | ||
for _, e := range h.IngestEndpoints { | ||
endpoint := map[string]interface{}{ | ||
"password": aws.StringValue(e.Password), | ||
"url": aws.StringValue(e.Url), | ||
"username": aws.StringValue(e.Username), | ||
} | ||
|
||
ingestEndpoints = append(ingestEndpoints, endpoint) | ||
} | ||
|
||
return []map[string]interface{}{ | ||
{"ingest_endpoints": ingestEndpoints}, | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,134 @@ | ||
package aws | ||
|
||
import ( | ||
"fmt" | ||
"regexp" | ||
"testing" | ||
|
||
"github.com/aws/aws-sdk-go/aws" | ||
"github.com/aws/aws-sdk-go/service/mediapackage" | ||
"github.com/hashicorp/terraform/helper/acctest" | ||
"github.com/hashicorp/terraform/helper/resource" | ||
"github.com/hashicorp/terraform/terraform" | ||
) | ||
|
||
func TestAccAWSMediaPackageChannel_basic(t *testing.T) { | ||
resourceName := "aws_media_package_channel.test" | ||
|
||
resource.ParallelTest(t, resource.TestCase{ | ||
PreCheck: func() { testAccPreCheck(t) }, | ||
Providers: testAccProviders, | ||
CheckDestroy: testAccCheckAwsMediaPackageChannelDestroy, | ||
Steps: []resource.TestStep{ | ||
{ | ||
Config: testAccMediaPackageChannelConfig(acctest.RandString(5)), | ||
Check: resource.ComposeTestCheckFunc( | ||
testAccCheckAwsMediaPackageChannelExists(resourceName), | ||
testAccMatchResourceAttrRegionalARN(resourceName, "arn", "mediapackage", regexp.MustCompile(`channels/.+`)), | ||
resource.TestMatchResourceAttr(resourceName, "hls_ingest.0.ingest_endpoints.0.password", regexp.MustCompile("^[0-9a-f]*$")), | ||
resource.TestMatchResourceAttr(resourceName, "hls_ingest.0.ingest_endpoints.0.url", regexp.MustCompile("^https://")), | ||
resource.TestMatchResourceAttr(resourceName, "hls_ingest.0.ingest_endpoints.0.username", regexp.MustCompile("^[0-9a-f]*$")), | ||
resource.TestMatchResourceAttr(resourceName, "hls_ingest.0.ingest_endpoints.1.password", regexp.MustCompile("^[0-9a-f]*$")), | ||
resource.TestMatchResourceAttr(resourceName, "hls_ingest.0.ingest_endpoints.1.url", regexp.MustCompile("^https://")), | ||
resource.TestMatchResourceAttr(resourceName, "hls_ingest.0.ingest_endpoints.1.username", regexp.MustCompile("^[0-9a-f]*$")), | ||
), | ||
}, | ||
{ | ||
ResourceName: resourceName, | ||
ImportState: true, | ||
ImportStateVerify: true, | ||
}, | ||
}, | ||
}) | ||
} | ||
|
||
func TestAccAWSMediaPackageChannel_description(t *testing.T) { | ||
resourceName := "aws_media_package_channel.test" | ||
rName := acctest.RandomWithPrefix("tf-acc-test") | ||
|
||
resource.ParallelTest(t, resource.TestCase{ | ||
PreCheck: func() { testAccPreCheck(t) }, | ||
Providers: testAccProviders, | ||
CheckDestroy: testAccCheckAwsMediaPackageChannelDestroy, | ||
Steps: []resource.TestStep{ | ||
{ | ||
Config: testAccMediaPackageChannelConfigDescription(rName, "description1"), | ||
Check: resource.ComposeTestCheckFunc( | ||
testAccCheckAwsMediaPackageChannelExists(resourceName), | ||
resource.TestCheckResourceAttr(resourceName, "description", "description1"), | ||
), | ||
}, | ||
{ | ||
ResourceName: resourceName, | ||
ImportState: true, | ||
ImportStateVerify: true, | ||
}, | ||
{ | ||
Config: testAccMediaPackageChannelConfigDescription(rName, "description2"), | ||
Check: resource.ComposeTestCheckFunc( | ||
testAccCheckAwsMediaPackageChannelExists(resourceName), | ||
resource.TestCheckResourceAttr(resourceName, "description", "description2"), | ||
), | ||
}, | ||
}, | ||
}) | ||
} | ||
|
||
func testAccCheckAwsMediaPackageChannelDestroy(s *terraform.State) error { | ||
conn := testAccProvider.Meta().(*AWSClient).mediapackageconn | ||
|
||
for _, rs := range s.RootModule().Resources { | ||
if rs.Type != "aws_media_package_channel" { | ||
continue | ||
} | ||
|
||
input := &mediapackage.DescribeChannelInput{ | ||
Id: aws.String(rs.Primary.ID), | ||
} | ||
|
||
_, err := conn.DescribeChannel(input) | ||
if err == nil { | ||
return fmt.Errorf("MediaPackage Channel (%s) not deleted", rs.Primary.ID) | ||
} | ||
|
||
if !isAWSErr(err, mediapackage.ErrCodeNotFoundException, "") { | ||
return err | ||
} | ||
} | ||
|
||
return nil | ||
} | ||
|
||
func testAccCheckAwsMediaPackageChannelExists(name string) resource.TestCheckFunc { | ||
return func(s *terraform.State) error { | ||
rs, ok := s.RootModule().Resources[name] | ||
if !ok { | ||
return fmt.Errorf("Not found: %s", name) | ||
} | ||
|
||
conn := testAccProvider.Meta().(*AWSClient).mediapackageconn | ||
|
||
input := &mediapackage.DescribeChannelInput{ | ||
Id: aws.String(rs.Primary.ID), | ||
} | ||
|
||
_, err := conn.DescribeChannel(input) | ||
|
||
return err | ||
} | ||
} | ||
|
||
func testAccMediaPackageChannelConfig(rName string) string { | ||
return fmt.Sprintf(` | ||
resource "aws_media_package_channel" "test" { | ||
channel_id = "tf_mediachannel_%s" | ||
}`, rName) | ||
} | ||
|
||
func testAccMediaPackageChannelConfigDescription(rName, description string) string { | ||
return fmt.Sprintf(` | ||
resource "aws_media_package_channel" "test" { | ||
channel_id = %q | ||
description = %q | ||
}`, rName, description) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.