Skip to content

Commit 4d802fe

Browse files
committed
appstream_fleet: Custom diff
1 parent c48ae9c commit 4d802fe

File tree

1 file changed

+108
-23
lines changed

1 file changed

+108
-23
lines changed

internal/service/appstream/fleet.go

+108-23
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,24 @@ import (
44
"context"
55
"fmt"
66
"log"
7+
"reflect"
78
"time"
89

910
"github.com/aws/aws-sdk-go/aws"
1011
"github.com/aws/aws-sdk-go/service/appstream"
1112
"github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr"
1213
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
14+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff"
1315
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1416
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1517
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
1618
"github.com/hashicorp/terraform-provider-aws/internal/conns"
19+
"github.com/hashicorp/terraform-provider-aws/internal/create"
1720
"github.com/hashicorp/terraform-provider-aws/internal/flex"
1821
tftags "github.com/hashicorp/terraform-provider-aws/internal/tags"
1922
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
2023
"github.com/hashicorp/terraform-provider-aws/internal/verify"
24+
"github.com/hashicorp/terraform-provider-aws/names"
2125
)
2226

2327
func ResourceFleet() *schema.Resource {
@@ -26,9 +30,16 @@ func ResourceFleet() *schema.Resource {
2630
ReadWithoutTimeout: resourceFleetRead,
2731
UpdateWithoutTimeout: resourceFleetUpdate,
2832
DeleteWithoutTimeout: resourceFleetDelete,
33+
2934
Importer: &schema.ResourceImporter{
3035
StateContext: schema.ImportStatePassthroughContext,
3136
},
37+
38+
CustomizeDiff: customdiff.Sequence(
39+
resourceFleetCustDiff,
40+
verify.SetTagsDiff,
41+
),
42+
3243
Schema: map[string]*schema.Schema{
3344
"arn": {
3445
Type: schema.TypeString,
@@ -91,10 +102,12 @@ func ResourceFleet() *schema.Resource {
91102
"directory_name": {
92103
Type: schema.TypeString,
93104
Optional: true,
105+
Computed: true,
94106
},
95107
"organizational_unit_distinguished_name": {
96108
Type: schema.TypeString,
97109
Optional: true,
110+
Computed: true,
98111
},
99112
},
100113
},
@@ -327,17 +340,25 @@ func resourceFleetRead(ctx context.Context, d *schema.ResourceData, meta interfa
327340

328341
d.Set("arn", fleet.Arn)
329342

330-
if err = d.Set("compute_capacity", flattenComputeCapacity(fleet.ComputeCapacityStatus)); err != nil {
331-
return diag.FromErr(fmt.Errorf("error setting `%s` for AppStream Fleet (%s): %w", "compute_capacity", d.Id(), err))
343+
if fleet.ComputeCapacityStatus != nil {
344+
if err = d.Set("compute_capacity", []interface{}{flattenComputeCapacity(fleet.ComputeCapacityStatus)}); err != nil {
345+
return create.DiagSettingError(names.AppStream, "Fleet", d.Id(), "compute_capacity", err)
346+
}
347+
} else {
348+
d.Set("compute_capacity", nil)
332349
}
333350

334351
d.Set("created_time", aws.TimeValue(fleet.CreatedTime).Format(time.RFC3339))
335352
d.Set("description", fleet.Description)
336353
d.Set("display_name", fleet.DisplayName)
337354
d.Set("disconnect_timeout_in_seconds", fleet.DisconnectTimeoutInSeconds)
338355

339-
if err = d.Set("domain_join_info", flattenDomainInfo(fleet.DomainJoinInfo)); err != nil {
340-
return diag.FromErr(fmt.Errorf("error setting `%s` for AppStream Fleet (%s): %w", "domain_join_info", d.Id(), err))
356+
if fleet.DomainJoinInfo != nil {
357+
if err = d.Set("domain_join_info", []interface{}{flattenDomainInfo(fleet.DomainJoinInfo)}); err != nil {
358+
return create.DiagSettingError(names.AppStream, "Fleet", d.Id(), "domain_join_info", err)
359+
}
360+
} else {
361+
d.Set("domain_join_info", nil)
341362
}
342363

343364
d.Set("idle_disconnect_timeout_in_seconds", fleet.IdleDisconnectTimeoutInSeconds)
@@ -352,8 +373,12 @@ func resourceFleetRead(ctx context.Context, d *schema.ResourceData, meta interfa
352373
d.Set("state", fleet.State)
353374
d.Set("stream_view", fleet.StreamView)
354375

355-
if err = d.Set("vpc_config", flattenVPCConfig(fleet.VpcConfig)); err != nil {
356-
return diag.FromErr(fmt.Errorf("error setting `%s` for AppStream Fleet (%s): %w", "vpc_config", d.Id(), err))
376+
if fleet.VpcConfig != nil {
377+
if err = d.Set("vpc_config", []interface{}{flattenVPCConfig(fleet.VpcConfig)}); err != nil {
378+
return create.DiagSettingError(names.AppStream, "Fleet", d.Id(), "vpc_config", err)
379+
}
380+
} else {
381+
d.Set("vpc_config", nil)
357382
}
358383

359384
tg, err := conn.ListTagsForResource(&appstream.ListTagsForResourceInput{
@@ -525,6 +550,17 @@ func resourceFleetDelete(ctx context.Context, d *schema.ResourceData, meta inter
525550
return nil
526551
}
527552

553+
func resourceFleetCustDiff(_ context.Context, diff *schema.ResourceDiff, meta interface{}) error {
554+
if diff.HasChange("domain_join_info") {
555+
o, n := diff.GetChange("domain_join_info")
556+
557+
if reflect.DeepEqual(expandDomainJoinInfo(o.([]interface{})), expandDomainJoinInfo(n.([]interface{}))) {
558+
diff.Clear("domain_join_info")
559+
}
560+
}
561+
return nil
562+
}
563+
528564
func expandComputeCapacity(tfList []interface{}) *appstream.ComputeCapacity {
529565
if len(tfList) == 0 {
530566
return nil
@@ -537,21 +573,41 @@ func expandComputeCapacity(tfList []interface{}) *appstream.ComputeCapacity {
537573
apiObject.DesiredInstances = aws.Int64(int64(v.(int)))
538574
}
539575

576+
if reflect.DeepEqual(&appstream.ComputeCapacity{}, apiObject) {
577+
return nil
578+
}
579+
540580
return apiObject
541581
}
542582

543-
func flattenComputeCapacity(apiObject *appstream.ComputeCapacityStatus) []interface{} {
583+
func flattenComputeCapacity(apiObject *appstream.ComputeCapacityStatus) map[string]interface{} {
544584
if apiObject == nil {
545585
return nil
546586
}
547587

548-
tfList := map[string]interface{}{}
549-
tfList["desired_instances"] = aws.Int64Value(apiObject.Desired)
550-
tfList["available"] = aws.Int64Value(apiObject.Available)
551-
tfList["in_use"] = aws.Int64Value(apiObject.InUse)
552-
tfList["running"] = aws.Int64Value(apiObject.Running)
588+
tfMap := map[string]interface{}{}
589+
590+
if v := apiObject.Desired; v != nil {
591+
tfMap["desired_instances"] = aws.Int64Value(v)
592+
}
593+
594+
if v := apiObject.Available; v != nil {
595+
tfMap["available"] = aws.Int64Value(v)
596+
}
597+
598+
if v := apiObject.InUse; v != nil {
599+
tfMap["in_use"] = aws.Int64Value(v)
600+
}
601+
602+
if v := apiObject.Running; v != nil {
603+
tfMap["running"] = aws.Int64Value(v)
604+
}
553605

554-
return []interface{}{tfList}
606+
if reflect.DeepEqual(map[string]interface{}{}, tfMap) {
607+
return nil
608+
}
609+
610+
return tfMap
555611
}
556612

557613
func expandDomainJoinInfo(tfList []interface{}) *appstream.DomainJoinInfo {
@@ -575,19 +631,33 @@ func expandDomainJoinInfo(tfList []interface{}) *appstream.DomainJoinInfo {
575631
apiObject.OrganizationalUnitDistinguishedName = aws.String(v.(string))
576632
}
577633

634+
if reflect.DeepEqual(&appstream.DomainJoinInfo{}, apiObject) {
635+
return nil
636+
}
637+
578638
return apiObject
579639
}
580640

581-
func flattenDomainInfo(apiObject *appstream.DomainJoinInfo) []interface{} {
641+
func flattenDomainInfo(apiObject *appstream.DomainJoinInfo) map[string]interface{} {
582642
if apiObject == nil {
583643
return nil
584644
}
585645

586-
tfList := map[string]interface{}{}
587-
tfList["directory_name"] = aws.StringValue(apiObject.DirectoryName)
588-
tfList["organizational_unit_distinguished_name"] = aws.StringValue(apiObject.OrganizationalUnitDistinguishedName)
646+
tfMap := map[string]interface{}{}
647+
648+
if v := apiObject.DirectoryName; v != nil && aws.StringValue(v) != "" {
649+
tfMap["directory_name"] = aws.StringValue(v)
650+
}
651+
652+
if v := apiObject.OrganizationalUnitDistinguishedName; v != nil && aws.StringValue(v) != "" {
653+
tfMap["organizational_unit_distinguished_name"] = aws.StringValue(v)
654+
}
655+
656+
if reflect.DeepEqual(map[string]interface{}{}, tfMap) {
657+
return nil
658+
}
589659

590-
return []interface{}{tfList}
660+
return tfMap
591661
}
592662

593663
func expandVPCConfig(tfList []interface{}) *appstream.VpcConfig {
@@ -601,21 +671,36 @@ func expandVPCConfig(tfList []interface{}) *appstream.VpcConfig {
601671
if v, ok := tfMap["security_group_ids"]; ok {
602672
apiObject.SecurityGroupIds = flex.ExpandStringList(v.([]interface{}))
603673
}
674+
604675
if v, ok := tfMap["subnet_ids"]; ok {
605676
apiObject.SubnetIds = flex.ExpandStringList(v.([]interface{}))
606677
}
607678

679+
if reflect.DeepEqual(&appstream.VpcConfig{}, apiObject) {
680+
return nil
681+
}
682+
608683
return apiObject
609684
}
610685

611-
func flattenVPCConfig(apiObject *appstream.VpcConfig) []interface{} {
686+
func flattenVPCConfig(apiObject *appstream.VpcConfig) map[string]interface{} {
612687
if apiObject == nil {
613688
return nil
614689
}
615690

616-
tfList := map[string]interface{}{}
617-
tfList["security_group_ids"] = aws.StringValueSlice(apiObject.SecurityGroupIds)
618-
tfList["subnet_ids"] = aws.StringValueSlice(apiObject.SubnetIds)
691+
tfMap := map[string]interface{}{}
692+
693+
if v := apiObject.SecurityGroupIds; v != nil {
694+
tfMap["security_group_ids"] = aws.StringValueSlice(v)
695+
}
696+
697+
if v := apiObject.SubnetIds; v != nil {
698+
tfMap["subnet_ids"] = aws.StringValueSlice(v)
699+
}
700+
701+
if reflect.DeepEqual(map[string]interface{}{}, tfMap) {
702+
return nil
703+
}
619704

620-
return []interface{}{tfList}
705+
return tfMap
621706
}

0 commit comments

Comments
 (0)