Skip to content

Commit 07da515

Browse files
authored
identity/group-alias: add api client lock (#2140)
* identity/group-alias: add api client lock * add changelog * use lock with mount_accessor * fix path * use context funcs * use import state context func
1 parent 8d2c1e4 commit 07da515

5 files changed

Lines changed: 54 additions & 61 deletions

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ FEATURES:
55
* Add support for configuration of plugin WIF to the AWS Secret Backend. Requires Vault 1.16+ ([#2138](https://github.com/hashicorp/terraform-provider-vault/pull/2138)).
66
* Add support for Oracle database plugin configuration options `split_statements` and `disconnect_sessions`: ([#2085](https://github.com/hashicorp/terraform-provider-vault/pull/2085))
77

8+
IMPROVEMENTS:
9+
* Add an API client lock to the `vault_identity_group_alias` resource: ([#2140](https://github.com/hashicorp/terraform-provider-vault/pull/2140))
10+
811
## 3.24.0 (Jan 17, 2024)
912

1013
FEATURES:

vault/data_identity_entity.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ func identityEntityDataSource() *schema.Resource {
201201

202202
func identityEntityLookup(client *api.Client, data map[string]interface{}) (*api.Secret, error) {
203203
log.Print("[DEBUG] Looking up IdentityEntity")
204+
204205
resp, err := client.Logical().Write(entity.LookupPath, data)
205206
if err != nil {
206207
return nil, fmt.Errorf("Error reading Identity Entity '%v': %w", data, err)

vault/resource_identity_entity_alias.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func identityEntityAliasResource() *schema.Resource {
2626
ReadContext: provider.ReadContextWrapper(identityEntityAliasRead),
2727
DeleteContext: identityEntityAliasDelete,
2828
Importer: &schema.ResourceImporter{
29-
State: schema.ImportStatePassthrough,
29+
StateContext: schema.ImportStatePassthroughContext,
3030
},
3131

3232
Schema: map[string]*schema.Schema{

vault/resource_identity_group_alias.go

Lines changed: 48 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,28 @@
44
package vault
55

66
import (
7+
"context"
78
"fmt"
89
"log"
910

11+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1012
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1113

1214
"github.com/hashicorp/terraform-provider-vault/internal/consts"
1315
"github.com/hashicorp/terraform-provider-vault/internal/provider"
1416
)
1517

16-
const identityGroupAliasPath = "/identity/group-alias"
18+
const (
19+
identityGroupAliasPath = "/identity/group-alias"
20+
identityGroupAliasIDPath = identityGroupAliasPath + "/id"
21+
)
1722

1823
func identityGroupAliasResource() *schema.Resource {
1924
return &schema.Resource{
20-
Create: identityGroupAliasCreate,
21-
Update: identityGroupAliasUpdate,
22-
Read: provider.ReadWrapper(identityGroupAliasRead),
23-
Delete: identityGroupAliasDelete,
24-
Exists: identityGroupAliasExists,
25+
CreateContext: identityGroupAliasCreate,
26+
UpdateContext: identityGroupAliasUpdate,
27+
ReadContext: provider.ReadContextWrapper(identityGroupAliasRead),
28+
DeleteContext: identityGroupAliasDelete,
2529
Importer: &schema.ResourceImporter{
2630
State: schema.ImportStatePassthrough,
2731
},
@@ -48,10 +52,14 @@ func identityGroupAliasResource() *schema.Resource {
4852
}
4953
}
5054

51-
func identityGroupAliasCreate(d *schema.ResourceData, meta interface{}) error {
55+
func identityGroupAliasCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
56+
lock, unlock := getEntityLockFuncs(d, identityGroupAliasIDPath)
57+
lock()
58+
defer unlock()
59+
5260
client, e := provider.GetClient(d, meta)
5361
if e != nil {
54-
return e
62+
return diag.FromErr(e)
5563
}
5664

5765
name := d.Get("name").(string)
@@ -66,30 +74,34 @@ func identityGroupAliasCreate(d *schema.ResourceData, meta interface{}) error {
6674
"canonical_id": canonicalID,
6775
}
6876

69-
resp, err := client.Logical().Write(path, data)
77+
resp, err := client.Logical().WriteWithContext(ctx, path, data)
7078
if err != nil {
71-
return fmt.Errorf("error writing IdentityGroupAlias to %q: %s", name, err)
79+
return diag.FromErr(fmt.Errorf("error writing IdentityGroupAlias to %q: %s", name, err))
7280
}
7381
log.Printf("[DEBUG] Wrote IdentityGroupAlias %q", name)
7482
d.SetId(resp.Data["id"].(string))
7583

76-
return identityGroupAliasRead(d, meta)
84+
return identityGroupAliasRead(ctx, d, meta)
7785
}
7886

79-
func identityGroupAliasUpdate(d *schema.ResourceData, meta interface{}) error {
87+
func identityGroupAliasUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
88+
lock, unlock := getEntityLockFuncs(d, identityGroupAliasIDPath)
89+
lock()
90+
defer unlock()
91+
8092
client, e := provider.GetClient(d, meta)
8193
if e != nil {
82-
return e
94+
return diag.FromErr(e)
8395
}
8496

8597
id := d.Id()
8698

8799
log.Printf("[DEBUG] Updating IdentityGroupAlias %q", id)
88-
path := identityGroupAliasIDPath(id)
100+
path := getIdentityGroupAliasIDPath(id)
89101

90-
resp, err := client.Logical().Read(path)
102+
resp, err := client.Logical().ReadWithContext(ctx, path)
91103
if err != nil {
92-
return fmt.Errorf("error updating IdentityGroupAlias %q: %s", id, err)
104+
return diag.FromErr(fmt.Errorf("error updating IdentityGroupAlias %q: %s", id, err))
93105
}
94106

95107
data := map[string]interface{}{
@@ -108,30 +120,30 @@ func identityGroupAliasUpdate(d *schema.ResourceData, meta interface{}) error {
108120
data["canonical_id"] = canonicalID
109121
}
110122

111-
_, err = client.Logical().Write(path, data)
123+
_, err = client.Logical().WriteWithContext(ctx, path, data)
112124

113125
if err != nil {
114-
return fmt.Errorf("error updating IdentityGroupAlias %q: %s", id, err)
126+
return diag.FromErr(fmt.Errorf("error updating IdentityGroupAlias %q: %s", id, err))
115127
}
116128
log.Printf("[DEBUG] Updated IdentityGroupAlias %q", id)
117129

118-
return identityGroupAliasRead(d, meta)
130+
return identityGroupAliasRead(ctx, d, meta)
119131
}
120132

121-
func identityGroupAliasRead(d *schema.ResourceData, meta interface{}) error {
133+
func identityGroupAliasRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
122134
client, e := provider.GetClient(d, meta)
123135
if e != nil {
124-
return e
136+
return diag.FromErr(e)
125137
}
126138

127139
id := d.Id()
128140

129-
path := identityGroupAliasIDPath(id)
141+
path := getIdentityGroupAliasIDPath(id)
130142

131143
log.Printf("[DEBUG] Reading IdentityGroupAlias %s from %q", id, path)
132-
resp, err := client.Logical().Read(path)
144+
resp, err := client.Logical().ReadWithContext(ctx, path)
133145
if err != nil {
134-
return fmt.Errorf("error reading IdentityGroupAlias %q: %s", id, err)
146+
return diag.FromErr(fmt.Errorf("error reading IdentityGroupAlias %q: %s", id, err))
135147
}
136148
log.Printf("[DEBUG] Read IdentityGroupAlias %s", id)
137149
if resp == nil {
@@ -143,63 +155,40 @@ func identityGroupAliasRead(d *schema.ResourceData, meta interface{}) error {
143155
d.SetId(resp.Data["id"].(string))
144156
for _, k := range []string{"name", consts.FieldMountAccessor, "canonical_id"} {
145157
if err := d.Set(k, resp.Data[k]); err != nil {
146-
return fmt.Errorf("error setting state key \"%s\" on IdentityGroupAlias %q: %s", k, id, err)
158+
return diag.FromErr(fmt.Errorf("error setting state key \"%s\" on IdentityGroupAlias %q: %s", k, id, err))
147159
}
148160
}
149161
return nil
150162
}
151163

152-
func identityGroupAliasDelete(d *schema.ResourceData, meta interface{}) error {
164+
func identityGroupAliasDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
165+
lock, unlock := getEntityLockFuncs(d, identityGroupAliasIDPath)
166+
lock()
167+
defer unlock()
168+
153169
client, e := provider.GetClient(d, meta)
154170
if e != nil {
155-
return e
171+
return diag.FromErr(e)
156172
}
157173

158174
id := d.Id()
159175

160-
path := identityGroupAliasIDPath(id)
176+
path := getIdentityGroupAliasIDPath(id)
161177

162178
log.Printf("[DEBUG] Deleting IdentityGroupAlias %q", id)
163-
_, err := client.Logical().Delete(path)
179+
_, err := client.Logical().DeleteWithContext(ctx, path)
164180
if err != nil {
165-
return fmt.Errorf("error IdentityGroupAlias %q", id)
181+
return diag.FromErr(fmt.Errorf("error IdentityGroupAlias %q", id))
166182
}
167183
log.Printf("[DEBUG] Deleted IdentityGroupAlias %q", id)
168184

169185
return nil
170186
}
171187

172-
func identityGroupAliasExists(d *schema.ResourceData, meta interface{}) (bool, error) {
173-
client, e := provider.GetClient(d, meta)
174-
if e != nil {
175-
return false, e
176-
}
177-
178-
id := d.Id()
179-
180-
path := identityGroupAliasIDPath(id)
181-
key := id
182-
183-
// use the name if no ID is set
184-
if len(id) == 0 {
185-
key = d.Get("name").(string)
186-
path = identityGroupAliasNamePath(key)
187-
}
188-
189-
log.Printf("[DEBUG] Checking if IdentityGroupAlias %q exists", key)
190-
resp, err := client.Logical().Read(path)
191-
if err != nil {
192-
return true, fmt.Errorf("error checking if IdentityGroupAlias %q exists: %s", key, err)
193-
}
194-
log.Printf("[DEBUG] Checked if IdentityGroupAlias %q exists", key)
195-
196-
return resp != nil, nil
197-
}
198-
199188
func identityGroupAliasNamePath(name string) string {
200189
return fmt.Sprintf("%s/name/%s", identityGroupAliasPath, name)
201190
}
202191

203-
func identityGroupAliasIDPath(id string) string {
204-
return fmt.Sprintf("%s/id/%s", identityGroupAliasPath, id)
192+
func getIdentityGroupAliasIDPath(id string) string {
193+
return fmt.Sprintf("%s/%s", identityGroupAliasIDPath, id)
205194
}

vault/resource_identity_group_alias_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ func testAccCheckIdentityGroupAliasDestroy(s *terraform.State) error {
8787
return e
8888
}
8989

90-
secret, err := client.Logical().Read(identityGroupAliasIDPath(rs.Primary.ID))
90+
secret, err := client.Logical().Read(getIdentityGroupAliasIDPath(rs.Primary.ID))
9191
if err != nil {
9292
return fmt.Errorf("error checking for identity group %q: %s", rs.Primary.ID, err)
9393
}

0 commit comments

Comments
 (0)