Skip to content

Commit

Permalink
Merge pull request #6957 from sjauld/f/media-package-channel
Browse files Browse the repository at this point in the history
Added MediaPackage Channel resource
  • Loading branch information
bflad authored Jan 8, 2019
2 parents 5240de6 + edbc7f0 commit 9d52431
Show file tree
Hide file tree
Showing 6 changed files with 380 additions and 0 deletions.
3 changes: 3 additions & 0 deletions aws/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ import (
"github.com/aws/aws-sdk-go/service/licensemanager"
"github.com/aws/aws-sdk-go/service/lightsail"
"github.com/aws/aws-sdk-go/service/macie"
"github.com/aws/aws-sdk-go/service/mediapackage"
"github.com/aws/aws-sdk-go/service/mediastore"
"github.com/aws/aws-sdk-go/service/mq"
"github.com/aws/aws-sdk-go/service/neptune"
Expand Down Expand Up @@ -253,6 +254,7 @@ type AWSClient struct {
glueconn *glue.Glue
athenaconn *athena.Athena
dxconn *directconnect.DirectConnect
mediapackageconn *mediapackage.MediaPackage
mediastoreconn *mediastore.MediaStore
appsyncconn *appsync.AppSync
lexmodelconn *lexmodelbuildingservice.LexModelBuildingService
Expand Down Expand Up @@ -592,6 +594,7 @@ func (c *Config) Client() (interface{}, error) {
client.glueconn = glue.New(sess)
client.athenaconn = athena.New(sess)
client.dxconn = directconnect.New(sess)
client.mediapackageconn = mediapackage.New(sess)
client.mediastoreconn = mediastore.New(sess)
client.appsyncconn = appsync.New(sess)
client.neptuneconn = neptune.New(sess)
Expand Down
1 change: 1 addition & 0 deletions aws/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -546,6 +546,7 @@ func Provider() terraform.ResourceProvider {
"aws_main_route_table_association": resourceAwsMainRouteTableAssociation(),
"aws_mq_broker": resourceAwsMqBroker(),
"aws_mq_configuration": resourceAwsMqConfiguration(),
"aws_media_package_channel": resourceAwsMediaPackageChannel(),
"aws_media_store_container": resourceAwsMediaStoreContainer(),
"aws_media_store_container_policy": resourceAwsMediaStoreContainerPolicy(),
"aws_nat_gateway": resourceAwsNatGateway(),
Expand Down
182 changes: 182 additions & 0 deletions aws/resource_aws_media_package_channel.go
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},
}
}
134 changes: 134 additions & 0 deletions aws/resource_aws_media_package_channel_test.go
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)
}
11 changes: 11 additions & 0 deletions website/aws.erb
Original file line number Diff line number Diff line change
Expand Up @@ -1732,6 +1732,17 @@
</ul>
</li>

<li<%= sidebar_current("docs-aws-resource-media-package") %>>
<a href="#">MediaPackage Resources</a>
<ul class="nav nav-visible">

<li<%= sidebar_current("docs-aws-resource-media-package-channel") %>>
<a href="/docs/providers/aws/r/media_package_channel.html">aws_media_package_channel</a>
</li>

</ul>
</li>

<li<%= sidebar_current("docs-aws-resource-media-store") %>>
<a href="#">MediaStore Resources</a>
<ul class="nav nav-visible">
Expand Down
Loading

0 comments on commit 9d52431

Please sign in to comment.