Skip to content

Commit 6aa966b

Browse files
fix: project_api_key data source missing project_assignment attribute (#1356)
1 parent 3f9b826 commit 6aa966b

9 files changed

+175
-196
lines changed

mongodbatlas/data_source_mongodbatlas_project_api_key.go

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,26 @@ func dataSourceMongoDBAtlasProjectAPIKey() *schema.Resource {
3939
Elem: &schema.Schema{
4040
Type: schema.TypeString,
4141
},
42+
Deprecated: fmt.Sprintf(DeprecationMessageParameterToResource, "v1.12.0", "project_assignment"),
43+
},
44+
"project_assignment": {
45+
Type: schema.TypeSet,
46+
Computed: true,
47+
Elem: &schema.Resource{
48+
Schema: map[string]*schema.Schema{
49+
"project_id": {
50+
Type: schema.TypeString,
51+
Computed: true,
52+
},
53+
"role_names": {
54+
Type: schema.TypeSet,
55+
Computed: true,
56+
Elem: &schema.Schema{
57+
Type: schema.TypeString,
58+
},
59+
},
60+
},
61+
},
4262
},
4363
},
4464
}
@@ -56,23 +76,31 @@ func dataSourceMongoDBAtlasProjectAPIKeyRead(ctx context.Context, d *schema.Reso
5676
}
5777

5878
for _, val := range projectAPIKeys {
59-
if val.ID == apiKeyID {
60-
if err := d.Set("description", val.Desc); err != nil {
61-
return diag.FromErr(fmt.Errorf("error setting `description`: %s", err))
62-
}
79+
if val.ID != apiKeyID {
80+
continue
81+
}
6382

64-
if err := d.Set("public_key", val.PublicKey); err != nil {
65-
return diag.FromErr(fmt.Errorf("error setting `public_key`: %s", err))
66-
}
83+
if err := d.Set("description", val.Desc); err != nil {
84+
return diag.FromErr(fmt.Errorf("error setting `description`: %s", err))
85+
}
6786

68-
if err := d.Set("private_key", val.PrivateKey); err != nil {
69-
return diag.FromErr(fmt.Errorf("error setting `private_key`: %s", err))
70-
}
87+
if err := d.Set("public_key", val.PublicKey); err != nil {
88+
return diag.FromErr(fmt.Errorf("error setting `public_key`: %s", err))
89+
}
7190

72-
if err := d.Set("role_names", flattenProjectAPIKeyRoles(projectID, val.Roles)); err != nil {
73-
return diag.FromErr(fmt.Errorf("error setting `roles`: %s", err))
91+
if err := d.Set("private_key", val.PrivateKey); err != nil {
92+
return diag.FromErr(fmt.Errorf("error setting `private_key`: %s", err))
93+
}
94+
95+
if projectAssignments, err := newProjectAssignment(ctx, conn, apiKeyID); err == nil {
96+
if err := d.Set("project_assignment", projectAssignments); err != nil {
97+
return diag.Errorf(errorProjectSetting, `project_assignment`, projectID, err)
7498
}
7599
}
100+
101+
if err := d.Set("role_names", flattenProjectAPIKeyRoles(projectID, val.Roles)); err != nil {
102+
return diag.FromErr(fmt.Errorf("error setting `roles`: %s", err))
103+
}
76104
}
77105

78106
d.SetId(id.UniqueId())

mongodbatlas/data_source_mongodbatlas_project_api_key_test.go

Lines changed: 0 additions & 58 deletions
This file was deleted.

mongodbatlas/data_source_mongodbatlas_project_api_keys.go

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,26 @@ func dataSourceMongoDBAtlasProjectAPIKeys() *schema.Resource {
5454
Elem: &schema.Schema{
5555
Type: schema.TypeString,
5656
},
57+
Deprecated: fmt.Sprintf(DeprecationMessageParameterToResource, "v1.12.0", "project_assignment"),
58+
},
59+
"project_assignment": {
60+
Type: schema.TypeSet,
61+
Optional: true,
62+
Elem: &schema.Resource{
63+
Schema: map[string]*schema.Schema{
64+
"project_id": {
65+
Type: schema.TypeString,
66+
Required: true,
67+
},
68+
"role_names": {
69+
Type: schema.TypeSet,
70+
Required: true,
71+
Elem: &schema.Schema{
72+
Type: schema.TypeString,
73+
},
74+
},
75+
},
76+
},
5777
},
5878
},
5979
},
@@ -77,11 +97,43 @@ func dataSourceMongoDBAtlasProjectAPIKeysRead(ctx context.Context, d *schema.Res
7797
return diag.FromErr(fmt.Errorf("error getting api keys information: %s", err))
7898
}
7999

