Skip to content

Commit

Permalink
fix: allow creation of playback configuration with minimal amount of …
Browse files Browse the repository at this point in the history
…arguments

OTT-6255
  • Loading branch information
thatsddr committed Jul 22, 2024
1 parent cc27ce0 commit 6f201c4
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 78 deletions.
2 changes: 1 addition & 1 deletion awsmt/data_source_playback_configuration.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ func (d *dataSourcePlaybackConfiguration) Read(ctx context.Context, req datasour
return
}

m := putPlaybackConfigurationModelbuilder{model: &data, output: mediatailor.PutPlaybackConfigurationOutput(*playbackConfiguration)}
m := putPlaybackConfigurationModelbuilder{model: &data, output: mediatailor.PutPlaybackConfigurationOutput(*playbackConfiguration), isResource: false}

resp.Diagnostics.Append(resp.State.Set(ctx, m.getModel())...)
}
17 changes: 15 additions & 2 deletions awsmt/helpers_playback_configuration.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@ type putPlaybackConfigurationInputBuilder struct {
}

type putPlaybackConfigurationModelbuilder struct {
model *playbackConfigurationModel
output mediatailor.PutPlaybackConfigurationOutput
model *playbackConfigurationModel
output mediatailor.PutPlaybackConfigurationOutput
isResource bool
}

