Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions cmd/tftemplate/datasource.go.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
{{- /*gotype: tftemplate/models.ResourceTemplate*/ -}}
package scaleway

import (
"context"

"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)

func dataSourceScaleway{{.Resource}}() *schema.Resource {
// Generate datasource schema from resource
dsSchema := datasourceSchemaFromResourceSchema(resourceScaleway{{.Resource}}().Schema)

addOptionalFieldsToSchema(dsSchema, "name", "{{.Locality}}")

dsSchema["{{.ResourceCleanLow}}_id"] = &schema.Schema{
Type: schema.TypeString,
Optional: true,
Description: "The ID of the {{.ResourceCleanLow}}",
ConflictsWith: []string{"name"},
ValidateFunc: validationUUIDorUUIDWithLocality(),
}

return &schema.Resource{
ReadContext: dataSourceScaleway{{.Resource}}Read,
Schema: dsSchema,
}
}

func dataSourceScaleway{{.Resource}}Read(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
api, {{.Locality}}, err := {{.API}}APIWith{{.LocalityUpper}}(d, meta)
if err != nil {
return diag.FromErr(err)
}

{{.ResourceCleanLow}}ID, {{.ResourceCleanLow}}IDExists := d.GetOk("{{.ResourceCleanLow}}_id")
if !{{.ResourceCleanLow}}IDExists {
res, err := api.List{{.ResourceClean}}s(&{{.API}}.List{{.ResourceClean}}sRequest{
{{.LocalityUpper}}: {{.Locality}},
Name: expandStringPtr(d.Get("name")),
ProjectID: expandStringPtr(d.Get("project_id")),
})
if err != nil {
return diag.FromErr(err)
}
for _, {{.ResourceCleanLow}} := range res.{{.ResourceClean}}s {
if {{.ResourceCleanLow}}.Name == d.Get("name").(string) {
if {{.ResourceCleanLow}}ID != "" {
return diag.Errorf("more than 1 {{.ResourceCleanLow}} found with the same name %s", d.Get("name"))
}
{{.ResourceCleanLow}}ID = {{.ResourceCleanLow}}.ID
}
}
if {{.ResourceCleanLow}}ID == "" {
return diag.Errorf("no {{.ResourceCleanLow}} found with the name %s", d.Get("name"))
}
}

{{.Locality}}ID := datasourceNew{{.LocalityAdjectiveUpper}}ID({{.ResourceCleanLow}}ID, {{.Locality}})
d.SetId({{.Locality}}ID)
err = d.Set("{{.ResourceCleanLow}}_id", {{.Locality}}ID)
if err != nil {
return diag.FromErr(err)
}

diags := resourceScaleway{{.Resource}}Read(ctx, d, meta)
if diags != nil {
return append(diags, diag.Errorf("failed to read {{.ResourceCleanLow}} state")...)
}

if d.Id() == "" {
return diag.Errorf("{{.ResourceCleanLow}} (%s) not found", {{.Locality}}ID)
}

return nil
}
45 changes: 45 additions & 0 deletions cmd/tftemplate/datasource_test.go.tmpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{{- /*gotype: tftemplate/models.ResourceTemplate*/ -}}
package scaleway

import (
"testing"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
)

func TestAccScalewayDataSource{{.Resource}}_Basic(t *testing.T) {
tt := NewTestTools(t)
defer tt.Cleanup()
resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
ProviderFactories: tt.ProviderFactories,
CheckDestroy: resource.ComposeTestCheckFunc(
testAccCheckScaleway{{.Resource}}Destroy(tt),
),
Steps: []resource.TestStep{
{
Config: `
resource scaleway_{{.ResourceHCL}} main {
name = "test-ds-{{.API}}-{{ .ResourceCleanLow}}-basic"
}

data scaleway_{{.ResourceHCL}} find_by_name {
name = scaleway_{{.ResourceHCL}}.main.name
}

data scaleway_{{.ResourceHCL}} find_by_id {
{{.ResourceCleanLow}}_id = scaleway_{{.ResourceHCL}}.main.id
}
`,
Check: resource.ComposeTestCheckFunc(
testAccCheckScaleway{{.Resource}}Exists(tt, "scaleway_{{.ResourceHCL}}.main"),

resource.TestCheckResourceAttrPair("scaleway_{{.ResourceHCL}}.main", "name", "data.scaleway_{{.ResourceHCL}}.find_by_name", "name"),
resource.TestCheckResourceAttrPair("scaleway_{{.ResourceHCL}}.main", "name", "data.scaleway_{{.ResourceHCL}}.find_by_id", "name"),
resource.TestCheckResourceAttrPair("scaleway_{{.ResourceHCL}}.main", "id", "data.scaleway_{{.ResourceHCL}}.find_by_name", "id"),
resource.TestCheckResourceAttrPair("scaleway_{{.ResourceHCL}}.main", "id", "data.scaleway_{{.ResourceHCL}}.find_by_id", "id"),
),
},
},
})
}
37 changes: 36 additions & 1 deletion cmd/tftemplate/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,21 @@ var (
resourceHelpersTemplateFile string
//go:embed waiters.go.tmpl
resourceWaitersTemplateFile string
//go:embed datasource.go.tmpl
datasourceTemplateFile string
//go:embed datasource_test.go.tmpl
datasourceTestTemplateFile string
)