80-
if err := d.Set("results", flattenProjectAPIKeys(ctx, conn, projectID, apiKeys)); err != nil {
100+
results, err := flattenProjectAPIKeys(ctx, conn, projectID, apiKeys)
101+
if err != nil {
102+
diag.FromErr(fmt.Errorf("error setting `results`: %s", err))
103+
}
104+
105+
if err := d.Set("results", results); err != nil {
81106
return diag.FromErr(fmt.Errorf("error setting `results`: %s", err))
82107
}
83108

84109
d.SetId(id.UniqueId())
85110

86111
return nil
87112
}
113+
114+
func flattenProjectAPIKeys(ctx context.Context, conn *matlas.Client, projectID string, apiKeys []matlas.APIKey) ([]map[string]interface{}, error) {
115+
var results []map[string]interface{}
116+
117+
if len(apiKeys) == 0 {
118+
return nil, nil
119+
}
120+
121+
results = make([]map[string]interface{}, len(apiKeys))
122+
for k, apiKey := range apiKeys {
123+
results[k] = map[string]interface{}{
124+
"api_key_id": apiKey.ID,
125+
"description": apiKey.Desc,
126+
"public_key": apiKey.PublicKey,
127+
"private_key": apiKey.PrivateKey,
128+
"role_names": flattenProjectAPIKeyRoles(projectID, apiKey.Roles),
129+
}
130+
131+
projectAssignment, err := newProjectAssignment(ctx, conn, apiKey.ID)
132+
if err != nil {
133+
return nil, err
134+
}
135+
136+
results[k]["project_assignment"] = projectAssignment
137+
}
138+
return results, nil
139+
}

mongodbatlas/data_source_mongodbatlas_project_api_keys_test.go

Lines changed: 0 additions & 59 deletions
This file was deleted.

mongodbatlas/resource_mongodbatlas_project_api_key.go

