Skip to content

Commit

Permalink
fix: project_api_key data source missing project_assignment attribute (
Browse files Browse the repository at this point in the history
  • Loading branch information
andreaangiolillo committed Aug 2, 2023
1 parent 3f9b826 commit 6aa966b
Show file tree
Hide file tree
Showing 9 changed files with 175 additions and 196 deletions.
52 changes: 40 additions & 12 deletions mongodbatlas/data_source_mongodbatlas_project_api_key.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,26 @@ func dataSourceMongoDBAtlasProjectAPIKey() *schema.Resource {
Elem: &schema.Schema{
Type: schema.TypeString,
},
Deprecated: fmt.Sprintf(DeprecationMessageParameterToResource, "v1.12.0", "project_assignment"),
},
"project_assignment": {
Type: schema.TypeSet,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"project_id": {
Type: schema.TypeString,
Computed: true,
},
"role_names": {
Type: schema.TypeSet,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
},
},
},
},
}
Expand All @@ -56,23 +76,31 @@ func dataSourceMongoDBAtlasProjectAPIKeyRead(ctx context.Context, d *schema.Reso
}

for _, val := range projectAPIKeys {
if val.ID == apiKeyID {
if err := d.Set("description", val.Desc); err != nil {
return diag.FromErr(fmt.Errorf("error setting `description`: %s", err))
}
if val.ID != apiKeyID {
continue
}

if err := d.Set("public_key", val.PublicKey); err != nil {
return diag.FromErr(fmt.Errorf("error setting `public_key`: %s", err))
}
if err := d.Set("description", val.Desc); err != nil {
return diag.FromErr(fmt.Errorf("error setting `description`: %s", err))
}

if err := d.Set("private_key", val.PrivateKey); err != nil {
return diag.FromErr(fmt.Errorf("error setting `private_key`: %s", err))
}
if err := d.Set("public_key", val.PublicKey); err != nil {
return diag.FromErr(fmt.Errorf("error setting `public_key`: %s", err))
}

if err := d.Set("role_names", flattenProjectAPIKeyRoles(projectID, val.Roles)); err != nil {
return diag.FromErr(fmt.Errorf("error setting `roles`: %s", err))
if err := d.Set("private_key", val.PrivateKey); err != nil {
return diag.FromErr(fmt.Errorf("error setting `private_key`: %s", err))
}

if projectAssignments, err := newProjectAssignment(ctx, conn, apiKeyID); err == nil {
if err := d.Set("project_assignment", projectAssignments); err != nil {
return diag.Errorf(errorProjectSetting, `project_assignment`, projectID, err)
}
}

if err := d.Set("role_names", flattenProjectAPIKeyRoles(projectID, val.Roles)); err != nil {
return diag.FromErr(fmt.Errorf("error setting `roles`: %s", err))
}
}

d.SetId(id.UniqueId())
Expand Down
58 changes: 0 additions & 58 deletions mongodbatlas/data_source_mongodbatlas_project_api_key_test.go

This file was deleted.

54 changes: 53 additions & 1 deletion mongodbatlas/data_source_mongodbatlas_project_api_keys.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,26 @@ func dataSourceMongoDBAtlasProjectAPIKeys() *schema.Resource {
Elem: &schema.Schema{
Type: schema.TypeString,
},
Deprecated: fmt.Sprintf(DeprecationMessageParameterToResource, "v1.12.0", "project_assignment"),
},
"project_assignment": {
Type: schema.TypeSet,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"project_id": {
Type: schema.TypeString,
Required: true,
},
"role_names": {
Type: schema.TypeSet,
Required: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
},
},
},
},
},
Expand All @@ -77,11 +97,43 @@ func dataSourceMongoDBAtlasProjectAPIKeysRead(ctx context.Context, d *schema.Res
return diag.FromErr(fmt.Errorf("error getting api keys information: %s", err))
}

if err := d.Set("results", flattenProjectAPIKeys(ctx, conn, projectID, apiKeys)); err != nil {
results, err := flattenProjectAPIKeys(ctx, conn, projectID, apiKeys)
if err != nil {
diag.FromErr(fmt.Errorf("error setting `results`: %s", err))
}

if err := d.Set("results", results); err != nil {
return diag.FromErr(fmt.Errorf("error setting `results`: %s", err))
}

d.SetId(id.UniqueId())

return nil
}

func flattenProjectAPIKeys(ctx context.Context, conn *matlas.Client, projectID string, apiKeys []matlas.APIKey) ([]map[string]interface{}, error) {
var results []map[string]interface{}

if len(apiKeys) == 0 {
return nil, nil
}

results = make([]map[string]interface{}, len(apiKeys))
for k, apiKey := range apiKeys {
results[k] = map[string]interface{}{
"api_key_id": apiKey.ID,
"description": apiKey.Desc,
"public_key": apiKey.PublicKey,
"private_key": apiKey.PrivateKey,
"role_names": flattenProjectAPIKeyRoles(projectID, apiKey.Roles),
}

projectAssignment, err := newProjectAssignment(ctx, conn, apiKey.ID)
if err != nil {
return nil, err
}

results[k]["project_assignment"] = projectAssignment
}
return results, nil
}
59 changes: 0 additions & 59 deletions mongodbatlas/data_source_mongodbatlas_project_api_keys_test.go

This file was deleted.