func (i *putPlaybackConfigurationInputBuilder) getInput() *mediatailor.PutPlaybackConfigurationInput {
Expand Down Expand Up @@ -190,6 +191,9 @@ func (m *putPlaybackConfigurationModelbuilder) addAvailSuppressionToModel() {
if m.output.AvailSuppression == nil {
return
}
if m.model.AvailSuppression == nil && m.isResource {
return
}
m.model.AvailSuppression = &availSuppressionModel{}

m.model.AvailSuppression.Mode = aws.String(string(m.output.AvailSuppression.Mode))
Expand All @@ -216,6 +220,9 @@ func (m *putPlaybackConfigurationModelbuilder) addCdnConfigurationToModel() {
if m.output.CdnConfiguration == nil {
return
}
if m.model.CdnConfiguration == nil && m.isResource {
return
}
m.model.CdnConfiguration = &cdnConfigurationModel{}
if m.output.CdnConfiguration.AdSegmentUrlPrefix != nil {
m.model.CdnConfiguration.AdSegmentUrlPrefix = m.output.CdnConfiguration.AdSegmentUrlPrefix
Expand All @@ -229,6 +236,9 @@ func (m *putPlaybackConfigurationModelbuilder) addDashConfigurationToModel() {
if m.output.DashConfiguration == nil {
return
}
if m.model.DashConfiguration == nil && m.isResource {
return
}
m.model.DashConfiguration = &dashConfigurationModel{}
m.model.DashConfiguration.ManifestEndpointPrefix = types.StringValue(*m.output.DashConfiguration.MpdLocation)
if m.output.DashConfiguration.MpdLocation != nil {
Expand All @@ -254,6 +264,9 @@ func (m *putPlaybackConfigurationModelbuilder) addManifestProcessingRulesToModel
if m.output.ManifestProcessingRules == nil || m.output.ManifestProcessingRules.AdMarkerPassthrough == nil {
return
}
if m.model.ManifestProcessingRules == nil && m.isResource {
return
}
m.model.ManifestProcessingRules = &manifestProcessingRulesModel{
AdMarkerPassthrough: &adMarkerPassthroughModel{
Enabled: m.output.ManifestProcessingRules.AdMarkerPassthrough.Enabled,
Expand Down
21 changes: 14 additions & 7 deletions awsmt/resource_playback_configuration.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
"github.com/hashicorp/terraform-plugin-framework/path"
"github.com/hashicorp/terraform-plugin-framework/resource"
"github.com/hashicorp/terraform-plugin-framework/resource/schema"
"github.com/hashicorp/terraform-plugin-framework/resource/schema/objectplanmodifier"
"github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier"
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
"github.com/hashicorp/terraform-plugin-framework/types"
)
Expand Down Expand Up @@ -73,7 +75,7 @@ func (r *resourcePlaybackConfiguration) Schema(_ context.Context, _ resource.Sch
},
},
"dash_configuration": schema.SingleNestedAttribute{
Required: true,
Optional: true,
Attributes: map[string]schema.Attribute{
"manifest_endpoint_prefix": computedStringWithStateForUnknown,
"mpd_location": schema.StringAttribute{
Expand Down Expand Up @@ -101,12 +103,17 @@ func (r *resourcePlaybackConfiguration) Schema(_ context.Context, _ resource.Sch
},
"manifest_processing_rules": schema.SingleNestedAttribute{
Optional: true,
Computed: true,
PlanModifiers: []planmodifier.Object{
objectplanmodifier.UseStateForUnknown(),
},
Attributes: map[string]schema.Attribute{
"ad_marker_passthrough": schema.SingleNestedAttribute{
Optional: true,
Attributes: map[string]schema.Attribute{
"enabled": optionalBool,
"enabled": schema.BoolAttribute{
Optional: true,
Computed: true,
},
},
},
},
Expand Down Expand Up @@ -151,7 +158,7 @@ func (r *resourcePlaybackConfiguration) Create(ctx context.Context, req resource
return
}

m := putPlaybackConfigurationModelbuilder{model: &plan, output: *playbackConfiguration}
m := putPlaybackConfigurationModelbuilder{model: &plan, output: *playbackConfiguration, isResource: true}

resp.Diagnostics.Append(resp.State.Set(ctx, m.getModel())...)
if resp.Diagnostics.HasError() {
Expand Down Expand Up @@ -179,7 +186,7 @@ func (r *resourcePlaybackConfiguration) Read(ctx context.Context, req resource.R
return
}

m := putPlaybackConfigurationModelbuilder{model: &state, output: mediatailor.PutPlaybackConfigurationOutput(*playbackConfiguration)}
m := putPlaybackConfigurationModelbuilder{model: &state, output: mediatailor.PutPlaybackConfigurationOutput(*playbackConfiguration), isResource: true}

// Set refreshed state
resp.Diagnostics.Append(resp.State.Set(ctx, m.getModel())...)
Expand Down Expand Up @@ -218,7 +225,7 @@ func (r *resourcePlaybackConfiguration) Update(ctx context.Context, req resource
err = V2UpdatesTags(r.client, playbackConfiguration.Tags, plan.Tags, *playbackConfiguration.PlaybackConfigurationArn)
if err != nil {
resp.Diagnostics.AddError(
"Error while untaging playback configuration tags"+err.Error(),
"Error while updating playback configuration tags"+err.Error(),
err.Error(),
)
}
Expand All @@ -235,7 +242,7 @@ func (r *resourcePlaybackConfiguration) Update(ctx context.Context, req resource
return
}

m := putPlaybackConfigurationModelbuilder{model: &plan, output: *playbackConfigurationUpdate}
m := putPlaybackConfigurationModelbuilder{model: &plan, output: *playbackConfigurationUpdate, isResource: true}

resp.Diagnostics.Append(resp.State.Set(ctx, m.getModel())...)
if resp.Diagnostics.HasError() {
Expand Down
173 changes: 105 additions & 68 deletions awsmt/resource_playback_configuration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,53 @@ import (
"testing"
)

func TestAccPlaybackConfigurationMinimal(t *testing.T) {
resourceName := "awsmt_playback_configuration.r2"
name := "test-acc-playback-configuration-minimal"
adUrl := "https://www.foo.de/"
videoSourceUrl := "https://www.bar.at"
adUrl2 := "https://www.biz.ch"
videoSourceUrl2 := "https://www.buzz.com"
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
Steps: []resource.TestStep{
{
Config: minimalPlaybackConfiguration(name, adUrl, videoSourceUrl),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttr(resourceName, "id", name),
resource.TestCheckResourceAttr(resourceName, "name", name),
resource.TestCheckResourceAttr(resourceName, "ad_decision_server_url", adUrl),
resource.TestCheckResourceAttr(resourceName, "video_content_source_url", videoSourceUrl),
),
},
{
Config: minimalPlaybackConfiguration(name, adUrl2, videoSourceUrl2),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttr(resourceName, "id", name),
resource.TestCheckResourceAttr(resourceName, "name", name),
resource.TestCheckResourceAttr(resourceName, "ad_decision_server_url", adUrl2),
resource.TestCheckResourceAttr(resourceName, "video_content_source_url", videoSourceUrl2),
),
},
},
})
}

func TestAccPlaybackConfigurationResource(t *testing.T) {
name := "example-playback-configuration-awsmt"
ad_url := "https://exampleurl.com/"
ad_url2 := "https://exampleurl2.com/"
bumper_e := "https://wxample.com/endbumper"
bumper_e2 := "https://wxample.com/endbumper2"
bumper_s := "https://wxample.com/startbumper"
bumper_s2 := "https://wxample.com/startbumper2"
cdn_url := "https://exampleurl.com/"
cdn_url2 := "https://exampleurl2.com/"
max_d := "2"
max_d2 := "3"
p_s := "2"
p_s2 := "3"
adUrl := "https://exampleurl.com/"
adUrl2 := "https://exampleurl2.com/"
bumperE := "https://wxample.com/endbumper"
bumperE2 := "https://wxample.com/endbumper2"
bumperS := "https://wxample.com/startbumper"
bumperS2 := "https://wxample.com/startbumper2"
cdnUrl := "https://exampleurl.com/"
cdnUrl2 := "https://exampleurl2.com/"
maxD := "2"
maxD2 := "3"
pS := "2"
pS2 := "3"
k1 := "Environment"
v1 := "dev"
k2 := "Testing"
Expand All @@ -32,23 +65,23 @@ func TestAccPlaybackConfigurationResource(t *testing.T) {
Steps: []resource.TestStep{
// Create and Read testing
{
Config: basicPlaybackConfiguration(name, ad_url, bumper_e, bumper_s, cdn_url, max_d, p_s, k1, v1, k2, v2),
Config: completePlaybackConfiguration(name, adUrl, bumperE, bumperS, cdnUrl, maxD, pS, k1, v1, k2, v2),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "id", "example-playback-configuration-awsmt"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "ad_decision_server_url", "https://exampleurl.com/"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "id", name),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "ad_decision_server_url", adUrl),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "avail_suppression.fill_policy", "FULL_AVAIL_ONLY"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "avail_suppression.mode", "BEHIND_LIVE_EDGE"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "avail_suppression.value", "00:00:00"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "bumper.end_url", "https://wxample.com/endbumper"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "bumper.start_url", "https://wxample.com/startbumper"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "cdn_configuration.ad_segment_url_prefix", "https://exampleurl.com/"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "bumper.end_url", bumperE),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "bumper.start_url", bumperS),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "cdn_configuration.ad_segment_url_prefix", cdnUrl),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "dash_configuration.mpd_location", "DISABLED"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "dash_configuration.origin_manifest_type", "SINGLE_PERIOD"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "live_pre_roll_configuration.ad_decision_server_url", "https://exampleurl.com/"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "live_pre_roll_configuration.max_duration_seconds", "2"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "live_pre_roll_configuration.max_duration_seconds", maxD),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "manifest_processing_rules.ad_marker_passthrough.enabled", "false"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "name", "example-playback-configuration-awsmt"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "personalization_threshold_seconds", "2"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "name", name),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "personalization_threshold_seconds", pS),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "slate_ad_url", "https://exampleurl.com/"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "tags.Environment", "dev"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "tags.Testing", "pass"),
Expand All @@ -62,7 +95,7 @@ func TestAccPlaybackConfigurationResource(t *testing.T) {
},
// Update and Read testing
{
Config: basicPlaybackConfiguration(name, ad_url2, bumper_e2, bumper_s2, cdn_url2, max_d2, p_s2, k3, v3, k2, v2),
Config: completePlaybackConfiguration(name, adUrl2, bumperE2, bumperS2, cdnUrl2, maxD2, pS2, k3, v3, k2, v2),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "name", "example-playback-configuration-awsmt"),
resource.TestCheckResourceAttr("awsmt_playback_configuration.r1", "personalization_threshold_seconds", "3"),
Expand All @@ -80,51 +113,55 @@ func TestAccPlaybackConfigurationResource(t *testing.T) {
})
}

func basicPlaybackConfiguration(name, ad_url, bumper_e, bumper_s, cdn_url, max_d, p_s, k1, v1, k2, v2 string) string {
return fmt.Sprintf(`resource "awsmt_playback_configuration" "r1" {
ad_decision_server_url = "%[2]s"
avail_suppression = {
fill_policy = "FULL_AVAIL_ONLY"
mode = "BEHIND_LIVE_EDGE"
value = "00:00:00"
}
bumper = {
end_url = "%[3]s"
start_url = "%[4]s"
}
cdn_configuration = {
ad_segment_url_prefix = "%[5]s"
}
dash_configuration = {
mpd_location = "DISABLED",
origin_manifest_type = "SINGLE_PERIOD"
}
live_pre_roll_configuration = {
ad_decision_server_url = "%[2]s"
max_duration_seconds = "%[6]s"
}
manifest_processing_rules = {
ad_marker_passthrough = {
enabled = "false"
}
}
name = "%[1]s"
personalization_threshold_seconds = "%[7]s"
slate_ad_url = "https://exampleurl.com/"
tags = {
"%[8]s": "%[9]s",
"%[10]s": "%[11]s"
}
video_content_source_url = "%[2]s"
}
data "awsmt_playback_configuration" "test"{
name = awsmt_playback_configuration.r1.name
}
output "playback_configuration_out" {
value = data.awsmt_playback_configuration.test
}
`, name, ad_url, bumper_e, bumper_s, cdn_url, max_d, p_s, k1, v1, k2, v2)
func minimalPlaybackConfiguration(name, adUrl, videoSourceUrl string) string {
return fmt.Sprintf(`
resource "awsmt_playback_configuration" "r2" {
ad_decision_server_url = "%[2]s"
name = "%[1]s"
video_content_source_url = "%[3]s"
}
`, name, adUrl, videoSourceUrl,
)
}

func completePlaybackConfiguration(name, adUrl, bumperE, bumperS, cdnUrl, maxD, pS, k1, v1, k2, v2 string) string {
return fmt.Sprintf(`
resource "awsmt_playback_configuration" "r1" {
ad_decision_server_url = "%[2]s"
avail_suppression = {
fill_policy = "FULL_AVAIL_ONLY"
mode = "BEHIND_LIVE_EDGE"
value = "00:00:00"
}
bumper = {
end_url = "%[3]s"
start_url = "%[4]s"
}
cdn_configuration = {
ad_segment_url_prefix = "%[5]s"
}
dash_configuration = {
mpd_location = "DISABLED",
origin_manifest_type = "SINGLE_PERIOD"
}
live_pre_roll_configuration = {
ad_decision_server_url = "%[2]s"
max_duration_seconds = "%[6]s"
}
manifest_processing_rules = {
ad_marker_passthrough = {
enabled = "false"
}
}
name = "%[1]s"
personalization_threshold_seconds = "%[7]s"
slate_ad_url = "https://exampleurl.com/"
tags = {
"%[8]s": "%[9]s",
"%[10]s": "%[11]s"
}
video_content_source_url = "%[2]s"
}
`, name, adUrl, bumperE, bumperS, cdnUrl, maxD, pS, k1, v1, k2, v2,
)
}

0 comments on commit 6f201c4

Please sign in to comment.