Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new aws_chime_voice_connector_group resource #20565

Merged
merged 5 commits into from
Aug 19, 2021
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .changelog/20565.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:new-resource
aws_chime_voice_connector_group
```
1 change: 1 addition & 0 deletions aws/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -549,6 +549,7 @@ func Provider() *schema.Provider {
"aws_budgets_budget": resourceAwsBudgetsBudget(),
"aws_budgets_budget_action": resourceAwsBudgetsBudgetAction(),
"aws_chime_voice_connector": resourceAwsChimeVoiceConnector(),
"aws_chime_voice_connector_group": resourceAwsChimeVoiceConnectorGroup(),
"aws_cloud9_environment_ec2": resourceAwsCloud9EnvironmentEc2(),
"aws_cloudformation_stack": resourceAwsCloudFormationStack(),
"aws_cloudformation_stack_set": resourceAwsCloudFormationStackSet(),
Expand Down
177 changes: 177 additions & 0 deletions aws/resource_aws_chime_voice_connector_group.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
package aws

import (
"context"
"log"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/chime"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)

func resourceAwsChimeVoiceConnectorGroup() *schema.Resource {
return &schema.Resource{
CreateContext: resourceAwsChimeVoiceConnectorGroupCreate,
ReadContext: resourceAwsChimeVoiceConnectorGroupRead,
UpdateContext: resourceAwsChimeVoiceConnectorGroupUpdate,
DeleteContext: resourceAwsChimeVoiceConnectorGroupDelete,

Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},

Schema: map[string]*schema.Schema{
"connector": {
Type: schema.TypeList,
aleks1001 marked this conversation as resolved.
Show resolved Hide resolved
Optional: true,
MaxItems: 3,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"voice_connector_id": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringLenBetween(1, 256),
},
"priority": {
Type: schema.TypeInt,
Required: true,
ValidateFunc: validation.IntBetween(1, 99),
},
},
},
},
"name": {
Type: schema.TypeString,
Required: true,
ValidateFunc: validation.StringLenBetween(1, 256),
},
},
}
}

func resourceAwsChimeVoiceConnectorGroupCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*AWSClient).chimeconn

input := &chime.CreateVoiceConnectorGroupInput{
Name: aws.String(d.Get("name").(string)),
}

if v, ok := d.GetOk("connector"); ok && len(v.([]interface{})) > 0 {
input.VoiceConnectorItems = expandVoiceConnectorItems(v.([]interface{}))
}

resp, err := conn.CreateVoiceConnectorGroupWithContext(ctx, input)
if err != nil || resp.VoiceConnectorGroup == nil {
return diag.Errorf("error creating Chime Voice connector group: %s", err)
}

d.SetId(aws.StringValue(resp.VoiceConnectorGroup.VoiceConnectorGroupId))

return resourceAwsChimeVoiceConnectorGroupRead(ctx, d, meta)
}

func resourceAwsChimeVoiceConnectorGroupRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*AWSClient).chimeconn

getInput := &chime.GetVoiceConnectorGroupInput{
VoiceConnectorGroupId: aws.String(d.Id()),
}

resp, err := conn.GetVoiceConnectorGroupWithContext(ctx, getInput)
if !d.IsNewResource() && isAWSErr(err, chime.ErrCodeNotFoundException, "") {
log.Printf("[WARN] Chime Voice conector group %s not found", d.Id())
d.SetId("")
return nil
}
if err != nil || resp.VoiceConnectorGroup == nil {
return diag.Errorf("error getting Voice connector group (%s): %s", d.Id(), err)
aleks1001 marked this conversation as resolved.
Show resolved Hide resolved
}

d.Set("name", resp.VoiceConnectorGroup.Name)

if err := d.Set("connector", flattenVoiceConnectorItems(resp.VoiceConnectorGroup.VoiceConnectorItems)); err != nil {
return diag.Errorf("error setting Chime Voice connector group items (%s): %s", d.Id(), err)
}
return nil
}

func resourceAwsChimeVoiceConnectorGroupUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*AWSClient).chimeconn

input := &chime.UpdateVoiceConnectorGroupInput{
Name: aws.String(d.Get("name").(string)),
VoiceConnectorGroupId: aws.String(d.Id()),
}

if d.HasChange("connector") {
if v, ok := d.GetOk("connector"); ok {
input.VoiceConnectorItems = expandVoiceConnectorItems(v.([]interface{}))
}
} else if !d.IsNewResource() {
input.VoiceConnectorItems = make([]*chime.VoiceConnectorItem, 0)
}

if _, err := conn.UpdateVoiceConnectorGroupWithContext(ctx, input); err != nil {
if isAWSErr(err, chime.ErrCodeNotFoundException, "") {
log.Printf("[WARN] Chime Voice conector group %s not found", d.Id())
d.SetId("")
return nil
}
return diag.Errorf("error updating Voice connector group (%s): %s", d.Id(), err)
aleks1001 marked this conversation as resolved.
Show resolved Hide resolved
}

return resourceAwsChimeVoiceConnectorGroupRead(ctx, d, meta)
}

func resourceAwsChimeVoiceConnectorGroupDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
conn := meta.(*AWSClient).chimeconn

if v, ok := d.GetOk("connector"); ok && len(v.([]interface{})) > 0 {
bill-rich marked this conversation as resolved.
Show resolved Hide resolved
if err := resourceAwsChimeVoiceConnectorGroupUpdate(ctx, d, meta); err != nil {
return err
}
}

input := &chime.DeleteVoiceConnectorGroupInput{
VoiceConnectorGroupId: aws.String(d.Id()),
}

if _, err := conn.DeleteVoiceConnectorGroupWithContext(ctx, input); err != nil {
if isAWSErr(err, chime.ErrCodeNotFoundException, "") {
log.Printf("[WARN] Chime Voice conector group %s not found", d.Id())
return nil
}
return diag.Errorf("error deleting Voice connector group (%s): %s", d.Id(), err)
aleks1001 marked this conversation as resolved.
Show resolved Hide resolved
}

return nil
}

func expandVoiceConnectorItems(data []interface{}) []*chime.VoiceConnectorItem {
var connectorsItems []*chime.VoiceConnectorItem

for _, rItem := range data {
item := rItem.(map[string]interface{})
connectorsItems = append(connectorsItems, &chime.VoiceConnectorItem{
VoiceConnectorId: aws.String(item["voice_connector_id"].(string)),
Priority: aws.Int64(int64(item["priority"].(int))),
})
}

return connectorsItems
}

func flattenVoiceConnectorItems(connectors []*chime.VoiceConnectorItem) []interface{} {
var rawConnectors []interface{}

for _, c := range connectors {
rawC := map[string]interface{}{
"priority": aws.Int64Value(c.Priority),
"voice_connector_id": aws.StringValue(c.VoiceConnectorId),
}
rawConnectors = append(rawConnectors, rawC)
}
return rawConnectors
}
184 changes: 184 additions & 0 deletions aws/resource_aws_chime_voice_connector_group_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
package aws

import (
"fmt"
"testing"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/chime"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
)

func TestAccAWSChimeVoiceConnectorGroup_basic(t *testing.T) {
var voiceConnectorGroup *chime.VoiceConnectorGroup

vcgName := acctest.RandomWithPrefix("tf-acc-test")
resourceName := "aws_chime_voice_connector_group.test"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ErrorCheck: testAccErrorCheck(t, chime.EndpointsID),
Providers: testAccProviders,
CheckDestroy: testAccCheckAWSChimeVoiceConnectorGroupDestroy,
Steps: []resource.TestStep{
{
Config: testAccAWSChimeVoiceConnectorGroupConfig(vcgName),
Check: resource.ComposeAggregateTestCheckFunc(
testAccCheckAWSChimeVoiceConnectorGroupExists(resourceName, voiceConnectorGroup),
resource.TestCheckResourceAttr(resourceName, "name", fmt.Sprintf("vcg-%s", vcgName)),
resource.TestCheckResourceAttr(resourceName, "connector.#", "1"),
resource.TestCheckResourceAttr(resourceName, "connector.0.priority", "1"),
),
},
{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}

func TestAccAWSChimeVoiceConnectorGroup_disappears(t *testing.T) {
var voiceConnectorGroup *chime.VoiceConnectorGroup

vcgName := acctest.RandomWithPrefix("tf-acc-test")
resourceName := "aws_chime_voice_connector_group.test"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ErrorCheck: testAccErrorCheck(t, chime.EndpointsID),
Providers: testAccProviders,
CheckDestroy: testAccCheckAWSChimeVoiceConnectorGroupDestroy,
Steps: []resource.TestStep{
{
Config: testAccAWSChimeVoiceConnectorGroupConfig(vcgName),
Check: resource.ComposeTestCheckFunc(
testAccCheckAWSChimeVoiceConnectorGroupExists(resourceName, voiceConnectorGroup),
testAccCheckResourceDisappears(testAccProvider, resourceAwsChimeVoiceConnectorGroup(), resourceName),
),
ExpectNonEmptyPlan: true,
},
},
})
}

func TestAccAWSChimeVoiceConnectorGroup_update(t *testing.T) {
var voiceConnectorGroup *chime.VoiceConnectorGroup

vcgName := acctest.RandomWithPrefix("tf-acc-test")
resourceName := "aws_chime_voice_connector_group.test"

resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ErrorCheck: testAccErrorCheck(t, chime.EndpointsID),
Providers: testAccProviders,
CheckDestroy: testAccCheckAWSChimeVoiceConnectorGroupDestroy,
Steps: []resource.TestStep{
{
Config: testAccAWSChimeVoiceConnectorGroupConfig(vcgName),
Check: resource.ComposeAggregateTestCheckFunc(
testAccCheckAWSChimeVoiceConnectorGroupExists(resourceName, voiceConnectorGroup),
resource.TestCheckResourceAttr(resourceName, "name", fmt.Sprintf("vcg-%s", vcgName)),
resource.TestCheckResourceAttr(resourceName, "connector.#", "1"),
),
},
{
Config: testAccAWSChimeVoiceConnectorGroupUpdated(vcgName),
Check: resource.ComposeAggregateTestCheckFunc(
resource.TestCheckResourceAttr(resourceName, "name", fmt.Sprintf("vcg-updated-%s", vcgName)),
resource.TestCheckResourceAttr(resourceName, "connector.0.priority", "10"),
),
},
{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
},
},
})
}

func testAccAWSChimeVoiceConnectorGroupConfig(name string) string {
return fmt.Sprintf(`
resource "aws_chime_voice_connector" "chime" {
name = "vc-%[1]s"
require_encryption = true
}

