Skip to content

Commit

Permalink
Fixed
Browse files Browse the repository at this point in the history
  • Loading branch information
dginty4 committed Sep 2, 2024
1 parent d3b0ed9 commit ac3a52c
Show file tree
Hide file tree
Showing 3 changed files with 287 additions and 31 deletions.
73 changes: 42 additions & 31 deletions genesyscloud/routing_queue/resource_genesyscloud_routing_queue.go
Original file line number Diff line number Diff line change
Expand Up @@ -297,34 +297,9 @@ func updateQueue(ctx context.Context, d *schema.ResourceData, meta interface{})
MemberGroups: &memberGroups,
}

/*
DEVTOOLING-751: If conditional group routing rules and outbound email address are managed by their independent resource
they are being removed when the parent queue is updated since the update body does not contain them.
If the independent resources are enabled, pass in the current OEA and CGR to the update queue so they are not removed
*/
currentQueue, resp, err := routingAPI.GetRoutingQueue(d.Id())
if err != nil {
return util.BuildAPIDiagnosticError(resourceName, fmt.Sprintf("Failed to get queue %s for update, error: %s", *updateQueue.Name, err), resp)
}

if exists := featureToggles.CSGToggleExists(); !exists {
conditionalGroupRouting, diagErr := buildSdkConditionalGroupRouting(d)
if diagErr != nil {
return diagErr
}
updateQueue.ConditionalGroupRouting = conditionalGroupRouting
} else {
log.Printf("%s is set, not updating conditional_group_routing_rules attribute in routing_queue %s resource", featureToggles.CSGToggleName(), d.Id())
log.Println(currentQueue.ConditionalGroupRouting)
updateQueue.ConditionalGroupRouting = currentQueue.ConditionalGroupRouting
}

if exists := featureToggles.OEAToggleExists(); !exists {
updateQueue.OutboundEmailAddress = buildSdkQueueEmailAddress(d)
} else {
log.Printf("%s is set, not updating outbound_email_address attribute in routing_queue %s resource", featureToggles.OEAToggleName(), d.Id())
log.Println(currentQueue.OutboundMessagingAddresses)
updateQueue.OutboundMessagingAddresses = currentQueue.OutboundMessagingAddresses
diagErr := addCGRAndOEA(routingAPI, d, &updateQueue)
if diagErr != nil {
return diagErr
}

log.Printf("Updating queue %s", *updateQueue.Name)
Expand All @@ -333,13 +308,12 @@ func updateQueue(ctx context.Context, d *schema.ResourceData, meta interface{})
updateQueue.ScoringMethod = &scoringMethod
}

log.Println(updateQueue.String())
_, resp, err = routingAPI.PutRoutingQueue(d.Id(), updateQueue)
_, resp, err := routingAPI.PutRoutingQueue(d.Id(), updateQueue)
if err != nil {
return util.BuildAPIDiagnosticError(resourceName, fmt.Sprintf("Failed to update queue %s error: %s", *updateQueue.Name, err), resp)
}

diagErr := util.UpdateObjectDivision(d, "QUEUE", sdkConfig)
diagErr = util.UpdateObjectDivision(d, "QUEUE", sdkConfig)
if diagErr != nil {
return diagErr
}
Expand All @@ -358,6 +332,43 @@ func updateQueue(ctx context.Context, d *schema.ResourceData, meta interface{})
return readQueue(ctx, d, meta)
}