73 changes: 28 additions & 45 deletions mongodbatlas/resource_mongodbatlas_project_api_key.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ func resourceMongoDBAtlasProjectAPIKey() *schema.Resource {
Type: schema.TypeString,
},
ConflictsWith: []string{"project_assignment"},
Deprecated: fmt.Sprintf(DeprecationMessageParameterToResource, "v1.12.0", "project_assignment"),
},
"project_assignment": {
Type: schema.TypeSet,
Expand Down Expand Up @@ -157,27 +158,6 @@ func resourceMongoDBAtlasProjectAPIKeyRead(ctx context.Context, d *schema.Resour
projectID := ids["project_id"]
apiKeyID := ids["api_key_id"]

options := &matlas.ListOptions{}

apiKeyOrgList, _, err := conn.Root.List(ctx, options)
if err != nil {
return diag.FromErr(fmt.Errorf("error getting api key information: %s", err))
}
projectAssignments, err := getAPIProjectAssignments(ctx, conn, apiKeyOrgList, apiKeyID)
if err != nil {
return diag.FromErr(fmt.Errorf("error getting api key information: %s", err))
}

_, roleOk := d.GetOk("role_names")
if !roleOk {
if err := d.Set("role_names", nil); err != nil {
return diag.FromErr(fmt.Errorf("error setting `roles`: %s", err))
}
if err := d.Set("project_assignment", FlattenProjectAssignment(projectAssignments)); err != nil {
return diag.Errorf(errorProjectSetting, `created`, projectID, err)
}
}

projectAPIKeys, _, err := conn.ProjectAPIKeys.List(ctx, projectID, nil)
if err != nil {
return diag.FromErr(fmt.Errorf("error getting api key information: %s", err))
Expand All @@ -200,7 +180,18 @@ func resourceMongoDBAtlasProjectAPIKeyRead(ctx context.Context, d *schema.Resour
if err := d.Set("public_key", val.PublicKey); err != nil {
return diag.FromErr(fmt.Errorf("error setting `public_key`: %s", err))
}
if roleOk {

_, roleOk := d.GetOk("role_names")
if !roleOk {
if err := d.Set("role_names", nil); err != nil {
return diag.FromErr(fmt.Errorf("error setting `roles`: %s", err))
}
if projectAssignments, err := newProjectAssignment(ctx, conn, apiKeyID); err == nil {
if err := d.Set("project_assignment", projectAssignments); err != nil {
return diag.Errorf(errorProjectSetting, `created`, projectID, err)
}
}
} else {
if err := d.Set("role_names", flattenProjectAPIKeyRoles(projectID, val.Roles)); err != nil {
return diag.FromErr(fmt.Errorf("error setting `roles`: %s", err))
}
Expand Down Expand Up @@ -387,24 +378,6 @@ func resourceMongoDBAtlasProjectAPIKeyImportState(ctx context.Context, d *schema
return []*schema.ResourceData{d}, nil
}

func flattenProjectAPIKeys(ctx context.Context, conn *matlas.Client, projectID string, apiKeys []matlas.APIKey) []map[string]interface{} {
var results []map[string]interface{}

if len(apiKeys) > 0 {
results = make([]map[string]interface{}, len(apiKeys))
for k, apiKey := range apiKeys {
results[k] = map[string]interface{}{
"api_key_id": apiKey.ID,
"description": apiKey.Desc,
"public_key": apiKey.PublicKey,
"private_key": apiKey.PrivateKey,
"role_names": flattenProjectAPIKeyRoles(projectID, apiKey.Roles),
}
}
}
return results
}

func flattenProjectAPIKeyRoles(projectID string, apiKeyRoles []matlas.AtlasRole) []string {
if len(apiKeyRoles) == 0 {
return nil
Expand Down Expand Up @@ -435,13 +408,23 @@ func ExpandProjectAssignmentSet(projectAssignments *schema.Set) []*APIProjectAss
return res
}

func FlattenProjectAssignment(apiKeyAssignmentSet []APIProjectAssignmentKeyInput) []map[string]interface{} {
func newProjectAssignment(ctx context.Context, conn *matlas.Client, apiKeyID string) ([]map[string]interface{}, error) {
apiKeyOrgList, _, err := conn.Root.List(ctx, nil)
if err != nil {
return nil, fmt.Errorf("error getting api key information: %s", err)
}

projectAssignments, err := getAPIProjectAssignments(ctx, conn, apiKeyOrgList, apiKeyID)
if err != nil {
return nil, fmt.Errorf("error getting api key information: %s", err)
}

var results []map[string]interface{}
var atlasRoles []matlas.AtlasRole
var atlasRole matlas.AtlasRole
if len(apiKeyAssignmentSet) > 0 {
results = make([]map[string]interface{}, len(apiKeyAssignmentSet))
for k, apiKey := range apiKeyAssignmentSet {
if len(projectAssignments) > 0 {
results = make([]map[string]interface{}, len(projectAssignments))
for k, apiKey := range projectAssignments {
for _, roleName := range apiKey.RoleNames {
atlasRole.GroupID = apiKey.ProjectID
atlasRole.RoleName = roleName
Expand All @@ -453,7 +436,7 @@ func FlattenProjectAssignment(apiKeyAssignmentSet []APIProjectAssignmentKeyInput
}
}
}
return results
return results, nil
}

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

0 comments on commit 6aa966b

Please sign in to comment.