Skip to content

Commit 56f10e2

Browse files
Mia-Crossremyleone
andauthored
feat(iam): add support for iam group resource (#1350)
Co-authored-by: Rémy Léone <[email protected]>
1 parent 2e52e90 commit 56f10e2

11 files changed

+10138
-0
lines changed

scaleway/data_source_iam_group.go

+83
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package scaleway
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+
iam "github.com/scaleway/scaleway-sdk-go/api/iam/v1alpha1"
9+
"github.com/scaleway/scaleway-sdk-go/scw"
10+
)
11+
12+
func dataSourceScalewayIamGroup() *schema.Resource {
13+
// Generate datasource schema from resource
14+
dsSchema := datasourceSchemaFromResourceSchema(resourceScalewayIamGroup().Schema)
15+
16+
addOptionalFieldsToSchema(dsSchema, "name")
17+
18+
dsSchema["name"].ConflictsWith = []string{"group_id"}
19+
dsSchema["group_id"] = &schema.Schema{
20+
Type: schema.TypeString,
21+
Optional: true,
22+
Description: "The ID of the IAM group",
23+
ConflictsWith: []string{"name"},
24+
ValidateFunc: validationUUID(),
25+
}
26+
// Default organization_id will be available on a major release. Please check #1337
27+
dsSchema["organization_id"] = &schema.Schema{
28+
Type: schema.TypeString,
29+
Description: "The organization_id you want to attach the resource to",
30+
Required: true,
31+
}
32+
33+
return &schema.Resource{
34+
ReadContext: dataSourceScalewayIamGroupRead,
35+
Schema: dsSchema,
36+
}
37+
}
38+
39+
func dataSourceScalewayIamGroupRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
40+
api := iamAPI(meta)
41+
42+
groupID, groupIDExists := d.GetOk("group_id")
43+
if !groupIDExists {
44+
req := &iam.ListGroupsRequest{
45+
OrganizationID: expandStringPtr(d.Get("organization_id")),
46+
Name: expandStringPtr(d.Get("name")),
47+
}
48+
49+
res, err := api.ListGroups(req, scw.WithContext(ctx))
50+
if err != nil {
51+
return diag.FromErr(err)
52+
}
53+
54+
for _, group := range res.Groups {
55+
if group.Name == d.Get("name").(string) {
56+
if groupID != "" {
57+
return diag.Errorf("more than 1 group found with the same name %s", d.Get("name"))
58+
}
59+
groupID = group.ID
60+
}
61+
}
62+
if groupID == "" {
63+
return diag.Errorf("no group found with the name %s", d.Get("name"))
64+
}
65+
}
66+
67+
d.SetId(groupID.(string))
68+
err := d.Set("group_id", groupID)
69+
if err != nil {
70+
return diag.FromErr(err)
71+
}
72+
73+
diags := resourceScalewayIamGroupRead(ctx, d, meta)
74+
if diags != nil {
75+
return append(diags, diag.Errorf("failed to read iam group state")...)
76+
}
77+
78+
if d.Id() == "" {
79+
return diag.Errorf("iam group (%s) not found", groupID)
80+
}
81+
82+
return nil
83+
}
+111
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package scaleway
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccScalewayDataSourceIamGroup_Basic(t *testing.T) {
10+
SkipBetaTest(t)
11+
tt := NewTestTools(t)
12+
defer tt.Cleanup()
13+
resource.ParallelTest(t, resource.TestCase{
14+
PreCheck: func() { testAccPreCheck(t) },
15+
ProviderFactories: tt.ProviderFactories,
16+
CheckDestroy: resource.ComposeTestCheckFunc(
17+
testAccCheckScalewayIamGroupDestroy(tt),
18+
),
19+
Steps: []resource.TestStep{
20+
{
21+
Config: `
22+
resource "scaleway_iam_group" "main_ds_basic" {
23+
name = "test_data_source_basic"
24+
}
25+
26+
data "scaleway_iam_group" "find_by_id_basic" {
27+
group_id = scaleway_iam_group.main_ds_basic.id
28+
organization_id = "08555df8-bb26-43bc-b749-1b98c5d02343"
29+
}
30+
31+
data "scaleway_iam_group" "find_by_name_basic" {
32+
name = scaleway_iam_group.main_ds_basic.name
33+
organization_id = "08555df8-bb26-43bc-b749-1b98c5d02343"
34+
}
35+
`,
36+
Check: resource.ComposeTestCheckFunc(
37+
testAccCheckScalewayIamGroupExists(tt, "scaleway_iam_group.main_ds_basic"),
38+
resource.TestCheckResourceAttr("data.scaleway_iam_group.find_by_id_basic", "name", "test_data_source_basic"),
39+
resource.TestCheckResourceAttr("data.scaleway_iam_group.find_by_name_basic", "name", "test_data_source_basic"),
40+
resource.TestCheckResourceAttrPair("data.scaleway_iam_group.find_by_id_basic", "id", "scaleway_iam_group.main_ds_basic", "id"),
41+
resource.TestCheckResourceAttrPair("data.scaleway_iam_group.find_by_name_basic", "id", "scaleway_iam_group.main_ds_basic", "id"),
42+
),
43+
},
44+
},
45+
})
46+
}
47+
48+
func TestAccScalewayDataSourceIamGroup_UsersAndApplications(t *testing.T) {
49+
SkipBetaTest(t)
50+
tt := NewTestTools(t)
51+
defer tt.Cleanup()
52+
resource.ParallelTest(t, resource.TestCase{
53+
PreCheck: func() { testAccPreCheck(t) },
54+
ProviderFactories: tt.ProviderFactories,
55+
CheckDestroy: resource.ComposeTestCheckFunc(
56+
testAccCheckScalewayIamGroupDestroy(tt),
57+
),
58+
Steps: []resource.TestStep{
59+
{
60+
Config: `
61+
resource "scaleway_iam_application" "app00" {
62+
name = "app"
63+
}
64+
65+
data "scaleway_iam_user" "user00" {
66+
user_id = "ce18cffd-e7c8-47f8-8de8-00e97e50a0d3"
67+
organization_id = "08555df8-bb26-43bc-b749-1b98c5d02343"
68+
}
69+
data "scaleway_iam_user" "user01" {
70+
user_id = "255b63c2-b4de-4af6-9ed4-967f69d9dd85"
71+
organization_id = "08555df8-bb26-43bc-b749-1b98c5d02343"
72+
}
73+
74+
resource "scaleway_iam_group" "main_ds_mix" {
75+
name = "test_data_source_mix"
76+
application_ids = [
77+
scaleway_iam_application.app00.id,
78+
]
79+
user_ids = [
80+
data.scaleway_iam_user.user00.user_id,
81+
data.scaleway_iam_user.user01.user_id,
82+
]
83+
}
84+
85+
data "scaleway_iam_group" "find_by_id_mix" {
86+
group_id = scaleway_iam_group.main_ds_mix.id
87+
organization_id = "08555df8-bb26-43bc-b749-1b98c5d02343"
88+
}
89+
90+
data "scaleway_iam_group" "find_by_name_mix" {
91+
name = scaleway_iam_group.main_ds_mix.name
92+
organization_id = "08555df8-bb26-43bc-b749-1b98c5d02343"
93+
}
94+
`,
95+
Check: resource.ComposeTestCheckFunc(
96+
testAccCheckScalewayIamGroupExists(tt, "scaleway_iam_group.main_ds_mix"),
97+
resource.TestCheckResourceAttr("data.scaleway_iam_group.find_by_id_mix", "name", "test_data_source_mix"),
98+
resource.TestCheckResourceAttr("data.scaleway_iam_group.find_by_name_mix", "name", "test_data_source_mix"),
99+
resource.TestCheckResourceAttrPair("data.scaleway_iam_group.find_by_id_mix", "id", "scaleway_iam_group.main_ds_mix", "id"),
100+
resource.TestCheckTypeSetElemAttrPair("data.scaleway_iam_group.find_by_name_mix", "id", "scaleway_iam_group.main_ds_mix", "id"),
101+
resource.TestCheckTypeSetElemAttrPair("data.scaleway_iam_group.find_by_id_mix", "user_ids.*", "data.scaleway_iam_user.user00", "user_id"),
102+
resource.TestCheckTypeSetElemAttrPair("data.scaleway_iam_group.find_by_id_mix", "user_ids.*", "data.scaleway_iam_user.user01", "user_id"),
103+
resource.TestCheckTypeSetElemAttrPair("data.scaleway_iam_group.find_by_name_mix", "user_ids.*", "data.scaleway_iam_user.user00", "user_id"),
104+
resource.TestCheckTypeSetElemAttrPair("data.scaleway_iam_group.find_by_name_mix", "user_ids.*", "data.scaleway_iam_user.user01", "user_id"),
105+
resource.TestCheckResourceAttrPair("data.scaleway_iam_group.find_by_id_mix", "application_ids.0", "scaleway_iam_application.app00", "id"),
106+
resource.TestCheckResourceAttrPair("data.scaleway_iam_group.find_by_name_mix", "application_ids.0", "scaleway_iam_application.app00", "id"),
107+
),
108+
},
109+
},
110+
})
111+
}

scaleway/provider.go

+2
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,13 @@ func addBetaResources(provider *schema.Provider) {
3434
betaResources := map[string]*schema.Resource{
3535
"scaleway_iam_api_key": resourceScalewayIamAPIKey(),
3636
"scaleway_iam_application": resourceScalewayIamApplication(),
37+
"scaleway_iam_group": resourceScalewayIamGroup(),
3738
"scaleway_iam_ssh_key": resourceScalewayIamSSKKey(),
3839
}
3940
betaDataSources := map[string]*schema.Resource{
4041
"scaleway_iam_ssh_key": dataSourceScalewayIamSSHKey(),
4142
"scaleway_iam_application": dataSourceScalewayIamApplication(),
43+
"scaleway_iam_group": dataSourceScalewayIamGroup(),
4244
"scaleway_iam_user": dataSourceScalewayIamUser(),
4345
}
4446
for resourceName, resource := range betaResources {

0 commit comments

Comments
 (0)