Skip to content

Commit

Permalink
Feature: AWSConnectContactFlow Resource
Browse files Browse the repository at this point in the history
  • Loading branch information
thornleyk committed Dec 21, 2020
1 parent d9854f6 commit 5755f13
Show file tree
Hide file tree
Showing 14 changed files with 1,097 additions and 0 deletions.
146 changes: 146 additions & 0 deletions aws/data_source_aws_connect_contact_flow.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
package aws

import (
"context"
"errors"
"fmt"
"log"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/connect"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags"
)

func dataSourceAwsConnectContactFlow() *schema.Resource {
return &schema.Resource{
ReadContext: dataSourceAwsConnectContactFlowRead,
Schema: map[string]*schema.Schema{
"arn": {
Type: schema.TypeString,
Computed: true,
},
"contact_flow_id": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"instance_id": {
Type: schema.TypeString,
Required: true,
},
"name": {
Type: schema.TypeString,
Optional: true,
},
"description": {
Type: schema.TypeString,
Optional: true,
},
"content": {
Type: schema.TypeString,
Optional: true,
},
"type": {
Type: schema.TypeString,
Optional: true,
},
"tags": tagsSchema(),
},
}
}

func dataSourceAwsConnectContactFlowRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*AWSClient).connectconn
ignoreTagsConfig := meta.(*AWSClient).IgnoreTagsConfig

var matchedInstance *connect.ContactFlow

contactFlowID, contactFlowIDOk := d.GetOk("contact_flow_id")
instanceID, instanceIDOk := d.GetOk("instance_id")
name, nameOk := d.GetOk("name")

if !instanceIDOk && (!contactFlowIDOk || !nameOk) {
return diag.FromErr(errors.New("error instance_id and contact_flow_id or name of must be assigned"))
}
if contactFlowIDOk {
resp, err := conn.DescribeContactFlow(&connect.DescribeContactFlowInput{
ContactFlowId: aws.String(contactFlowID.(string)),
InstanceId: aws.String(instanceID.(string)),
})
if err != nil {
return diag.FromErr(fmt.Errorf("error getting Connect Contact Flow by contact_flow_id (%s): %s", contactFlowID, err))
}
matchedInstance = resp.ContactFlow
} else if nameOk {
connectFlowSummaryList, err := dataSourceAwsConnectGetAllConnectContactFlowSummaries(ctx, conn, instanceID.(string))
if err != nil {
return diag.FromErr(fmt.Errorf("error listing Connect Contact Flows: %s", err))
}

for _, connectFlowSummary := range connectFlowSummaryList {
log.Printf("[DEBUG] Connect Contact flow summary: %s", connectFlowSummary)
if aws.StringValue(connectFlowSummary.Name) == name.(string) {
resp, err := conn.DescribeContactFlow(&connect.DescribeContactFlowInput{
ContactFlowId: connectFlowSummary.Id,
InstanceId: aws.String(instanceID.(string)),
})
if err != nil {
return diag.FromErr(fmt.Errorf("error getting Connect Contact Flow by name (%s): %s", name, err))
}
matchedInstance = resp.ContactFlow
break
}
}
}

if matchedInstance == nil {
return diag.FromErr(fmt.Errorf("error finding Connect Contact Flow by name: %s", name))
}

d.Set("arn", matchedInstance.Arn)
d.Set("instance_id", instanceID)
d.Set("contact_flow_id", matchedInstance.Id)
d.Set("name", matchedInstance.Name)
d.Set("description", matchedInstance.Description)
d.Set("content", matchedInstance.Content)
d.Set("type", matchedInstance.Type)
if err := d.Set("tags", keyvaluetags.ConnectKeyValueTags(matchedInstance.Tags).IgnoreAws().IgnoreConfig(ignoreTagsConfig).Map()); err != nil {
return diag.FromErr(fmt.Errorf("error setting tags: %s", err))
}
d.SetId(fmt.Sprintf("%s:%s", instanceID, d.Get("contact_flow_id").(string)))

return nil
}

