Skip to content

Commit

Permalink
Fixed user test and schema for routing skill group
Browse files Browse the repository at this point in the history
  • Loading branch information
BrianMoyles committed Jul 25, 2024
1 parent 6e07b66 commit ecfa1ba
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 33 deletions.
2 changes: 1 addition & 1 deletion docs/resources/routing_skill_group.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ resource "genesyscloud_routing_skill_group" "skillgroup" {

- `description` (String) Description of the skill group
- `division_id` (String) The division to which this entity belongs
- `member_divisions` (List of String) Member divisions for this skill group.
- `member_division_ids` (List of String) The IDs of member divisions to add or remove for this skill group. An empty array means all divisions will be removed, '*' means all divisions will be added.
- `skill_conditions` (String) JSON encoded array of rules that will be used to determine group membership.

### Read-Only
Expand Down
51 changes: 48 additions & 3 deletions genesyscloud/resource_genesyscloud_user_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package genesyscloud
import (
"context"
"fmt"
"log"
"strconv"
"strings"
"terraform-provider-genesyscloud/genesyscloud/provider"
Expand Down Expand Up @@ -1185,7 +1186,11 @@ func testVerifyUsersDestroyed(state *terraform.State) error {

diagErr := util.WithRetries(context.Background(), 20*time.Second, func() *retry.RetryError {
for _, rs := range state.RootModule().Resources {
if rs.Type != resourceName {
if rs.Type != "genesyscloud_user" {
continue
}
err := checkUserDeleted(rs.Primary.ID)(state)
if err != nil {
continue
}
_, resp, err := usersAPI.GetUser(rs.Primary.ID, nil, "", "")
Expand All @@ -1194,10 +1199,10 @@ func testVerifyUsersDestroyed(state *terraform.State) error {
if util.IsStatus404(resp) {
continue
}
return retry.NonRetryableError(util.BuildWithRetriesApiDiagnosticError(resourceName, fmt.Sprintf("Unexpected error: %s", err), resp))
return retry.NonRetryableError(util.BuildWithRetriesApiDiagnosticError("genesyscloud_user", fmt.Sprintf("Unexpected error: %s", err), resp))
}

return retry.RetryableError(util.BuildWithRetriesApiDiagnosticError(resourceName, fmt.Sprintf("User (%s) still exists", rs.Primary.ID), resp))
return retry.RetryableError(util.BuildWithRetriesApiDiagnosticError("genesyscloud_user", fmt.Sprintf("User (%s) still exists", rs.Primary.ID), resp))
}
return nil
})
Expand All @@ -1210,6 +1215,46 @@ func testVerifyUsersDestroyed(state *terraform.State) error {
return nil
}

func checkUserDeleted(id string) resource.TestCheckFunc {
log.Printf("Fetching user with ID: %s\n", id)
return func(s *terraform.State) error {
maxAttempts := 30
for i := 0; i < maxAttempts; i++ {

deleted, err := isUserDeleted(id)
if err != nil {
return err
}
if deleted {
return nil
}
time.Sleep(10 * time.Second)
}
return fmt.Errorf("user %s was not deleted properly", id)
}
}

func isUserDeleted(id string) (bool, error) {
sdkConfig, _ := provider.AuthorizeSdk()
usersAPI := platformclientv2.NewUsersApiWithConfig(sdkConfig)
// Attempt to get the user
_, response, err := usersAPI.GetUser(id, nil, "", "")

// Check if the user is not found (deleted)
if response != nil && response.StatusCode == 404 {
return true, nil // User is deleted
}

// Handle other errors
if err != nil {
log.Printf("Error fetching user: %v", err)
return false, err
}

// If user is found, it means the user is not deleted
return false, nil
}

func validateUserSkill(userResourceName string, skillResourceName string, proficiency string) resource.TestCheckFunc {
return func(state *terraform.State) error {
userResource, ok := state.RootModule().Resources[userResourceName]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,19 +104,19 @@ func readSkillGroups(ctx context.Context, d *schema.ResourceData, meta interface
_ = d.Set("skill_conditions", nil)
}

// Set member_divisions avoiding plan not empty error
// Set member_division_ids avoiding plan not empty error
memberDivIds, diagErr := readSkillGroupMemberDivisions(ctx, d, meta)
if diagErr != nil {
return retry.NonRetryableError(fmt.Errorf("%v", diagErr))
}

var schemaMemberDivisionIds []string
if divIds, ok := d.Get("member_divisions").([]interface{}); ok {
if divIds, ok := d.Get("member_division_ids").([]interface{}); ok {
schemaMemberDivisionIds = lists.InterfaceListToStrings(divIds)
}

memberDivisionIds := organizeMemberDivisionIdsForRead(schemaMemberDivisionIds, memberDivIds, *skillGroup.Division.Id)
_ = d.Set("member_divisions", memberDivisionIds)
_ = d.Set("member_division_ids", memberDivisionIds)

log.Printf("Read skill groups name %s %s", d.Id(), *skillGroup.Name)
return cc.CheckState(d)
Expand Down Expand Up @@ -186,7 +186,7 @@ func deleteSkillGroups(ctx context.Context, d *schema.ResourceData, meta interfa
func createRoutingSkillGroupsMemberDivisions(ctx context.Context, d *schema.ResourceData, meta interface{}, skillGroupDivisionIds []string, create bool) diag.Diagnostics {
sdkConfig := meta.(*provider.ProviderMeta).ClientConfig
proxy := getRoutingSkillGroupsProxy(sdkConfig)
memberDivIds := d.Get("member_divisions").([]interface{})
memberDivIds := d.Get("member_division_ids").([]interface{})
var reqBody platformclientv2.Skillgroupmemberdivisions

if memberDivIds == nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ func SetRegistrar(regInstance registrar.Registrar) {
regInstance.RegisterExporter(resourceName, ResourceSkillGroupExporter())
}


func ResourceRoutingSkillGroup() *schema.Resource {
return &schema.Resource{
Description: `Genesys Cloud Skill Group`,
Expand Down Expand Up @@ -55,8 +54,8 @@ func ResourceRoutingSkillGroup() *schema.Resource {
Computed: true,
DiffSuppressFunc: util.SuppressEquivalentJsonDiffs,
},
"member_divisions": {
Description: "Member divisions for this skill group.",
"member_division_ids": {
Description: "The IDs of member divisions to add or remove for this skill group. An empty array means all divisions will be removed, '*' means all divisions will be added.",
Type: schema.TypeList,
MaxItems: 50,
Optional: true,
Expand Down Expand Up @@ -84,8 +83,8 @@ func ResourceSkillGroupExporter() *resourceExporter.ResourceExporter {
return &resourceExporter.ResourceExporter{
GetResourcesFunc: provider.GetAllWithPooledClient(getAllRoutingSkillGroups),
RefAttrs: map[string]*resourceExporter.RefAttrSettings{
"division_id": {RefType: "genesyscloud_auth_division"},
"member_divisions": {RefType: "genesyscloud_auth_division"},
"division_id": {RefType: "genesyscloud_auth_division"},
"member_division_ids": {RefType: "genesyscloud_auth_division"},
},
RemoveIfMissing: map[string][]string{
"division_id": {"division_id"},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -311,8 +311,8 @@ data "genesyscloud_auth_division_home" "home" {}
testAccCheckSkillConditions("genesyscloud_routing_skill_group."+skillGroupResource, skillCondition1),
provider.TestDefaultHomeDivision("genesyscloud_routing_skill_group."+skillGroupResource),

resource.TestCheckResourceAttr("genesyscloud_routing_skill_group."+skillGroupResource, "member_divisions.#", "1"),
util.ValidateResourceAttributeInArray("genesyscloud_routing_skill_group."+skillGroupResource, "member_divisions",
resource.TestCheckResourceAttr("genesyscloud_routing_skill_group."+skillGroupResource, "member_division_ids.#", "1"),
util.ValidateResourceAttributeInArray("genesyscloud_routing_skill_group."+skillGroupResource, "member_division_ids",
"data.genesyscloud_auth_division_home.home", "id"),
),
},
Expand All @@ -324,12 +324,12 @@ data "genesyscloud_auth_division_home" "home" {}
testAccCheckSkillConditions("genesyscloud_routing_skill_group."+skillGroupResource, skillCondition2),
provider.TestDefaultHomeDivision("genesyscloud_routing_skill_group."+skillGroupResource),

resource.TestCheckResourceAttr("genesyscloud_routing_skill_group."+skillGroupResource, "member_divisions.#", "3"),
util.ValidateResourceAttributeInArray("genesyscloud_routing_skill_group."+skillGroupResource, "member_divisions",
resource.TestCheckResourceAttr("genesyscloud_routing_skill_group."+skillGroupResource, "member_division_ids.#", "3"),
util.ValidateResourceAttributeInArray("genesyscloud_routing_skill_group."+skillGroupResource, "member_division_ids",
"data.genesyscloud_auth_division_home.home", "id"),
util.ValidateResourceAttributeInArray("genesyscloud_routing_skill_group."+skillGroupResource, "member_divisions",
util.ValidateResourceAttributeInArray("genesyscloud_routing_skill_group."+skillGroupResource, "member_division_ids",
"genesyscloud_auth_division."+authDivision1Resource, "id"),
util.ValidateResourceAttributeInArray("genesyscloud_routing_skill_group."+skillGroupResource, "member_divisions",
util.ValidateResourceAttributeInArray("genesyscloud_routing_skill_group."+skillGroupResource, "member_division_ids",
"genesyscloud_auth_division."+authDivision2Resource, "id"),
),
},
Expand All @@ -341,10 +341,10 @@ data "genesyscloud_auth_division_home" "home" {}
testAccCheckSkillConditions("genesyscloud_routing_skill_group."+skillGroupResource, skillCondition2),
provider.TestDefaultHomeDivision("genesyscloud_routing_skill_group."+skillGroupResource),

resource.TestCheckResourceAttr("genesyscloud_routing_skill_group."+skillGroupResource, "member_divisions.#", "2"),
util.ValidateResourceAttributeInArray("genesyscloud_routing_skill_group."+skillGroupResource, "member_divisions",
resource.TestCheckResourceAttr("genesyscloud_routing_skill_group."+skillGroupResource, "member_division_ids.#", "2"),
util.ValidateResourceAttributeInArray("genesyscloud_routing_skill_group."+skillGroupResource, "member_division_ids",
"data.genesyscloud_auth_division_home.home", "id"),
util.ValidateResourceAttributeInArray("genesyscloud_routing_skill_group."+skillGroupResource, "member_divisions",
util.ValidateResourceAttributeInArray("genesyscloud_routing_skill_group."+skillGroupResource, "member_division_ids",
"genesyscloud_auth_division."+authDivision1Resource, "id"),
),
},
Expand All @@ -357,7 +357,7 @@ data "genesyscloud_auth_division_home" "home" {}
testAccCheckSkillConditions("genesyscloud_routing_skill_group."+skillGroupResource, skillCondition2),
provider.TestDefaultHomeDivision("genesyscloud_routing_skill_group."+skillGroupResource),

resource.TestCheckResourceAttr("genesyscloud_routing_skill_group."+skillGroupResource, "member_divisions.#", "0"),
resource.TestCheckResourceAttr("genesyscloud_routing_skill_group."+skillGroupResource, "member_division_ids.#", "0"),
testVerifyMemberDivisionsCleared("genesyscloud_routing_skill_group."+skillGroupResource),
),
},
Expand All @@ -370,16 +370,16 @@ data "genesyscloud_auth_division_home" "home" {}
testAccCheckSkillConditions("genesyscloud_routing_skill_group."+skillGroupResource, skillCondition2),
provider.TestDefaultHomeDivision("genesyscloud_routing_skill_group."+skillGroupResource),

resource.TestCheckResourceAttr("genesyscloud_routing_skill_group."+skillGroupResource, "member_divisions.#", "1"),
resource.TestCheckResourceAttr("genesyscloud_routing_skill_group."+skillGroupResource, "member_divisions.0", "*"),
testVerifyAllDivisionsAssigned("genesyscloud_routing_skill_group."+skillGroupResource, "member_divisions"),
resource.TestCheckResourceAttr("genesyscloud_routing_skill_group."+skillGroupResource, "member_division_ids.#", "1"),
resource.TestCheckResourceAttr("genesyscloud_routing_skill_group."+skillGroupResource, "member_division_ids.0", "*"),
testVerifyAllDivisionsAssigned("genesyscloud_routing_skill_group."+skillGroupResource, "member_division_ids"),
),
},
{
ResourceName: "genesyscloud_routing_skill_group." + skillGroupResource,
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"member_divisions"},
ImportStateVerifyIgnore: []string{"member_division_ids"},
},
},
CheckDestroy: testVerifySkillGroupDestroyed,
Expand Down Expand Up @@ -469,7 +469,7 @@ resource "genesyscloud_user" "%s" {
skillGroupResource := fmt.Sprintf(`
resource "genesyscloud_routing_skill_group" "%s" {
name = "%s"
member_divisions = [%s]
member_division_ids = [%s]
description = "%s"
skill_conditions = jsonencode(
[
Expand Down Expand Up @@ -520,7 +520,7 @@ resource "genesyscloud_routing_skill_group" "%s" {
ResourceName: "genesyscloud_routing_skill_group." + skillGroupResourceId,
ImportState: true,
ImportStateVerify: true,
ImportStateVerifyIgnore: []string{"member_divisions"},
ImportStateVerifyIgnore: []string{"member_division_ids"},
Destroy: true,
},
},
Expand All @@ -542,7 +542,7 @@ func generateRoutingSkillGroupResource(
description="%s"
division_id=%s
skill_conditions = jsonencode(%s)
member_divisions = %s
member_division_ids = %s
}
`, resourceID, divisionResourceName, name, description, divisionID, skillCondition, memberDivisionIds)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

// Prepare member_divisions list to avoid an unnecessary plan not empty error
// Prepare member_division_ids list to avoid an unnecessary plan not empty error
func organizeMemberDivisionIdsForUpdate(schemaIds, apiIds []string) ([]string, []string) {
toAdd := make([]string, 0)
toRemove := make([]string, 0)
Expand All @@ -30,7 +30,7 @@ func organizeMemberDivisionIdsForUpdate(schemaIds, apiIds []string) ([]string, [
return toAdd, toRemove
}

// Prepare member_divisions list to avoid an unnecessary plan not empty error
// Prepare member_division_ids list to avoid an unnecessary plan not empty error
func organizeMemberDivisionIdsForRead(schemaList, apiList []string, divisionId string) []string {
if !lists.ItemInSlice(divisionId, schemaList) {
apiList = lists.RemoveStringFromSlice(divisionId, apiList)
Expand Down Expand Up @@ -96,7 +96,7 @@ func createListsForSkillgroupsMembersDivisions(schemaMemberDivisionIds []string,

if allMemberDivisionsSpecified(schemaMemberDivisionIds) {
if len(schemaMemberDivisionIds) > 1 {
return nil, nil, util.BuildDiagnosticError(resourceName, fmt.Sprintf(`member_divisions should not contain more than one item when the value of an item is "*"`), fmt.Errorf(`member_divisions should not contain more than one item when the value of an item is "*"`))
return nil, nil, util.BuildDiagnosticError(resourceName, fmt.Sprintf(`member_division_ids should not contain more than one item when the value of an item is "*"`), fmt.Errorf(`member_division_ids should not contain more than one item when the value of an item is "*"`))
}
toAdd, err := getAllAuthDivisionIds(meta)
return toAdd, nil, err
Expand Down

0 comments on commit ecfa1ba

Please sign in to comment.