/*
DEVTOOLING-751: If conditional group routing rules and outbound email address are managed by their independent resource
they are being removed when the parent queue is updated since the update body does not contain them.
If the independent resources are enabled, pass in the current OEA and/or CGR to the update queue so they are not removed
*/
func addCGRAndOEA(routingAPI *platformclientv2.RoutingApi, d *schema.ResourceData, queue *platformclientv2.Queuerequest) diag.Diagnostics {
currentQueue, resp, err := routingAPI.GetRoutingQueue(d.Id())
if err != nil {
return util.BuildAPIDiagnosticError(resourceName, fmt.Sprintf("Failed to get queue %s for update, error: %s", *queue.Name, err), resp)
}

if exists := featureToggles.CSGToggleExists(); !exists {
conditionalGroupRouting, diagErr := buildSdkConditionalGroupRouting(d)
if diagErr != nil {
return diagErr
}
queue.ConditionalGroupRouting = conditionalGroupRouting
} else {
log.Printf("%s is set, not updating conditional_group_routing_rules attribute in routing_queue %s resource", featureToggles.CSGToggleName(), d.Id())
queue.ConditionalGroupRouting = currentQueue.ConditionalGroupRouting

// remove queue_id from first CGR rule to avoid api error
if len(*queue.ConditionalGroupRouting.Rules) > 0 {
(*queue.ConditionalGroupRouting.Rules)[0].Queue = nil
}
}

if exists := featureToggles.OEAToggleExists(); !exists {
queue.OutboundEmailAddress = buildSdkQueueEmailAddress(d)
} else {
log.Printf("%s is set, not updating outbound_email_address attribute in routing_queue %s resource", featureToggles.OEAToggleName(), d.Id())
queue.OutboundEmailAddress = *currentQueue.OutboundEmailAddress
}

return nil
}

func deleteQueue(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
name := d.Get("name").(string)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,136 @@ func TestAccResourceRoutingQueueConditionalGroupRouting(t *testing.T) {
})
}

