-
Notifications
You must be signed in to change notification settings - Fork 9.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #20565 from aleks1001/f/aws_chime_voice_connector_…
…group Add new aws_chime_voice_connector_group resource
- Loading branch information
Showing
5 changed files
with
436 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
```release-note:new-resource | ||
aws_chime_voice_connector_group | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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.TypeSet, | ||
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 && v.(*schema.Set).Len() > 0 { | ||
input.VoiceConnectorItems = expandVoiceConnectorItems(v.(*schema.Set).List()) | ||
} | ||
|
||
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 Chime Voice Connector group (%s): %s", d.Id(), err) | ||
} | ||
|
||
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.(*schema.Set).List()) | ||
} | ||
} 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 Chime Voice Connector group (%s): %s", d.Id(), err) | ||
} | ||
|
||
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 && v.(*schema.Set).Len() > 0 { | ||
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 Chime Voice Connector group (%s): %s", d.Id(), err) | ||
} | ||
|
||
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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
Oops, something went wrong.