func dataSourceAwsConnectGetAllConnectContactFlowSummaries(ctx context.Context, conn *connect.Connect, instanceID string) ([]*connect.ContactFlowSummary, error) {
var instances []*connect.ContactFlowSummary
var nextToken string

for {
input := &connect.ListContactFlowsInput{
InstanceId: aws.String(instanceID),
// MaxResults Valid Range: Minimum value of 1. Maximum value of 60
MaxResults: aws.Int64(int64(60)),
}
if nextToken != "" {
input.NextToken = aws.String(nextToken)
}

log.Printf("[DEBUG] Listing Connect Contact Flows: %s", input)

output, err := conn.ListContactFlowsWithContext(ctx, input)
if err != nil {
return instances, err
}
instances = append(instances, output.ContactFlowSummaryList...)

if output.NextToken == nil {
break
}
nextToken = aws.StringValue(output.NextToken)
}

return instances, nil
}
127 changes: 127 additions & 0 deletions aws/data_source_aws_connect_contact_flow_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package aws

import (
"fmt"
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
)

func TestAccDataSourceAwsConnectContactFlow_basic(t *testing.T) {
rInt := acctest.RandInt()
resourceName := "aws_connect_contact_flow.foo"
datasourceName := "data.aws_connect_contact_flow.foo"

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
Steps: []resource.TestStep{
{
Config: testAccAwsConnectContactFlowDataSourceConfig_basic(rInt, resourceName),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttrPair(datasourceName, "id", resourceName, "id"),
resource.TestCheckResourceAttrPair(datasourceName, "arn", resourceName, "arn"),
resource.TestCheckResourceAttrPair(datasourceName, "contact_flow_id", resourceName, "contact_flow_id"),
resource.TestCheckResourceAttrPair(datasourceName, "instance_id", resourceName, "instance_id"),
resource.TestCheckResourceAttrPair(datasourceName, "name", resourceName, "name"),
resource.TestCheckResourceAttrPair(datasourceName, "description", resourceName, "description"),
resource.TestCheckResourceAttrPair(datasourceName, "content", resourceName, "content"),
resource.TestCheckResourceAttrPair(datasourceName, "type", resourceName, "type"),
resource.TestCheckResourceAttrPair(datasourceName, "tags.%", resourceName, "tags.%"),
),
},
},
})
}

func TestAccDataSourceAwsConnectContactFlow_byname(t *testing.T) {
rInt := acctest.RandInt()
resourceName := "aws_connect_contact_flow.foo"
datasourceName := "data.aws_connect_contact_flow.foo"

resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
Steps: []resource.TestStep{
{
Config: testAccAwsConnectContactFlowDataSourceConfig_byname(rInt, resourceName),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttrPair(datasourceName, "id", resourceName, "id"),
resource.TestCheckResourceAttrPair(datasourceName, "arn", resourceName, "arn"),
resource.TestCheckResourceAttrPair(datasourceName, "contact_flow_id", resourceName, "contact_flow_id"),
resource.TestCheckResourceAttrPair(datasourceName, "instance_id", resourceName, "instance_id"),
resource.TestCheckResourceAttrPair(datasourceName, "name", resourceName, "name"),
resource.TestCheckResourceAttrPair(datasourceName, "description", resourceName, "description"),
resource.TestCheckResourceAttrPair(datasourceName, "content", resourceName, "content"),
resource.TestCheckResourceAttrPair(datasourceName, "type", resourceName, "type"),
resource.TestCheckResourceAttrPair(datasourceName, "tags.%", resourceName, "tags.%"),
),
},
},
})
}

func testAccAwsConnectContactFlowDataSourceBaseConfig(rInt int, contactFlowName string) string {
return fmt.Sprintf(`
resource "aws_connect_instance" "foo" {
instance_alias = "resource-test-terraform-%d"
}
resource "aws_connect_contact_flow" "foo" {
instance_id = aws_connect_instance.foo.id
name = "%[2]s"
description = "Test Contact Flow Description"
type = "CONTACT_FLOW"
content = <<JSON
{
"Version": "2019-10-30",
"StartAction": "12345678-1234-1234-1234-123456789012",
"Actions": [
{
"Identifier": "12345678-1234-1234-1234-123456789012",
"Type": "MessageParticipant",
"Transitions": {
"NextAction": "abcdef-abcd-abcd-abcd-abcdefghijkl",
"Errors": [],
"Conditions": []
},
"Parameters": {
"Text": "Thanks for calling the sample flow!"
}
},
{
"Identifier": "abcdef-abcd-abcd-abcd-abcdefghijkl",
"Type": "DisconnectParticipant",
"Transitions": {},
"Parameters": {}
}
]
}
JSON
tags = map(
"Name", "Test Contact Flow",
"Application", "Terraform",
"Method", "Create"
)
}
`, rInt, contactFlowName)
}

