Skip to content

Commit 7a175b8

Browse files
authored
Merge pull request #291 from celest-io/ovh_cloud_project_user_s3_credential
Add S3 Credential datasource and resource
2 parents e1fb3cb + 6b18cf5 commit 7a175b8

12 files changed

+646
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
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+
"github.com/ovh/terraform-provider-ovh/ovh/helpers"
10+
)
11+
12+
func dataCloudProjectUserS3Credential() *schema.Resource {
13+
return &schema.Resource{
14+
Read: dataCloudProjectUserS3CredentialRead,
15+
Schema: map[string]*schema.Schema{
16+
"service_name": {
17+
Type: schema.TypeString,
18+
Required: true,
19+
ForceNew: true,
20+
DefaultFunc: schema.EnvDefaultFunc("OVH_CLOUD_PROJECT_SERVICE", nil),
21+
Description: "Service name of the resource representing the ID of the cloud project.",
22+
},
23+
"user_id": {
24+
Type: schema.TypeString,
25+
Required: true,
26+
ForceNew: true,
27+
Description: "The user ID",
28+
},
29+
"access_key_id": {
30+
Type: schema.TypeString,
31+
Required: true,
32+
ForceNew: true,
33+
Description: "The access key",
34+
},
35+
36+
//Computed
37+
"secret_access_key": {
38+
Type: schema.TypeString,
39+
Computed: true,
40+
Sensitive: true,
41+
},
42+
},
43+
}
44+
}
45+
46+
func dataCloudProjectUserS3CredentialRead(d *schema.ResourceData, meta interface{}) error {
47+
config := meta.(*Config)
48+
serviceName := d.Get("service_name").(string)
49+
userID := d.Get("user_id").(string)
50+
accessKey := d.Get("access_key_id").(string)
51+
52+
log.Printf("[DEBUG] Will read public cloud secret access key for access key %s user %s on project: %s", accessKey, userID, serviceName)
53+
54+
endpoint := fmt.Sprintf(
55+
"/cloud/project/%s/user/%s/s3Credentials/%s",
56+
url.PathEscape(serviceName),
57+
url.PathEscape(userID),
58+
url.PathEscape(accessKey),
59+
)
60+
61+
s3Credential := &CloudProjectUserS3Credential{}
62+
if err := config.OVHClient.Get(endpoint, &s3Credential); err != nil {
63+
return helpers.CheckDeleted(d, err, endpoint)
64+
}
65+
66+
d.SetId(serviceName)
67+
d.Set("secret_access_key", s3Credential.Secret)
68+
69+
return nil
70+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
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 testAccDataCloudProjectUserS3CredentialConfig_basic = `
12+
resource "ovh_cloud_project_user" "user" {
13+
service_name = "%s"
14+
description = "my user for acceptance tests"
15+
}
16+
17+
resource "ovh_cloud_project_user_s3_credential" "s3_cred_1" {
18+
service_name = ovh_cloud_project_user.user.service_name
19+
user_id = ovh_cloud_project_user.user.id
20+
}
21+
22+
resource "ovh_cloud_project_user_s3_credential" "s3_cred_2" {
23+
service_name = ovh_cloud_project_user.user.service_name
24+
user_id = ovh_cloud_project_user.user.id
25+
}
26+
27+
data "ovh_cloud_project_user_s3_credential" "s3_cred_key_2" {
28+
service_name = ovh_cloud_project_user.user.service_name
29+
user_id = ovh_cloud_project_user.user.id
30+
access_key_id = ovh_cloud_project_user_s3_credential.s3_cred_2.access_key_id
31+
depends_on = [ovh_cloud_project_user_s3_credential.s3_cred_1, ovh_cloud_project_user_s3_credential.s3_cred_2]
32+
}
33+
34+
data "ovh_cloud_project_user_s3_credential" "s3_cred_key_1" {
35+
service_name = ovh_cloud_project_user.user.service_name
36+
user_id = ovh_cloud_project_user.user.id
37+
access_key_id = ovh_cloud_project_user_s3_credential.s3_cred_1.access_key_id
38+
depends_on = [ovh_cloud_project_user_s3_credential.s3_cred_1, ovh_cloud_project_user_s3_credential.s3_cred_2]
39+
}
40+
41+
output "same_secret_key_cred_1" {
42+
value = data.ovh_cloud_project_user_s3_credential.s3_cred_key_1.secret_access_key == ovh_cloud_project_user_s3_credential.s3_cred_1.secret_access_key
43+
sensitive=true
44+
}
45+
46+
output "same_secret_key_cred_2" {
47+
value = data.ovh_cloud_project_user_s3_credential.s3_cred_key_2.secret_access_key == ovh_cloud_project_user_s3_credential.s3_cred_2.secret_access_key
48+
sensitive=true
49+
}
50+
`
51+
52+
func TestAccDataCloudProjectUserS3Credential_basic(t *testing.T) {
53+
serviceName := os.Getenv("OVH_CLOUD_PROJECT_SERVICE_TEST")
54+
55+
config := fmt.Sprintf(testAccDataCloudProjectUserS3CredentialConfig_basic, serviceName)
56+
57+
resource.Test(t, resource.TestCase{
58+
PreCheck: func() { testAccPreCheckCredentials(t) },
59+
Providers: testAccProviders,
60+
Steps: []resource.TestStep{
61+
{
62+
Config: config,
63+
Check: resource.ComposeTestCheckFunc(
64+
resource.TestCheckResourceAttrSet(
65+
"data.ovh_cloud_project_user_s3_credential.s3_cred_key_1",
66+
"secret_access_key",
67+
),
68+
resource.TestCheckResourceAttrSet(
69+
"data.ovh_cloud_project_user_s3_credential.s3_cred_key_2",
70+
"secret_access_key",
71+
),
72+
resource.TestCheckOutput(
73+
"same_secret_key_cred_1", "true"),
74+
resource.TestCheckOutput(
75+
"same_secret_key_cred_2", "true"),
76+
),
77+
},
78+
},
79+
})
80+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
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 dataCloudProjectUserS3Credentials() *schema.Resource {
12+
return &schema.Resource{
13+
Read: dataCloudProjectUserS3CredentialsRead,
14+
Schema: map[string]*schema.Schema{
15+
"service_name": {
16+
Type: schema.TypeString,
17+
Required: true,
18+
ForceNew: true,
19+
DefaultFunc: schema.EnvDefaultFunc("OVH_CLOUD_PROJECT_SERVICE", nil),
20+
Description: "Service name of the resource representing the ID of the cloud project.",
21+
},
22+
"user_id": {
23+
Type: schema.TypeString,
24+
Required: true,
25+
ForceNew: true,
26+
Description: "The user ID",
27+
},
28+
"access_key_ids": {
29+
Type: schema.TypeList,
30+
Computed: true,
31+
Elem: &schema.Schema{
32+
Type: schema.TypeString,
33+
},
34+
},
35+
},
36+
}
37+
}
38+
39+
func dataCloudProjectUserS3CredentialsRead(d *schema.ResourceData, meta interface{}) error {
40+
config := meta.(*Config)
41+
serviceName := d.Get("service_name").(string)
42+
userID := d.Get("user_id").(string)
43+
44+
log.Printf("[DEBUG] Will read public cloud access key ids for user %s on project: %s", userID, serviceName)
45+
46+
endpoint := fmt.Sprintf(
47+
"/cloud/project/%s/user/%s/s3Credentials",
48+
url.PathEscape(serviceName),
49+
url.PathEscape(userID),
50+
)
51+
52+
credentials := make([]CloudProjectUserS3Credential, 0)
53+
if err := config.OVHClient.Get(endpoint, &credentials); err != nil {
54+
return fmt.Errorf("Error calling %s:\n\t %q", endpoint, err)
55+
}
56+
57+
accessKeys := make([]string, 0, len(credentials))
58+
59+
for _, key := range credentials {
60+
accessKeys = append(accessKeys, key.Access)
61+
}
62+
63+
d.SetId(fmt.Sprintf("%s/%s", serviceName, userID))
64+
d.Set("access_key_ids", accessKeys)
65+
66+
return nil
67+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
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 testAccDataCloudProjectUserS3CredentialsConfig_basic = `
12+
resource "ovh_cloud_project_user" "user" {
13+
service_name = "%s"
14+
description = "my user for acceptance tests"
15+
}
16+
17+
resource "ovh_cloud_project_user_s3_credential" "s3_cred" {
18+
service_name = ovh_cloud_project_user.user.service_name
19+
user_id = ovh_cloud_project_user.user.id
20+
}
21+
22+
data "ovh_cloud_project_user_s3_credentials" "keys" {
23+
service_name = ovh_cloud_project_user.user.service_name
24+
user_id = ovh_cloud_project_user.user.id
25+
depends_on = [ovh_cloud_project_user_s3_credential.s3_cred]
26+
}
27+
28+
output "access_key_ids_count" {
29+
value = length(data.ovh_cloud_project_user_s3_credentials.keys.access_key_ids)
30+
}
31+
`
32+
33+
func TestAccDataCloudProjectUserS3Credentials_basic(t *testing.T) {
34+
serviceName := os.Getenv("OVH_CLOUD_PROJECT_SERVICE_TEST")
35+
36+
config := fmt.Sprintf(testAccDataCloudProjectUserS3CredentialsConfig_basic, serviceName)
37+
38+
resource.Test(t, resource.TestCase{
39+
PreCheck: func() { testAccPreCheckCredentials(t) },
40+
Providers: testAccProviders,
41+
Steps: []resource.TestStep{
42+
{
43+
Config: config,
44+
Check: resource.ComposeTestCheckFunc(
45+
resource.TestCheckResourceAttrSet(
46+
"data.ovh_cloud_project_user_s3_credentials.keys",
47+
"access_key_ids.#",
48+
),
49+
resource.TestCheckOutput(
50+
"access_key_ids_count", "1"),
51+
),
52+
},
53+
},
54+
})
55+
}

ovh/provider.go

+3
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ func Provider() *schema.Provider {
6060
"ovh_cloud_project_kube_nodepool": dataSourceCloudProjectKubeNodepool(),
6161
"ovh_cloud_project_region": dataSourceCloudProjectRegion(),
6262
"ovh_cloud_project_regions": dataSourceCloudProjectRegions(),
63+
"ovh_cloud_project_user_s3_credential": dataCloudProjectUserS3Credential(),
64+
"ovh_cloud_project_user_s3_credentials": dataCloudProjectUserS3Credentials(),
6365
"ovh_dbaas_logs_input_engine": dataSourceDbaasLogsInputEngine(),
6466
"ovh_dbaas_logs_output_graylog_stream": dataSourceDbaasLogsOutputGraylogStream(),
6567
"ovh_dedicated_ceph": dataSourceDedicatedCeph(),
@@ -110,6 +112,7 @@ func Provider() *schema.Provider {
110112
"ovh_cloud_project_network_private": resourceCloudProjectNetworkPrivate(),
111113
"ovh_cloud_project_network_private_subnet": resourceCloudProjectNetworkPrivateSubnet(),
112114
"ovh_cloud_project_user": resourceCloudProjectUser(),
115+
"ovh_cloud_project_user_s3_credential": resourceCloudProjectUserS3Credential(),
113116
"ovh_dbaas_logs_input": resourceDbaasLogsInput(),
114117
"ovh_dbaas_logs_output_graylog_stream": resourceDbaasLogsOutputGraylogStream(),
115118
"ovh_dedicated_ceph_acl": resourceDedicatedCephACL(),

0 commit comments

Comments
 (0)