func TestAccResourceRoutingQueueConditionalGroupRoutingExists(t *testing.T) {
var (
conditionalGroupRoutingResource = "test-conditional-routing-group"

queueResource = "test-queue"
queueName1 = "Terraform Test Queue-" + uuid.NewString()
queueName2 = "Terraform Test Queue-" + uuid.NewString()

skillGroupResourceId = "skillgroup"
skillGroupName = "test skillgroup " + uuid.NewString()

conditionalGroupRoutingRule1Operator = "LessThanOrEqualTo"
conditionalGroupRoutingRule1Metric = "EstimatedWaitTime"
conditionalGroupRoutingRule1ConditionValue = "0"
conditionalGroupRoutingRule1WaitSeconds = "20"
conditionalGroupRoutingRule1GroupType = "SKILLGROUP"
)

err := os.Setenv(featureToggles.CSGToggleName(), "enabled")
if err != nil {
t.Errorf("%s is not set", featureToggles.CSGToggleName())
}

resource.Test(t, resource.TestCase{
PreCheck: func() {
util.TestAccPreCheck(t)
},
ProviderFactories: provider.GetProviderFactories(providerResources, nil),
Steps: []resource.TestStep{
{
// Create rule
Config: routingSkillGroup.GenerateRoutingSkillGroupResourceBasic(
skillGroupResourceId,
skillGroupName,
"description",
) + routingQueue.GenerateRoutingQueueResourceBasic(
queueResource,
queueName1,
"skill_groups = [genesyscloud_routing_skill_group."+skillGroupResourceId+".id]",
) + generateConditionalGroupRouting(
conditionalGroupRoutingResource,
"genesyscloud_routing_queue."+queueResource+".id",
generateConditionalGroupRoutingRuleBlock(
conditionalGroupRoutingRule1Operator,
conditionalGroupRoutingRule1Metric,
conditionalGroupRoutingRule1ConditionValue,
conditionalGroupRoutingRule1WaitSeconds,
generateConditionalGroupRoutingRuleGroupBlock(
"genesyscloud_routing_skill_group."+skillGroupResourceId+".id",
conditionalGroupRoutingRule1GroupType,
),
),
),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrPair(
"genesyscloud_routing_queue_conditional_group_routing."+conditionalGroupRoutingResource, "queue_id", "genesyscloud_routing_queue."+queueResource, "id",
),
resource.TestCheckResourceAttr("genesyscloud_routing_queue_conditional_group_routing."+conditionalGroupRoutingResource, "rules.0.operator", conditionalGroupRoutingRule1Operator),
resource.TestCheckResourceAttr("genesyscloud_routing_queue_conditional_group_routing."+conditionalGroupRoutingResource, "rules.0.metric", conditionalGroupRoutingRule1Metric),
resource.TestCheckResourceAttr("genesyscloud_routing_queue_conditional_group_routing."+conditionalGroupRoutingResource, "rules.0.condition_value", conditionalGroupRoutingRule1ConditionValue),
resource.TestCheckResourceAttr("genesyscloud_routing_queue_conditional_group_routing."+conditionalGroupRoutingResource, "rules.0.wait_seconds", conditionalGroupRoutingRule1WaitSeconds),
resource.TestCheckResourceAttr("genesyscloud_routing_queue_conditional_group_routing."+conditionalGroupRoutingResource, "rules.0.groups.0.member_group_type", conditionalGroupRoutingRule1GroupType),
resource.TestCheckResourceAttrPair(
"genesyscloud_routing_queue_conditional_group_routing."+conditionalGroupRoutingResource, "rules.0.groups.0.member_group_id", "genesyscloud_routing_skill_group."+skillGroupResourceId, "id",
),
),
},
{
// Update queue
Config: routingSkillGroup.GenerateRoutingSkillGroupResourceBasic(
skillGroupResourceId,
skillGroupName,
"description",
) + routingQueue.GenerateRoutingQueueResourceBasic(
queueResource,
queueName2,
"skill_groups = [genesyscloud_routing_skill_group."+skillGroupResourceId+".id]",
) + generateConditionalGroupRouting(
conditionalGroupRoutingResource,
"genesyscloud_routing_queue."+queueResource+".id",
generateConditionalGroupRoutingRuleBlock(
conditionalGroupRoutingRule1Operator,
conditionalGroupRoutingRule1Metric,
conditionalGroupRoutingRule1ConditionValue,
conditionalGroupRoutingRule1WaitSeconds,
generateConditionalGroupRoutingRuleGroupBlock(
"genesyscloud_routing_skill_group."+skillGroupResourceId+".id",
conditionalGroupRoutingRule1GroupType,
),
),
),
Check: verifyConditionalGroupRoutingExists("genesyscloud_routing_queue." + queueResource),
},
{
// Import/Read
ResourceName: "genesyscloud_routing_queue_conditional_group_routing." + conditionalGroupRoutingResource,
ImportState: true,
ImportStateVerify: true,
Destroy: true,
},
},
CheckDestroy: func(state *terraform.State) error {
time.Sleep(40 * time.Second)
return testVerifyGroupsAndUsersDestroyed(state)
},
})
}

func verifyConditionalGroupRoutingExists(queueResourceName string) resource.TestCheckFunc {
return func(state *terraform.State) error {
queueResource, ok := state.RootModule().Resources[queueResourceName]
if !ok {
return fmt.Errorf("failed to find queue %s in state", queueResourceName)
}
queueID := queueResource.Primary.ID

routingApi := platformclientv2.NewRoutingApi()
queue, _, err := routingApi.GetRoutingQueue(queueID)
if err != nil {
return err
}

if queue.ConditionalGroupRouting == nil {
return fmt.Errorf("no conditional group routing found for queue %s %s", queueID, *queue.Name)
}

return nil
}
}

func checkQueueId(queueIdChan chan string, closeChannel bool) func(value string) error {
return func(value string) error {
queueId, ok := <-queueIdChan
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,121 @@ func TestAccResourceRoutingQueueOutboundEmailAddress(t *testing.T) {
})
}

