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

Address parallelism in okta_user_base_schema_property resource #1351

Merged
merged 8 commits into from
Nov 7, 2022
6 changes: 6 additions & 0 deletions okta/resource_okta_user_base_schema_property.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ func resourceUserBaseSchemaResourceV0() *schema.Resource {
}

func resourceUserBaseSchemaCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
oktaMutexKV.Lock(userBaseSchemaProperty)
defer oktaMutexKV.Unlock(userBaseSchemaProperty)

if err := updateUserBaseSubschema(ctx, d, m); err != nil {
return err
}
Expand All @@ -89,6 +92,9 @@ func resourceUserBaseSchemaRead(ctx context.Context, d *schema.ResourceData, m i
}

func resourceUserBaseSchemaUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
oktaMutexKV.Lock(userBaseSchemaProperty)
defer oktaMutexKV.Unlock(userBaseSchemaProperty)

if err := updateUserBaseSubschema(ctx, d, m); err != nil {
return err
}
Expand Down
96 changes: 96 additions & 0 deletions okta/resource_okta_user_base_schema_property_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,3 +146,99 @@ func testOktaUserBaseSchemasExists(name string) resource.TestCheckFunc {
return nil
}
}

// TestAccOktaUserBaseSchemaLogin_multiple_properties Test for issue 1217 fix.
// https://github.com/okta/terraform-provider-okta/issues/1217 This test would
// fail befor the fix was implemented. The fix is to put a calling mutex on
// create and update for the `okta_user_base_schema_property` resource. The Okta
// management API ignores parallel calls to `POST
// /api/v1/meta/schemas/user/{userId}` and our fix is to use a calling mutex in
// the resource to impose the equivelent of `terraform -parallelism=1`
func TestAccOktaUserBaseSchemaLogin_multiple_properties(t *testing.T) {
config := `
data "okta_user_type" "user" {
name = "user"
}
resource "okta_user_base_schema_property" "login" {
index = "login"
title = "Username"
type = "string"
required = true
master = "PROFILE_MASTER"
user_type = "${data.okta_user_type.user.id}"
pattern = ".+"
permissions = "%s"
}
resource "okta_user_base_schema_property" "firstname" {
index = "firstName"
title = "First name"
type = "string"
required = true
master = "PROFILE_MASTER"
user_type = "${data.okta_user_type.user.id}"
permissions = "%s"
}
resource "okta_user_base_schema_property" "lastname" {
index = "lastName"
title = "Last name"
type = "string"
required = true
master = "PROFILE_MASTER"
user_type = "${data.okta_user_type.user.id}"
permissions = "%s"
}
resource "okta_user_base_schema_property" "email" {
index = "email"
title = "Primary email"
type = "string"
required = true
master = "PROFILE_MASTER"
user_type = "${data.okta_user_type.user.id}"
permissions = "%s"
}
resource "okta_user_base_schema_property" "mobilephone" {
index = "mobilePhone"
title = "Mobile phone"
type = "string"
master = "PROFILE_MASTER"
user_type = "${data.okta_user_type.user.id}"
permissions = "%s"
}`
ro := make([]interface{}, 5)
for i := 0; i < 5; i++ {
ro[i] = "READ_ONLY"
}
rw := make([]interface{}, 5)
for i := 0; i < 5; i++ {
rw[i] = "READ_WRITE"
}
roConfig := fmt.Sprintf(config, ro...)
rwConfig := fmt.Sprintf(config, rw...)
resource.Test(t, resource.TestCase{
PreCheck: testAccPreCheck(t),
ErrorCheck: testAccErrorChecks(t),
ProviderFactories: testAccProvidersFactories,
Steps: []resource.TestStep{
{
Config: roConfig,
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("okta_user_base_schema_property.login", "permissions", "READ_ONLY"),
resource.TestCheckResourceAttr("okta_user_base_schema_property.firstname", "permissions", "READ_ONLY"),
resource.TestCheckResourceAttr("okta_user_base_schema_property.lastname", "permissions", "READ_ONLY"),
resource.TestCheckResourceAttr("okta_user_base_schema_property.email", "permissions", "READ_ONLY"),
resource.TestCheckResourceAttr("okta_user_base_schema_property.mobilephone", "permissions", "READ_ONLY"),
),
},
{
Config: rwConfig,
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr("okta_user_base_schema_property.login", "permissions", "READ_WRITE"),
resource.TestCheckResourceAttr("okta_user_base_schema_property.firstname", "permissions", "READ_WRITE"),
resource.TestCheckResourceAttr("okta_user_base_schema_property.lastname", "permissions", "READ_WRITE"),
resource.TestCheckResourceAttr("okta_user_base_schema_property.email", "permissions", "READ_WRITE"),
resource.TestCheckResourceAttr("okta_user_base_schema_property.mobilephone", "permissions", "READ_WRITE"),
),
},
},
})
}