Skip to content

Commit

Permalink
Merge pull request #32119 from hashicorp/s-lazy-load-aws-api-clients
Browse files Browse the repository at this point in the history
Sweepers: Initialize `conn.AWSClient.ServicePackages` as AWS API clients are now lazy-loaded
  • Loading branch information
ewbankkit committed Jun 21, 2023
2 parents d7a24ea + 3a7dc94 commit 31443bf
Show file tree
Hide file tree
Showing 9 changed files with 470 additions and 17 deletions.
6 changes: 4 additions & 2 deletions GNUmakefile
Original file line number Diff line number Diff line change
Expand Up @@ -145,17 +145,19 @@ gen:
rm -f internal/conns/*_gen.go
rm -f internal/provider/*_gen.go
rm -f internal/service/**/*_gen.go
rm -f internal/sweep/sweep_test.go
rm -f internal/sweep/sweep_test.go internal/sweep/service_packages_gen_test.go
rm -f names/caps.md
rm -f names/*_gen.go
rm -f website/docs/guides/custom-service-endpoints.html.md
rm -f .ci/.semgrep-caps-aws-ec2.yml
rm -f .ci/.semgrep-configs.yml
rm -f .ci/.semgrep-service-name*.yml
$(GO_VER) generate ./...
# Generate service package list last as it may depend on output of earlier generators.
# Generate service package lists last as they may depend on output of earlier generators.
rm -f internal/provider/service_packages_gen.go
$(GO_VER) generate ./internal/provider
rm -f internal/sweep/sweep_test.go internal/sweep/service_packages_gen_test.go
$(GO_VER) generate ./internal/sweep

gencheck:
@echo "==> Checking generated source code..."
Expand Down
10 changes: 9 additions & 1 deletion internal/generate/servicepackages/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package main

import (
_ "embed"
"flag"
"fmt"
"os"
"sort"
Expand All @@ -15,9 +16,16 @@ import (

func main() {
const (
filename = `service_packages_gen.go`
namesDataFile = `../../names/names_data.csv`
)
filename := `service_packages_gen.go`

flag.Parse()
args := flag.Args()
if len(args) > 0 {
filename = args[0]
}

g := common.NewGenerator()

packageName := os.Getenv("GOPACKAGE")
Expand Down
5 changes: 4 additions & 1 deletion internal/generate/sweepimp/file.tmpl
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
// Code generated by internal/generate/sweepimp/main.go; DO NOT EDIT.

package sweep_test
package {{ .PackageName }}

import (
"context"
"testing"

"github.com/hashicorp/terraform-plugin-testing/helper/resource"
{{- range .Services }}
_ "github.com/hashicorp/terraform-provider-aws/internal/service/{{ .ProviderPackage }}"
{{- end }}
"github.com/hashicorp/terraform-provider-aws/internal/sweep"
)

func TestMain(m *testing.M) {
sweep.ServicePackages = servicePackages(context.Background())
resource.TestMain(m)
}
4 changes: 0 additions & 4 deletions internal/generate/sweepimp/generate.go

This file was deleted.

20 changes: 12 additions & 8 deletions internal/generate/sweepimp/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (
"io/fs"
"os"
"sort"
"strings"

"github.com/hashicorp/terraform-provider-aws/internal/generate/common"
"github.com/hashicorp/terraform-provider-aws/names"
Expand All @@ -21,25 +20,30 @@ type ServiceDatum struct {
}

type TemplateData struct {
Services []ServiceDatum
PackageName string
Services []ServiceDatum
}

func main() {
const (
filename = `../../sweep/sweep_test.go`
namesDataFile = "../../../names/names_data.csv"
filename = `sweep_test.go`
namesDataFile = "../../names/names_data.csv"
)
g := common.NewGenerator()

g.Infof("Generating %s", strings.TrimPrefix(filename, "../../"))
packageName := os.Getenv("GOPACKAGE")

g.Infof("Generating %s/%s", packageName, filename)

data, err := common.ReadAllCSVData(namesDataFile)

if err != nil {
g.Fatalf("error reading %s: %s", namesDataFile, err)
}

td := TemplateData{}
td := TemplateData{
PackageName: packageName,
}

for i, l := range data {
if i < 1 { // no header
Expand All @@ -60,11 +64,11 @@ func main() {
p = l[names.ColProviderPackageActual]
}

if _, err := os.Stat(fmt.Sprintf("../../service/%s", p)); err != nil || errors.Is(err, fs.ErrNotExist) {
if _, err := os.Stat(fmt.Sprintf("../service/%s", p)); err != nil || errors.Is(err, fs.ErrNotExist) {
continue
}

if _, err := os.Stat(fmt.Sprintf("../../service/%s/sweep.go", p)); err != nil || errors.Is(err, fs.ErrNotExist) {
if _, err := os.Stat(fmt.Sprintf("../service/%s/sweep.go", p)); err != nil || errors.Is(err, fs.ErrNotExist) {
continue
}

Expand Down
5 changes: 5 additions & 0 deletions internal/sweep/generate_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
//go:generate go run ../generate/servicepackages/main.go -- service_packages_gen_test.go
//go:generate go run ../generate/sweepimp/main.go
// ONLY generate directives and package declaration! Do not add anything else to this file.

package sweep_test
421 changes: 421 additions & 0 deletions internal/sweep/service_packages_gen_test.go

Large diffs are not rendered by default.

13 changes: 12 additions & 1 deletion internal/sweep/sweep.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ const (

const defaultSweeperAssumeRoleDurationSeconds = 3600

// ServicePackages is set in TestMain in order to break an import cycle.
var ServicePackages []conns.ServicePackage

// sweeperClients is a shared cache of regional conns.AWSClient
// This prevents client re-initialization for every resource with no benefit.
var sweeperClients map[string]*conns.AWSClient = make(map[string]*conns.AWSClient)
Expand Down Expand Up @@ -52,6 +55,14 @@ func SharedRegionalSweepClientWithContext(ctx context.Context, region string) (*
}
}

meta := new(conns.AWSClient)
servicePackageMap := make(map[string]conns.ServicePackage)
for _, sp := range ServicePackages {
servicePackageName := sp.ServicePackageName()
servicePackageMap[servicePackageName] = sp
}
meta.ServicePackages = servicePackageMap

conf := &conns.Config{
MaxRetries: 5,
Region: region,
Expand Down Expand Up @@ -80,7 +91,7 @@ func SharedRegionalSweepClientWithContext(ctx context.Context, region string) (*
}

// configures a default client for the region, using the above env vars
client, diags := conf.ConfigureProvider(ctx, &conns.AWSClient{})
client, diags := conf.ConfigureProvider(ctx, meta)

if diags.HasError() {
return nil, fmt.Errorf("getting AWS client: %#v", diags)
Expand Down
3 changes: 3 additions & 0 deletions internal/sweep/sweep_test.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 31443bf

Please sign in to comment.