From 9709818e14a22e61b5d8a14457d9edeaebb48ca1 Mon Sep 17 00:00:00 2001 From: lmasson Date: Thu, 1 Aug 2024 16:55:54 +0200 Subject: [PATCH 1/4] fix(tftemplate): fix generation --- cmd/tftemplate/datasource.go.tmpl | 49 ++++++++++------------ cmd/tftemplate/datasource_test.go.tmpl | 2 +- cmd/tftemplate/go.mod | 9 +++-- cmd/tftemplate/go.sum | 18 ++++++--- cmd/tftemplate/helpers.go.tmpl | 8 ++-- cmd/tftemplate/main.go | 17 ++++---- cmd/tftemplate/models/resource.go | 11 ++++- cmd/tftemplate/resource.go.tmpl | 56 ++++++++++++++++---------- cmd/tftemplate/templates.go | 7 +++- cmd/tftemplate/waiters.go.tmpl | 8 +++- 10 files changed, 110 insertions(+), 75 deletions(-) diff --git a/cmd/tftemplate/datasource.go.tmpl b/cmd/tftemplate/datasource.go.tmpl index 5680c78f8..bce5bf24f 100644 --- a/cmd/tftemplate/datasource.go.tmpl +++ b/cmd/tftemplate/datasource.go.tmpl @@ -1,25 +1,27 @@ {{- /*gotype: tftemplate/models.ResourceTemplate*/ -}} -package scaleway +package {{.API}} import ( "context" "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/scaleway/terraform-provider-scaleway/v2/internal/datasource" + "github.com/scaleway/terraform-provider-scaleway/v2/internal/verify" ) func DataSource{{.Resource}}() *schema.Resource { // Generate datasource schema from resource - dsSchema := datasourceSchemaFromResourceSchema(Resource{{.Resource}}().Schema) + dsSchema := datasource.SchemaFromResourceSchema(Resource{{.Resource}}().Schema) - addOptionalFieldsToSchema(dsSchema, "name", "{{.Locality}}") + datasource.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(), + ValidateFunc: verify.IsUUIDorUUIDWithLocality(), } dsSchema["project_id"].Optional = true @@ -30,49 +32,42 @@ func DataSource{{.Resource}}() *schema.Resource { } func DataSource{{.Resource}}Read(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - api, {{.Locality}}, err := {{.API}}APIWith{{.LocalityUpper}}(d, m) + api, {{.Locality}}, err := newAPIWith{{.LocalityUpper}}(d, m) if err != nil { return diag.FromErr(err) } {{.ResourceCleanLow}}ID, {{.ResourceCleanLow}}IDExists := d.GetOk("{{.ResourceCleanLow}}_id") if !{{.ResourceCleanLow}}IDExists { + {{.ResourceCleanLow}}Name := d.Get("name").(string) res, err := api.List{{.ResourceClean}}s(&{{.API}}.List{{.ResourceClean}}sRequest{ {{.LocalityUpper}}: {{.Locality}}, Name: types.ExpandStringPtr(d.Get("name")), - ProjectID: types.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")) + found{{.ResourceClean}} , err := datasource.FindExact( + res.{{.ResourceClean}}s, + func(s *{{.API}}.{{.ResourceClean}}) bool {return s.Name == {{.ResourceCleanLow}}Name }, + {{.ResourceCleanLow}}Name, + ) + if err != nil { + return diag.FromErr(err) } + {{.ResourceCleanLow}}ID = found{{.ResourceClean}}.ID } - {{.Locality}}ID := datasourceNew{{.LocalityAdjectiveUpper}}ID({{.ResourceCleanLow}}ID, {{.Locality}}) + {{- if eq .Locality "zone" }} + {{.Locality}}ID := datasource.NewZonedID({{.ResourceCleanLow}}ID, {{.Locality}}) + {{- else }} + {{.Locality}}ID := datasource.New{{.LocalityAdjectiveUpper}}ID({{.ResourceCleanLow}}ID, {{.Locality}}) + {{- end}} d.SetId({{.Locality}}ID) err = d.Set("{{.ResourceCleanLow}}_id", {{.Locality}}ID) if err != nil { return diag.FromErr(err) } - diags := Resource{{.Resource}}Read(ctx, d, m) - 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 + return Resource{{.Resource}}Read(ctx, d, m) } diff --git a/cmd/tftemplate/datasource_test.go.tmpl b/cmd/tftemplate/datasource_test.go.tmpl index 8d260975b..edf24a92d 100644 --- a/cmd/tftemplate/datasource_test.go.tmpl +++ b/cmd/tftemplate/datasource_test.go.tmpl @@ -1,5 +1,5 @@ {{- /*gotype: tftemplate/models.ResourceTemplate*/ -}} -package scaleway +package {{.API}}_test import ( "testing" diff --git a/cmd/tftemplate/go.mod b/cmd/tftemplate/go.mod index 9ce0a4248..b046ed24d 100644 --- a/cmd/tftemplate/go.mod +++ b/cmd/tftemplate/go.mod @@ -8,10 +8,11 @@ require github.com/AlecAivazis/survey/v2 v2.3.7 require ( github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/mattn/go-colorable v0.1.2 // indirect - github.com/mattn/go-isatty v0.0.8 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect - golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect + github.com/stretchr/testify v1.7.0 // indirect + golang.org/x/sys v0.20.0 // indirect golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/text v0.4.0 // indirect + golang.org/x/text v0.15.0 // indirect ) diff --git a/cmd/tftemplate/go.sum b/cmd/tftemplate/go.sum index 8cb5f0542..a6a72385f 100644 --- a/cmd/tftemplate/go.sum +++ b/cmd/tftemplate/go.sum @@ -11,17 +11,21 @@ github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -36,16 +40,20 @@ golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= diff --git a/cmd/tftemplate/helpers.go.tmpl b/cmd/tftemplate/helpers.go.tmpl index bbdffddb1..c3b38c840 100644 --- a/cmd/tftemplate/helpers.go.tmpl +++ b/cmd/tftemplate/helpers.go.tmpl @@ -1,16 +1,16 @@ {{- /*gotype: tftemplate/models.ResourceTemplate*/ -}} -package scaleway +package {{.API}} import ( "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/scaleway/scaleway-sdk-go/scw" ) -// {{.API}}APIWith{{.LocalityUpper}} returns a new {{.API}} API and the {{.Locality}} for a Create request +// newAPIWith{{.LocalityUpper}} returns a new {{.API}} API and the {{.Locality}} for a Create request func {{.API}}APIWith{{.LocalityUpper}}(d *schema.ResourceData, m interface{}) (*{{.API}}.API, scw.{{.LocalityUpper}}, error) { {{.API}}API := {{.API}}.NewAPI(meta.ExtractScwClient(m)) - {{.Locality}}, err := extract{{.LocalityUpper}}(d, m) + {{.Locality}}, err := meta.Extract{{.LocalityUpper}}(d, m) if err != nil { return nil, "", err } @@ -22,7 +22,7 @@ func {{.API}}APIWith{{.LocalityUpper}}(d *schema.ResourceData, m interface{}) (* func {{.API}}APIWith{{.LocalityUpper}}AndID(m interface{}, {{.LocalityAdjective}}ID string) (*{{.API}}.API, scw.{{.LocalityUpper}}, string, error) { {{.API}}API := {{.API}}.NewAPI(meta.ExtractScwClient(m)) - {{.Locality}}, ID, err := parse{{.LocalityAdjectiveUpper}}ID({{.LocalityAdjective}}ID) + {{.Locality}}, ID, err := {{.LocalityAdjective}}.ParseID({{.LocalityAdjective}}ID) if err != nil { return nil, "", "", err } diff --git a/cmd/tftemplate/main.go b/cmd/tftemplate/main.go index 2eb30341c..a7dd4432a 100644 --- a/cmd/tftemplate/main.go +++ b/cmd/tftemplate/main.go @@ -5,6 +5,7 @@ import ( "fmt" "log" "text/template" + "tftemplate/models" "github.com/AlecAivazis/survey/v2" @@ -54,14 +55,14 @@ var resourceQS = []*survey.Question{ { Name: "helpers", Prompt: &survey.Confirm{ - Message: "Generate helpers ? Will override scaleway/helpers_{api}.go", + Message: "Generate helpers ? Will override ../../internal/services/{api}/helpers_{api}.go", Default: false, }, }, { Name: "waiters", Prompt: &survey.Confirm{ - Message: "Generate waiters ? Will be added to scaleway/helpers_{api}.go", + Message: "Generate waiters ? Will be added to ../../internal/services/{api}/waiter.go", Default: true, }, }, @@ -95,32 +96,32 @@ func main() { templates := []*TerraformTemplate{ { - FileName: fmt.Sprintf("../../scaleway/resource_%s.go", resourceData.ResourceHCL), + FileName: fmt.Sprintf("../../internal/services/%s/%s.go", resourceData.API, resourceData.ResourceHCL), TemplateFile: resourceTemplateFile, Skip: !contains(resourceInput.Targets, "resource"), }, { - FileName: fmt.Sprintf("../../scaleway/resource_%s_test.go", resourceData.ResourceHCL), + FileName: fmt.Sprintf("../../internal/services/%s/%s_test.go", resourceData.API, resourceData.ResourceHCL), TemplateFile: resourceTestTemplateFile, Skip: !contains(resourceInput.Targets, "resource"), }, { - FileName: fmt.Sprintf("../../scaleway/data_source_%s.go", resourceData.ResourceHCL), + FileName: fmt.Sprintf("../../internal/services/%s/%s_data_source.go", resourceData.API, resourceData.ResourceHCL), TemplateFile: datasourceTemplateFile, Skip: !contains(resourceInput.Targets, "datasource"), }, { - FileName: fmt.Sprintf("../../scaleway/data_source_%s_test.go", resourceData.ResourceHCL), + FileName: fmt.Sprintf("../../internal/services/%s/data_source_%s_test.go", resourceData.API, resourceData.ResourceHCL), TemplateFile: datasourceTestTemplateFile, Skip: !contains(resourceInput.Targets, "datasource"), }, { - FileName: fmt.Sprintf("../../scaleway/helpers_%s.go", resourceData.API), + FileName: fmt.Sprintf("../../internal/services/%s/helpers_%s.go", resourceData.API, resourceData.API), TemplateFile: resourceHelpersTemplateFile, Skip: !resourceInput.Helpers, }, { - FileName: fmt.Sprintf("../../scaleway/helpers_%s.go", resourceData.API), + FileName: fmt.Sprintf("../../internal/services/%s/waiter.go", resourceData.API), TemplateFile: resourceWaitersTemplateFile, Skip: !resourceInput.Waiters, Append: true, diff --git a/cmd/tftemplate/models/resource.go b/cmd/tftemplate/models/resource.go index 6258e7bb0..24dd7c687 100644 --- a/cmd/tftemplate/models/resource.go +++ b/cmd/tftemplate/models/resource.go @@ -1,6 +1,8 @@ package models import ( + "golang.org/x/text/cases" + "golang.org/x/text/language" "strings" "unicode" ) @@ -15,6 +17,7 @@ type ResourceTemplate struct { ResourceCleanLow string // namespace ResourceHCL string // function_namespace API string // function + APIFirstLetterUpper string SupportWaiters bool // If resource have waiters } @@ -24,6 +27,11 @@ func isUpper(letter uint8) bool { return unicode.IsUpper(r) || unicode.IsDigit(r) } +func APIfirstLetterUpper(api string) string { + capitalized := cases.Title(language.Und).String(api) + return capitalized +} + // splitByWord split a resource name to words // ex: FunctionNamespace, K8SCluster, IamSSHKey func splitByWord(sentence string) []string { @@ -81,7 +89,7 @@ func resourceWordsLower(resource string) []string { func adjectiveLocality(locality string) string { switch locality { case "zone": - return "zoned" + return "zonal" case "region": return "regional" } @@ -103,5 +111,6 @@ func NewResourceTemplate(api string, resource string, locality string) ResourceT ResourceCleanLow: cleanResource(api, resource, false), ResourceHCL: strings.Join(resourceWordsLower(resource), "_"), API: api, + APIFirstLetterUpper: APIfirstLetterUpper(api), } } diff --git a/cmd/tftemplate/resource.go.tmpl b/cmd/tftemplate/resource.go.tmpl index 4805e877e..36b92ea40 100644 --- a/cmd/tftemplate/resource.go.tmpl +++ b/cmd/tftemplate/resource.go.tmpl @@ -1,5 +1,5 @@ {{- /*gotype: tftemplate/models.ResourceTemplate*/ -}} -package scaleway +package {{.API}} import ( "context" @@ -7,6 +7,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/scaleway/scaleway-sdk-go/scw" + _ "time" ) func Resource{{ .Resource }}() *schema.Resource { @@ -18,7 +19,13 @@ func Resource{{ .Resource }}() *schema.Resource { Importer: &schema.ResourceImporter{ StateContext: schema.ImportStatePassthroughContext, }, - //TODO: timeouts + Timeouts: &schema.ResourceTimeout{ + Create: schema.DefaultTimeout(default{{.APIFirstLetterUpper}}{{.Resource}}Timeout), + Read: schema.DefaultTimeout(default{{.APIFirstLetterUpper}}{{.Resource}}Timeout), + Update: schema.DefaultTimeout(default{{.APIFirstLetterUpper}}{{.Resource}}Timeout), + Delete: schema.DefaultTimeout(default{{.APIFirstLetterUpper}}{{.Resource}}Timeout), + Default: schema.DefaultTimeout(default{{.APIFirstLetterUpper}}{{.Resource}}Timeout), + }, SchemaVersion: 0, Schema: map[string]*schema.Schema{ "name": { @@ -27,28 +34,31 @@ func Resource{{ .Resource }}() *schema.Resource { Optional: true, Description: "The {{ .ResourceCleanLow }} name", }, - "{{ .Locality }}": {{ .Locality }}Schema(), + "{{ .Locality }}": {{.LocalityAdjective}}.Schema(), "project_id": account.ProjectIDSchema(), + "organization_id": account.OrganizationIDSchema(), }, } } func Resource{{ .Resource }}Create(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - api, {{ .Locality }}, err := {{ .API }}APIWith{{ .LocalityUpper }}(d, m) + api, {{ .Locality }}, err := newAPIWith{{ .LocalityUpper }}(d, m) if err != nil { return diag.FromErr(err) } - {{ .ResourceCleanLow }}, err := api.Create{{ .ResourceClean }}(&{{ .API }}.Create{{ .ResourceClean }}Request{ - {{.LocalityUpper}}: {{.Locality}}, - ProjectID: d.Get("project_id").(string), - Name: types.ExpandOrGenerateString(d.Get("name").(string), "{{ .ResourceCleanLow }}"), - }, scw.WithContext(ctx)) + req := &{{ .API }}.Create{{ .ResourceClean }}Request{ + {{.LocalityUpper}}: {{.Locality}}, + ProjectID: types.ExpandStringPtr(d.Get("project_id").(string)), + Name: types.ExpandOrGenerateString(d.Get("name").(string), "{{ .ResourceCleanLow }}"), + } + + {{ .ResourceCleanLow }}, err := api.Create{{.ResourceClean}}(req, scw.WithContext(ctx)) if err != nil { return diag.FromErr(err) } - d.SetId(new{{ .LocalityAdjectiveUpper }}IDString({{ .Locality }}, {{ .ResourceCleanLow }}.ID)) + d.SetId({{.LocalityAdjective}}.NewIDString({{ .Locality }}, {{ .ResourceCleanLow }}.ID)) {{if .SupportWaiters}} _, err = waitFor{{ .Resource }}(ctx, api, {{ .Locality }}, {{ .ResourceCleanLow }}.ID, d.Timeout(schema.TimeoutCreate)) @@ -61,25 +71,27 @@ func Resource{{ .Resource }}Create(ctx context.Context, d *schema.ResourceData, } func Resource{{ .Resource }}Read(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - api, {{ .Locality }}, id, err := {{ .API }}APIWith{{ .LocalityUpper }}AndID(m, d.Id()) + api, id, zone, err := NewAPIWith{{ .LocalityUpper }}AndID(m, d.Id()) if err != nil { return diag.FromErr(err) } + {{if .SupportWaiters}} {{ .ResourceCleanLow }}, err := waitFor{{ .Resource }}(ctx, api, {{ .Locality }}, id, d.Timeout(schema.TimeoutRead)) +{{- else}} + {{.ResourceCleanLow}}, err = api.Get{{.ResourceClean}}(&{{ .API }}.Get{{.ResourceClean}}Request + { + {{.ResourceClean}}ID: id, + {{.LocalityUpper}}: {{.Locality}}, + }, scw.WithContext(ctx)) +{{- end }} if err != nil { - if is404Error(err) { + if httperrors.Is404(err) { d.SetId("") return nil } return diag.FromErr(err) } -{{- else}} - {{.ResourceCleanLow}}, err := api.Get{{.ResourceClean}}(&{{.API}}.Get{{.ResourceClean}}Request{ - {{.ResourceClean}}ID: id, - {{.LocalityUpper}}: {{.Locality}}, - }, scw.WithContext(ctx)) -{{- end }} _ = d.Set("name", {{ .ResourceCleanLow }}.Name) _ = d.Set("{{.Locality}}", {{.ResourceCleanLow}}.{{.LocalityUpper}}) @@ -89,14 +101,14 @@ func Resource{{ .Resource }}Read(ctx context.Context, d *schema.ResourceData, m } func Resource{{ .Resource }}Update(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - api, {{ .Locality }}, id, err := {{ .API }}APIWith{{ .LocalityUpper }}AndID(m, d.Id()) + api, {{ .Locality }}, id, err := NewAPIWith{{ .LocalityUpper }}AndID(m, d.Id()) if err != nil { return diag.FromErr(err) } {{if .SupportWaiters }} {{ .ResourceCleanLow }}, err := waitFor{{ .Resource }}(ctx, api, {{ .Locality }}, id, d.Timeout(schema.TimeoutUpdate)) if err != nil { - if is404Error(err) { + if httperrors.Is404(err) { d.SetId("") return nil } @@ -120,7 +132,7 @@ func Resource{{ .Resource }}Update(ctx context.Context, d *schema.ResourceData, } func Resource{{ .Resource }}Delete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - api, {{ .Locality }}, id, err := {{ .API }}APIWith{{ .LocalityUpper }}AndID(m, d.Id()) + api, {{ .Locality }}, id, err := NewAPIWith{{ .LocalityUpper }}AndID(m, d.Id()) if err != nil { return diag.FromErr(err) } @@ -140,7 +152,7 @@ func Resource{{ .Resource }}Delete(ctx context.Context, d *schema.ResourceData, {{- if .SupportWaiters}} _, err = waitFor{{ .Resource }}(ctx, api, {{ .Locality }}, id, d.Timeout(schema.TimeoutDelete)) - if err != nil && !is404Error(err) { + if err != nil && !httperrors.Is404(err) { return diag.FromErr(err) } {{- end}} diff --git a/cmd/tftemplate/templates.go b/cmd/tftemplate/templates.go index 8ef42e47b..e4ea190ec 100644 --- a/cmd/tftemplate/templates.go +++ b/cmd/tftemplate/templates.go @@ -4,6 +4,8 @@ import ( "log" "os" "text/template" + + "strings" "tftemplate/models" ) @@ -23,9 +25,10 @@ type TerraformTemplate struct { func executeTemplate(tmpl *TerraformTemplate, data models.ResourceTemplate) error { var outputFile *os.File var err error - + lastInd := strings.LastIndex(tmpl.FileName, "/") + _ = os.Mkdir(tmpl.FileName[:lastInd], os.ModePerm) if tmpl.Append { - outputFile, err = os.OpenFile(tmpl.FileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + outputFile, err = os.OpenFile(tmpl.FileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) } else { outputFile, err = os.Create(tmpl.FileName) } diff --git a/cmd/tftemplate/waiters.go.tmpl b/cmd/tftemplate/waiters.go.tmpl index 38103654c..4927b4582 100644 --- a/cmd/tftemplate/waiters.go.tmpl +++ b/cmd/tftemplate/waiters.go.tmpl @@ -1,7 +1,13 @@ {{- /*gotype: tftemplate/models.ResourceTemplate*/ -}} +package {{.API}} + +import ( + "github.com/scaleway/terraform-provider-scaleway/v2/internal/transport" + "github.com/scaleway/scaleway-sdk-go/scw" +) func waitFor{{.Resource}}(ctx context.Context, {{.API}}API *{{.API}}.API, {{.Locality}} scw.{{.LocalityUpper}}, id string, timeout time.Duration) (*{{.API}}.{{.ResourceClean}}, error) { - retryInterval := defaultFunctionRetryInterval + retryInterval := default{{.ResourceClean}}RetryInterval if DefaultWaitRetryInterval != nil { retryInterval = *DefaultWaitRetryInterval } From b7650f312379e4ec8d8b22845c4a642a9ecbe0bd Mon Sep 17 00:00:00 2001 From: lmasson Date: Fri, 9 Aug 2024 09:48:31 +0200 Subject: [PATCH 2/4] language undefined to english --- cmd/tftemplate/models/resource.go | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/cmd/tftemplate/models/resource.go b/cmd/tftemplate/models/resource.go index 24dd7c687..43e10f606 100644 --- a/cmd/tftemplate/models/resource.go +++ b/cmd/tftemplate/models/resource.go @@ -8,16 +8,17 @@ import ( ) type ResourceTemplate struct { - LocalityAdjectiveUpper string // Regional/Zoned - LocalityAdjective string // regional/zoned - LocalityUpper string // Region - Locality string // region - Resource string // FunctionNamespace - ResourceClean string // Namespace - ResourceCleanLow string // namespace - ResourceHCL string // function_namespace - API string // function - APIFirstLetterUpper string + LocalityAdjectiveUpper string // Regional/Zoned + LocalityAdjective string // regional/zoned + LocalityUpper string // Region + Locality string // region + Resource string // FunctionNamespace + ResourceClean string // Namespace + ResourceCleanLow string // namespace + ResourceFistLetterUpper string + ResourceHCL string // function_namespace + API string // function + APIFirstLetterUpper string // Function SupportWaiters bool // If resource have waiters } @@ -27,8 +28,8 @@ func isUpper(letter uint8) bool { return unicode.IsUpper(r) || unicode.IsDigit(r) } -func APIfirstLetterUpper(api string) string { - capitalized := cases.Title(language.Und).String(api) +func FirstLetterUpper(string string) string { + capitalized := cases.Title(language.English).String(string) return capitalized } @@ -111,6 +112,6 @@ func NewResourceTemplate(api string, resource string, locality string) ResourceT ResourceCleanLow: cleanResource(api, resource, false), ResourceHCL: strings.Join(resourceWordsLower(resource), "_"), API: api, - APIFirstLetterUpper: APIfirstLetterUpper(api), + APIFirstLetterUpper: FirstLetterUpper(api), } } From f50a29e3e8dd04bf4103a6d748c046269cafd072 Mon Sep 17 00:00:00 2001 From: lmasson Date: Fri, 9 Aug 2024 10:27:30 +0200 Subject: [PATCH 3/4] fix space instead of tab --- cmd/tftemplate/datasource.go.tmpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/tftemplate/datasource.go.tmpl b/cmd/tftemplate/datasource.go.tmpl index bce5bf24f..6a5b426a9 100644 --- a/cmd/tftemplate/datasource.go.tmpl +++ b/cmd/tftemplate/datasource.go.tmpl @@ -58,11 +58,11 @@ func DataSource{{.Resource}}Read(ctx context.Context, d *schema.ResourceData, m {{.ResourceCleanLow}}ID = found{{.ResourceClean}}.ID } - {{- if eq .Locality "zone" }} + {{- if eq .Locality "zone" }} {{.Locality}}ID := datasource.NewZonedID({{.ResourceCleanLow}}ID, {{.Locality}}) {{- else }} {{.Locality}}ID := datasource.New{{.LocalityAdjectiveUpper}}ID({{.ResourceCleanLow}}ID, {{.Locality}}) - {{- end}} + {{- end}} d.SetId({{.Locality}}ID) err = d.Set("{{.ResourceCleanLow}}_id", {{.Locality}}ID) if err != nil { From 3e7821c5304c80219cb145dc7dae1042b419f5fb Mon Sep 17 00:00:00 2001 From: Laure-di <62625835+Laure-di@users.noreply.github.com> Date: Fri, 9 Aug 2024 11:11:20 +0200 Subject: [PATCH 4/4] Update cmd/tftemplate/resource.go.tmpl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jules Castéran --- cmd/tftemplate/resource.go.tmpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/tftemplate/resource.go.tmpl b/cmd/tftemplate/resource.go.tmpl index 36b92ea40..b91ada621 100644 --- a/cmd/tftemplate/resource.go.tmpl +++ b/cmd/tftemplate/resource.go.tmpl @@ -19,7 +19,7 @@ func Resource{{ .Resource }}() *schema.Resource { Importer: &schema.ResourceImporter{ StateContext: schema.ImportStatePassthroughContext, }, - Timeouts: &schema.ResourceTimeout{ + Timeouts: &schema.ResourceTimeout{ // TODO: remove unused timeouts Create: schema.DefaultTimeout(default{{.APIFirstLetterUpper}}{{.Resource}}Timeout), Read: schema.DefaultTimeout(default{{.APIFirstLetterUpper}}{{.Resource}}Timeout), Update: schema.DefaultTimeout(default{{.APIFirstLetterUpper}}{{.Resource}}Timeout),