Skip to content

Commit 60bc5e3

Browse files
beergeekbeergeekthemantissacoderGo93
authored
Add Organisation and Project invitations (#560)
* Add Organisation and Project invitations * Fix linting issues * Change to American spelling * Apply fixes and suggested modifications * Fix the linting issues * Fix the linting issues * Add tests * Refactor portions of the code to reduce the amount of code required * Changes as requested * Changes as requested * Changes to code as requested, plus doc updates * Fix conflict * Fix context and spelling * Fix spelling and grammar as advised * Further spelling and grammatical fixes * refactor: fixed many bugs that couldn't be tested locally Co-authored-by: beergeek <[email protected]> Co-authored-by: Melissa Plunkett <[email protected]> Co-authored-by: Edgar López <[email protected]>
1 parent f333547 commit 60bc5e3

13 files changed

+1460
-0
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package mongodbatlas
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
)
10+
11+
func dataSourceMongoDBAtlasOrgInvitation() *schema.Resource {
12+
return &schema.Resource{
13+
ReadContext: dataSourceMongoDBAtlasOrgInvitationRead,
14+
Schema: map[string]*schema.Schema{
15+
"org_id": {
16+
Type: schema.TypeString,
17+
Required: true,
18+
},
19+
"username": {
20+
Type: schema.TypeString,
21+
Required: true,
22+
},
23+
"invitation_id": {
24+
Type: schema.TypeString,
25+
Required: true,
26+
},
27+
"expires_at": {
28+
Type: schema.TypeString,
29+
Computed: true,
30+
},
31+
"created_at": {
32+
Type: schema.TypeString,
33+
Computed: true,
34+
},
35+
"inviter_username": {
36+
Type: schema.TypeString,
37+
Computed: true,
38+
},
39+
"teams_ids": {
40+
Type: schema.TypeSet,
41+
Computed: true,
42+
Elem: &schema.Schema{
43+
Type: schema.TypeString,
44+
},
45+
},
46+
"roles": {
47+
Type: schema.TypeSet,
48+
Computed: true,
49+
Elem: &schema.Schema{
50+
Type: schema.TypeString,
51+
},
52+
},
53+
},
54+
}
55+
}
56+
57+
func dataSourceMongoDBAtlasOrgInvitationRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
58+
// Get client connection.
59+
conn := meta.(*MongoDBClient).Atlas
60+
orgID := d.Get("org_id").(string)
61+
username := d.Get("username").(string)
62+
invitationID := d.Get("invitation_id").(string)
63+
64+
orgInvitation, _, err := conn.Organizations.Invitation(ctx, orgID, invitationID)
65+
if err != nil {
66+
return diag.FromErr(fmt.Errorf("error getting Organization Invitation information: %w", err))
67+
}
68+
69+
if err := d.Set("username", orgInvitation.Username); err != nil {
70+
return diag.FromErr(fmt.Errorf("error getting `username` for Organization Invitation (%s): %w", d.Id(), err))
71+
}
72+
73+
if err := d.Set("org_id", orgInvitation.OrgID); err != nil {
74+
return diag.FromErr(fmt.Errorf("error getting `username` for Organization Invitation (%s): %w", d.Id(), err))
75+
}
76+
77+
if err := d.Set("invitation_id", orgInvitation.ID); err != nil {
78+
return diag.FromErr(fmt.Errorf("error getting `invitation_id` for Organization Invitation (%s): %w", d.Id(), err))
79+
}
80+
81+
if err := d.Set("expires_at", orgInvitation.ExpiresAt); err != nil {
82+
return diag.FromErr(fmt.Errorf("error getting `expires_at` for Organization Invitation (%s): %w", d.Id(), err))
83+
}
84+
85+
if err := d.Set("created_at", orgInvitation.CreatedAt); err != nil {
86+
return diag.FromErr(fmt.Errorf("error getting `created_at` for Organization Invitation (%s): %w", d.Id(), err))
87+
}
88+
89+
if err := d.Set("inviter_username", orgInvitation.InviterUsername); err != nil {
90+
return diag.FromErr(fmt.Errorf("error getting `inviter_username` for Organization Invitation (%s): %w", d.Id(), err))
91+
}
92+
93+
if err := d.Set("teams_ids", orgInvitation.TeamIDs); err != nil {
94+
return diag.FromErr(fmt.Errorf("error getting `teams_ids` for Organization Invitation (%s): %w", d.Id(), err))
95+
}
96+
97+
if err := d.Set("roles", orgInvitation.Roles); err != nil {
98+
return diag.FromErr(fmt.Errorf("error getting `roles` for Organization Invitation (%s): %w", d.Id(), err))
99+
}
100+
101+
d.SetId(encodeStateID(map[string]string{
102+
"username": username,
103+
"org_id": orgID,
104+
"invitation_id": invitationID,
105+
}))
106+
107+
return nil
108+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package mongodbatlas
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"strings"
7+
"testing"
8+
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11+
)
12+
13+
func TestAccDataSourceMongoDBAtlasOrgInvitation_basic(t *testing.T) {
14+
var (
15+
dataSourceName = "mongodbatlas_org_invitation.test"
16+
orgID = os.Getenv("MONGODB_ATLAS_ORG_ID")
17+
name = fmt.Sprintf("test-acc-%[email protected]", acctest.RandString(10))
18+
initialRole = []string{"ORG_OWNER"}
19+
)
20+
21+
resource.Test(t, resource.TestCase{
22+
PreCheck: func() { testAccPreCheck(t) },
23+
ProviderFactories: testAccProviderFactories,
24+
CheckDestroy: testAccCheckMongoDBAtlasOrgInvitationDestroy,
25+
Steps: []resource.TestStep{
26+
{
27+
Config: testAccDataSourceMongoDBAtlasOrgInvitationConfig(orgID, name, initialRole),
28+
Check: resource.ComposeTestCheckFunc(
29+
resource.TestCheckResourceAttrSet(dataSourceName, "org_id"),
30+
resource.TestCheckResourceAttrSet(dataSourceName, "username"),
31+
resource.TestCheckResourceAttrSet(dataSourceName, "invitation_id"),
32+
resource.TestCheckResourceAttr(dataSourceName, "username", name),
33+
resource.TestCheckResourceAttr(dataSourceName, "roles.#", "1"),
34+
),
35+
},
36+
},
37+
})
38+
}
39+
40+
func testAccDataSourceMongoDBAtlasOrgInvitationConfig(orgID, username string, roles []string) string {
41+
return fmt.Sprintf(`
42+
resource "mongodbatlas_org_invitation" "test" {
43+
org_id = %[1]q
44+
username = %[2]q
45+
roles = ["%[3]s"]
46+
}
47+
48+
data "mongodbatlas_org_invitation" "test" {
49+
org_id = mongodbatlas_org_invitation.test.org_id
50+
username = mongodbatlas_org_invitation.test.username
51+
invitation_id = mongodbatlas_org_invitation.test.invitation_id
52+
}`, orgID, username,
53+
strings.Join(roles, `", "`),
54+
)
55+
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package mongodbatlas
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
)
10+
11+
func dataSourceMongoDBAtlasProjectInvitation() *schema.Resource {
12+
return &schema.Resource{
13+
ReadContext: dataSourceMongoDBAtlasProjectInvitationRead,
14+
Schema: map[string]*schema.Schema{
15+
"project_id": {
16+
Type: schema.TypeString,
17+
Required: true,
18+
},
19+
"username": {
20+
Type: schema.TypeString,
21+
Required: true,
22+
},
23+
"invitation_id": {
24+
Type: schema.TypeString,
25+
Required: true,
26+
},
27+
"expires_at": {
28+
Type: schema.TypeString,
29+
Computed: true,
30+
},
31+
"created_at": {
32+
Type: schema.TypeString,
33+
Computed: true,
34+
},
35+
"inviter_username": {
36+
Type: schema.TypeString,
37+
Computed: true,
38+
},
39+
"roles": {
40+
Type: schema.TypeSet,
41+
Computed: true,
42+
Elem: &schema.Schema{
43+
Type: schema.TypeString,
44+
},
45+
},
46+
},
47+
}
48+
}
49+
50+
func dataSourceMongoDBAtlasProjectInvitationRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
51+
// Get client connection.
52+
conn := meta.(*MongoDBClient).Atlas
53+
projectID := d.Get("project_id").(string)
54+
username := d.Get("username").(string)
55+
invitationID := d.Get("invitation_id").(string)
56+
57+
projectInvitation, _, err := conn.Projects.Invitation(ctx, projectID, invitationID)
58+
if err != nil {
59+
return diag.FromErr(fmt.Errorf("error getting Project Invitation information: %w", err))
60+
}
61+
62+
if err := d.Set("username", projectInvitation.Username); err != nil {
63+
return diag.FromErr(fmt.Errorf("error getting `username` for Project Invitation (%s): %w", d.Id(), err))
64+
}
65+
66+
if err := d.Set("project_id", projectInvitation.GroupID); err != nil {
67+
return diag.FromErr(fmt.Errorf("error getting `username` for Project Invitation (%s): %w", d.Id(), err))
68+
}
69+
70+
if err := d.Set("invitation_id", projectInvitation.ID); err != nil {
71+
return diag.FromErr(fmt.Errorf("error getting `invitation_id` for Project Invitation (%s): %w", d.Id(), err))
72+
}
73+
74+
if err := d.Set("expires_at", projectInvitation.ExpiresAt); err != nil {
75+
return diag.FromErr(fmt.Errorf("error getting `expires_at` for Project Invitation (%s): %w", d.Id(), err))
76+
}
77+
78+
if err := d.Set("created_at", projectInvitation.CreatedAt); err != nil {
79+
return diag.FromErr(fmt.Errorf("error getting `created_at` for Project Invitation (%s): %w", d.Id(), err))
80+
}
81+
82+
if err := d.Set("inviter_username", projectInvitation.InviterUsername); err != nil {
83+
return diag.FromErr(fmt.Errorf("error getting `inviter_username` for Project Invitation (%s): %w", d.Id(), err))
84+
}
85+
86+
if err := d.Set("roles", projectInvitation.Roles); err != nil {
87+
return diag.FromErr(fmt.Errorf("error getting `roles` for Project Invitation (%s): %s", d.Id(), err))
88+
}
89+
90+
d.SetId(encodeStateID(map[string]string{
91+
"username": username,
92+
"project_id": projectID,
93+
"invitation_id": invitationID,
94+
}))
95+
96+
return nil
97+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package mongodbatlas
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"strings"
7+
"testing"
8+
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11+
)
12+
13+
func TestAccDataSourceMongoDBAtlasProjectInvitation_basic(t *testing.T) {
14+
var (
15+
dataSourceName = "mongodbatlas_project_invitation.test"
16+
projectID = os.Getenv("MONGODB_ATLAS_PROJECT_ID")
17+
name = fmt.Sprintf("test-acc-%[email protected]", acctest.RandString(10))
18+
initialRole = []string{"GROUP_OWNER"}
19+
)
20+
21+
resource.Test(t, resource.TestCase{
22+
PreCheck: func() { testAccPreCheck(t) },
23+
ProviderFactories: testAccProviderFactories,
24+
CheckDestroy: testAccCheckMongoDBAtlasProjectInvitationDestroy,
25+
Steps: []resource.TestStep{
26+
{
27+
Config: testAccDataSourceMongoDBAtlasProjectInvitationConfig(projectID, name, initialRole),
28+
Check: resource.ComposeTestCheckFunc(
29+
resource.TestCheckResourceAttrSet(dataSourceName, "project_id"),
30+
resource.TestCheckResourceAttrSet(dataSourceName, "username"),
31+
resource.TestCheckResourceAttrSet(dataSourceName, "invitation_id"),
32+
resource.TestCheckResourceAttr(dataSourceName, "username", name),
33+
resource.TestCheckResourceAttr(dataSourceName, "roles.#", "1"),
34+
),
35+
},
36+
},
37+
})
38+
}
39+
40+
func testAccDataSourceMongoDBAtlasProjectInvitationConfig(projectID, username string, roles []string) string {
41+
return fmt.Sprintf(`
42+
resource "mongodbatlas_project_invitation" "test" {
43+
project_id = %[1]q
44+
username = %[2]q
45+
roles = ["%[3]s"]
46+
}
47+
48+
data "mongodbatlas_project_invitation" "test" {
49+
project_id = mongodbatlas_project_invitation.test.project_id
50+
username = mongodbatlas_project_invitation.test.username
51+
invitation_id = mongodbatlas_project_invitation.test.invitation_id
52+
}`, projectID, username,
53+
strings.Join(roles, `", "`),
54+
)
55+
}