// Ensure the OEA resource remains if we update the parent queue
func TestAccResourceRoutingQueueOutboundEmailAddressExists(t *testing.T) {
var (
outboundEmailAddressResource = "test-email-address"

queueResource = "test-queue"
queueName1 = "Terraform Test Queue-" + uuid.NewString()
queueName2 = "Terraform Test Queue-" + uuid.NewString()

domainResource = "test-domain"
domainId = fmt.Sprintf("terraform.%s.com", strings.Replace(uuid.NewString(), "-", "", -1))

routeResource = "test-route"
routePattern = "terraform1"
fromName = "John Terraform"
)

err := os.Setenv(featureToggles.OEAToggleName(), "enabled")
if err != nil {
t.Errorf("%s is not set", featureToggles.OEAToggleName())
}

cleanupRoutingEmailDomains()

resource.Test(t, resource.TestCase{
PreCheck: func() { util.TestAccPreCheck(t) },
ProviderFactories: provider.GetProviderFactories(providerResources, nil),
Steps: []resource.TestStep{
{
Config: routingQueue.GenerateRoutingQueueResourceBasic(
queueResource,
queueName1,
) + routingEmailDomain.GenerateRoutingEmailDomainResource(
domainResource,
domainId,
util.FalseValue,
util.NullValue,
) + routingEmailRoute.GenerateRoutingEmailRouteResource(
routeResource,
"genesyscloud_routing_email_domain."+domainResource+".id",
routePattern,
fromName,
) + generateRoutingQueueOutboundEmailAddressResource(
outboundEmailAddressResource,
"genesyscloud_routing_queue."+queueResource+".id",
"genesyscloud_routing_email_domain."+domainResource+".id",
"genesyscloud_routing_email_route."+routeResource+".id",
),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttrPair(
"genesyscloud_routing_queue_outbound_email_address."+outboundEmailAddressResource, "queue_id", "genesyscloud_routing_queue."+queueResource, "id",
),
resource.TestCheckResourceAttrPair(
"genesyscloud_routing_queue_outbound_email_address."+outboundEmailAddressResource, "domain_id", "genesyscloud_routing_email_domain."+domainResource, "id",
),
resource.TestCheckResourceAttrPair(
"genesyscloud_routing_queue_outbound_email_address."+outboundEmailAddressResource, "route_id", "genesyscloud_routing_email_route."+routeResource, "id",
),
),
},
// Update queue
{
Config: routingQueue.GenerateRoutingQueueResourceBasic(
queueResource,
queueName2,
) + routingEmailDomain.GenerateRoutingEmailDomainResource(
domainResource,
domainId,
util.FalseValue,
util.NullValue,
) + routingEmailRoute.GenerateRoutingEmailRouteResource(
routeResource,
"genesyscloud_routing_email_domain."+domainResource+".id",
routePattern,
fromName,
) + generateRoutingQueueOutboundEmailAddressResource(
outboundEmailAddressResource,
"genesyscloud_routing_queue."+queueResource+".id",
"genesyscloud_routing_email_domain."+domainResource+".id",
"genesyscloud_routing_email_route."+routeResource+".id",
),
Check: verifyOutboundEmailAddressExists("genesyscloud_routing_queue." + queueResource),
},
{
// Import/Read
ResourceName: "genesyscloud_routing_queue_outbound_email_address." + outboundEmailAddressResource,
ImportState: true,
ImportStateVerify: true,
},
},
})
}

func verifyOutboundEmailAddressExists(queueResourceName string) resource.TestCheckFunc {
return func(state *terraform.State) error {
queueResource, ok := state.RootModule().Resources[queueResourceName]
if !ok {
return fmt.Errorf("Failed to find queue %s in state", queueResourceName)
}
queueID := queueResource.Primary.ID

routingApi := platformclientv2.NewRoutingApi()
queue, _, err := routingApi.GetRoutingQueue(queueID)
if err != nil {
return err
}

if queue.OutboundEmailAddress == nil || *queue.OutboundEmailAddress == nil {
return fmt.Errorf("no outbound email address found for queue %s %s", queueID, *queue.Name)
}

return nil
}
}

func generateRoutingQueueOutboundEmailAddressResource(resourceId, queueId, domainId, routeId string) string {
return fmt.Sprintf(`resource "genesyscloud_routing_queue_outbound_email_address" "%s" {
queue_id = %s
Expand Down

0 comments on commit ac3a52c

Please sign in to comment.