func testAccAwsConnectContactFlowDataSourceConfig_basic(rInt int, contactFlowName string) string {
return fmt.Sprintf(testAccAwsConnectContactFlowDataSourceBaseConfig(rInt, contactFlowName) + `
data "aws_connect_contact_flow" "foo" {
instance_id = aws_connect_instance.foo.id
contact_flow_id = aws_connect_contact_flow.foo.contact_flow_id
}
`)
}

func testAccAwsConnectContactFlowDataSourceConfig_byname(rInt int, contactFlowName string) string {
return fmt.Sprintf(testAccAwsConnectContactFlowDataSourceBaseConfig(rInt, contactFlowName) + `
data "aws_connect_contact_flow" "foo" {
instance_id = aws_connect_instance.foo.id
name = aws_connect_contact_flow.foo.name
}
`)
}
1 change: 1 addition & 0 deletions aws/internal/keyvaluetags/generators/servicetags/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ var mapServiceNames = []string{
"codestarnotifications",
"cognitoidentity",
"cognitoidentityprovider",
"connect",
"dataexchange",
"dlm",
"eks",
Expand Down
1 change: 1 addition & 0 deletions aws/internal/keyvaluetags/generators/updatetags/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ var serviceNames = []string{
"cognitoidentity",
"cognitoidentityprovider",
"configservice",
"connect",
"databasemigrationservice",
"dataexchange",
"datapipeline",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import (
"github.com/aws/aws-sdk-go/service/cognitoidentity"
"github.com/aws/aws-sdk-go/service/cognitoidentityprovider"
"github.com/aws/aws-sdk-go/service/configservice"
"github.com/aws/aws-sdk-go/service/connect"
"github.com/aws/aws-sdk-go/service/databasemigrationservice"
"github.com/aws/aws-sdk-go/service/dataexchange"
"github.com/aws/aws-sdk-go/service/datapipeline"
Expand Down Expand Up @@ -183,6 +184,8 @@ func ServiceClientType(serviceName string) string {
funcType = reflect.TypeOf(cognitoidentityprovider.New)
case "configservice":
funcType = reflect.TypeOf(configservice.New)
case "connect":
funcType = reflect.TypeOf(connect.New)
case "databasemigrationservice":
funcType = reflect.TypeOf(databasemigrationservice.New)
case "dataexchange":
Expand Down
10 changes: 10 additions & 0 deletions aws/internal/keyvaluetags/service_tags_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

37 changes: 37 additions & 0 deletions aws/internal/keyvaluetags/update_tags_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions aws/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ func Provider() *schema.Provider {
"aws_codeartifact_repository_endpoint": dataSourceAwsCodeArtifactRepositoryEndpoint(),
"aws_cognito_user_pools": dataSourceAwsCognitoUserPools(),
"aws_codecommit_repository": dataSourceAwsCodeCommitRepository(),
"aws_connect_contact_flow": dataSourceAwsConnectContactFlow(),
"aws_connect_instance": dataSourceAwsConnectInstance(),
"aws_cur_report_definition": dataSourceAwsCurReportDefinition(),
"aws_db_cluster_snapshot": dataSourceAwsDbClusterSnapshot(),
Expand Down Expand Up @@ -526,6 +527,7 @@ func Provider() *schema.Provider {
"aws_codepipeline": resourceAwsCodePipeline(),
"aws_codepipeline_webhook": resourceAwsCodePipelineWebhook(),
"aws_codestarnotifications_notification_rule": resourceAwsCodeStarNotificationsNotificationRule(),
"aws_connect_contact_flow": resourceAwsConnectContactFlow(),
"aws_connect_instance": resourceAwsConnectInstance(),
"aws_cur_report_definition": resourceAwsCurReportDefinition(),
"aws_customer_gateway": resourceAwsCustomerGateway(),
Expand Down
Loading

0 comments on commit 5755f13

Please sign in to comment.