mongodbatlas/provider.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ func getDataSourcesMap() map[string]*schema.Resource {
116116
"mongodbatlas_data_lakes": dataSourceMongoDBAtlasDataLakes(),
117117
"mongodbatlas_event_trigger": dataSourceMongoDBAtlasEventTrigger(),
118118
"mongodbatlas_event_triggers": dataSourceMongoDBAtlasEventTriggers(),
119+
"mongodbatlas_project_invitation": dataSourceMongoDBAtlasProjectInvitation(),
120+
"mongodbatlas_org_invitation": dataSourceMongoDBAtlasOrgInvitation(),
119121
"mongodbatlas_cloud_backup_snapshot": dataSourceMongoDBAtlasCloudBackupSnapshot(),
120122
"mongodbatlas_cloud_backup_snapshots": dataSourceMongoDBAtlasCloudBackupSnapshots(),
121123
"mongodbatlas_cloud_backup_snapshot_restore_job": dataSourceMongoDBAtlasCloudBackupSnapshotRestoreJob(),
@@ -160,6 +162,8 @@ func getResourcesMap() map[string]*schema.Resource {
160162
"mongodbatlas_data_lake": resourceMongoDBAtlasDataLake(),
161163
"mongodbatlas_event_trigger": resourceMongoDBAtlasEventTriggers(),
162164
"mongodbatlas_cloud_backup_schedule": resourceMongoDBAtlasCloudBackupSchedule(),
165+
"mongodbatlas_project_invitation": resourceMongoDBAtlasProjectInvitation(),
166+
"mongodbatlas_org_invitation": resourceMongoDBAtlasOrgInvitation(),
163167
"mongodbatlas_cloud_backup_snapshot": resourceMongoDBAtlasCloudBackupSnapshot(),
164168
"mongodbatlas_cloud_backup_snapshot_restore_job": resourceMongoDBAtlasCloudBackupSnapshotRestoreJob(),
165169
}

0 commit comments

Comments
 (0)