var resourceQS = []*survey.Question{
{
Name: "targets",
Prompt: &survey.MultiSelect{
Message: "Select targets to generate",
Options: []string{"resource", "datasource"},
Default: []string{"resource"},
},
},
{
Name: "api",
Prompt: &survey.Input{Message: "API name (function, instance, container)"},
Expand Down Expand Up @@ -49,14 +61,25 @@ var resourceQS = []*survey.Question{
{
Name: "waiters",
Prompt: &survey.Confirm{
Message: "Generate helpers ? Will be added to scaleway/helpers_{api}.go",
Message: "Generate waiters ? Will be added to scaleway/helpers_{api}.go",
Default: true,
},
},
}

func contains[T comparable](slice []T, expected T) bool {
for _, elem := range slice {
if elem == expected {
return true
}
}

return false
}

func main() {
resourceInput := struct {
Targets []string
API string
Resource string
Locality string
Expand All @@ -73,10 +96,22 @@ func main() {
{
FileName: fmt.Sprintf("../../scaleway/resource_%s.go", resourceData.ResourceHCL),
TemplateFile: resourceTemplateFile,
Skip: !contains(resourceInput.Targets, "resource"),
},
{
FileName: fmt.Sprintf("../../scaleway/resource_%s_test.go", resourceData.ResourceHCL),
TemplateFile: resourceTestTemplateFile,
Skip: !contains(resourceInput.Targets, "resource"),
},
{
FileName: fmt.Sprintf("../../scaleway/data_source_%s.go", resourceData.ResourceHCL),
TemplateFile: datasourceTemplateFile,
Skip: !contains(resourceInput.Targets, "datasource"),
},
{
FileName: fmt.Sprintf("../../scaleway/data_source_%s_test.go", resourceData.ResourceHCL),
TemplateFile: datasourceTestTemplateFile,
Skip: !contains(resourceInput.Targets, "datasource"),
},
{
FileName: fmt.Sprintf("../../scaleway/helpers_%s.go", resourceData.API),
Expand Down
2 changes: 2 additions & 0 deletions cmd/tftemplate/resource.go.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ func resourceScaleway{{ .Resource }}Read(ctx context.Context, d *schema.Resource
}

_ = d.Set("name", {{ .ResourceCleanLow }}.Name)
_ = d.Set("{{.Locality}}", {{.ResourceCleanLow}}.{{.LocalityUpper}})
_ = d.Set("project_id", {{.ResourceCleanLow}}.ProjectID)

return nil
}
Expand Down