Skip to content

Commit 0fb59b0

Browse files
authored
Merge pull request #278 from lpatte/PUD-1390-1391_pgsql-mysql-user-provider
Add generic user provider and postgresql user provider
2 parents ae42e65 + efb7abd commit 0fb59b0

19 files changed

+1548
-111
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package ovh
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"net/url"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
)
10+
11+
func dataSourceCloudProjectDatabasePostgresqlUser() *schema.Resource {
12+
return &schema.Resource{
13+
Read: dataSourceCloudProjectDatabasePostgresqlUserRead,
14+
Schema: map[string]*schema.Schema{
15+
"service_name": {
16+
Type: schema.TypeString,
17+
Required: true,
18+
DefaultFunc: schema.EnvDefaultFunc("OVH_CLOUD_PROJECT_SERVICE", nil),
19+
},
20+
"cluster_id": {
21+
Type: schema.TypeString,
22+
Description: "Cluster ID",
23+
Required: true,
24+
},
25+
"name": {
26+
Type: schema.TypeString,
27+
Description: "Name of the user",
28+
Required: true,
29+
},
30+
31+
//Computed
32+
"created_at": {
33+
Type: schema.TypeString,
34+
Description: "Date of the creation of the user",
35+
Computed: true,
36+
},
37+
"roles": {
38+
Type: schema.TypeList,
39+
Description: "Roles the user belongs to",
40+
Computed: true,
41+
Elem: &schema.Schema{Type: schema.TypeString},
42+
},
43+
"status": {
44+
Type: schema.TypeString,
45+
Description: "Current status of the user",
46+
Computed: true,
47+
},
48+
},
49+
}
50+
}
51+
52+
func dataSourceCloudProjectDatabasePostgresqlUserRead(d *schema.ResourceData, meta interface{}) error {
53+
config := meta.(*Config)
54+
serviceName := d.Get("service_name").(string)
55+
clusterId := d.Get("cluster_id").(string)
56+
name := d.Get("name").(string)
57+
58+
listEndpoint := fmt.Sprintf("/cloud/project/%s/database/postgresql/%s/user",
59+
url.PathEscape(serviceName),
60+
url.PathEscape(clusterId),
61+
)
62+
63+
listRes := make([]string, 0)
64+
65+
log.Printf("[DEBUG] Will read users from cluster %s from project %s", clusterId, serviceName)
66+
if err := config.OVHClient.Get(listEndpoint, &listRes); err != nil {
67+
return fmt.Errorf("Error calling GET %s:\n\t %q", listEndpoint, err)
68+
}
69+
70+
for _, id := range listRes {
71+
endpoint := fmt.Sprintf("/cloud/project/%s/database/postgresql/%s/user/%s",
72+
url.PathEscape(serviceName),
73+
url.PathEscape(clusterId),
74+
url.PathEscape(id),
75+
)
76+
res := &CloudProjectDatabasePostgresqlUserResponse{}
77+
78+
log.Printf("[DEBUG] Will read user %s from cluster %s from project %s", id, clusterId, serviceName)
79+
if err := config.OVHClient.Get(endpoint, res); err != nil {
80+
return fmt.Errorf("Error calling GET %s:\n\t %q", endpoint, err)
81+
}
82+
83+
if res.Username == name {
84+
for k, v := range res.ToMap() {
85+
if k != "id" {
86+
d.Set(k, v)
87+
} else {
88+
d.SetId(fmt.Sprint(v))
89+
}
90+
}
91+
log.Printf("[DEBUG] Read user %+v", res)
92+
return nil
93+
}
94+
}
95+
96+
return fmt.Errorf("User name %s not found for cluster %s from project %s", name, clusterId, serviceName)
97+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package ovh
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"testing"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
)
10+
11+
const testAccCloudProjectDatabasePostgresqlUserDatasourceConfig_Basic = `
12+
resource "ovh_cloud_project_database" "db" {
13+
service_name = "%s"
14+
engine = "postgresql"
15+
version = "%s"
16+
plan = "essential"
17+
nodes {
18+
region = "%s"
19+
}
20+
flavor = "%s"
21+
}
22+
23+
resource "ovh_cloud_project_database_postgresql_user" "user" {
24+
service_name = ovh_cloud_project_database.db.service_name
25+
cluster_id = ovh_cloud_project_database.db.id
26+
name = "%s"
27+
roles = ["replication"]
28+
}
29+
30+
data "ovh_cloud_project_database_postgresql_user" "user" {
31+
service_name = ovh_cloud_project_database_postgresql_user.user.service_name
32+
cluster_id = ovh_cloud_project_database_postgresql_user.user.cluster_id
33+
name = ovh_cloud_project_database_postgresql_user.user.name
34+
}
35+
`
36+
37+
func TestAccCloudProjectDatabasePostgresqlUserDataSource_basic(t *testing.T) {
38+
serviceName := os.Getenv("OVH_CLOUD_PROJECT_SERVICE_TEST")
39+
version := os.Getenv("OVH_CLOUD_PROJECT_DATABASE_POSTGRESQL_VERSION_TEST")
40+
if version == "" {
41+
version = os.Getenv("OVH_CLOUD_PROJECT_DATABASE_VERSION_TEST")
42+
}
43+
region := os.Getenv("OVH_CLOUD_PROJECT_DATABASE_REGION_TEST")
44+
flavor := os.Getenv("OVH_CLOUD_PROJECT_DATABASE_FLAVOR_TEST")
45+
name := "johndoe"
46+
47+
config := fmt.Sprintf(
48+
testAccCloudProjectDatabasePostgresqlUserDatasourceConfig_Basic,
49+
serviceName,
50+
version,
51+
region,
52+
flavor,
53+
name,
54+
)
55+
56+
resource.Test(t, resource.TestCase{
57+
PreCheck: func() { testAccPreCheckCloudDatabaseNoEngine(t) },
58+
Providers: testAccProviders,
59+
Steps: []resource.TestStep{
60+
{
61+
Config: config,
62+
Check: resource.ComposeTestCheckFunc(
63+
resource.TestCheckResourceAttrSet(
64+
"data.ovh_cloud_project_database_postgresql_user.user", "created_at"),
65+
resource.TestCheckResourceAttrSet(
66+
"data.ovh_cloud_project_database_postgresql_user.user", "roles.#"),
67+
resource.TestCheckResourceAttrSet(
68+
"data.ovh_cloud_project_database_postgresql_user.user", "status"),
69+
resource.TestCheckResourceAttr(
70+
"data.ovh_cloud_project_database_postgresql_user.user", "name", name,
71+
),
72+
),
73+
},
74+
},
75+
})
76+
}
+105
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package ovh
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"net/url"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
)
10+
11+
func dataSourceCloudProjectDatabaseUser() *schema.Resource {
12+
return &schema.Resource{
13+
Read: dataSourceCloudProjectDatabaseUserRead,
14+
Schema: map[string]*schema.Schema{
15+
"service_name": {
16+
Type: schema.TypeString,
17+
Required: true,
18+
DefaultFunc: schema.EnvDefaultFunc("OVH_CLOUD_PROJECT_SERVICE", nil),
19+
},
20+
"engine": {
21+
Type: schema.TypeString,
22+
Description: "Name of the engine of the service",
23+
Required: true,
24+
},
25+
"cluster_id": {
26+
Type: schema.TypeString,
27+
Description: "Cluster ID",
28+
Required: true,
29+
},
30+
"name": {
31+
Type: schema.TypeString,
32+
Description: "Name of the user",
33+
Required: true,
34+
},
35+
36+
//Computed
37+
"created_at": {
38+
Type: schema.TypeString,
39+
Description: "Date of the creation of the user",
40+
Computed: true,
41+
},
42+
"status": {
43+
Type: schema.TypeString,
44+
Description: "Current status of the user",
45+
Computed: true,
46+
},
47+
},
48+
}
49+
}
50+
51+
func dataSourceCloudProjectDatabaseUserRead(d *schema.ResourceData, meta interface{}) error {
52+
config := meta.(*Config)
53+
serviceName := d.Get("service_name").(string)
54+
engine := d.Get("engine").(string)
55+
clusterId := d.Get("cluster_id").(string)
56+
name := d.Get("name").(string)
57+
58+
listEndpoint := fmt.Sprintf("/cloud/project/%s/database/%s/%s/user",
59+
url.PathEscape(serviceName),
60+
url.PathEscape(engine),
61+
url.PathEscape(clusterId),
62+
)
63+
64+
listRes := make([]string, 0)
65+
66+
log.Printf("[DEBUG] Will read users from cluster %s from project %s", clusterId, serviceName)
67+
if err := config.OVHClient.Get(listEndpoint, &listRes); err != nil {
68+
return fmt.Errorf("Error calling GET %s:\n\t %q", listEndpoint, err)
69+
}
70+
71+
for _, id := range listRes {
72+
endpoint := fmt.Sprintf("/cloud/project/%s/database/%s/%s/user/%s",
73+
url.PathEscape(serviceName),
74+
url.PathEscape(engine),
75+
url.PathEscape(clusterId),
76+
url.PathEscape(id),
77+
)
78+
79+
err := mustGenericEngineUserEndpoint(engine)
80+
if err != nil {
81+
return fmt.Errorf("Calling Get %s :\n\t %q", endpoint, err)
82+
}
83+
84+
res := &CloudProjectDatabaseUserResponse{}
85+
86+
log.Printf("[DEBUG] Will read user %s from cluster %s from project %s", id, clusterId, serviceName)
87+
if err := config.OVHClient.Get(endpoint, res); err != nil {
88+
return fmt.Errorf("Error calling GET %s:\n\t %q", endpoint, err)
89+
}
90+
91+
if res.Username == name {
92+
for k, v := range res.ToMap() {
93+
if k != "id" {
94+
d.Set(k, v)
95+
} else {
96+
d.SetId(fmt.Sprint(v))
97+
}
98+
}
99+
log.Printf("[DEBUG] Read user %+v", res)
100+
return nil
101+
}
102+
}
103+
104+
return fmt.Errorf("User name %s not found for cluster %s from project %s", name, clusterId, serviceName)
105+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package ovh
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"testing"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
)
10+
11+
const testAccCloudProjectDatabaseUserDatasourceConfig_Basic = `
12+
resource "ovh_cloud_project_database" "db" {
13+
service_name = "%s"
14+
engine = "%s"
15+
version = "%s"
16+
plan = "essential"
17+
nodes {
18+
region = "%s"
19+
}
20+
flavor = "%s"
21+
}
22+
23+
resource "ovh_cloud_project_database_user" "user" {
24+
service_name = ovh_cloud_project_database.db.service_name
25+
engine = ovh_cloud_project_database.db.engine
26+
cluster_id = ovh_cloud_project_database.db.id
27+
name = "%s"
28+
}
29+
30+
data "ovh_cloud_project_database_user" "user" {
31+
service_name = ovh_cloud_project_database_user.user.service_name
32+
engine = ovh_cloud_project_database_user.user.engine
33+
cluster_id = ovh_cloud_project_database_user.user.cluster_id
34+
name = ovh_cloud_project_database_user.user.name
35+
}
36+
`
37+
38+
func TestAccCloudProjectDatabaseUserDataSource_basic(t *testing.T) {
39+
serviceName := os.Getenv("OVH_CLOUD_PROJECT_SERVICE_TEST")
40+
engine := os.Getenv("OVH_CLOUD_PROJECT_DATABASE_ENGINE_TEST")
41+
version := os.Getenv("OVH_CLOUD_PROJECT_DATABASE_VERSION_TEST")
42+
region := os.Getenv("OVH_CLOUD_PROJECT_DATABASE_REGION_TEST")
43+
flavor := os.Getenv("OVH_CLOUD_PROJECT_DATABASE_FLAVOR_TEST")
44+
name := "johndoe"
45+
46+
config := fmt.Sprintf(
47+
testAccCloudProjectDatabaseUserDatasourceConfig_Basic,
48+
serviceName,
49+
engine,
50+
version,
51+
region,
52+
flavor,
53+
name,
54+
)
55+
56+
resource.Test(t, resource.TestCase{
57+
PreCheck: func() { testAccPreCheckCloudDatabase(t) },
58+
Providers: testAccProviders,
59+
Steps: []resource.TestStep{
60+
{
61+
Config: config,
62+
Check: resource.ComposeTestCheckFunc(
63+
resource.TestCheckResourceAttrSet(
64+
"data.ovh_cloud_project_database_user.user", "created_at"),
65+
resource.TestCheckResourceAttrSet(
66+
"data.ovh_cloud_project_database_user.user", "status"),
67+
resource.TestCheckResourceAttr(
68+
"data.ovh_cloud_project_database_user.user", "name", name,
69+
),
70+
),
71+
},
72+
},
73+
})
74+
}

0 commit comments

Comments
 (0)