Skip to content

Commit 810a31e

Browse files
author
Becca Petrin
authored
Merge pull request hashicorp#321 from nazarewk/feature/identity-improvements
Identity improvements
2 parents b7a7c6d + 811c388 commit 810a31e

9 files changed

Lines changed: 463 additions & 78 deletions

vault/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ func Provider() terraform.ResourceProvider {
150150
"vault_identity_entity_alias": identityEntityAliasResource(),
151151
"vault_identity_group": identityGroupResource(),
152152
"vault_identity_group_alias": identityGroupAliasResource(),
153+
"vault_identity_group_policies": identityGroupPoliciesResource(),
153154
"vault_rabbitmq_secret_backend": rabbitmqSecretBackendResource(),
154155
"vault_rabbitmq_secret_backend_role": rabbitmqSecretBackendRoleResource(),
155156
"vault_pki_secret_backend": pkiSecretBackendResource(),

vault/resource_identity_entity.go

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@ func identityEntityResource() *schema.Resource {
1818
Read: identityEntityRead,
1919
Delete: identityEntityDelete,
2020
Exists: identityEntityExists,
21+
Importer: &schema.ResourceImporter{
22+
State: schema.ImportStatePassthrough,
23+
},
2124

2225
Schema: map[string]*schema.Schema{
2326
"name": {
2427
Type: schema.TypeString,
25-
Required: true,
2628
Description: "Name of the entity.",
27-
ForceNew: true,
29+
Optional: true,
30+
Computed: true,
2831
},
2932

3033
"metadata": {
@@ -50,12 +53,6 @@ func identityEntityResource() *schema.Resource {
5053
Optional: true,
5154
Description: "Whether the entity is disabled. Disabled entities' associated tokens cannot be used, but are not revoked.",
5255
},
53-
54-
"id": {
55-
Type: schema.TypeString,
56-
Computed: true,
57-
Description: "ID of the entity.",
58-
},
5956
},
6057
}
6158
}
@@ -98,8 +95,6 @@ func identityEntityCreate(d *schema.ResourceData, meta interface{}) error {
9895
}
9996
log.Printf("[DEBUG] Wrote IdentityEntity %q", name)
10097

101-
d.Set("id", resp.Data["id"])
102-
10398
d.SetId(resp.Data["id"].(string))
10499

105100
return identityEntityRead(d, meta)
@@ -150,7 +145,7 @@ func identityEntityRead(d *schema.ResourceData, meta interface{}) error {
150145

151146
for _, k := range []string{"name", "metadata", "disabled", "policies"} {
152147
if err := d.Set(k, resp.Data[k]); err != nil {
153-
return fmt.Errorf("error reading %s of IdentityEntity %q: %q", k, path, err)
148+
return fmt.Errorf("error setting state key \"%s\" on IdentityEntity %q: %s", k, id, err)
154149
}
155150
}
156151
return nil

vault/resource_identity_entity_alias.go

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@ func identityEntityAliasResource() *schema.Resource {
1717
Read: identityEntityAliasRead,
1818
Delete: identityEntityAliasDelete,
1919
Exists: identityEntityAliasExists,
20+
Importer: &schema.ResourceImporter{
21+
State: schema.ImportStatePassthrough,
22+
},
2023

2124
Schema: map[string]*schema.Schema{
2225
"name": {
2326
Type: schema.TypeString,
2427
Required: true,
2528
Description: "Name of the entity alias.",
26-
ForceNew: true,
2729
},
2830

2931
"mount_accessor": {
@@ -37,12 +39,6 @@ func identityEntityAliasResource() *schema.Resource {
3739
Required: true,
3840
Description: "ID of the entity to which this is an alias.",
3941
},
40-
41-
"id": {
42-
Type: schema.TypeString,
43-
Computed: true,
44-
Description: "ID of the entity alias.",
45-
},
4642
},
4743
}
4844
}
@@ -69,8 +65,6 @@ func identityEntityAliasCreate(d *schema.ResourceData, meta interface{}) error {
6965
}
7066
log.Printf("[DEBUG] Wrote IdentityEntityAlias %q", name)
7167

72-
d.Set("id", resp.Data["id"])
73-
7468
d.SetId(resp.Data["id"].(string))
7569

7670
return identityEntityAliasRead(d, meta)
@@ -129,8 +123,11 @@ func identityEntityAliasRead(d *schema.ResourceData, meta interface{}) error {
129123
return nil
130124
}
131125

132-
for _, k := range []string{"id", "name", "mount_accessor", "canonical_id"} {
133-
d.Set(k, resp.Data[k])
126+
d.SetId(resp.Data["id"].(string))
127+
for _, k := range []string{"name", "mount_accessor", "canonical_id"} {
128+
if err := d.Set(k, resp.Data[k]); err != nil {
129+
return fmt.Errorf("error setting state key \"%s\" on IdentityEntityAlias %q: %s", k, id, err)
130+
}
134131
}
135132
return nil
136133
}

vault/resource_identity_entity_test.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func TestAccIdentityEntity(t *testing.T) {
2323
Steps: []resource.TestStep{
2424
{
2525
Config: testAccIdentityEntityConfig(entity),
26-
Check: testAccIdentityEntityCheckAttrs(entity),
26+
Check: testAccIdentityEntityCheckAttrs(),
2727
},
2828
},
2929
})
@@ -39,12 +39,13 @@ func TestAccIdentityEntityUpdate(t *testing.T) {
3939
Steps: []resource.TestStep{
4040
{
4141
Config: testAccIdentityEntityConfig(entity),
42-
Check: testAccIdentityEntityCheckAttrs(entity),
42+
Check: testAccIdentityEntityCheckAttrs(),
4343
},
4444
{
4545
Config: testAccIdentityEntityConfigUpdate(entity),
4646
Check: resource.ComposeTestCheckFunc(
47-
testAccIdentityEntityCheckAttrs(entity),
47+
testAccIdentityEntityCheckAttrs(),
48+
resource.TestCheckResourceAttr("vault_identity_entity.entity", "name", fmt.Sprintf("%s-2", entity)),
4849
resource.TestCheckResourceAttr("vault_identity_entity.entity", "metadata.version", "2"),
4950
resource.TestCheckResourceAttr("vault_identity_entity.entity", "policies.#", "2"),
5051
resource.TestCheckResourceAttr("vault_identity_entity.entity", "policies.326271447", "dev"),
@@ -73,7 +74,7 @@ func testAccCheckIdentityEntityDestroy(s *terraform.State) error {
7374
return nil
7475
}
7576

76-
func testAccIdentityEntityCheckAttrs(entity string) resource.TestCheckFunc {
77+
func testAccIdentityEntityCheckAttrs() resource.TestCheckFunc {
7778
return func(s *terraform.State) error {
7879
resourceState := s.Modules[0].Resources["vault_identity_entity.entity"]
7980
if resourceState == nil {
@@ -182,7 +183,7 @@ resource "vault_identity_entity" "entity" {
182183
func testAccIdentityEntityConfigUpdate(entityName string) string {
183184
return fmt.Sprintf(`
184185
resource "vault_identity_entity" "entity" {
185-
name = "%s"
186+
name = "%s-2"
186187
policies = ["dev", "test"]
187188
metadata = {
188189
version = "2"

vault/resource_identity_group.go

Lines changed: 54 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@ func identityGroupResource() *schema.Resource {
1818
Read: identityGroupRead,
1919
Delete: identityGroupDelete,
2020
Exists: identityGroupExists,
21+
Importer: &schema.ResourceImporter{
22+
State: schema.ImportStatePassthrough,
23+
},
2124

2225
Schema: map[string]*schema.Schema{
2326
"name": {
2427
Type: schema.TypeString,
25-
Required: true,
2628
Description: "Name of the group.",
27-
ForceNew: true,
29+
Optional: true,
30+
Computed: true,
2831
},
2932

3033
"type": {
@@ -51,6 +54,16 @@ func identityGroupResource() *schema.Resource {
5154
Type: schema.TypeString,
5255
},
5356
Description: "Policies to be tied to the group.",
57+
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
58+
return d.Get("external_policies").(bool)
59+
},
60+
},
61+
62+
"external_policies": {
63+
Type: schema.TypeBool,
64+
Optional: true,
65+
Default: false,
66+
Description: "Manage policies externally through `vault_identity_group_policies`, allows using group ID in assigned policies.",
5467
},
5568

5669
"member_group_ids": {
@@ -79,19 +92,19 @@ func identityGroupResource() *schema.Resource {
7992
return false
8093
},
8194
},
82-
83-
"id": {
84-
Type: schema.TypeString,
85-
Computed: true,
86-
Description: "ID of the group.",
87-
},
8895
},
8996
}
9097
}
9198

9299
func identityGroupUpdateFields(d *schema.ResourceData, data map[string]interface{}) error {
93-
if policies, ok := d.GetOk("policies"); ok {
94-
data["policies"] = policies.(*schema.Set).List()
100+
if name, ok := d.GetOk("name"); ok {
101+
data["name"] = name
102+
}
103+
104+
if externalPolicies, ok := d.GetOk("external_policies"); !(ok && externalPolicies.(bool)) {
105+
if policies, ok := d.GetOk("policies"); ok {
106+
data["policies"] = policies.(*schema.Set).List()
107+
}
95108
}
96109

97110
if memberEntityIDs, ok := d.GetOk("member_entity_ids"); ok && d.Get("type").(string) == "internal" {
@@ -133,8 +146,6 @@ func identityGroupCreate(d *schema.ResourceData, meta interface{}) error {
133146
}
134147
log.Printf("[DEBUG] Wrote IdentityGroup %q", name)
135148

136-
d.Set("id", resp.Data["id"])
137-
138149
d.SetId(resp.Data["id"].(string))
139150

140151
return identityGroupRead(d, meta)
@@ -167,16 +178,13 @@ func identityGroupRead(d *schema.ResourceData, meta interface{}) error {
167178
client := meta.(*api.Client)
168179
id := d.Id()
169180

170-
path := identityGroupIDPath(id)
171-
172-
log.Printf("[DEBUG] Reading IdentityGroup %s from %q", id, path)
173-
resp, err := client.Logical().Read(path)
181+
resp, err := readIdentityGroup(client, id)
174182
if err != nil {
175183
// We need to check if the secret_id has expired
176184
if util.IsExpiredTokenErr(err) {
177185
return nil
178186
}
179-
return fmt.Errorf("error reading AppRole auth backend role SecretID %q: %s", id, err)
187+
return fmt.Errorf("error reading IdentityGroup %q: %s", id, err)
180188
}
181189
log.Printf("[DEBUG] Read IdentityGroup %s", id)
182190
if resp == nil {
@@ -185,11 +193,11 @@ func identityGroupRead(d *schema.ResourceData, meta interface{}) error {
185193
return nil
186194
}
187195

188-
for _, k := range []string{"name", "type", "metadata", "policies", "member_entity_ids", "member_group_ids"} {
189-
if v, ok := resp.Data[k]; ok {
190-
if err := d.Set(k, v); err != nil {
191-
return fmt.Errorf("error reading %s for Identity Group %q: %q", k, path, err)
192-
}
196+
readFields := []string{"name", "type", "metadata", "member_entity_ids", "member_group_ids", "policies"}
197+
198+
for _, k := range readFields {
199+
if err := d.Set(k, resp.Data[k]); err != nil {
200+
return fmt.Errorf("error setting state key \"%s\" on IdentityGroup %q: %s", k, id, err)
193201
}
194202
}
195203
return nil
@@ -214,30 +222,44 @@ func identityGroupDelete(d *schema.ResourceData, meta interface{}) error {
214222
func identityGroupExists(d *schema.ResourceData, meta interface{}) (bool, error) {
215223
client := meta.(*api.Client)
216224
id := d.Id()
217-
218-
path := identityGroupIDPath(id)
219225
key := id
220226

221-
// use the name if no ID is set
222227
if len(id) == 0 {
228+
return false, nil
229+
} else {
223230
key = d.Get("name").(string)
224-
path = identityGroupNamePath(key)
225231
}
226232

227233
log.Printf("[DEBUG] Checking if IdentityGroup %q exists", key)
228-
resp, err := client.Logical().Read(path)
234+
resp, err := readIdentityGroup(client, id)
229235
if err != nil {
230236
return true, fmt.Errorf("error checking if IdentityGroup %q exists: %s", key, err)
231237
}
232238
log.Printf("[DEBUG] Checked if IdentityGroup %q exists", key)
233-
234239
return resp != nil, nil
235240
}
236241

237-
func identityGroupNamePath(name string) string {
238-
return fmt.Sprintf("%s/name/%s", identityGroupPath, name)
239-
}
240-
241242
func identityGroupIDPath(id string) string {
242243
return fmt.Sprintf("%s/id/%s", identityGroupPath, id)
243244
}
245+
246+
func readIdentityGroupPolicies(client *api.Client, groupId string) ([]interface{}, error) {
247+
var presentPolicies []interface{}
248+
if resp, err := readIdentityGroup(client, groupId); err != nil {
249+
return nil, fmt.Errorf("error reading IdentityGroup policies %q: %s", groupId, err)
250+
} else {
251+
presentPolicies = resp.Data["policies"].([]interface{})
252+
}
253+
return presentPolicies, nil
254+
}
255+
256+
func readIdentityGroup(client *api.Client, groupId string) (*api.Secret, error) {
257+
path := identityGroupIDPath(groupId)
258+
log.Printf("[DEBUG] Reading IdentityGroup %s from %q", groupId, path)
259+
260+
if resp, err := client.Logical().Read(path); err != nil {
261+
return resp, fmt.Errorf("failed reading IdentityGroup %s from %s", groupId, path)
262+
} else {
263+
return resp, nil
264+
}
265+
}

vault/resource_identity_group_alias.go

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@ func identityGroupAliasResource() *schema.Resource {
1717
Read: identityGroupAliasRead,
1818
Delete: identityGroupAliasDelete,
1919
Exists: identityGroupAliasExists,
20+
Importer: &schema.ResourceImporter{
21+
State: schema.ImportStatePassthrough,
22+
},
2023

2124
Schema: map[string]*schema.Schema{
2225
"name": {
2326
Type: schema.TypeString,
2427
Required: true,
2528
Description: "Name of the group alias.",
26-
ForceNew: true,
2729
},
2830

2931
"mount_accessor": {
@@ -37,12 +39,6 @@ func identityGroupAliasResource() *schema.Resource {
3739
Required: true,
3840
Description: "ID of the group to which this is an alias.",
3941
},
40-
41-
"id": {
42-
Type: schema.TypeString,
43-
Computed: true,
44-
Description: "ID of the group alias.",
45-
},
4642
},
4743
}
4844
}
@@ -68,9 +64,6 @@ func identityGroupAliasCreate(d *schema.ResourceData, meta interface{}) error {
6864
return fmt.Errorf("error writing IdentityGroupAlias to %q: %s", name, err)
6965
}
7066
log.Printf("[DEBUG] Wrote IdentityGroupAlias %q", name)
71-
72-
d.Set("id", resp.Data["id"])
73-
7467
d.SetId(resp.Data["id"].(string))
7568

7669
return identityGroupAliasRead(d, meta)
@@ -129,8 +122,11 @@ func identityGroupAliasRead(d *schema.ResourceData, meta interface{}) error {
129122
return nil
130123
}
131124

132-
for _, k := range []string{"id", "name", "mount_accessor", "canonical_id"} {
133-
d.Set(k, resp.Data[k])
125+
d.SetId(resp.Data["id"].(string))
126+
for _, k := range []string{"name", "mount_accessor", "canonical_id"} {
127+
if err := d.Set(k, resp.Data[k]); err != nil {
128+
return fmt.Errorf("error setting state key \"%s\" on IdentityGroupAlias %q: %s", k, id, err)
129+
}
134130
}
135131
return nil
136132
}

0 commit comments

Comments
 (0)