Skip to content

Commit

Permalink
Merge pull request #349 from magodo/optimize_cfg_gen
Browse files Browse the repository at this point in the history
Use `tfadd.StateForTargets` to avoid running `terraform show` for multiple times
  • Loading branch information
magodo committed Feb 1, 2023
2 parents cd8f0d6 + d135fb3 commit e9c582c
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 42 deletions.
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ require (
github.com/magodo/aztft v0.3.1-0.20230129030008-95c799252ad3
github.com/magodo/spinner v0.0.0-20220720073946-50f31b2dc5a6
github.com/magodo/textinput v0.0.0-20210913072708-7d24f2b4b0c0
github.com/magodo/tfadd v0.10.1-0.20230106064825-378b3ebb9a4e
github.com/magodo/tfadd v0.10.1-0.20230201064200-e5ab536e6d77
github.com/magodo/tfmerge v0.0.0-20221214062955-f52e46d03402
github.com/magodo/workerpool v0.0.0-20230119025400-40192d2716ea
github.com/mitchellh/go-wordwrap v1.0.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -205,8 +205,8 @@ github.com/magodo/spinner v0.0.0-20220720073946-50f31b2dc5a6 h1:CElHO4hPXC+Eivy8
github.com/magodo/spinner v0.0.0-20220720073946-50f31b2dc5a6/go.mod h1:Cn4fFwFH/Ddw9sjWPeSS72bNaxbM+FRXf7pkGEDReq8=
github.com/magodo/textinput v0.0.0-20210913072708-7d24f2b4b0c0 h1:aNtr4iNv/tex2t8W1u3scAoNHEnFlTKhNNHOpYStqbs=
github.com/magodo/textinput v0.0.0-20210913072708-7d24f2b4b0c0/go.mod h1:MqYhNP+PC386Bjsx5piZe7T4vDm5QIPv8b1RU0prVnU=
github.com/magodo/tfadd v0.10.1-0.20230106064825-378b3ebb9a4e h1:EywN5T4ZF02ImRXEVkW6BmRcqsPgesn6EPJoPKMT60k=
github.com/magodo/tfadd v0.10.1-0.20230106064825-378b3ebb9a4e/go.mod h1:DbJnYhmAkyjNnVt819cytTfJMtv5DpqV9MkHuUbyv3c=
github.com/magodo/tfadd v0.10.1-0.20230201064200-e5ab536e6d77 h1:InVVwnvWRUiND6vYiNLpGn43hloPC6sv7aD/QfQSlfQ=
github.com/magodo/tfadd v0.10.1-0.20230201064200-e5ab536e6d77/go.mod h1:DbJnYhmAkyjNnVt819cytTfJMtv5DpqV9MkHuUbyv3c=
github.com/magodo/tfmerge v0.0.0-20221214062955-f52e46d03402 h1:RyaR4VE7hoR9AyoVH414cpM8V63H4rLe2aZyKdoDV1w=
github.com/magodo/tfmerge v0.0.0-20221214062955-f52e46d03402/go.mod h1:ssV++b4DH33rsD592bvpS4Peng3ZfdGNZbFgCDkCfj8=
github.com/magodo/tfpluginschema v0.0.0-20220905090502-2d6a05ebaefd h1:L0kTduNwpx60EdBPYOVF9oUY7jdfZHIncvQN490qWd4=
Expand Down
62 changes: 23 additions & 39 deletions internal/meta/base_meta.go
Original file line number Diff line number Diff line change
Expand Up @@ -688,47 +688,31 @@ func (meta *baseMeta) importItem(ctx context.Context, item *ImportItem, importId
}

func (meta baseMeta) stateToConfig(ctx context.Context, list ImportList) (ConfigInfos, error) {
out := make([]ConfigInfo, len(list.Imported()))

wp := workerpool.NewWorkPool(meta.parallelism)

type result struct {
idx int
info ConfigInfo
var out []ConfigInfo

var addrs []string
importedList := list.Imported()
for _, item := range importedList {
addr := item.TFAddr.String()
if meta.moduleAddr != "" {
addr = meta.moduleAddr + "." + addr
}
addrs = append(addrs, addr)
}
wp.Run(func(i interface{}) error {
result := i.(result)
out[result.idx] = result.info
return nil
})

for idx, item := range list.Imported() {
idx, item := idx, item
wp.AddTask(func() (interface{}, error) {
addr := item.TFAddr.String()
if meta.moduleAddr != "" {
addr = meta.moduleAddr + "." + addr
}
b, err := tfadd.State(ctx, meta.tf, tfadd.Target(addr), tfadd.Full(meta.fullConfig))
if err != nil {
return nil, fmt.Errorf("converting terraform state to config for resource %s: %w", item.TFAddr, err)
}
tpl := meta.cleanupTerraformAdd(string(b))
f, diag := hclwrite.ParseConfig([]byte(tpl), "", hcl.InitialPos)
if diag.HasErrors() {
return nil, fmt.Errorf("parsing the HCL generated by \"terraform add\" of %s: %s", item.TFAddr, diag.Error())
}
return result{
idx: idx,
info: ConfigInfo{
ImportItem: item,
hcl: f,
}}, nil
})
bs, err := tfadd.StateForTargets(ctx, meta.tf, addrs, tfadd.Full(meta.fullConfig))
if err != nil {
return nil, fmt.Errorf("converting terraform state to config: %w", err)
}

if err := wp.Done(); err != nil {
return nil, err
for i, b := range bs {
tpl := meta.cleanupTerraformAdd(string(b))
f, diag := hclwrite.ParseConfig([]byte(tpl), "", hcl.InitialPos)
if diag.HasErrors() {
return nil, fmt.Errorf("parsing the HCL generated by \"terraform add\" of %s: %s", importedList[i].TFAddr, diag.Error())
}
out = append(out, ConfigInfo{
ImportItem: importedList[i],
hcl: f,
})
}

return out, nil
Expand Down

0 comments on commit e9c582c

Please sign in to comment.