Skip to content

Commit 8c0a897

Browse files
authored
fix(tftemplates): add sweep and sweep_test (#2734)
* fix templates * fix waiters template defaultRetryInterval * fix test templates * fix sweeper test * fix sweeper test * separate sweeper * fix test resource * add sweep template and test * fix resource and helper * fix name resource * fix package name * fix method name
1 parent 8c08756 commit 8c0a897

7 files changed

+101
-55
lines changed

cmd/tftemplate/helpers.go.tmpl

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import (
66
"github.com/scaleway/scaleway-sdk-go/scw"
77
)
88

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

1313
{{.Locality}}, err := meta.Extract{{.LocalityUpper}}(d, m)
@@ -18,8 +18,8 @@ func {{.API}}APIWith{{.LocalityUpper}}(d *schema.ResourceData, m interface{}) (*
1818
return {{.API}}API, {{.Locality}}, nil
1919
}
2020

21-
// {{.API}}APIWith{{.LocalityAdjectiveUpper}}AndID returns a new {{.API }} API with {{.Locality}} and ID extracted from the state
22-
func {{.API}}APIWith{{.LocalityUpper}}AndID(m interface{}, {{.LocalityAdjective}}ID string) (*{{.API}}.API, scw.{{.LocalityUpper}}, string, error) {
21+
// NewAPIWith{{.LocalityUpper}}AndID returns a new {{.API }} API with {{.Locality}} and ID extracted from the state
22+
func NewAPIWith{{.LocalityUpper}}AndID(m interface{}, {{.LocalityAdjective}}ID string) (*{{.API}}.API, scw.{{.LocalityUpper}}, string, error) {
2323
{{.API}}API := {{.API}}.NewAPI(meta.ExtractScwClient(m))
2424

2525
{{.Locality}}, ID, err := {{.LocalityAdjective}}.ParseID({{.LocalityAdjective}}ID)

cmd/tftemplate/main.go

+24
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ var (
2424
datasourceTemplateFile string
2525
//go:embed datasource_test.go.tmpl
2626
datasourceTestTemplateFile string
27+
//go:embed sweep_test.go.tmpl
28+
resourceSweepTemplateFile string
29+
//go:embed sweep.go.tmpl
30+
resourceSweepTestTemplateFile string
2731
)
2832

2933
var resourceQS = []*survey.Question{
@@ -66,6 +70,13 @@ var resourceQS = []*survey.Question{
6670
Default: true,
6771
},
6872
},
73+
{
74+
Name: "sweep",
75+
Prompt: &survey.Confirm{
76+
Message: "Generate sweeper ? Will be added to ../../internal/services/{api}/sweep.go",
77+
Default: true,
78+
},
79+
},
6980
}
7081

7182
func contains[T comparable](slice []T, expected T) bool {
@@ -86,6 +97,7 @@ func main() {
8697
Locality string
8798
Helpers bool
8899
Waiters bool
100+
Sweep bool
89101
}{}
90102
err := survey.Ask(resourceQS, &resourceInput)
91103
if err != nil {
@@ -126,6 +138,18 @@ func main() {
126138
Skip: !resourceInput.Waiters,
127139
Append: true,
128140
},
141+
{
142+
FileName: fmt.Sprintf("../../internal/services/%s/testfuncs/sweep.go", resourceData.API),
143+
TemplateFile: resourceSweepTemplateFile,
144+
Skip: !contains(resourceInput.Targets, "resource"),
145+
Append: true,
146+
},
147+
{
148+
FileName: fmt.Sprintf("../../internal/services/%s/sweep_test.go", resourceData.API),
149+
TemplateFile: resourceSweepTestTemplateFile,
150+
Skip: !contains(resourceInput.Targets, "resource"),
151+
Append: true,
152+
},
129153
}
130154

131155
for _, tmpl := range templates {

cmd/tftemplate/resource.go.tmpl

+4-4
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func Resource{{ .Resource }}Create(ctx context.Context, d *schema.ResourceData,
4949

5050
req := &{{ .API }}.Create{{ .ResourceClean }}Request{
5151
{{.LocalityUpper}}: {{.Locality}},
52-
ProjectID: types.ExpandStringPtr(d.Get("project_id").(string)),
52+
ProjectID: d.Get("project_id").(string),
5353
Name: types.ExpandOrGenerateString(d.Get("name").(string), "{{ .ResourceCleanLow }}"),
5454
}
5555

@@ -71,7 +71,7 @@ func Resource{{ .Resource }}Create(ctx context.Context, d *schema.ResourceData,
7171
}
7272

7373
func Resource{{ .Resource }}Read(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
74-
api, id, zone, err := NewAPIWith{{ .LocalityUpper }}AndID(m, d.Id())
74+
api,{{.Locality}}, id, err := newAPIWith{{ .LocalityUpper }}AndID(m, d.Id())
7575
if err != nil {
7676
return diag.FromErr(err)
7777
}
@@ -101,7 +101,7 @@ func Resource{{ .Resource }}Read(ctx context.Context, d *schema.ResourceData, m
101101
}
102102

103103
func Resource{{ .Resource }}Update(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
104-
api, {{ .Locality }}, id, err := NewAPIWith{{ .LocalityUpper }}AndID(m, d.Id())
104+
api, {{ .Locality }}, id, err := newAPIWith{{ .LocalityUpper }}AndID(m, d.Id())
105105
if err != nil {
106106
return diag.FromErr(err)
107107
}
@@ -132,7 +132,7 @@ func Resource{{ .Resource }}Update(ctx context.Context, d *schema.ResourceData,
132132
}
133133

134134
func Resource{{ .Resource }}Delete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
135-
api, {{ .Locality }}, id, err := NewAPIWith{{ .LocalityUpper }}AndID(m, d.Id())
135+
api, {{ .Locality }}, id, err := newAPIWith{{ .LocalityUpper }}AndID(m, d.Id())
136136
if err != nil {
137137
return diag.FromErr(err)
138138
}

cmd/tftemplate/resource_test.go.tmpl

+11-45
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
"fmt"
@@ -10,74 +10,40 @@ import (
1010
"github.com/scaleway/scaleway-sdk-go/scw"
1111
)
1212

13-
func init() {
14-
resource.AddTestSweepers("scaleway_{{ .ResourceHCL }}", &resource.Sweeper{
15-
Name: "scaleway_{{ .ResourceHCL }}",
16-
F: testSweep{{ .Resource }},
17-
})
18-
}
19-
20-
func testSweep{{ .Resource }}(_ string) error {
21-
return sweep{{.LocalityUpper}}s((&{{ .API }}.API{}).{{ .LocalityUpper }}s(), func(scwClient *scw.Client, {{ .Locality }} scw.{{.LocalityUpper}}) error {
22-
{{ .API }}API := {{ .API }}.NewAPI(scwClient)
23-
l.Debugf("sweeper: destroying the {{ .API }} {{ .ResourceCleanLow }}s in (%s)", {{.Locality}})
24-
list{{.ResourceClean}}s, err := {{.API}}API.List{{.ResourceClean}}s(
25-
&{{.API}}.List{{.ResourceClean}}sRequest{
26-
{{.LocalityUpper}}: {{.Locality}},
27-
}, scw.WithAllPages())
28-
if err != nil {
29-
return fmt.Errorf("error listing {{.ResourceCleanLow}} in (%s) in sweeper: %s", {{.Locality}}, err)
30-
}
3113

32-
for _, {{.ResourceCleanLow}} := range list{{.ResourceClean}}s.{{.ResourceClean}}s {
33-
_, err := {{.API}}API.Delete{{.ResourceClean}}(&{{.API}}.Delete{{.ResourceClean}}Request{
34-
{{.ResourceClean}}ID: {{.ResourceCleanLow}}.ID,
35-
{{.LocalityUpper}}: {{.Locality}},
36-
})
37-
if err != nil {
38-
l.Debugf("sweeper: error (%s)", err)
39-
40-
return fmt.Errorf("error deleting {{.ResourceCleanLow}} in sweeper: %s", err)
41-
}
42-
}
43-
44-
return nil
45-
})
46-
}
4714

4815
func TestAcc{{.Resource}}_Basic(t *testing.T) {
4916
tt := acctest.NewTestTools(t)
5017
defer tt.Cleanup()
5118

5219
resource.ParallelTest(t, resource.TestCase{
53-
PreCheck: func() { testAccPreCheck(t) },
20+
PreCheck: func() { acctest.PreCheck(t) },
5421
ProviderFactories: tt.ProviderFactories,
5522
CheckDestroy: testAccCheck{{.Resource}}Destroy(tt),
5623
Steps: []resource.TestStep{
5724
{
5825
Config: `
59-
resource scaleway_{{.ResourceHCL}} main {
26+
resource "scaleway_{{.API}}_{{.ResourceHCL}}" "main" {
6027
name = "test-{{.API}}-{{ .ResourceCleanLow}}-basic"
6128
}
6229
`,
6330
Check: resource.ComposeTestCheckFunc(
64-
testAccCheck{{.Resource}}Exists(tt, "scaleway_{{.ResourceHCL}}.main"),
65-
testCheckResourceAttrUUID("scaleway_{{.ResourceHCL}}.main", "id"),
66-
resource.TestCheckResourceAttr("scaleway_{{.ResourceHCL}}.main", "name", "test-{{.API}}-{{ .ResourceCleanLow}}-basic"),
31+
testAccCheck{{.Resource}}Exists(tt, "scaleway_{{.API}}_{{.ResourceHCL}}.main"),
32+
resource.TestCheckResourceAttr("scaleway_{{.API}}_{{.ResourceHCL}}.main", "name", "test-{{.API}}-{{ .ResourceCleanLow}}-basic"),
6733
),
6834
},
6935
},
7036
})
7137
}
7238

73-
func testAccCheck{{.Resource}}Exists(tt *TestTools, n string) resource.TestCheckFunc {
39+
func testAccCheck{{.Resource}}Exists(tt *acctest.TestTools, n string) resource.TestCheckFunc {
7440
return func(state *terraform.State) error {
7541
rs, ok := state.RootModule().Resources[n]
7642
if !ok {
7743
return fmt.Errorf("resource not found: %s", n)
7844
}
7945

80-
api, {{.Locality}}, id, err := {{.API}}APIWith{{.LocalityUpper}}AndID(tt.Meta, rs.Primary.ID)
46+
api, {{.Locality}}, id, err := newAPIWith{{.LocalityUpper}}AndID(tt.Meta, rs.Primary.ID)
8147
if err != nil {
8248
return err
8349
}
@@ -95,14 +61,14 @@ func testAccCheck{{.Resource}}Exists(tt *TestTools, n string) resource.TestCheck
9561
}
9662
}
9763

98-
func testAccCheck{{.Resource}}Destroy(tt *TestTools) resource.TestCheckFunc {
64+
func testAccCheck{{.Resource}}Destroy(tt *acctest.TestTools) resource.TestCheckFunc {
9965
return func(state *terraform.State) error {
10066
for _, rs := range state.RootModule().Resources {
101-
if rs.Type != "scaleway_{{.ResourceHCL}}" {
67+
if rs.Type != "scaleway_{{.API}}_{{.ResourceHCL}}" {
10268
continue
10369
}
10470

105-
api, {{.Locality}}, id, err := {{.API}}APIWith{{.LocalityUpper}}AndID(tt.Meta, rs.Primary.ID)
71+
api, {{.Locality}}, id, err := newAPIWith{{.LocalityUpper}}AndID(tt.Meta, rs.Primary.ID)
10672
if err != nil {
10773
return err
10874
}
@@ -116,7 +82,7 @@ func testAccCheck{{.Resource}}Destroy(tt *TestTools) resource.TestCheckFunc {
11682
return fmt.Errorf("{{.API}} {{.ResourceCleanLow}} (%s) still exists", rs.Primary.ID)
11783
}
11884

119-
if !is404Error(err) {
85+
if !httperrors.Is404(err) {
12086
return err
12187
}
12288
}

cmd/tftemplate/sweep.go.tmpl

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
{{- /*gotype: tftemplate/models.ResourceTemplate*/ -}}
2+
package {{.API}}testfuncs
3+
4+
import (
5+
"fmt"
6+
"testing"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
10+
"github.com/scaleway/scaleway-sdk-go/scw"
11+
)
12+
13+
func testSweep{{ .Resource }}(_ string) error {
14+
return acctest.Sweep{{.LocalityUpper}}s((&{{ .API }}.API{}).{{ .LocalityUpper }}s(), func(scwClient *scw.Client, {{ .Locality }} scw.{{.LocalityUpper}}) error {
15+
{{ .API }}API := {{ .API }}.NewAPI(scwClient)
16+
logging.L.Debugf("sweeper: destroying the {{ .API }} {{ .ResourceCleanLow }}s in (%s)", {{.Locality}})
17+
list{{.ResourceClean}}s, err := {{.API}}API.List{{.ResourceClean}}s(
18+
&{{.API}}.List{{.ResourceClean}}sRequest{
19+
{{.LocalityUpper}}: {{.Locality}},
20+
}, scw.WithAllPages())
21+
if err != nil {
22+
return fmt.Errorf("error listing {{.ResourceCleanLow}} in (%s) in sweeper: %s", {{.Locality}}, err)
23+
}
24+
25+
for _, {{.ResourceCleanLow}} := range list{{.ResourceClean}}s.{{.ResourceClean}}s {
26+
_, err := {{.API}}API.Delete{{.ResourceClean}}(&{{.API}}.Delete{{.ResourceClean}}Request{
27+
{{.ResourceClean}}ID: {{.ResourceCleanLow}}.ID,
28+
{{.LocalityUpper}}: {{.Locality}},
29+
})
30+
if err != nil {
31+
logging.L.Debugf("sweeper: error (%s)", err)
32+
33+
return fmt.Errorf("error deleting {{.ResourceCleanLow}} in sweeper: %s", err)
34+
}
35+
}
36+
37+
return nil
38+
})
39+
}

cmd/tftemplate/sweep_test.go.tmpl

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{{- /*gotype: tftemplate/models.ResourceTemplate*/ -}}
2+
package {{.API}}_test
3+
4+
import (
5+
"fmt"
6+
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
8+
)
9+
10+
func init() {
11+
{{.API}}testfuncs.AddTestSweepers()
12+
}
13+
14+
func TestMain(m *testing.M) {
15+
resource.TestMain(m)
16+
}
17+

cmd/tftemplate/waiters.go.tmpl

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import (
88

99
func waitFor{{.Resource}}(ctx context.Context, {{.API}}API *{{.API}}.API, {{.Locality}} scw.{{.LocalityUpper}}, id string, timeout time.Duration) (*{{.API}}.{{.ResourceClean}}, error) {
1010
retryInterval := default{{.ResourceClean}}RetryInterval
11-
if DefaultWaitRetryInterval != nil {
12-
retryInterval = *DefaultWaitRetryInterval
11+
if transport.DefaultWaitRetryInterval != nil {
12+
retryInterval = *transport.DefaultWaitRetryInterval
1313
}
1414

1515
{{.ResourceCleanLow}}, err := {{.API}}API.WaitFor{{.ResourceClean}}(&{{.API}}.WaitFor{{.ResourceClean}}Request{

0 commit comments

Comments
 (0)