resource "aws_chime_voice_connector_group" "test" {
name = "vcg-%[1]s"

connector {
voice_connector_id = aws_chime_voice_connector.chime.id
priority = 1
}
}
`, name)
}

func testAccAWSChimeVoiceConnectorGroupUpdated(name string) string {
return fmt.Sprintf(`
resource "aws_chime_voice_connector" "chime" {
name = "vc-%[1]s"
require_encryption = false
}

resource "aws_chime_voice_connector_group" "test" {
name = "vcg-updated-%[1]s"

connector {
voice_connector_id = aws_chime_voice_connector.chime.id
priority = 10
}
}
`, name)
}

func testAccCheckAWSChimeVoiceConnectorGroupExists(name string, vc *chime.VoiceConnectorGroup) resource.TestCheckFunc {
return func(s *terraform.State) error {
rs, ok := s.RootModule().Resources[name]
if !ok {
return fmt.Errorf("not found: %s", name)
}

if rs.Primary.ID == "" {
return fmt.Errorf("no Chime voice connector group ID is set")
}

conn := testAccProvider.Meta().(*AWSClient).chimeconn
input := &chime.GetVoiceConnectorGroupInput{
VoiceConnectorGroupId: aws.String(rs.Primary.ID),
}

resp, err := conn.GetVoiceConnectorGroup(input)
if err != nil || resp.VoiceConnectorGroup == nil {
return err
}

vc = resp.VoiceConnectorGroup
return nil
}
}

func testAccCheckAWSChimeVoiceConnectorGroupDestroy(s *terraform.State) error {
for _, rs := range s.RootModule().Resources {
if rs.Type != "aws_chime_voice_connector" {
continue
}
conn := testAccProvider.Meta().(*AWSClient).chimeconn
input := &chime.GetVoiceConnectorGroupInput{
VoiceConnectorGroupId: aws.String(rs.Primary.ID),
}
resp, err := conn.GetVoiceConnectorGroup(input)
if err == nil {
if resp.VoiceConnectorGroup != nil && aws.StringValue(resp.VoiceConnectorGroup.Name) != "" {
return fmt.Errorf("error Chime Voice Connector still exists")
}
}
return nil
}
return nil
}
Loading