Skip to content

Commit e322ab9

Browse files
authored
chore: Upgrades x509authentication_database_user resource to auto-generated SDK (#1884)
* rename * acc.PreCheckCert * migration tests * refactor tests * create * read * import * data source * conv2 in tests
1 parent a974bb6 commit e322ab9

6 files changed

+210
-133
lines changed

internal/service/x509authenticationdatabaseuser/data_source_x509_authentication_database_user.go

+11-11
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212

1313
func DataSource() *schema.Resource {
1414
return &schema.Resource{
15-
ReadContext: dataSourceMongoDBAtlasX509AuthDBUserRead,
15+
ReadContext: dataSourceRead,
1616
Schema: map[string]*schema.Schema{
1717
"project_id": {
1818
Type: schema.TypeString,
@@ -61,29 +61,29 @@ func DataSource() *schema.Resource {
6161
}
6262
}
6363

64-
func dataSourceMongoDBAtlasX509AuthDBUserRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
65-
// Get client connection.
66-
conn := meta.(*config.MongoDBClient).Atlas
64+
func dataSourceRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
65+
connV2 := meta.(*config.MongoDBClient).AtlasV2
6766
projectID := d.Get("project_id").(string)
6867
username := d.Get("username").(string)
6968

7069
if username != "" {
71-
certificates, _, err := conn.X509AuthDBUsers.GetUserCertificates(ctx, projectID, username, nil)
70+
resp, _, err := connV2.X509AuthenticationApi.ListDatabaseUserCertificates(ctx, projectID, username).Execute()
7271
if err != nil {
7372
return diag.FromErr(fmt.Errorf(errorX509AuthDBUsersRead, username, projectID, err))
7473
}
75-
76-
if err := d.Set("certificates", flattenCertificates(certificates)); err != nil {
77-
return diag.FromErr(fmt.Errorf(errorX509AuthDBUsersSetting, "certificates", username, err))
74+
if resp != nil && resp.Results != nil {
75+
if err := d.Set("certificates", flattenCertificates(*resp.Results)); err != nil {
76+
return diag.FromErr(fmt.Errorf(errorX509AuthDBUsersSetting, "certificates", username, err))
77+
}
7878
}
7979
}
8080

81-
customerX509, _, err := conn.X509AuthDBUsers.GetCurrentX509Conf(ctx, projectID)
81+
resp, _, err := connV2.LDAPConfigurationApi.GetLDAPConfiguration(ctx, projectID).Execute()
8282
if err != nil {
8383
return diag.FromErr(fmt.Errorf(errorCustomerX509AuthDBUsersRead, projectID, err))
8484
}
85-
86-
if err := d.Set("customer_x509_cas", customerX509.Cas); err != nil {
85+
customerX509 := resp.GetCustomerX509()
86+
if err := d.Set("customer_x509_cas", customerX509.GetCas()); err != nil {
8787
return diag.FromErr(fmt.Errorf(errorX509AuthDBUsersSetting, "certificates", username, err))
8888
}
8989

internal/service/x509authenticationdatabaseuser/resource_x509_authentication_database_user.go

+41-44
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
"github.com/mongodb/terraform-provider-mongodbatlas/internal/common/conversion"
1212
"github.com/mongodb/terraform-provider-mongodbatlas/internal/config"
1313
"github.com/spf13/cast"
14-
matlas "go.mongodb.org/atlas/mongodbatlas"
14+
"go.mongodb.org/atlas-sdk/v20231115005/admin"
1515
)
1616

1717
const (
@@ -25,11 +25,11 @@ const (
2525

2626
func Resource() *schema.Resource {
2727
return &schema.Resource{
28-
CreateContext: resourceMongoDBAtlasX509AuthDBUserCreate,
29-
ReadContext: resourceMongoDBAtlasX509AuthDBUserRead,
30-
DeleteContext: resourceMongoDBAtlasX509AuthDBUserDelete,
28+
CreateContext: resourceCreate,
29+
ReadContext: resourceRead,
30+
DeleteContext: resourceDelete,
3131
Importer: &schema.ResourceImporter{
32-
StateContext: resourceMongoDBAtlasX509AuthDBUserImportState,
32+
StateContext: resourceImport,
3333
},
3434
Schema: map[string]*schema.Schema{
3535
"project_id": {
@@ -98,27 +98,29 @@ func Resource() *schema.Resource {
9898
}
9999
}
100100

101-
func resourceMongoDBAtlasX509AuthDBUserCreate(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
102-
conn := meta.(*config.MongoDBClient).Atlas
103-
101+
func resourceCreate(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
102+
connV2 := meta.(*config.MongoDBClient).AtlasV2
104103
projectID := d.Get("project_id").(string)
105104
username := d.Get("username").(string)
106105

107-
var serialNumber string
108-
109106
if expirationMonths, ok := d.GetOk("months_until_expiration"); ok {
110-
res, _, err := conn.X509AuthDBUsers.CreateUserCertificate(ctx, projectID, username, expirationMonths.(int))
107+
months := expirationMonths.(int)
108+
params := &admin.UserCert{
109+
MonthsUntilExpiration: &months,
110+
}
111+
certStr, _, err := connV2.X509AuthenticationApi.CreateDatabaseUserCertificate(ctx, projectID, username, params).Execute()
111112
if err != nil {
112113
return diag.FromErr(fmt.Errorf(errorX509AuthDBUsersCreate, username, projectID, err))
113114
}
114-
115-
serialNumber = cast.ToString(res.ID)
116-
if err := d.Set("current_certificate", cast.ToString(res.Certificate)); err != nil {
115+
if err := d.Set("current_certificate", cast.ToString(certStr)); err != nil {
117116
return diag.FromErr(fmt.Errorf(errorX509AuthDBUsersSetting, "current_certificate", username, err))
118117
}
119118
} else {
120119
customerX509Cas := d.Get("customer_x509_cas").(string)
121-
_, _, err := conn.X509AuthDBUsers.SaveConfiguration(ctx, projectID, &matlas.CustomerX509{Cas: customerX509Cas})
120+
userReq := &admin.UserSecurity{
121+
CustomerX509: &admin.DBUserTLSX509Settings{Cas: &customerX509Cas},
122+
}
123+
_, _, err := connV2.LDAPConfigurationApi.SaveLDAPConfiguration(ctx, projectID, userReq).Execute()
122124
if err != nil {
123125
return diag.FromErr(fmt.Errorf(errorCustomerX509AuthDBUsersCreate, projectID, err))
124126
}
@@ -127,27 +129,24 @@ func resourceMongoDBAtlasX509AuthDBUserCreate(ctx context.Context, d *schema.Res
127129
d.SetId(conversion.EncodeStateID(map[string]string{
128130
"project_id": projectID,
129131
"username": username,
130-
"serial_number": serialNumber,
132+
"serial_number": "", // not returned in create API, got later in Read
131133
}))
132134

133-
return resourceMongoDBAtlasX509AuthDBUserRead(ctx, d, meta)
135+
return resourceRead(ctx, d, meta)
134136
}
135137

136-
func resourceMongoDBAtlasX509AuthDBUserRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
137-
conn := meta.(*config.MongoDBClient).Atlas
138-
138+
func resourceRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
139+
connV2 := meta.(*config.MongoDBClient).AtlasV2
139140
ids := conversion.DecodeStateID(d.Id())
140141
projectID := ids["project_id"]
141142
username := ids["username"]
142-
143143
var (
144-
certificates []matlas.UserCertificate
145-
err error
144+
certificates []admin.UserCert
146145
serialNumber string
147146
)
148147

149148
if username != "" {
150-
certificates, _, err = conn.X509AuthDBUsers.GetUserCertificates(ctx, projectID, username, nil)
149+
resp, _, err := connV2.X509AuthenticationApi.ListDatabaseUserCertificates(ctx, projectID, username).Execute()
151150
if err != nil {
152151
// new resource missing
153152
reset := strings.Contains(err.Error(), "404") && !d.IsNewResource()
@@ -157,11 +156,13 @@ func resourceMongoDBAtlasX509AuthDBUserRead(ctx context.Context, d *schema.Resou
157156
}
158157
return diag.FromErr(fmt.Errorf(errorX509AuthDBUsersRead, username, projectID, err))
159158
}
160-
for _, val := range certificates {
161-
serialNumber = cast.ToString(val.ID)
159+
if resp != nil && resp.Results != nil {
160+
certificates = *resp.Results
161+
if len(certificates) > 0 {
162+
serialNumber = cast.ToString(certificates[len(certificates)-1].GetId()) // Get SerialId from last user certificate
163+
}
162164
}
163165
}
164-
165166
if err := d.Set("certificates", flattenCertificates(certificates)); err != nil {
166167
return diag.FromErr(fmt.Errorf(errorX509AuthDBUsersSetting, "certificates", username, err))
167168
}
@@ -175,30 +176,27 @@ func resourceMongoDBAtlasX509AuthDBUserRead(ctx context.Context, d *schema.Resou
175176
return nil
176177
}
177178

178-
func resourceMongoDBAtlasX509AuthDBUserDelete(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
179+
func resourceDelete(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
179180
// We don't do anything because X.509 certificates can not be deleted or disassociated from a user.
180181
// More info: https://jira.mongodb.org/browse/HELP-53363
181182
d.SetId("")
182183
return nil
183184
}
184185

185-
func resourceMongoDBAtlasX509AuthDBUserImportState(ctx context.Context, d *schema.ResourceData, meta any) ([]*schema.ResourceData, error) {
186-
conn := meta.(*config.MongoDBClient).Atlas
187-
186+
func resourceImport(ctx context.Context, d *schema.ResourceData, meta any) ([]*schema.ResourceData, error) {
187+
connV2 := meta.(*config.MongoDBClient).AtlasV2
188188
parts := strings.SplitN(d.Id(), "-", 2)
189189
if len(parts) != 1 && len(parts) != 2 {
190190
return nil, errors.New("import format error: to import a X509 Authentication, use the formats {project_id} or {project_id}-{username}")
191191
}
192-
193192
var username string
194193
if len(parts) == 2 {
195194
username = parts[1]
196195
}
197-
198196
projectID := parts[0]
199197

200198
if username != "" {
201-
_, _, err := conn.X509AuthDBUsers.GetUserCertificates(ctx, projectID, username, nil)
199+
_, _, err := connV2.X509AuthenticationApi.ListDatabaseUserCertificates(ctx, projectID, username).Execute()
202200
if err != nil {
203201
return nil, fmt.Errorf(errorX509AuthDBUsersRead, username, projectID, err)
204202
}
@@ -208,12 +206,12 @@ func resourceMongoDBAtlasX509AuthDBUserImportState(ctx context.Context, d *schem
208206
}
209207
}
210208

211-
customerX509, _, err := conn.X509AuthDBUsers.GetCurrentX509Conf(ctx, projectID)
209+
resp, _, err := connV2.LDAPConfigurationApi.GetLDAPConfiguration(ctx, projectID).Execute()
212210
if err != nil {
213211
return nil, fmt.Errorf(errorCustomerX509AuthDBUsersRead, projectID, err)
214212
}
215-
216-
if err := d.Set("customer_x509_cas", customerX509.Cas); err != nil {
213+
customerX509 := resp.GetCustomerX509()
214+
if err := d.Set("customer_x509_cas", customerX509.GetCas()); err != nil {
217215
return nil, fmt.Errorf(errorX509AuthDBUsersSetting, "certificates", username, err)
218216
}
219217

@@ -230,17 +228,16 @@ func resourceMongoDBAtlasX509AuthDBUserImportState(ctx context.Context, d *schem
230228
return []*schema.ResourceData{d}, nil
231229
}
232230

233-
func flattenCertificates(userCertificates []matlas.UserCertificate) []map[string]any {
231+
func flattenCertificates(userCertificates []admin.UserCert) []map[string]any {
234232
certificates := make([]map[string]any, len(userCertificates))
235233
for i, v := range userCertificates {
236234
certificates[i] = map[string]any{
237-
"id": v.ID,
238-
"created_at": v.CreatedAt,
239-
"group_id": v.GroupID,
240-
"not_after": v.NotAfter,
241-
"subject": v.Subject,
235+
"id": v.GetId(),
236+
"created_at": conversion.TimePtrToStringPtr(v.CreatedAt),
237+
"group_id": v.GetGroupId(),
238+
"not_after": conversion.TimePtrToStringPtr(v.NotAfter),
239+
"subject": v.GetSubject(),
242240
}
243241
}
244-
245242
return certificates
246243
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package x509authenticationdatabaseuser_test
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
"github.com/hashicorp/terraform-plugin-testing/helper/acctest"
8+
"github.com/hashicorp/terraform-plugin-testing/helper/resource"
9+
"github.com/hashicorp/terraform-plugin-testing/plancheck"
10+
"github.com/mongodb/terraform-provider-mongodbatlas/internal/testutil/acc"
11+
"github.com/mongodb/terraform-provider-mongodbatlas/internal/testutil/mig"
12+
)
13+
14+
func TestAccMigrationGenericX509AuthDBUser_basic(t *testing.T) {
15+
var (
16+
username = acctest.RandomWithPrefix("test-acc")
17+
orgID = os.Getenv("MONGODB_ATLAS_ORG_ID")
18+
projectName = acctest.RandomWithPrefix("test-acc")
19+
)
20+
21+
resource.ParallelTest(t, resource.TestCase{
22+
PreCheck: func() {
23+
mig.PreCheckBasic(t)
24+
},
25+
Steps: []resource.TestStep{
26+
{
27+
ExternalProviders: mig.ExternalProviders(),
28+
Config: configBasic(projectName, orgID, username),
29+
Check: resource.ComposeTestCheckFunc(
30+
checkExists(resourceName),
31+
resource.TestCheckResourceAttrSet(resourceName, "project_id"),
32+
resource.TestCheckResourceAttr(resourceName, "username", username),
33+
resource.TestCheckResourceAttrSet(dataSourceName, "project_id"),
34+
resource.TestCheckResourceAttr(dataSourceName, "username", username),
35+
),
36+
},
37+
{
38+
ProtoV6ProviderFactories: acc.TestAccProviderV6Factories,
39+
Config: configBasic(projectName, orgID, username),
40+
ConfigPlanChecks: resource.ConfigPlanChecks{
41+
PreApply: []plancheck.PlanCheck{
42+
acc.DebugPlan(),
43+
plancheck.ExpectEmptyPlan(),
44+
},
45+
},
46+
},
47+
},
48+
})
49+
}
50+
51+
func TestAccMigrationGenericX509AuthDBUser_withCustomerX509(t *testing.T) {
52+
var (
53+
cas = os.Getenv("CA_CERT")
54+
orgID = os.Getenv("MONGODB_ATLAS_ORG_ID")
55+
projectName = acctest.RandomWithPrefix("test-acc")
56+
)
57+
58+
resource.ParallelTest(t, resource.TestCase{
59+
PreCheck: func() { mig.PreCheckCert(t) },
60+
Steps: []resource.TestStep{
61+
{
62+
ExternalProviders: mig.ExternalProviders(),
63+
Config: configWithCustomerX509(projectName, orgID, cas),
64+
Check: resource.ComposeTestCheckFunc(
65+
checkExists(resourceName),
66+
resource.TestCheckResourceAttrSet(resourceName, "project_id"),
67+
resource.TestCheckResourceAttrSet(resourceName, "customer_x509_cas"),
68+
resource.TestCheckResourceAttrSet(dataSourceName, "project_id"),
69+
resource.TestCheckResourceAttrSet(dataSourceName, "customer_x509_cas"),
70+
),
71+
},
72+
{
73+
ProtoV6ProviderFactories: acc.TestAccProviderV6Factories,
74+
Config: configWithCustomerX509(projectName, orgID, cas),
75+
ConfigPlanChecks: resource.ConfigPlanChecks{
76+
PreApply: []plancheck.PlanCheck{
77+
acc.DebugPlan(),
78+
plancheck.ExpectEmptyPlan(),
79+
},
80+
},
81+
},
82+
},
83+
})
84+
}

0 commit comments

Comments
 (0)