Skip to content

Commit f1c9407

Browse files
committed
feat: add iam_resourcegroup data and resources
1 parent b401207 commit f1c9407

11 files changed

+668
-14
lines changed

ovh/data_iam_resource_group.go

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package ovh
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/url"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
)
11+
12+
func dataSourceIamResourceGroup() *schema.Resource {
13+
return &schema.Resource{
14+
Schema: map[string]*schema.Schema{
15+
"id": {
16+
Type: schema.TypeString,
17+
Required: true,
18+
},
19+
"name": {
20+
Type: schema.TypeString,
21+
Computed: true,
22+
},
23+
"resources": {
24+
Type: schema.TypeSet,
25+
Computed: true,
26+
Elem: &schema.Schema{
27+
Type: schema.TypeString,
28+
},
29+
},
30+
"owner": {
31+
Type: schema.TypeString,
32+
Computed: true,
33+
},
34+
"created_at": {
35+
Type: schema.TypeString,
36+
Computed: true,
37+
},
38+
"updated_at": {
39+
Type: schema.TypeString,
40+
Computed: true,
41+
},
42+
"read_only": {
43+
Type: schema.TypeBool,
44+
Computed: true,
45+
},
46+
"urn": {
47+
Type: schema.TypeString,
48+
Computed: true,
49+
},
50+
},
51+
ReadContext: datasourceIamResourceGroupRead,
52+
}
53+
}
54+
55+
func datasourceIamResourceGroupRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
56+
config := meta.(*Config)
57+
id := d.Get("id").(string)
58+
59+
var pol IamResourceGroup
60+
err := config.OVHClient.GetWithContext(ctx, fmt.Sprintf("/v2/iam/resourceGroup/%s?details=true", url.PathEscape(id)), &pol)
61+
if err != nil {
62+
return diag.FromErr(err)
63+
}
64+
65+
d.SetId(id)
66+
67+
var urns []string
68+
for _, r := range pol.Resources {
69+
urns = append(urns, r.URN)
70+
}
71+
72+
d.Set("resources", urns)
73+
d.Set("name", pol.Name)
74+
d.Set("owner", pol.Owner)
75+
d.Set("created_at", pol.CreatedAt)
76+
d.Set("updated_at", pol.UpdatedAt)
77+
d.Set("read_only", pol.ReadOnly)
78+
d.Set("urn", pol.URN)
79+
80+
return nil
81+
}

ovh/data_iam_resource_group_test.go

+146
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
package ovh
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"testing"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/acctest"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
10+
)
11+
12+
func TestAccIamResourceGroupDataSource_basic(t *testing.T) {
13+
resourceGroupName1 := acctest.RandomWithPrefix(test_prefix)
14+
resourceGroupName2 := acctest.RandomWithPrefix(test_prefix)
15+
16+
resource1 := "urn:v1:eu:resource:vrack:" + os.Getenv("OVH_VRACK_SERVICE_TEST")
17+
resource2 := "urn:v1:eu:resource:vps:" + os.Getenv("OVH_VPS")
18+
19+
preSetup := fmt.Sprintf(
20+
testAccIamResourceGroupDatasourceConfigInit,
21+
resourceGroupName1,
22+
resource1,
23+
resourceGroupName2,
24+
resource1,
25+
resource2,
26+
)
27+
28+
dataConfig := fmt.Sprintf(
29+
testAccIamResourceGroupDatasourceConfigData,
30+
resourceGroupName1,
31+
resource1,
32+
resourceGroupName2,
33+
resource1,
34+
resource2,
35+
)
36+
37+
config := fmt.Sprintf(
38+
testAccIamResourceGroupDatasourceConfigList,
39+
resourceGroupName1,
40+
resource1,
41+
resourceGroupName2,
42+
resource1,
43+
resource2,
44+
)
45+
46+
checks := append(
47+
checkIamResourceGroupResourceAttr("ovh_iam_resource_group.resource_group_1", resourceGroupName1, resource1),
48+
checkIamResourceGroupResourceAttr("ovh_iam_resource_group.resource_group_2", resourceGroupName2, resource1, resource2)...,
49+
)
50+
51+
checksData := append(
52+
checkIamResourceGroupResourceAttr("data.ovh_iam_resource_group.resource_group_1", resourceGroupName1, resource1),
53+
checkIamResourceGroupResourceAttr("data.ovh_iam_resource_group.resource_group_2", resourceGroupName2, resource1, resource2)...,
54+
)
55+
56+
resource.Test(t, resource.TestCase{
57+
PreCheck: func() {
58+
testAccPreCheckIamResourceGroup(t)
59+
},
60+
Providers: testAccProviders,
61+
Steps: []resource.TestStep{
62+
{
63+
Config: preSetup,
64+
Check: resource.ComposeTestCheckFunc(checks...),
65+
}, {
66+
Config: dataConfig,
67+
Check: resource.ComposeTestCheckFunc(checksData...),
68+
}, {
69+
Config: config,
70+
Check: resource.ComposeTestCheckFunc(
71+
resource.TestCheckOutput("keys_present", "true"),
72+
),
73+
},
74+
},
75+
})
76+
}
77+
78+
func checkIamResourceGroupResourceAttr(name, grpName string, resourceURNs ...string) []resource.TestCheckFunc {
79+
checks := []resource.TestCheckFunc{
80+
resource.TestCheckResourceAttr(name, "name", grpName),
81+
}
82+
for _, urn := range resourceURNs {
83+
checks = append(checks,
84+
resource.TestCheckTypeSetElemAttr(name, "resources.*", urn),
85+
)
86+
}
87+
return checks
88+
}
89+
90+
const testAccIamResourceGroupDatasourceConfigInit = `
91+
resource "ovh_iam_resource_group" "resource_group_1" {
92+
name = "%s"
93+
resources = ["%s"]
94+
}
95+
96+
resource "ovh_iam_resource_group" "resource_group_2" {
97+
name = "%s"
98+
resources = ["%s", "%s"]
99+
}
100+
`
101+
102+
const testAccIamResourceGroupDatasourceConfigData = `
103+
resource "ovh_iam_resource_group" "resource_group_1" {
104+
name = "%s"
105+
resources = ["%s"]
106+
}
107+
108+
resource "ovh_iam_resource_group" "resource_group_2" {
109+
name = "%s"
110+
resources = ["%s", "%s"]
111+
}
112+
113+
data "ovh_iam_resource_group" "resource_group_1" {
114+
id = ovh_iam_resource_group.resource_group_1.id
115+
}
116+
117+
data "ovh_iam_resource_group" "resource_group_2" {
118+
id = ovh_iam_resource_group.resource_group_2.id
119+
}
120+
`
121+
122+
const testAccIamResourceGroupDatasourceConfigList = `
123+
resource "ovh_iam_resource_group" "resource_group_1" {
124+
name = "%s"
125+
resources = ["%s"]
126+
}
127+
128+
resource "ovh_iam_resource_group" "resource_group_2" {
129+
name = "%s"
130+
resources = ["%s", "%s"]
131+
}
132+
133+
data "ovh_iam_resource_group" "data_resource_group_1" {
134+
id = ovh_iam_resource_group.resource_group_1.id
135+
}
136+
137+
138+
data "ovh_iam_resource_groups" "resource_groups" {}
139+
140+
output "keys_present" {
141+
value = tostring(
142+
contains(data.ovh_iam_resource_groups.resource_groups.resource_groups, ovh_iam_resource_group.resource_group_1.id) &&
143+
contains(data.ovh_iam_resource_groups.resource_groups.resource_groups, ovh_iam_resource_group.resource_group_2.id)
144+
)
145+
}
146+
`

