Skip to content

Commit 0cbcc5d

Browse files
authored
deprecate: Deprecates & updates resource.mongodbatlas_team.usernames attribute to be Optional & Computed (#3494)
1 parent bfcb81c commit 0cbcc5d

File tree

6 files changed

+137
-24
lines changed

6 files changed

+137
-24
lines changed

.changelog/3494.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
```release-note:note
2+
resource/mongodbatlas_team: Deprecates `usernames` attribute & makes it Optional & Computed in favour of `mongodbatlas_cloud_user_team_assignment` resource
3+
```
4+
5+
```release-note:note
6+
data-source/mongodbatlas_team: Deprecates `usernames` attribute in favour of `data.mongodbatlas_team.users` attribute
7+
```

internal/common/constant/deprecation.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ const (
1313
DeprecationParamByDateWithExternalLink = "This parameter is deprecated and will be removed in %s. For more details see %s."
1414
DeprecationSharedTier = "Shared-tier instance sizes are deprecated and will reach End of Life in %s. For more details see %s"
1515
ServerlessSharedEOLDate = "January 2026"
16+
DeprecationNextMajorWithReplacementGuide = "This %s is deprecated and will be removed in the next major release. Please transition to `%s`. For more details, see %s."
1617
)

internal/service/team/data_source_team.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ func DataSource() *schema.Resource {
3939
ConflictsWith: []string{"team_id"},
4040
},
4141
"usernames": {
42-
Type: schema.TypeSet,
43-
Computed: true,
42+
Type: schema.TypeSet,
43+
Computed: true,
44+
Deprecated: fmt.Sprintf(constant.DeprecationNextMajorWithReplacementGuide, "parameter", "data.mongodbatlas_team.users", "<link-to-migration-guide>"),
4445
Elem: &schema.Schema{
4546
Type: schema.TypeString,
4647
},

internal/service/team/resource_team.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,10 @@ func Resource() *schema.Resource {
5555
Required: true,
5656
},
5757
"usernames": {
58-
Type: schema.TypeSet,
59-
Required: true,
58+
Type: schema.TypeSet,
59+
Optional: true,
60+
Computed: true,
61+
Deprecated: fmt.Sprintf(constant.DeprecationNextMajorWithReplacementGuide, "parameter", "mongodbatlas_cloud_user_team_assignment", "<link-to-migration-guide>"),
6062
Elem: &schema.Schema{
6163
Type: schema.TypeString,
6264
},
@@ -76,11 +78,15 @@ func resourceCreate(ctx context.Context, d *schema.ResourceData, meta any) diag.
7678
orgID := d.Get("org_id").(string)
7779

7880
usernames := conversion.ExpandStringListFromSetSchema(d.Get("usernames").(*schema.Set))
79-
teamsResp, _, err := connV2.TeamsApi.CreateTeam(ctx, orgID,
80-
&admin20241113.Team{
81-
Name: d.Get("name").(string),
82-
Usernames: usernames,
83-
}).Execute()
81+
createTeamReq := &admin20241113.Team{
82+
Name: d.Get("name").(string),
83+
}
84+
85+
if len(usernames) > 0 {
86+
createTeamReq.Usernames = usernames
87+
}
88+
89+
teamsResp, _, err := connV2.TeamsApi.CreateTeam(ctx, orgID, createTeamReq).Execute()
8490
if err != nil {
8591
return diag.FromErr(fmt.Errorf(errorTeamCreate, err))
8692
}

internal/service/team/resource_team_migration_test.go

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"testing"
66

77
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
8+
89
"github.com/mongodb/terraform-provider-mongodbatlas/internal/testutil/acc"
910
"github.com/mongodb/terraform-provider-mongodbatlas/internal/testutil/mig"
1011
)
@@ -15,7 +16,8 @@ func TestMigConfigTeams_basic(t *testing.T) {
1516
orgID = os.Getenv("MONGODB_ATLAS_ORG_ID")
1617
username = os.Getenv("MONGODB_ATLAS_USERNAME")
1718
name = acc.RandomName()
18-
config = configBasic(orgID, name, []string{username})
19+
usernames = []string{username}
20+
config = configBasic(orgID, name, &usernames)
1921
)
2022

2123
resource.Test(t, resource.TestCase{
@@ -36,3 +38,45 @@ func TestMigConfigTeams_basic(t *testing.T) {
3638
},
3739
})
3840
}
41+
42+
func TestMigConfigTeams_usernamesDeprecation(t *testing.T) {
43+
var (
44+
resourceName = "mongodbatlas_team.test"
45+
orgID = os.Getenv("MONGODB_ATLAS_ORG_ID")
46+
username = os.Getenv("MONGODB_ATLAS_USERNAME")
47+
name = acc.RandomName()
48+
usernames = []string{username}
49+
)
50+
51+
resource.Test(t, resource.TestCase{
52+
PreCheck: func() { mig.PreCheckAtlasUsername(t) },
53+
CheckDestroy: acc.CheckDestroyTeam,
54+
Steps: []resource.TestStep{
55+
{
56+
ExternalProviders: mig.ExternalProviders(),
57+
Config: configBasic(orgID, name, &usernames),
58+
Check: resource.ComposeAggregateTestCheckFunc(
59+
checkExists(resourceName),
60+
resource.TestCheckResourceAttrSet(resourceName, "org_id"),
61+
resource.TestCheckResourceAttr(resourceName, "name", name),
62+
resource.TestCheckResourceAttr(resourceName, "usernames.#", "1"),
63+
resource.TestCheckTypeSetElemAttr(resourceName, "usernames.*", username),
64+
),
65+
},
66+
mig.TestStepCheckEmptyPlan(configBasic(orgID, name, &usernames)),
67+
{
68+
ProtoV6ProviderFactories: acc.TestAccProviderV6Factories,
69+
Config: configBasic(orgID, name, nil),
70+
Check: resource.ComposeAggregateTestCheckFunc(
71+
checkExists(resourceName),
72+
resource.TestCheckResourceAttrSet(resourceName, "org_id"),
73+
resource.TestCheckResourceAttr(resourceName, "name", name),
74+
// usernames should still be present in state (computed) but not in config
75+
resource.TestCheckResourceAttr(resourceName, "usernames.#", "1"),
76+
resource.TestCheckTypeSetElemAttr(resourceName, "usernames.*", username),
77+
),
78+
},
79+
mig.TestStepCheckEmptyPlan(configBasic(orgID, name, nil)),
80+
},
81+
})
82+
}

internal/service/team/resource_team_test.go

Lines changed: 68 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,58 @@ import (
1010

1111
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
1212
"github.com/hashicorp/terraform-plugin-testing/terraform"
13+
1314
"github.com/mongodb/terraform-provider-mongodbatlas/internal/common/conversion"
1415
"github.com/mongodb/terraform-provider-mongodbatlas/internal/testutil/acc"
1516
)
1617

18+
func TestAccConfigRSTeam_basicNoUsernames(t *testing.T) {
19+
var (
20+
resourceName = "mongodbatlas_team.test"
21+
orgID = os.Getenv("MONGODB_ATLAS_ORG_ID")
22+
name = acc.RandomName()
23+
updatedName = acc.RandomName()
24+
)
25+
26+
resource.ParallelTest(t, resource.TestCase{
27+
PreCheck: func() { acc.PreCheckBasic(t) },
28+
ProtoV6ProviderFactories: acc.TestAccProviderV6Factories,
29+
CheckDestroy: acc.CheckDestroyTeam,
30+
Steps: []resource.TestStep{
31+
{
32+
Config: configBasic(orgID, name, nil),
33+
Check: resource.ComposeAggregateTestCheckFunc(
34+
checkExists(resourceName),
35+
resource.TestCheckResourceAttrSet(resourceName, "org_id"),
36+
resource.TestCheckResourceAttr(resourceName, "name", name),
37+
),
38+
},
39+
{
40+
Config: configBasic(orgID, updatedName, nil),
41+
Check: resource.ComposeAggregateTestCheckFunc(
42+
checkExists(resourceName),
43+
resource.TestCheckResourceAttrSet(resourceName, "org_id"),
44+
resource.TestCheckResourceAttr(resourceName, "name", updatedName),
45+
),
46+
},
47+
{
48+
Config: configBasic(orgID, updatedName, nil),
49+
Check: resource.ComposeAggregateTestCheckFunc(
50+
checkExists(resourceName),
51+
resource.TestCheckResourceAttrSet(resourceName, "org_id"),
52+
resource.TestCheckResourceAttr(resourceName, "name", updatedName),
53+
),
54+
},
55+
{
56+
ResourceName: resourceName,
57+
ImportStateIdFunc: importStateIDFunc(resourceName),
58+
ImportState: true,
59+
ImportStateVerify: true,
60+
},
61+
},
62+
})
63+
}
64+
1765
func TestAccConfigRSTeam_basic(t *testing.T) {
1866
var (
1967
resourceName = "mongodbatlas_team.test"
@@ -29,7 +77,7 @@ func TestAccConfigRSTeam_basic(t *testing.T) {
2977
CheckDestroy: acc.CheckDestroyTeam,
3078
Steps: []resource.TestStep{
3179
{
32-
Config: configBasic(orgID, name, usernames),
80+
Config: configBasic(orgID, name, &usernames),
3381
Check: resource.ComposeAggregateTestCheckFunc(
3482
checkExists(resourceName),
3583
resource.TestCheckResourceAttrSet(resourceName, "org_id"),
@@ -38,7 +86,7 @@ func TestAccConfigRSTeam_basic(t *testing.T) {
3886
),
3987
},
4088
{
41-
Config: configBasic(orgID, updatedName, usernames),
89+
Config: configBasic(orgID, updatedName, &usernames),
4290
Check: resource.ComposeAggregateTestCheckFunc(
4391
checkExists(resourceName),
4492
resource.TestCheckResourceAttrSet(resourceName, "org_id"),
@@ -47,7 +95,7 @@ func TestAccConfigRSTeam_basic(t *testing.T) {
4795
),
4896
},
4997
{
50-
Config: configBasic(orgID, updatedName, usernames),
98+
Config: configBasic(orgID, updatedName, &usernames),
5199
Check: resource.ComposeAggregateTestCheckFunc(
52100
checkExists(resourceName),
53101
resource.TestCheckResourceAttrSet(resourceName, "org_id"),
@@ -83,7 +131,7 @@ func TestAccConfigRSTeam_updatingUsernames(t *testing.T) {
83131
CheckDestroy: acc.CheckDestroyTeam,
84132
Steps: []resource.TestStep{
85133
{
86-
Config: configBasic(orgID, name, usernames),
134+
Config: configBasic(orgID, name, &usernames),
87135
Check: resource.ComposeAggregateTestCheckFunc(
88136
checkExists(resourceName),
89137
resource.TestCheckResourceAttrSet(resourceName, "org_id"),
@@ -93,7 +141,7 @@ func TestAccConfigRSTeam_updatingUsernames(t *testing.T) {
93141
),
94142
},
95143
{
96-
Config: configBasic(orgID, name, updatedSingleUsername),
144+
Config: configBasic(orgID, name, &updatedSingleUsername),
97145
Check: resource.ComposeAggregateTestCheckFunc(
98146
checkExists(resourceName),
99147
resource.TestCheckResourceAttrSet(resourceName, "org_id"),
@@ -103,7 +151,7 @@ func TestAccConfigRSTeam_updatingUsernames(t *testing.T) {
103151
),
104152
},
105153
{
106-
Config: configBasic(orgID, name, updatedBothUsername),
154+
Config: configBasic(orgID, name, &updatedBothUsername),
107155
Check: resource.ComposeAggregateTestCheckFunc(
108156
checkExists(resourceName),
109157
resource.TestCheckResourceAttrSet(resourceName, "org_id"),
@@ -179,15 +227,21 @@ func importStateIDFunc(resourceName string) resource.ImportStateIdFunc {
179227
}
180228
}
181229

182-
func configBasic(orgID, name string, usernames []string) string {
230+
func configBasic(orgID, name string, usernames *[]string) string {
231+
var usernamesAttr string
232+
if usernames != nil && len(*usernames) > 0 {
233+
usernamesStr := `"` + strings.Join(*usernames, `", "`) + `"`
234+
usernamesAttr = fmt.Sprintf(`
235+
usernames = [%s]`, usernamesStr)
236+
}
237+
183238
return fmt.Sprintf(`
184-
resource "mongodbatlas_team" "test" {
185-
org_id = "%s"
186-
name = "%s"
187-
usernames = %s
188-
}`, orgID, name,
189-
strings.ReplaceAll(fmt.Sprintf("%+q", usernames), " ", ","),
190-
)
239+
resource "mongodbatlas_team" "test" {
240+
org_id = "%s"
241+
name = "%s"
242+
243+
%s
244+
}`, orgID, name, usernamesAttr)
191245
}
192246

193247
func configBasicLegacyNames(orgID, name string, usernames []string) string {

0 commit comments

Comments
 (0)