Skip to content

Commit b693d30

Browse files
authored
feat(iam): add iam application datasource (#1348)
* feat(iam): application datasource ok + tests * feat(iam): application: removed optional description from data source
1 parent dea5c86 commit b693d30

4 files changed

+1727
-1
lines changed
+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
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 dataSourceScalewayIamApplication() *schema.Resource {
13+
// Generate datasource schema from resource
14+
dsSchema := datasourceSchemaFromResourceSchema(resourceScalewayIamApplication().Schema)
15+
16+
addOptionalFieldsToSchema(dsSchema, "name")
17+
18+
dsSchema["name"].ConflictsWith = []string{"application_id"}
19+
dsSchema["application_id"] = &schema.Schema{
20+
Type: schema.TypeString,
21+
Optional: true,
22+
Description: "The ID of the IAM application",
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: dataSourceScalewayIamApplicationRead,
35+
Schema: dsSchema,
36+
}
37+
}
38+
39+
func dataSourceScalewayIamApplicationRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
40+
api := iamAPI(meta)
41+
42+
appID, appIDExists := d.GetOk("application_id")
43+
44+
if !appIDExists {
45+
res, err := api.ListApplications(&iam.ListApplicationsRequest{
46+
OrganizationID: expandStringPtr(d.Get("organization_id")),
47+
Name: expandStringPtr(d.Get("name")),
48+
}, scw.WithContext(ctx))
49+
if err != nil {
50+
return diag.FromErr(err)
51+
}
52+
53+
for _, app := range res.Applications {
54+
if app.Name == d.Get("name").(string) {
55+
if appID != "" {
56+
return diag.Errorf("more than 1 application found with the same name %s", d.Get("name"))
57+
}
58+
appID = app.ID
59+
}
60+
}
61+
if appID == "" {
62+
return diag.Errorf("no application found with the name %s", d.Get("name"))
63+
}
64+
}
65+
66+
d.SetId(appID.(string))
67+
err := d.Set("application_id", appID)
68+
if err != nil {
69+
return diag.FromErr(err)
70+
}
71+
72+
diags := resourceScalewayIamApplicationRead(ctx, d, meta)
73+
if diags != nil {
74+
return append(diags, diag.Errorf("failed to read iam application state")...)
75+
}
76+
77+
if d.Id() == "" {
78+
return diag.Errorf("iam application (%s) not found", appID)
79+
}
80+
81+
return nil
82+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package scaleway
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
func TestAccScalewayDataSourceIamApplication_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+
testAccCheckScalewayIamApplicationDestroy(tt),
18+
),
19+
Steps: []resource.TestStep{
20+
{
21+
Config: `
22+
resource "scaleway_iam_application" "app_ds_basic" {
23+
name = "test_data_source_basic"
24+
}
25+
`,
26+
},
27+
{
28+
Config: `
29+
resource "scaleway_iam_application" "app_ds_basic" {
30+
name = "test_data_source_basic"
31+
}
32+
33+
data "scaleway_iam_application" "find_by_id_basic" {
34+
application_id = scaleway_iam_application.app_ds_basic.id
35+
organization_id = "08555df8-bb26-43bc-b749-1b98c5d02343"
36+
}
37+
data "scaleway_iam_application" "find_by_name_basic" {
38+
name = "test_data_source_basic"
39+
organization_id = "08555df8-bb26-43bc-b749-1b98c5d02343"
40+
}
41+
`,
42+
Check: resource.ComposeTestCheckFunc(
43+
testAccCheckScalewayIamApplicationExists(tt, "scaleway_iam_application.app_ds_basic"),
44+
resource.TestCheckResourceAttr("data.scaleway_iam_application.find_by_id_basic", "name", "test_data_source_basic"),
45+
resource.TestCheckResourceAttr("data.scaleway_iam_application.find_by_name_basic", "name", "test_data_source_basic"),
46+
resource.TestCheckResourceAttrPair("data.scaleway_iam_application.find_by_id_basic", "id", "scaleway_iam_application.app_ds_basic", "id"),
47+
resource.TestCheckResourceAttrPair("data.scaleway_iam_application.find_by_name_basic", "id", "scaleway_iam_application.app_ds_basic", "id"),
48+
),
49+
},
50+
{
51+
Config: `
52+
resource "scaleway_iam_application" "app_ds_basic" {
53+
name = "test_data_source_basic_renamed"
54+
description = "test_data_source_basic_description"
55+
}
56+
`,
57+
},
58+
{
59+
Config: `
60+
resource "scaleway_iam_application" "app_ds_basic" {
61+
name = "test_data_source_basic_renamed"
62+
description = "test_data_source_basic_description"
63+
}
64+
65+
data "scaleway_iam_application" "find_by_id_basic" {
66+
application_id = scaleway_iam_application.app_ds_basic.id
67+
organization_id = "08555df8-bb26-43bc-b749-1b98c5d02343"
68+
}
69+
data "scaleway_iam_application" "find_by_name_basic" {
70+
name = "test_data_source_basic_renamed"
71+
organization_id = "08555df8-bb26-43bc-b749-1b98c5d02343"
72+
}
73+
`,
74+
Check: resource.ComposeTestCheckFunc(
75+
testAccCheckScalewayIamApplicationExists(tt, "scaleway_iam_application.app_ds_basic"),
76+
resource.TestCheckResourceAttr("data.scaleway_iam_application.find_by_id_basic", "name", "test_data_source_basic_renamed"),
77+
resource.TestCheckResourceAttr("data.scaleway_iam_application.find_by_name_basic", "name", "test_data_source_basic_renamed"),
78+
resource.TestCheckResourceAttr("data.scaleway_iam_application.find_by_id_basic", "description", "test_data_source_basic_description"),
79+
resource.TestCheckResourceAttr("data.scaleway_iam_application.find_by_name_basic", "description", "test_data_source_basic_description"),
80+
resource.TestCheckResourceAttrPair("data.scaleway_iam_application.find_by_id_basic", "id", "scaleway_iam_application.app_ds_basic", "id"),
81+
resource.TestCheckResourceAttrPair("data.scaleway_iam_application.find_by_name_basic", "id", "scaleway_iam_application.app_ds_basic", "id"),
82+
),
83+
},
84+
},
85+
})
86+
}

scaleway/provider.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ func addBetaResources(provider *schema.Provider) {
3434
betaResources := map[string]*schema.Resource{
3535
"scaleway_iam_application": resourceScalewayIamApplication(),
3636
}
37-
betaDataSources := map[string]*schema.Resource{}
37+
betaDataSources := map[string]*schema.Resource{
38+
"scaleway_iam_application": dataSourceScalewayIamApplication(),
39+
}
3840
for resourceName, resource := range betaResources {
3941
provider.ResourcesMap[resourceName] = resource
4042
}

0 commit comments

Comments
 (0)