Skip to content

Commit

Permalink
DXCDT-463: Mutex standardization (#627)
Browse files Browse the repository at this point in the history
* Using static ID value instead of dynamic TF ID

* Standardizing usage of mutexs

* Removing redundant mutex locks

* Removing suffix

---------

Co-authored-by: Will Vedder <[email protected]>
  • Loading branch information
willvedd and willvedd authored Jun 14, 2023
1 parent 7be6716 commit a130e1c
Show file tree
Hide file tree
Showing 18 changed files with 39 additions and 177 deletions.
8 changes: 4 additions & 4 deletions internal/auth0/connection/resource_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,11 @@ func NewClientResource() *schema.Resource {

func createConnectionClient(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
api := meta.(*config.Config).GetAPI()
mutex := meta.(*config.Config).GetMutex()

connectionID := data.Get("connection_id").(string)

mutex.Lock(connectionID)
mutex := meta.(*config.Config).GetMutex()
mutex.Lock(connectionID) // Prevents colliding API requests between other `auth0_connection_client` resource.
defer mutex.Unlock(connectionID)

connection, err := api.Connection.Read(connectionID)
Expand Down Expand Up @@ -115,11 +115,11 @@ func readConnectionClient(_ context.Context, data *schema.ResourceData, meta int

func deleteConnectionClient(_ context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
api := meta.(*config.Config).GetAPI()
mutex := meta.(*config.Config).GetMutex()

connectionID := data.Get("connection_id").(string)

mutex.Lock(connectionID)
mutex := meta.(*config.Config).GetMutex()
mutex.Lock(connectionID) // Prevents colliding API requests between other `auth0_connection_client` resource.
defer mutex.Unlock(connectionID)

connection, err := api.Connection.Read(connectionID)
Expand Down
12 changes: 0 additions & 12 deletions internal/auth0/connection/resource_clients.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,9 @@ func NewClientsResource() *schema.Resource {

func createConnectionClients(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
api := meta.(*config.Config).GetAPI()
mutex := meta.(*config.Config).GetMutex()

connectionID := data.Get("connection_id").(string)

mutex.Lock(connectionID)
defer mutex.Unlock(connectionID)

connection, err := api.Connection.Read(
connectionID,
management.IncludeFields("enabled_clients", "strategy", "name"),
Expand Down Expand Up @@ -127,10 +123,6 @@ func readConnectionClients(_ context.Context, data *schema.ResourceData, meta in

func updateConnectionClients(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
api := meta.(*config.Config).GetAPI()
mutex := meta.(*config.Config).GetMutex()

mutex.Lock(data.Id())
defer mutex.Unlock(data.Id())

if err := api.Connection.Update(
data.Id(),
Expand All @@ -149,10 +141,6 @@ func updateConnectionClients(ctx context.Context, data *schema.ResourceData, met

func deleteConnectionClients(_ context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
api := meta.(*config.Config).GetAPI()
mutex := meta.(*config.Config).GetMutex()

mutex.Lock(data.Id())
defer mutex.Unlock(data.Id())

enabledClients := make([]string, 0)

Expand Down
12 changes: 0 additions & 12 deletions internal/auth0/organization/resource_connection.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,9 @@ func NewConnectionResource() *schema.Resource {

func createOrganizationConnection(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
api := meta.(*config.Config).GetAPI()
mutex := meta.(*config.Config).GetMutex()

organizationID := data.Get("organization_id").(string)

mutex.Lock(organizationID)
defer mutex.Unlock(organizationID)

connectionID := data.Get("connection_id").(string)
assignMembershipOnLogin := data.Get("assign_membership_on_login").(bool)

Expand Down Expand Up @@ -109,13 +105,9 @@ func readOrganizationConnection(_ context.Context, data *schema.ResourceData, me

func updateOrganizationConnection(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
api := meta.(*config.Config).GetAPI()
mutex := meta.(*config.Config).GetMutex()

organizationID := data.Get("organization_id").(string)

mutex.Lock(organizationID)
defer mutex.Unlock(organizationID)

connectionID := data.Get("connection_id").(string)
assignMembershipOnLogin := data.Get("assign_membership_on_login").(bool)

Expand All @@ -132,13 +124,9 @@ func updateOrganizationConnection(ctx context.Context, data *schema.ResourceData

func deleteOrganizationConnection(_ context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
api := meta.(*config.Config).GetAPI()
mutex := meta.(*config.Config).GetMutex()

organizationID := data.Get("organization_id").(string)

mutex.Lock(organizationID)
defer mutex.Unlock(organizationID)

connectionID := data.Get("connection_id").(string)

if err := api.Organization.DeleteConnection(organizationID, connectionID); err != nil {
Expand Down
20 changes: 6 additions & 14 deletions internal/auth0/organization/resource_connections.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,13 +63,9 @@ func NewConnectionsResource() *schema.Resource {

func createOrganizationConnections(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
api := meta.(*config.Config).GetAPI()
mutex := meta.(*config.Config).GetMutex()

organizationID := data.Get("organization_id").(string)

mutex.Lock(organizationID)
defer mutex.Unlock(organizationID)

alreadyEnabledConnections, err := api.Organization.Connections(organizationID)
if err != nil {
if mErr, ok := err.(management.Error); ok && mErr.Status() == http.StatusNotFound {
Expand Down Expand Up @@ -130,19 +126,16 @@ func readOrganizationConnections(_ context.Context, data *schema.ResourceData, m

func updateOrganizationConnections(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
api := meta.(*config.Config).GetAPI()
mutex := meta.(*config.Config).GetMutex()

orgID := data.Id()
mutex.Lock(orgID)
defer mutex.Unlock(orgID)
organizationID := data.Id()

var result *multierror.Error
toAdd, toRemove := value.Difference(data, "enabled_connections")

for _, rmConnection := range toRemove {
connection := rmConnection.(map[string]interface{})

if err := api.Organization.DeleteConnection(orgID, connection["connection_id"].(string)); err != nil {
if err := api.Organization.DeleteConnection(organizationID, connection["connection_id"].(string)); err != nil {
if mErr, ok := err.(management.Error); ok && mErr.Status() == http.StatusNotFound {
data.SetId("")
return nil
Expand All @@ -155,7 +148,7 @@ func updateOrganizationConnections(ctx context.Context, data *schema.ResourceDat
for _, addConnection := range toAdd {
connection := addConnection.(map[string]interface{})

if err := api.Organization.AddConnection(orgID, &management.OrganizationConnection{
if err := api.Organization.AddConnection(organizationID, &management.OrganizationConnection{
ConnectionID: auth0.String(connection["connection_id"].(string)),
AssignMembershipOnLogin: auth0.Bool(connection["assign_membership_on_login"].(bool)),
}); err != nil {
Expand All @@ -177,15 +170,14 @@ func updateOrganizationConnections(ctx context.Context, data *schema.ResourceDat

func deleteOrganizationConnections(_ context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
api := meta.(*config.Config).GetAPI()
mutex := meta.(*config.Config).GetMutex()
mutex.Lock(data.Id())
defer mutex.Unlock(data.Id())

organizationID := data.Id()

var result *multierror.Error

connections := expandOrganizationConnections(data.GetRawState().GetAttr("enabled_connections"))
for _, conn := range connections {
err := api.Organization.DeleteConnection(data.Id(), conn.GetConnectionID())
err := api.Organization.DeleteConnection(organizationID, conn.GetConnectionID())
result = multierror.Append(result, err)
}

Expand Down
49 changes: 17 additions & 32 deletions internal/auth0/organization/resource_member.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,20 +52,17 @@ func NewMemberResource() *schema.Resource {

func createOrganizationMember(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
api := m.(*config.Config).GetAPI()
mutex := m.(*config.Config).GetMutex()

userID := d.Get("user_id").(string)
orgID := d.Get("organization_id").(string)
organizationID := d.Get("organization_id").(string)

mutex.Lock(orgID)
if err := api.Organization.AddMembers(orgID, []string{userID}); err != nil {
if err := api.Organization.AddMembers(organizationID, []string{userID}); err != nil {
return diag.FromErr(err)
}
mutex.Unlock(orgID)

d.SetId(orgID + ":" + userID)
d.SetId(organizationID + ":" + userID)

if err := assignRoles(d, m); err != nil {
if err := assignMemberRoles(d, m); err != nil {
if err, ok := err.(management.Error); ok && err.Status() == http.StatusNotFound {
d.SetId("")
return nil
Expand All @@ -77,24 +74,24 @@ func createOrganizationMember(ctx context.Context, d *schema.ResourceData, m int
return readOrganizationMember(ctx, d, m)
}

func assignRoles(d *schema.ResourceData, meta interface{}) error {
func assignMemberRoles(d *schema.ResourceData, meta interface{}) error {
if !d.HasChange("roles") {
return nil
}

userID := d.Get("user_id").(string)
orgID := d.Get("organization_id").(string)
organizationID := d.Get("organization_id").(string)

toAdd, toRemove := value.Difference(d, "roles")

if err := addMemberRoles(meta, orgID, userID, toAdd); err != nil {
if err := addMemberRoles(meta, organizationID, userID, toAdd); err != nil {
return err
}

return removeMemberRoles(meta, orgID, userID, toRemove)
return removeMemberRoles(meta, organizationID, userID, toRemove)
}

func removeMemberRoles(meta interface{}, orgID string, userID string, roles []interface{}) error {
func removeMemberRoles(meta interface{}, organizationID string, userID string, roles []interface{}) error {
if len(roles) == 0 {
return nil
}
Expand All @@ -105,15 +102,11 @@ func removeMemberRoles(meta interface{}, orgID string, userID string, roles []in
}

api := meta.(*config.Config).GetAPI()
mutex := meta.(*config.Config).GetMutex()

mutex.Lock(orgID)
defer mutex.Unlock(orgID)

return api.Organization.DeleteMemberRoles(orgID, userID, rolesToRemove)
return api.Organization.DeleteMemberRoles(organizationID, userID, rolesToRemove)
}

func addMemberRoles(meta interface{}, orgID string, userID string, roles []interface{}) error {
func addMemberRoles(meta interface{}, organizationID string, userID string, roles []interface{}) error {
if len(roles) == 0 {
return nil
}
Expand All @@ -124,21 +117,17 @@ func addMemberRoles(meta interface{}, orgID string, userID string, roles []inter
}

api := meta.(*config.Config).GetAPI()
mutex := meta.(*config.Config).GetMutex()

mutex.Lock(orgID)
defer mutex.Unlock(orgID)

return api.Organization.AssignMemberRoles(orgID, userID, rolesToAssign)
return api.Organization.AssignMemberRoles(organizationID, userID, rolesToAssign)
}

func readOrganizationMember(_ context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
api := m.(*config.Config).GetAPI()

orgID := d.Get("organization_id").(string)
organizationID := d.Get("organization_id").(string)
userID := d.Get("user_id").(string)

roles, err := api.Organization.MemberRoles(orgID, userID)
roles, err := api.Organization.MemberRoles(organizationID, userID)
if err != nil {
if err, ok := err.(management.Error); ok && err.Status() == http.StatusNotFound {
d.SetId("")
Expand All @@ -158,7 +147,7 @@ func readOrganizationMember(_ context.Context, d *schema.ResourceData, m interfa
}

func updateOrganizationMember(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
if err := assignRoles(d, m); err != nil {
if err := assignMemberRoles(d, m); err != nil {
if err, ok := err.(management.Error); ok && err.Status() == http.StatusNotFound {
d.SetId("")
return nil
Expand All @@ -172,15 +161,11 @@ func updateOrganizationMember(ctx context.Context, d *schema.ResourceData, m int

func deleteOrganizationMember(_ context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
api := m.(*config.Config).GetAPI()
mutex := m.(*config.Config).GetMutex()

organizationID := d.Get("organization_id").(string)
userID := d.Get("user_id").(string)
orgID := d.Get("organization_id").(string)

mutex.Lock(orgID)
defer mutex.Unlock(orgID)

if err := api.Organization.DeleteMember(orgID, []string{userID}); err != nil {
if err := api.Organization.DeleteMember(organizationID, []string{userID}); err != nil {
if err, ok := err.(management.Error); ok && err.Status() == http.StatusNotFound {
d.SetId("")
return nil
Expand Down
8 changes: 0 additions & 8 deletions internal/auth0/organization/resource_member_role.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,11 @@ func NewMemberRoleResource() *schema.Resource {

func createOrganizationMemberRole(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
api := meta.(*config.Config).GetAPI()
mutex := meta.(*config.Config).GetMutex()

organizationID := data.Get("organization_id").(string)
userID := data.Get("user_id").(string)
roleID := data.Get("role_id").(string)

mutex.Lock(organizationID)
defer mutex.Unlock(organizationID)

if err := api.Organization.AssignMemberRoles(organizationID, userID, []string{roleID}); err != nil {
if err, ok := err.(management.Error); ok && err.Status() == http.StatusNotFound {
return nil
Expand Down Expand Up @@ -113,15 +109,11 @@ func readOrganizationMemberRole(_ context.Context, data *schema.ResourceData, me

func deleteOrganizationMemberRole(_ context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
api := meta.(*config.Config).GetAPI()
mutex := meta.(*config.Config).GetMutex()

organizationID := data.Get("organization_id").(string)
userID := data.Get("user_id").(string)
roleID := data.Get("role_id").(string)

mutex.Lock(organizationID)
defer mutex.Unlock(organizationID)

if err := api.Organization.DeleteMemberRoles(organizationID, userID, []string{roleID}); err != nil {
if err, ok := err.(management.Error); ok && err.Status() == http.StatusNotFound {
return nil
Expand Down
14 changes: 5 additions & 9 deletions internal/auth0/organization/resource_member_roles.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,10 @@ func NewMemberRolesResource() *schema.Resource {
}

func createOrganizationMemberRoles(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
if err := assignRoles(data, meta); err != nil {
organizationID := data.Get("organization_id").(string)
userID := data.Get("user_id").(string)

if err := assignMemberRoles(data, meta); err != nil {
if err, ok := err.(management.Error); ok && err.Status() == http.StatusNotFound {
data.SetId("")
return nil
Expand All @@ -58,9 +61,6 @@ func createOrganizationMemberRoles(ctx context.Context, data *schema.ResourceDat
return diag.FromErr(err)
}

organizationID := data.Get("organization_id").(string)
userID := data.Get("user_id").(string)

data.SetId(organizationID + ":" + userID)

return readOrganizationMemberRoles(ctx, data, meta)
Expand Down Expand Up @@ -91,7 +91,7 @@ func readOrganizationMemberRoles(_ context.Context, data *schema.ResourceData, m
}

func updateOrganizationMemberRoles(ctx context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
if err := assignRoles(data, meta); err != nil {
if err := assignMemberRoles(data, meta); err != nil {
if err, ok := err.(management.Error); ok && err.Status() == http.StatusNotFound {
data.SetId("")
return nil
Expand All @@ -105,7 +105,6 @@ func updateOrganizationMemberRoles(ctx context.Context, data *schema.ResourceDat

func deleteOrganizationMemberRoles(_ context.Context, data *schema.ResourceData, meta interface{}) diag.Diagnostics {
api := meta.(*config.Config).GetAPI()
mutex := meta.(*config.Config).GetMutex()

organizationID := data.Get("organization_id").(string)
userID := data.Get("user_id").(string)
Expand All @@ -120,9 +119,6 @@ func deleteOrganizationMemberRoles(_ context.Context, data *schema.ResourceData,
rolesToRemove = append(rolesToRemove, role.(string))
}

mutex.Lock(organizationID)
defer mutex.Unlock(organizationID)

if err := api.Organization.DeleteMemberRoles(organizationID, userID, rolesToRemove); err != nil {
if err, ok := err.(management.Error); ok && err.Status() == http.StatusNotFound {
return nil
Expand Down
Loading

0 comments on commit a130e1c

Please sign in to comment.