Skip to content

Commit 3f75aeb

Browse files
authored
Merge pull request #360 from lpatte/PUD-1794-1806_advanced-config-avnadamin-user
add advanced config and manage avnadmin user
2 parents e3dab41 + ed8c4e1 commit 3f75aeb

18 files changed

+274
-491
lines changed

ovh/data_cloud_project_database.go

+17
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,14 @@ func dataSourceCloudProjectDatabase() *schema.Resource {
167167
Description: "Disk type attributes of the cluster",
168168
Computed: true,
169169
},
170+
"advanced_configuration": {
171+
Type: schema.TypeMap,
172+
Elem: &schema.Schema{
173+
Type: schema.TypeString,
174+
},
175+
Description: "Advanced configuration key / value",
176+
Computed: true,
177+
},
170178
},
171179
}
172180
}
@@ -206,6 +214,15 @@ func dataSourceCloudProjectDatabaseRead(d *schema.ResourceData, meta interface{}
206214

207215
res.Region = node.Region
208216

217+
if engine != "mongodb" {
218+
advancedConfigEndpoint := fmt.Sprintf("%s/advancedConfiguration", serviceEndpoint)
219+
advancedConfigMap := &map[string]string{}
220+
if err := config.OVHClient.Get(advancedConfigEndpoint, advancedConfigMap); err != nil {
221+
return fmt.Errorf("unable to get database %s advanced configuration: %v", res.Id, err)
222+
}
223+
res.AdvancedConfiguration = *advancedConfigMap
224+
}
225+
209226
for k, v := range res.ToMap() {
210227
if k != "id" {
211228
d.Set(k, v)

ovh/data_cloud_project_database_databases.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"sort"
88

99
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
"github.com/ovh/terraform-provider-ovh/ovh/helpers"
1011
"github.com/ovh/terraform-provider-ovh/ovh/helpers/hashcode"
1112
)
1213

@@ -20,9 +21,10 @@ func dataSourceCloudProjectDatabaseDatabases() *schema.Resource {
2021
DefaultFunc: schema.EnvDefaultFunc("OVH_CLOUD_PROJECT_SERVICE", nil),
2122
},
2223
"engine": {
23-
Type: schema.TypeString,
24-
Description: "Name of the engine of the service",
25-
Required: true,
24+
Type: schema.TypeString,
25+
Description: "Name of the engine of the service",
26+
Required: true,
27+
ValidateFunc: helpers.ValidateEnum([]string{"mysql", "postgresql"}),
2628
},
2729
"cluster_id": {
2830
Type: schema.TypeString,

ovh/resource_cloud_project_database.go

+36-1
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,18 @@ func resourceCloudProjectDatabase() *schema.Resource {
113113
Computed: true,
114114
ValidateFunc: validateCloudProjectDatabaseDiskSize,
115115
},
116+
"advanced_configuration": {
117+
Type: schema.TypeMap,
118+
Elem: &schema.Schema{
119+
Type: schema.TypeString,
120+
},
121+
Description: "Advanced configuration key / value",
122+
Optional: true,
123+
Computed: true,
124+
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
125+
return d.Get("engine").(string) == "mongodb" || new == old
126+
},
127+
},
116128

117129
//Computed
118130
"backup_time": {
@@ -247,7 +259,9 @@ func resourceCloudProjectDatabaseCreate(d *schema.ResourceData, meta interface{}
247259

248260
d.SetId(res.Id)
249261

250-
if (engine == "kafka" && d.Get("kafka_rest_api").(bool)) || (engine == "opensearch" && d.Get("opensearch_acls_enabled").(bool)) {
262+
if (engine != "mongodb" && len(d.Get("advanced_configuration").(map[string]interface{})) > 0) ||
263+
(engine == "kafka" && d.Get("kafka_rest_api").(bool)) ||
264+
(engine == "opensearch" && d.Get("opensearch_acls_enabled").(bool)) {
251265
return resourceCloudProjectDatabaseUpdate(d, meta)
252266
}
253267

@@ -288,6 +302,15 @@ func resourceCloudProjectDatabaseRead(d *schema.ResourceData, meta interface{})
288302

289303
res.Region = node.Region
290304

305+
if engine != "mongodb" {
306+
advancedConfigEndpoint := fmt.Sprintf("%s/advancedConfiguration", serviceEndpoint)
307+
advancedConfigMap := &map[string]string{}
308+
if err := config.OVHClient.Get(advancedConfigEndpoint, advancedConfigMap); err != nil {
309+
return fmt.Errorf("unable to get database %s advanced configuration: %v", res.Id, err)
310+
}
311+
res.AdvancedConfiguration = *advancedConfigMap
312+
}
313+
291314
for k, v := range res.ToMap() {
292315
if k != "id" {
293316
d.Set(k, v)
@@ -325,6 +348,18 @@ func resourceCloudProjectDatabaseUpdate(d *schema.ResourceData, meta interface{}
325348
if err != nil {
326349
return fmt.Errorf("timeout while waiting database %s to be READY: %w", d.Id(), err)
327350
}
351+
352+
if d.HasChanges("advanced_configuration") {
353+
acParams := d.Get("advanced_configuration").(map[string]interface{})
354+
355+
advancedConfigEndpoint := fmt.Sprintf("%s/advancedConfiguration", endpoint)
356+
357+
err = config.OVHClient.Put(advancedConfigEndpoint, acParams, nil)
358+
if err != nil {
359+
return fmt.Errorf("calling Put %s with params %v:\n\t %q", advancedConfigEndpoint, acParams, err)
360+
}
361+
}
362+
328363
log.Printf("[DEBUG] database %s is READY", d.Id())
329364

330365
return resourceCloudProjectDatabaseRead(d, meta)

ovh/resource_cloud_project_database_m3db_user.go

+8-97
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"fmt"
55
"log"
66
"net/url"
7-
"strings"
87
"time"
98

109
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -80,43 +79,14 @@ func resourceCloudProjectDatabaseM3dbUser() *schema.Resource {
8079
}
8180

8281
func resourceCloudProjectDatabaseM3dbUserImportState(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
83-
givenId := d.Id()
84-
n := 3
85-
splitId := strings.SplitN(givenId, "/", n)
86-
if len(splitId) != n {
87-
return nil, fmt.Errorf("Import Id is not service_name/cluster_id/id formatted")
88-
}
89-
serviceName := splitId[0]
90-
clusterId := splitId[1]
91-
id := splitId[2]
92-
d.SetId(id)
93-
d.Set("cluster_id", clusterId)
94-
d.Set("service_name", serviceName)
95-
96-
results := make([]*schema.ResourceData, 1)
97-
results[0] = d
98-
return results, nil
82+
return importCloudProjectDatabaseUser(d, meta)
9983
}
10084

10185
func resourceCloudProjectDatabaseM3dbUserCreate(d *schema.ResourceData, meta interface{}) error {
102-
serviceName := d.Get("service_name").(string)
103-
clusterId := d.Get("cluster_id").(string)
104-
105-
endpoint := fmt.Sprintf("/cloud/project/%s/database/m3db/%s/user",
106-
url.PathEscape(serviceName),
107-
url.PathEscape(clusterId),
108-
)
109-
params := (&CloudProjectDatabaseM3dbUserCreateOpts{}).FromResource(d)
110-
res := &CloudProjectDatabaseUserResponse{}
111-
112-
log.Printf("[DEBUG] Will create user: %+v for cluster %s from project %s", params, clusterId, serviceName)
113-
err := postCloudProjectDatabaseUser(d, meta, "m3db", endpoint, params, res, schema.TimeoutCreate)
114-
if err != nil {
115-
return err
86+
f := func() interface{} {
87+
return (&CloudProjectDatabaseM3dbUserCreateOpts{}).FromResource(d)
11688
}
117-
118-
d.SetId(res.Id)
119-
return resourceCloudProjectDatabaseM3dbUserRead(d, meta)
89+
return postCloudProjectDatabaseUser(d, meta, "m3db", dataSourceCloudProjectDatabaseM3dbUserRead, resourceCloudProjectDatabaseM3dbUserRead, resourceCloudProjectDatabaseM3dbUserUpdate, f)
12090
}
12191

12292
func resourceCloudProjectDatabaseM3dbUserRead(d *schema.ResourceData, meta interface{}) error {
@@ -150,71 +120,12 @@ func resourceCloudProjectDatabaseM3dbUserRead(d *schema.ResourceData, meta inter
150120
}
151121

152122
func resourceCloudProjectDatabaseM3dbUserUpdate(d *schema.ResourceData, meta interface{}) error {
153-
config := meta.(*Config)
154-
serviceName := d.Get("service_name").(string)
155-
clusterId := d.Get("cluster_id").(string)
156-
passwordReset := d.HasChange("password_reset")
157-
id := d.Id()
158-
159-
endpoint := fmt.Sprintf("/cloud/project/%s/database/m3db/%s/user/%s",
160-
url.PathEscape(serviceName),
161-
url.PathEscape(clusterId),
162-
url.PathEscape(id),
163-
)
164-
params := (&CloudProjectDatabaseM3dbUserUpdateOpts{}).FromResource(d)
165-
166-
log.Printf("[DEBUG] Will update user: %+v from cluster %s from project %s", params, clusterId, serviceName)
167-
err := config.OVHClient.Put(endpoint, params, nil)
168-
if err != nil {
169-
return fmt.Errorf("calling Put %s with params %+v:\n\t %q", endpoint, params, err)
170-
}
171-
172-
log.Printf("[DEBUG] Waiting for user %s to be READY", id)
173-
err = waitForCloudProjectDatabaseUserReady(config.OVHClient, serviceName, "m3db", clusterId, id, d.Timeout(schema.TimeoutUpdate))
174-
if err != nil {
175-
return fmt.Errorf("timeout while waiting user %s to be READY: %w", id, err)
123+
f := func() interface{} {
124+
return (&CloudProjectDatabaseM3dbUserUpdateOpts{}).FromResource(d)
176125
}
177-
log.Printf("[DEBUG] user %s is READY", id)
178-
179-
if passwordReset {
180-
pwdResetEndpoint := endpoint + "/credentials/reset"
181-
res := &CloudProjectDatabaseUserResponse{}
182-
log.Printf("[DEBUG] Will update user password for cluster %s from project %s", clusterId, serviceName)
183-
err := postCloudProjectDatabaseUser(d, meta, "m3db", pwdResetEndpoint, nil, res, schema.TimeoutUpdate)
184-
if err != nil {
185-
return err
186-
}
187-
}
188-
189-
return resourceCloudProjectDatabaseM3dbUserRead(d, meta)
126+
return updateCloudProjectDatabaseUser(d, meta, "m3db", resourceCloudProjectDatabaseM3dbUserRead, f)
190127
}
191128

192129
func resourceCloudProjectDatabaseM3dbUserDelete(d *schema.ResourceData, meta interface{}) error {
193-
config := meta.(*Config)
194-
serviceName := d.Get("service_name").(string)
195-
clusterId := d.Get("cluster_id").(string)
196-
id := d.Id()
197-
198-
endpoint := fmt.Sprintf("/cloud/project/%s/database/m3db/%s/user/%s",
199-
url.PathEscape(serviceName),
200-
url.PathEscape(clusterId),
201-
url.PathEscape(id),
202-
)
203-
204-
log.Printf("[DEBUG] Will delete user %s from cluster %s from project %s", id, clusterId, serviceName)
205-
err := config.OVHClient.Delete(endpoint, nil)
206-
if err != nil {
207-
return helpers.CheckDeleted(d, err, endpoint)
208-
}
209-
210-
log.Printf("[DEBUG] Waiting for user %s to be DELETED", id)
211-
err = waitForCloudProjectDatabaseUserDeleted(config.OVHClient, serviceName, "m3db", clusterId, id, d.Timeout(schema.TimeoutDelete))
212-
if err != nil {
213-
return fmt.Errorf("timeout while waiting user %s to be DELETED: %w", id, err)
214-
}
215-
log.Printf("[DEBUG] user %s is DELETED", id)
216-
217-
d.SetId("")
218-
219-
return nil
130+
return deleteCloudProjectDatabaseUser(d, meta, "m3db")
220131
}

ovh/resource_cloud_project_database_mongodb_user.go

+3-19
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"fmt"
55
"log"
66
"net/url"
7-
"strings"
87
"time"
98

109
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
@@ -91,22 +90,7 @@ func resourceCloudProjectDatabaseMongodbUser() *schema.Resource {
9190
}
9291

9392
func resourceCloudProjectDatabaseMongodbUserImportState(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
94-
givenId := d.Id()
95-
n := 3
96-
splitId := strings.SplitN(givenId, "/", n)
97-
if len(splitId) != n {
98-
return nil, fmt.Errorf("Import Id is not service_name/cluster_id/id formatted")
99-
}
100-
serviceName := splitId[0]
101-
clusterId := splitId[1]
102-
id := splitId[2]
103-
d.SetId(id)
104-
d.Set("cluster_id", clusterId)
105-
d.Set("service_name", serviceName)
106-
107-
results := make([]*schema.ResourceData, 1)
108-
results[0] = d
109-
return results, nil
93+
return importCloudProjectDatabaseUser(d, meta)
11094
}
11195

11296
func resourceCloudProjectDatabaseMongodbUserCreate(d *schema.ResourceData, meta interface{}) error {
@@ -122,7 +106,7 @@ func resourceCloudProjectDatabaseMongodbUserCreate(d *schema.ResourceData, meta
122106

123107
return resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
124108
log.Printf("[DEBUG] Will create user: %+v for cluster %s from project %s", params, clusterId, serviceName)
125-
err := postCloudProjectDatabaseUser(d, meta, "mongodb", endpoint, params, res, schema.TimeoutCreate)
109+
err := postFuncCloudProjectDatabaseUser(d, meta, "mongodb", endpoint, params, res, schema.TimeoutCreate)
126110
if err != nil {
127111
if errOvh, ok := err.(*ovh.APIError); ok && (errOvh.Code == 409) {
128112
return resource.RetryableError(err)
@@ -204,7 +188,7 @@ func resourceCloudProjectDatabaseMongodbUserUpdate(d *schema.ResourceData, meta
204188
pwdResetEndpoint := endpoint + "/credentials/reset"
205189
res := &CloudProjectDatabaseUserResponse{}
206190
log.Printf("[DEBUG] Will update user password for cluster %s from project %s", clusterId, serviceName)
207-
err := postCloudProjectDatabaseUser(d, meta, "mongodb", pwdResetEndpoint, nil, res, schema.TimeoutUpdate)
191+
err := postFuncCloudProjectDatabaseUser(d, meta, "mongodb", pwdResetEndpoint, nil, res, schema.TimeoutUpdate)
208192
if err != nil {
209193
if errOvh, ok := err.(*ovh.APIError); ok && (errOvh.Code == 409) {
210194
return resource.RetryableError(err)

0 commit comments

Comments
 (0)