Skip to content

Commit 4061d10

Browse files
Laure-diCodelaxremyleone
authored
fix(tftemplate): fix generation (#2684)
* fix(tftemplate): fix generation * language undefined to english * fix space instead of tab * Update cmd/tftemplate/resource.go.tmpl Co-authored-by: Jules Castéran <[email protected]> --------- Co-authored-by: Jules Castéran <[email protected]> Co-authored-by: Rémy Léone <[email protected]>
1 parent f2452b6 commit 4061d10

10 files changed

+120
-84
lines changed

cmd/tftemplate/datasource.go.tmpl

+22-27
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,27 @@
11
{{- /*gotype: tftemplate/models.ResourceTemplate*/ -}}
2-
package scaleway
2+
package {{.API}}
33

44
import (
55
"context"
66

77
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
88
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
9+
"github.com/scaleway/terraform-provider-scaleway/v2/internal/datasource"
10+
"github.com/scaleway/terraform-provider-scaleway/v2/internal/verify"
911
)
1012

1113
func DataSource{{.Resource}}() *schema.Resource {
1214
// Generate datasource schema from resource
13-
dsSchema := datasourceSchemaFromResourceSchema(Resource{{.Resource}}().Schema)
15+
dsSchema := datasource.SchemaFromResourceSchema(Resource{{.Resource}}().Schema)
1416

15-
addOptionalFieldsToSchema(dsSchema, "name", "{{.Locality}}")
17+
datasource.AddOptionalFieldsToSchema(dsSchema, "name", "{{.Locality}}")
1618

1719
dsSchema["{{.ResourceCleanLow}}_id"] = &schema.Schema{
1820
Type: schema.TypeString,
1921
Optional: true,
2022
Description: "The ID of the {{.ResourceCleanLow}}",
2123
ConflictsWith: []string{"name"},
22-
ValidateFunc: validationUUIDorUUIDWithLocality(),
24+
ValidateFunc: verify.IsUUIDorUUIDWithLocality(),
2325
}
2426
dsSchema["project_id"].Optional = true
2527

@@ -30,49 +32,42 @@ func DataSource{{.Resource}}() *schema.Resource {
3032
}
3133

3234
func DataSource{{.Resource}}Read(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
33-
api, {{.Locality}}, err := {{.API}}APIWith{{.LocalityUpper}}(d, m)
35+
api, {{.Locality}}, err := newAPIWith{{.LocalityUpper}}(d, m)
3436
if err != nil {
3537
return diag.FromErr(err)
3638
}
3739

3840
{{.ResourceCleanLow}}ID, {{.ResourceCleanLow}}IDExists := d.GetOk("{{.ResourceCleanLow}}_id")
3941
if !{{.ResourceCleanLow}}IDExists {
42+
{{.ResourceCleanLow}}Name := d.Get("name").(string)
4043
res, err := api.List{{.ResourceClean}}s(&{{.API}}.List{{.ResourceClean}}sRequest{
4144
{{.LocalityUpper}}: {{.Locality}},
4245
Name: types.ExpandStringPtr(d.Get("name")),
43-
ProjectID: types.ExpandStringPtr(d.Get("project_id")),
4446
})
4547
if err != nil {
4648
return diag.FromErr(err)
4749
}
48-
for _, {{.ResourceCleanLow}} := range res.{{.ResourceClean}}s {
49-
if {{.ResourceCleanLow}}.Name == d.Get("name").(string) {
50-
if {{.ResourceCleanLow}}ID != "" {
51-
return diag.Errorf("more than 1 {{.ResourceCleanLow}} found with the same name %s", d.Get("name"))
52-
}
53-
{{.ResourceCleanLow}}ID = {{.ResourceCleanLow}}.ID
54-
}
55-
}
56-
if {{.ResourceCleanLow}}ID == "" {
57-
return diag.Errorf("no {{.ResourceCleanLow}} found with the name %s", d.Get("name"))
50+
found{{.ResourceClean}} , err := datasource.FindExact(
51+
res.{{.ResourceClean}}s,
52+
func(s *{{.API}}.{{.ResourceClean}}) bool {return s.Name == {{.ResourceCleanLow}}Name },
53+
{{.ResourceCleanLow}}Name,
54+
)
55+
if err != nil {
56+
return diag.FromErr(err)
5857
}
58+
{{.ResourceCleanLow}}ID = found{{.ResourceClean}}.ID
5959
}
6060

61-
{{.Locality}}ID := datasourceNew{{.LocalityAdjectiveUpper}}ID({{.ResourceCleanLow}}ID, {{.Locality}})
61+
{{- if eq .Locality "zone" }}
62+
{{.Locality}}ID := datasource.NewZonedID({{.ResourceCleanLow}}ID, {{.Locality}})
63+
{{- else }}
64+
{{.Locality}}ID := datasource.New{{.LocalityAdjectiveUpper}}ID({{.ResourceCleanLow}}ID, {{.Locality}})
65+
{{- end}}
6266
d.SetId({{.Locality}}ID)
6367
err = d.Set("{{.ResourceCleanLow}}_id", {{.Locality}}ID)
6468
if err != nil {
6569
return diag.FromErr(err)
6670
}
6771

68-
diags := Resource{{.Resource}}Read(ctx, d, m)
69-
if diags != nil {
70-
return append(diags, diag.Errorf("failed to read {{.ResourceCleanLow}} state")...)
71-
}
72-
73-
if d.Id() == "" {
74-
return diag.Errorf("{{.ResourceCleanLow}} (%s) not found", {{.Locality}}ID)
75-
}
76-
77-
return nil
72+
return Resource{{.Resource}}Read(ctx, d, m)
7873
}

cmd/tftemplate/datasource_test.go.tmpl

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{{- /*gotype: tftemplate/models.ResourceTemplate*/ -}}
2-
package scaleway
2+
package {{.API}}_test
33

44
import (
55
"testing"

cmd/tftemplate/go.mod

+5-4
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,11 @@ require github.com/AlecAivazis/survey/v2 v2.3.7
88

99
require (
1010
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
11-
github.com/mattn/go-colorable v0.1.2 // indirect
12-
github.com/mattn/go-isatty v0.0.8 // indirect
11+
github.com/mattn/go-colorable v0.1.13 // indirect
12+
github.com/mattn/go-isatty v0.0.20 // indirect
1313
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect
14-
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect
14+
github.com/stretchr/testify v1.7.0 // indirect
15+
golang.org/x/sys v0.20.0 // indirect
1516
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
16-
golang.org/x/text v0.4.0 // indirect
17+
golang.org/x/text v0.15.0 // indirect
1718
)

cmd/tftemplate/go.sum

+13-5
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,21 @@ github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u
1111
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68=
1212
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
1313
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
14-
github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
1514
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
16-
github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
15+
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
16+
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
1717
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
18+
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
19+
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
20+
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
1821
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4=
1922
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
2023
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
2124
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
2225
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
23-
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
2426
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
27+
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
28+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
2529
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
2630
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
2731
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
3640
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
3741
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3842
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
39-
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
4043
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
44+
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
45+
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
46+
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
47+
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
4148
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
4249
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
4350
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
4451
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
4552
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
4653
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
47-
golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg=
4854
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
55+
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
56+
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
4957
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
5058
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
5159
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=

cmd/tftemplate/helpers.go.tmpl

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
{{- /*gotype: tftemplate/models.ResourceTemplate*/ -}}
2-
package scaleway
2+
package {{.API}}
33

44
import (
55
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
66
"github.com/scaleway/scaleway-sdk-go/scw"
77
)
88

9-
// {{.API}}APIWith{{.LocalityUpper}} returns a new {{.API}} API and the {{.Locality}} for a Create request
9+
// newAPIWith{{.LocalityUpper}} returns a new {{.API}} API and the {{.Locality}} for a Create request
1010
func {{.API}}APIWith{{.LocalityUpper}}(d *schema.ResourceData, m interface{}) (*{{.API}}.API, scw.{{.LocalityUpper}}, error) {
1111
{{.API}}API := {{.API}}.NewAPI(meta.ExtractScwClient(m))
1212

13-
{{.Locality}}, err := extract{{.LocalityUpper}}(d, m)
13+
{{.Locality}}, err := meta.Extract{{.LocalityUpper}}(d, m)
1414
if err != nil {
1515
return nil, "", err
1616
}
@@ -22,7 +22,7 @@ func {{.API}}APIWith{{.LocalityUpper}}(d *schema.ResourceData, m interface{}) (*
2222
func {{.API}}APIWith{{.LocalityUpper}}AndID(m interface{}, {{.LocalityAdjective}}ID string) (*{{.API}}.API, scw.{{.LocalityUpper}}, string, error) {
2323
{{.API}}API := {{.API}}.NewAPI(meta.ExtractScwClient(m))
2424

25-
{{.Locality}}, ID, err := parse{{.LocalityAdjectiveUpper}}ID({{.LocalityAdjective}}ID)
25+
{{.Locality}}, ID, err := {{.LocalityAdjective}}.ParseID({{.LocalityAdjective}}ID)
2626
if err != nil {
2727
return nil, "", "", err
2828
}

cmd/tftemplate/main.go

+9-8
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"log"
77
"text/template"
8+
89
"tftemplate/models"
910

1011
"github.com/AlecAivazis/survey/v2"
@@ -54,14 +55,14 @@ var resourceQS = []*survey.Question{
5455
{
5556
Name: "helpers",
5657
Prompt: &survey.Confirm{
57-
Message: "Generate helpers ? Will override scaleway/helpers_{api}.go",
58+
Message: "Generate helpers ? Will override ../../internal/services/{api}/helpers_{api}.go",
5859
Default: false,
5960
},
6061
},
6162
{
6263
Name: "waiters",
6364
Prompt: &survey.Confirm{
64-
Message: "Generate waiters ? Will be added to scaleway/helpers_{api}.go",
65+
Message: "Generate waiters ? Will be added to ../../internal/services/{api}/waiter.go",
6566
Default: true,
6667
},
6768
},
@@ -95,32 +96,32 @@ func main() {
9596

9697
templates := []*TerraformTemplate{
9798
{
98-
FileName: fmt.Sprintf("../../scaleway/resource_%s.go", resourceData.ResourceHCL),
99+
FileName: fmt.Sprintf("../../internal/services/%s/%s.go", resourceData.API, resourceData.ResourceHCL),
99100
TemplateFile: resourceTemplateFile,
100101
Skip: !contains(resourceInput.Targets, "resource"),
101102
},
102103
{
103-
FileName: fmt.Sprintf("../../scaleway/resource_%s_test.go", resourceData.ResourceHCL),
104+
FileName: fmt.Sprintf("../../internal/services/%s/%s_test.go", resourceData.API, resourceData.ResourceHCL),
104105
TemplateFile: resourceTestTemplateFile,
105106
Skip: !contains(resourceInput.Targets, "resource"),
106107
},
107108
{
108-
FileName: fmt.Sprintf("../../scaleway/data_source_%s.go", resourceData.ResourceHCL),
109+
FileName: fmt.Sprintf("../../internal/services/%s/%s_data_source.go", resourceData.API, resourceData.ResourceHCL),
109110
TemplateFile: datasourceTemplateFile,
110111
Skip: !contains(resourceInput.Targets, "datasource"),
111112
},
112113
{
113-
FileName: fmt.Sprintf("../../scaleway/data_source_%s_test.go", resourceData.ResourceHCL),
114+
FileName: fmt.Sprintf("../../internal/services/%s/data_source_%s_test.go", resourceData.API, resourceData.ResourceHCL),
114115
TemplateFile: datasourceTestTemplateFile,
115116
Skip: !contains(resourceInput.Targets, "datasource"),
116117
},
117118
{
118-
FileName: fmt.Sprintf("../../scaleway/helpers_%s.go", resourceData.API),
119+
FileName: fmt.Sprintf("../../internal/services/%s/helpers_%s.go", resourceData.API, resourceData.API),
119120
TemplateFile: resourceHelpersTemplateFile,
120121
Skip: !resourceInput.Helpers,
121122
},
122123
{
123-
FileName: fmt.Sprintf("../../scaleway/helpers_%s.go", resourceData.API),
124+
FileName: fmt.Sprintf("../../internal/services/%s/waiter.go", resourceData.API),
124125
TemplateFile: resourceWaitersTemplateFile,
125126
Skip: !resourceInput.Waiters,
126127
Append: true,

cmd/tftemplate/models/resource.go

+20-10
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
11
package models
22

33
import (
4+
"golang.org/x/text/cases"
5+
"golang.org/x/text/language"
46
"strings"
57
"unicode"
68
)
79

810
type ResourceTemplate struct {
9-
LocalityAdjectiveUpper string // Regional/Zoned
10-
LocalityAdjective string // regional/zoned
11-
LocalityUpper string // Region
12-
Locality string // region
13-
Resource string // FunctionNamespace
14-
ResourceClean string // Namespace
15-
ResourceCleanLow string // namespace
16-
ResourceHCL string // function_namespace
17-
API string // function
11+
LocalityAdjectiveUpper string // Regional/Zoned
12+
LocalityAdjective string // regional/zoned
13+
LocalityUpper string // Region
14+
Locality string // region
15+
Resource string // FunctionNamespace
16+
ResourceClean string // Namespace
17+
ResourceCleanLow string // namespace
18+
ResourceFistLetterUpper string
19+
ResourceHCL string // function_namespace
20+
API string // function
21+
APIFirstLetterUpper string // Function
1822

1923
SupportWaiters bool // If resource have waiters
2024
}
@@ -24,6 +28,11 @@ func isUpper(letter uint8) bool {
2428
return unicode.IsUpper(r) || unicode.IsDigit(r)
2529
}
2630

31+
func FirstLetterUpper(string string) string {
32+
capitalized := cases.Title(language.English).String(string)
33+
return capitalized
34+
}
35+
2736
// splitByWord split a resource name to words
2837
// ex: FunctionNamespace, K8SCluster, IamSSHKey
2938
func splitByWord(sentence string) []string {
@@ -81,7 +90,7 @@ func resourceWordsLower(resource string) []string {
8190
func adjectiveLocality(locality string) string {
8291
switch locality {
8392
case "zone":
84-
return "zoned"
93+
return "zonal"
8594
case "region":
8695
return "regional"
8796
}
@@ -103,5 +112,6 @@ func NewResourceTemplate(api string, resource string, locality string) ResourceT
103112
ResourceCleanLow: cleanResource(api, resource, false),
104113
ResourceHCL: strings.Join(resourceWordsLower(resource), "_"),
105114
API: api,
115+
APIFirstLetterUpper: FirstLetterUpper(api),
106116
}
107117
}

0 commit comments

Comments
 (0)