Skip to content

Commit ece1a2f

Browse files
committed
feat: add iam_resourcegroup data and resources
1 parent 75a956f commit ece1a2f

12 files changed

+684
-14
lines changed

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_group.resource_groups.resource_groups, ovh_iam_resource_group.resource_group_1.id) &&
143+
contains(data.ovh_iam_resource_group.resource_groups.resource_groups, ovh_iam_resource_group.resource_group_2.id)
144+
)
145+
}
146+
`

ovh/data_iam_resourcegroup.go

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

ovh/data_iam_resourcegroups.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/import_iam_resource_group_test.go

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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 TestAccIamResourceGroup_importBasic(t *testing.T) {
13+
resourceGroupName1 := acctest.RandomWithPrefix(test_prefix)
14+
15+
resourceUrn := "urn:v1:eu:resource:vps:" + os.Getenv("OVH_VPS")
16+
17+
config := fmt.Sprintf(
18+
`resource "ovh_iam_resource_group" "resource_group_1" {
19+
name = "%s"
20+
resources = ["%s"]
21+
}
22+
`,
23+
resourceGroupName1,
24+
resourceUrn,
25+
)
26+
27+
resource.Test(t, resource.TestCase{
28+
PreCheck: func() {
29+
testAccPreCheckIamResourceGroup(t)
30+
},
31+
Providers: testAccProviders,
32+
Steps: []resource.TestStep{
33+
{
34+
Config: config,
35+
},
36+
{
37+
ResourceName: "ovh_iam_resource_group.resource_group_1",
38+
ImportState: true,
39+
ImportStateVerify: true,
40+
},
41+
},
42+
})
43+
}

ovh/provider.go

+3
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,8 @@ func Provider() *schema.Provider {
112112
"ovh_iam_policy": dataSourceIamPolicy(),
113113
"ovh_iam_reference_actions": dataSourceIamReferenceActions(),
114114
"ovh_iam_reference_resource_type": dataSourceIamReferenceResourceType(),
115+
"ovh_iam_resource_group": dataSourceIamResourceGroup(),
116+
"ovh_iam_resource_groups": dataSourceIamResourceGroups(),
115117
"ovh_ip_service": dataSourceIpService(),
116118
"ovh_iploadbalancing": dataSourceIpLoadbalancing(),
117119
"ovh_iploadbalancing_vrack_network": dataSourceIpLoadbalancingVrackNetwork(),
@@ -190,6 +192,7 @@ func Provider() *schema.Provider {
190192
"ovh_hosting_privatedatabase_user_grant": resourceHostingPrivateDatabaseUserGrant(),
191193
"ovh_hosting_privatedatabase_whitelist": resourceHostingPrivateDatabaseWhitelist(),
192194
"ovh_iam_policy": resourceIamPolicy(),
195+
"ovh_iam_resource_group": resourceIamResourceGroup(),
193196
"ovh_ip_reverse": resourceIpReverse(),
194197
"ovh_ip_service": resourceIpService(),
195198
"ovh_iploadbalancing": resourceIpLoadbalancing(),

ovh/provider_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -357,3 +357,9 @@ func testAccPreCheckWorkflowBackup(t *testing.T) {
357357
func testAccPreCheckDedicatedServerNetworking(t *testing.T) {
358358
checkEnvOrSkip(t, "TEST_DEDICATED_SERVER_NETWORKING")
359359
}
360+
361+
func testAccPreCheckIamResourceGroup(t *testing.T) {
362+
testAccPreCheckCredentials(t)
363+
checkEnvOrSkip(t, "OVH_VRACK_SERVICE_TEST")
364+
checkEnvOrSkip(t, "OVH_VPS")
365+
}

0 commit comments

Comments
 (0)