Lines changed: 28 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ func resourceMongoDBAtlasProjectAPIKey() *schema.Resource {
5151
Type: schema.TypeString,
5252
},
5353
ConflictsWith: []string{"project_assignment"},
54+
Deprecated: fmt.Sprintf(DeprecationMessageParameterToResource, "v1.12.0", "project_assignment"),
5455
},
5556
"project_assignment": {
5657
Type: schema.TypeSet,
@@ -157,27 +158,6 @@ func resourceMongoDBAtlasProjectAPIKeyRead(ctx context.Context, d *schema.Resour
157158
projectID := ids["project_id"]
158159
apiKeyID := ids["api_key_id"]
159160

160-
options := &matlas.ListOptions{}
161-
162-
apiKeyOrgList, _, err := conn.Root.List(ctx, options)
163-
if err != nil {
164-
return diag.FromErr(fmt.Errorf("error getting api key information: %s", err))
165-
}
166-
projectAssignments, err := getAPIProjectAssignments(ctx, conn, apiKeyOrgList, apiKeyID)
167-
if err != nil {
168-
return diag.FromErr(fmt.Errorf("error getting api key information: %s", err))
169-
}
170-
171-
_, roleOk := d.GetOk("role_names")
172-
if !roleOk {
173-
if err := d.Set("role_names", nil); err != nil {
174-
return diag.FromErr(fmt.Errorf("error setting `roles`: %s", err))
175-
}
176-
if err := d.Set("project_assignment", FlattenProjectAssignment(projectAssignments)); err != nil {
177-
return diag.Errorf(errorProjectSetting, `created`, projectID, err)
178-
}
179-
}
180-
181161
projectAPIKeys, _, err := conn.ProjectAPIKeys.List(ctx, projectID, nil)
182162
if err != nil {
183163
return diag.FromErr(fmt.Errorf("error getting api key information: %s", err))
@@ -200,7 +180,18 @@ func resourceMongoDBAtlasProjectAPIKeyRead(ctx context.Context, d *schema.Resour
200180
if err := d.Set("public_key", val.PublicKey); err != nil {
201181
return diag.FromErr(fmt.Errorf("error setting `public_key`: %s", err))
202182
}
203-
if roleOk {
183+
184+
_, roleOk := d.GetOk("role_names")
185+
if !roleOk {
186+
if err := d.Set("role_names", nil); err != nil {
187+
return diag.FromErr(fmt.Errorf("error setting `roles`: %s", err))
188+
}
189+
if projectAssignments, err := newProjectAssignment(ctx, conn, apiKeyID); err == nil {
190+
if err := d.Set("project_assignment", projectAssignments); err != nil {
191+
return diag.Errorf(errorProjectSetting, `created`, projectID, err)
192+
}
193+
}
194+
} else {
204195
if err := d.Set("role_names", flattenProjectAPIKeyRoles(projectID, val.Roles)); err != nil {
205196
return diag.FromErr(fmt.Errorf("error setting `roles`: %s", err))
206197
}
@@ -387,24 +378,6 @@ func resourceMongoDBAtlasProjectAPIKeyImportState(ctx context.Context, d *schema
387378
return []*schema.ResourceData{d}, nil
388379
}
389380

390-
func flattenProjectAPIKeys(ctx context.Context, conn *matlas.Client, projectID string, apiKeys []matlas.APIKey) []map[string]interface{} {
391-
var results []map[string]interface{}
392-
393-
if len(apiKeys) > 0 {
394-
results = make([]map[string]interface{}, len(apiKeys))
395-
for k, apiKey := range apiKeys {
396-
results[k] = map[string]interface{}{
397-
"api_key_id": apiKey.ID,
398-
"description": apiKey.Desc,
399-
"public_key": apiKey.PublicKey,
400-
"private_key": apiKey.PrivateKey,
401-
"role_names": flattenProjectAPIKeyRoles(projectID, apiKey.Roles),
402-
}
403-
}
404-
}
405-
return results
406-
}
407-
408381
func flattenProjectAPIKeyRoles(projectID string, apiKeyRoles []matlas.AtlasRole) []string {
409382
if len(apiKeyRoles) == 0 {
410383
return nil
@@ -435,13 +408,23 @@ func ExpandProjectAssignmentSet(projectAssignments *schema.Set) []*APIProjectAss
435408
return res
436409
}
437410

438-
func FlattenProjectAssignment(apiKeyAssignmentSet []APIProjectAssignmentKeyInput) []map[string]interface{} {
411+
func newProjectAssignment(ctx context.Context, conn *matlas.Client, apiKeyID string) ([]map[string]interface{}, error) {
412+
apiKeyOrgList, _, err := conn.Root.List(ctx, nil)
413+
if err != nil {
414+
return nil, fmt.Errorf("error getting api key information: %s", err)
415+
}
416+
417+
projectAssignments, err := getAPIProjectAssignments(ctx, conn, apiKeyOrgList, apiKeyID)
418+
if err != nil {
419+
return nil, fmt.Errorf("error getting api key information: %s", err)
420+
}
421+
439422
var results []map[string]interface{}
440423
var atlasRoles []matlas.AtlasRole
441424
var atlasRole matlas.AtlasRole
442-
if len(apiKeyAssignmentSet) > 0 {
443-
results = make([]map[string]interface{}, len(apiKeyAssignmentSet))
444-
for k, apiKey := range apiKeyAssignmentSet {
425+
if len(projectAssignments) > 0 {
426+
results = make([]map[string]interface{}, len(projectAssignments))
427+
for k, apiKey := range projectAssignments {
445428
for _, roleName := range apiKey.RoleNames {
446429
atlasRole.GroupID = apiKey.ProjectID
447430
atlasRole.RoleName = roleName
@@ -453,7 +436,7 @@ func FlattenProjectAssignment(apiKeyAssignmentSet []APIProjectAssignmentKeyInput
453436
}
454437
}
455438
}
456-
return results
439+
return results, nil
457440
}
458441

459442
func getStateProjectAssignmentAPIKeys(d *schema.ResourceData) (newAPIKeys, changedAPIKeys, removedAPIKeys []interface{}) {

0 commit comments

Comments
 (0)