Skip to content

Commit

Permalink
Merge pull request #360 from lpatte/PUD-1794-1806_advanced-config-avn…
Browse files Browse the repository at this point in the history
…adamin-user

add advanced config and manage avnadmin user
  • Loading branch information
scraly authored Feb 15, 2023
2 parents e3dab41 + ed8c4e1 commit 3f75aeb
Show file tree
Hide file tree
Showing 18 changed files with 274 additions and 491 deletions.
17 changes: 17 additions & 0 deletions ovh/data_cloud_project_database.go
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,14 @@ func dataSourceCloudProjectDatabase() *schema.Resource {
Description: "Disk type attributes of the cluster",
Computed: true,
},
"advanced_configuration": {
Type: schema.TypeMap,
Elem: &schema.Schema{
Type: schema.TypeString,
},
Description: "Advanced configuration key / value",
Computed: true,
},
},
}
}
Expand Down Expand Up @@ -206,6 +214,15 @@ func dataSourceCloudProjectDatabaseRead(d *schema.ResourceData, meta interface{}

res.Region = node.Region

if engine != "mongodb" {
advancedConfigEndpoint := fmt.Sprintf("%s/advancedConfiguration", serviceEndpoint)
advancedConfigMap := &map[string]string{}
if err := config.OVHClient.Get(advancedConfigEndpoint, advancedConfigMap); err != nil {
return fmt.Errorf("unable to get database %s advanced configuration: %v", res.Id, err)
}
res.AdvancedConfiguration = *advancedConfigMap
}

for k, v := range res.ToMap() {
if k != "id" {
d.Set(k, v)
Expand Down
8 changes: 5 additions & 3 deletions ovh/data_cloud_project_database_databases.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"sort"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/ovh/terraform-provider-ovh/ovh/helpers"
"github.com/ovh/terraform-provider-ovh/ovh/helpers/hashcode"
)

Expand All @@ -20,9 +21,10 @@ func dataSourceCloudProjectDatabaseDatabases() *schema.Resource {
DefaultFunc: schema.EnvDefaultFunc("OVH_CLOUD_PROJECT_SERVICE", nil),
},
"engine": {
Type: schema.TypeString,
Description: "Name of the engine of the service",
Required: true,
Type: schema.TypeString,
Description: "Name of the engine of the service",
Required: true,
ValidateFunc: helpers.ValidateEnum([]string{"mysql", "postgresql"}),
},
"cluster_id": {
Type: schema.TypeString,
Expand Down
37 changes: 36 additions & 1 deletion ovh/resource_cloud_project_database.go
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,18 @@ func resourceCloudProjectDatabase() *schema.Resource {
Computed: true,
ValidateFunc: validateCloudProjectDatabaseDiskSize,
},
"advanced_configuration": {
Type: schema.TypeMap,
Elem: &schema.Schema{
Type: schema.TypeString,
},
Description: "Advanced configuration key / value",
Optional: true,
Computed: true,
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
return d.Get("engine").(string) == "mongodb" || new == old
},
},

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

d.SetId(res.Id)

if (engine == "kafka" && d.Get("kafka_rest_api").(bool)) || (engine == "opensearch" && d.Get("opensearch_acls_enabled").(bool)) {
if (engine != "mongodb" && len(d.Get("advanced_configuration").(map[string]interface{})) > 0) ||
(engine == "kafka" && d.Get("kafka_rest_api").(bool)) ||
(engine == "opensearch" && d.Get("opensearch_acls_enabled").(bool)) {
return resourceCloudProjectDatabaseUpdate(d, meta)
}

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

res.Region = node.Region

if engine != "mongodb" {
advancedConfigEndpoint := fmt.Sprintf("%s/advancedConfiguration", serviceEndpoint)
advancedConfigMap := &map[string]string{}
if err := config.OVHClient.Get(advancedConfigEndpoint, advancedConfigMap); err != nil {
return fmt.Errorf("unable to get database %s advanced configuration: %v", res.Id, err)
}
res.AdvancedConfiguration = *advancedConfigMap
}

for k, v := range res.ToMap() {
if k != "id" {
d.Set(k, v)
Expand Down Expand Up @@ -325,6 +348,18 @@ func resourceCloudProjectDatabaseUpdate(d *schema.ResourceData, meta interface{}
if err != nil {
return fmt.Errorf("timeout while waiting database %s to be READY: %w", d.Id(), err)
}

if d.HasChanges("advanced_configuration") {
acParams := d.Get("advanced_configuration").(map[string]interface{})

advancedConfigEndpoint := fmt.Sprintf("%s/advancedConfiguration", endpoint)

err = config.OVHClient.Put(advancedConfigEndpoint, acParams, nil)
if err != nil {
return fmt.Errorf("calling Put %s with params %v:\n\t %q", advancedConfigEndpoint, acParams, err)
}
}

log.Printf("[DEBUG] database %s is READY", d.Id())

return resourceCloudProjectDatabaseRead(d, meta)
Expand Down
105 changes: 8 additions & 97 deletions ovh/resource_cloud_project_database_m3db_user.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"fmt"
"log"
"net/url"
"strings"
"time"

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

func resourceCloudProjectDatabaseM3dbUserImportState(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
givenId := d.Id()
n := 3
splitId := strings.SplitN(givenId, "/", n)
if len(splitId) != n {
return nil, fmt.Errorf("Import Id is not service_name/cluster_id/id formatted")
}
serviceName := splitId[0]
clusterId := splitId[1]
id := splitId[2]
d.SetId(id)
d.Set("cluster_id", clusterId)
d.Set("service_name", serviceName)

results := make([]*schema.ResourceData, 1)
results[0] = d
return results, nil
return importCloudProjectDatabaseUser(d, meta)
}

func resourceCloudProjectDatabaseM3dbUserCreate(d *schema.ResourceData, meta interface{}) error {
serviceName := d.Get("service_name").(string)
clusterId := d.Get("cluster_id").(string)

endpoint := fmt.Sprintf("/cloud/project/%s/database/m3db/%s/user",
url.PathEscape(serviceName),
url.PathEscape(clusterId),
)
params := (&CloudProjectDatabaseM3dbUserCreateOpts{}).FromResource(d)
res := &CloudProjectDatabaseUserResponse{}

log.Printf("[DEBUG] Will create user: %+v for cluster %s from project %s", params, clusterId, serviceName)
err := postCloudProjectDatabaseUser(d, meta, "m3db", endpoint, params, res, schema.TimeoutCreate)
if err != nil {
return err
f := func() interface{} {
return (&CloudProjectDatabaseM3dbUserCreateOpts{}).FromResource(d)
}

d.SetId(res.Id)
return resourceCloudProjectDatabaseM3dbUserRead(d, meta)
return postCloudProjectDatabaseUser(d, meta, "m3db", dataSourceCloudProjectDatabaseM3dbUserRead, resourceCloudProjectDatabaseM3dbUserRead, resourceCloudProjectDatabaseM3dbUserUpdate, f)
}

func resourceCloudProjectDatabaseM3dbUserRead(d *schema.ResourceData, meta interface{}) error {
Expand Down Expand Up @@ -150,71 +120,12 @@ func resourceCloudProjectDatabaseM3dbUserRead(d *schema.ResourceData, meta inter
}

func resourceCloudProjectDatabaseM3dbUserUpdate(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
serviceName := d.Get("service_name").(string)
clusterId := d.Get("cluster_id").(string)
passwordReset := d.HasChange("password_reset")
id := d.Id()

endpoint := fmt.Sprintf("/cloud/project/%s/database/m3db/%s/user/%s",
url.PathEscape(serviceName),
url.PathEscape(clusterId),
url.PathEscape(id),
)
params := (&CloudProjectDatabaseM3dbUserUpdateOpts{}).FromResource(d)

log.Printf("[DEBUG] Will update user: %+v from cluster %s from project %s", params, clusterId, serviceName)
err := config.OVHClient.Put(endpoint, params, nil)
if err != nil {
return fmt.Errorf("calling Put %s with params %+v:\n\t %q", endpoint, params, err)
}

log.Printf("[DEBUG] Waiting for user %s to be READY", id)
err = waitForCloudProjectDatabaseUserReady(config.OVHClient, serviceName, "m3db", clusterId, id, d.Timeout(schema.TimeoutUpdate))
if err != nil {
return fmt.Errorf("timeout while waiting user %s to be READY: %w", id, err)
f := func() interface{} {
return (&CloudProjectDatabaseM3dbUserUpdateOpts{}).FromResource(d)
}
log.Printf("[DEBUG] user %s is READY", id)

if passwordReset {
pwdResetEndpoint := endpoint + "/credentials/reset"
res := &CloudProjectDatabaseUserResponse{}
log.Printf("[DEBUG] Will update user password for cluster %s from project %s", clusterId, serviceName)
err := postCloudProjectDatabaseUser(d, meta, "m3db", pwdResetEndpoint, nil, res, schema.TimeoutUpdate)
if err != nil {
return err
}
}

return resourceCloudProjectDatabaseM3dbUserRead(d, meta)
return updateCloudProjectDatabaseUser(d, meta, "m3db", resourceCloudProjectDatabaseM3dbUserRead, f)
}

func resourceCloudProjectDatabaseM3dbUserDelete(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
serviceName := d.Get("service_name").(string)
clusterId := d.Get("cluster_id").(string)
id := d.Id()

endpoint := fmt.Sprintf("/cloud/project/%s/database/m3db/%s/user/%s",
url.PathEscape(serviceName),
url.PathEscape(clusterId),
url.PathEscape(id),
)

log.Printf("[DEBUG] Will delete user %s from cluster %s from project %s", id, clusterId, serviceName)
err := config.OVHClient.Delete(endpoint, nil)
if err != nil {
return helpers.CheckDeleted(d, err, endpoint)
}

log.Printf("[DEBUG] Waiting for user %s to be DELETED", id)
err = waitForCloudProjectDatabaseUserDeleted(config.OVHClient, serviceName, "m3db", clusterId, id, d.Timeout(schema.TimeoutDelete))
if err != nil {
return fmt.Errorf("timeout while waiting user %s to be DELETED: %w", id, err)
}
log.Printf("[DEBUG] user %s is DELETED", id)

d.SetId("")

return nil
return deleteCloudProjectDatabaseUser(d, meta, "m3db")
}
22 changes: 3 additions & 19 deletions ovh/resource_cloud_project_database_mongodb_user.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"fmt"
"log"
"net/url"
"strings"
"time"

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

func resourceCloudProjectDatabaseMongodbUserImportState(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) {
givenId := d.Id()
n := 3
splitId := strings.SplitN(givenId, "/", n)
if len(splitId) != n {
return nil, fmt.Errorf("Import Id is not service_name/cluster_id/id formatted")
}
serviceName := splitId[0]
clusterId := splitId[1]
id := splitId[2]
d.SetId(id)
d.Set("cluster_id", clusterId)
d.Set("service_name", serviceName)

results := make([]*schema.ResourceData, 1)
results[0] = d
return results, nil
return importCloudProjectDatabaseUser(d, meta)
}

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

return resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
log.Printf("[DEBUG] Will create user: %+v for cluster %s from project %s", params, clusterId, serviceName)
err := postCloudProjectDatabaseUser(d, meta, "mongodb", endpoint, params, res, schema.TimeoutCreate)
err := postFuncCloudProjectDatabaseUser(d, meta, "mongodb", endpoint, params, res, schema.TimeoutCreate)
if err != nil {
if errOvh, ok := err.(*ovh.APIError); ok && (errOvh.Code == 409) {
return resource.RetryableError(err)
Expand Down Expand Up @@ -204,7 +188,7 @@ func resourceCloudProjectDatabaseMongodbUserUpdate(d *schema.ResourceData, meta
pwdResetEndpoint := endpoint + "/credentials/reset"
res := &CloudProjectDatabaseUserResponse{}
log.Printf("[DEBUG] Will update user password for cluster %s from project %s", clusterId, serviceName)
err := postCloudProjectDatabaseUser(d, meta, "mongodb", pwdResetEndpoint, nil, res, schema.TimeoutUpdate)
err := postFuncCloudProjectDatabaseUser(d, meta, "mongodb", pwdResetEndpoint, nil, res, schema.TimeoutUpdate)
if err != nil {
if errOvh, ok := err.(*ovh.APIError); ok && (errOvh.Code == 409) {
return resource.RetryableError(err)
Expand Down
Loading

0 comments on commit 3f75aeb

Please sign in to comment.