ovh/data_iam_resource_groups.go

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package ovh
2+
3+
import (
4+
"context"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
8+
"github.com/ovh/terraform-provider-ovh/ovh/helpers/hashcode"
9+
)
10+
11+
func dataSourceIamResourceGroups() *schema.Resource {
12+
return &schema.Resource{
13+
Schema: map[string]*schema.Schema{
14+
"resource_groups": {
15+
Type: schema.TypeSet,
16+
Elem: &schema.Schema{Type: schema.TypeString},
17+
Computed: true,
18+
},
19+
},
20+
ReadContext: datasourceIamResourceGroupsRead,
21+
}
22+
}
23+
24+
func datasourceIamResourceGroupsRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
25+
config := meta.(*Config)
26+
27+
var groups []IamResourceGroup
28+
err := config.OVHClient.GetWithContext(ctx, "/v2/iam/resourceGroup?details=true", &groups)
29+
if err != nil {
30+
return diag.FromErr(err)
31+
}
32+
33+
var grpsId []string
34+
for _, grp := range groups {
35+
grpsId = append(grpsId, grp.ID)
36+
}
37+
38+
d.SetId(hashcode.Strings(grpsId))
39+
d.Set("resource_groups", grpsId)
40+
return nil
41+
}

ovh/provider.go

+3
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ func Provider() *schema.Provider {
113113
"ovh_iam_policy": dataSourceIamPolicy(),
114114
"ovh_iam_reference_actions": dataSourceIamReferenceActions(),
115115
"ovh_iam_reference_resource_type": dataSourceIamReferenceResourceType(),
116+
"ovh_iam_resource_group": dataSourceIamResourceGroup(),
117+
"ovh_iam_resource_groups": dataSourceIamResourceGroups(),
116118
"ovh_ip_service": dataSourceIpService(),
117119
"ovh_iploadbalancing": dataSourceIpLoadbalancing(),
118120
"ovh_iploadbalancing_vrack_network": dataSourceIpLoadbalancingVrackNetwork(),
@@ -192,6 +194,7 @@ func Provider() *schema.Provider {
192194
"ovh_hosting_privatedatabase_user_grant": resourceHostingPrivateDatabaseUserGrant(),
193195
"ovh_hosting_privatedatabase_whitelist": resourceHostingPrivateDatabaseWhitelist(),
194196
"ovh_iam_policy": resourceIamPolicy(),
197+
"ovh_iam_resource_group": resourceIamResourceGroup(),
195198
"ovh_ip_reverse": resourceIpReverse(),
196199
"ovh_ip_service": resourceIpService(),
197200
"ovh_iploadbalancing": resourceIpLoadbalancing(),

ovh/provider_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -373,3 +373,9 @@ func testAccPreCheckWorkflowBackup(t *testing.T) {
373373
func testAccPreCheckDedicatedServerNetworking(t *testing.T) {
374374
checkEnvOrSkip(t, "TEST_DEDICATED_SERVER_NETWORKING")
375375
}
376+
377+
func testAccPreCheckIamResourceGroup(t *testing.T) {
378+
testAccPreCheckCredentials(t)
379+
checkEnvOrSkip(t, "OVH_VRACK_SERVICE_TEST")
380+
checkEnvOrSkip(t, "OVH_VPS")
381+
}

0 commit comments

Comments
 (0)