44package pipeline
55
66import (
7+ "context"
78 "fmt"
9+ "runtime"
810
11+ "golang.org/x/sync/errgroup"
912 "github.com/hashicorp/pandora/tools/data-api-repository/repository"
1013 "github.com/hashicorp/pandora/tools/importer-rest-api-specs/internal/components/terraform"
1114 "github.com/hashicorp/pandora/tools/importer-rest-api-specs/internal/logging"
@@ -47,7 +50,13 @@ func RunImporter(opts Options) error {
4750 logging .Debug ("Completed - Clearing any existing API Definitions." )
4851
4952 logging .Infof ("Processing %d Services.." , len (p .servicesFromConfigurationFiles ))
53+
54+ g , ctx := errgroup .WithContext (context .Background ())
55+ semaphore := make (chan struct {}, runtime .NumCPU ())
56+
5057 for _ , service := range p .servicesFromConfigurationFiles {
58+ service := service
59+
5160 if len (opts .ServiceNamesToLimitTo ) > 0 {
5261 processThisService := false
5362 for _ , serviceNameToLimitTo := range opts .ServiceNamesToLimitTo {
@@ -62,37 +71,52 @@ func RunImporter(opts Options) error {
6271 }
6372 }
6473
65- logging .Infof ("Discovering the Data for Service %q.." , service .Name )
66- data , err := p .parseDataForService (service )
67- if err != nil {
68- return fmt .Errorf ("parsing Data for the Service %q: %+v" , service .Name , err )
69- }
70- logging .Debugf ("Completed - Discovering the Data for Service %q." , service .Name )
74+ g .Go (func () error {
75+ select {
76+ case semaphore <- struct {}{}:
77+ case <- ctx .Done ():
78+ return ctx .Err ()
79+ }
80+ defer func () { <- semaphore }()
7181
72- terraformDetails , ok := p .servicesToTerraformDetails [service .Name ]
73- if ok {
74- logging .Infof ("Building the Terraform Data for the Service %q.." , service .Name )
75- data , err = terraform .BuildForService (* data , terraformDetails .resourceLabelToResourceDefinitions , p .opts .ProviderPrefix , terraformDetails .terraformPackageName )
82+ logging .Infof ("Discovering the Data for Service %q.." , service .Name )
83+ data , err := p .parseDataForService (service )
7684 if err != nil {
77- return fmt .Errorf ("building the Terraform Data for Service %q: %+v" , service .Name , err )
85+ return fmt .Errorf ("parsing Data for the Service %q: %+v" , service .Name , err )
7886 }
79- logging .Debugf ("Completed - Building the Terraform Data for the Service %q." , service .Name )
80- } else {
81- logging .Debugf ("Skipping - no Terraform Definitions for the Service %q.." , service .Name )
82- }
87+ logging .Debugf ("Completed - Discovering the Data for Service %q." , service .Name )
8388
84- logging .Infof ("Writing Data for Service %q.." , service .Name )
85- saveServiceOpts := repository.SaveServiceOptions {
86- ResourceProvider : service .ResourceProvider ,
87- Service : * data ,
88- ServiceName : service .Name ,
89- SourceCommitSHA : restAPISpecsCommitSHA ,
90- SourceDataOrigin : p .opts .SourceDataOrigin ,
91- }
92- if err := p .repository .SaveService (saveServiceOpts ); err != nil {
93- return fmt .Errorf ("saving the Service %q: %+v" , service .Name , err )
94- }
95- logging .Debugf ("Completed - writing Data for Service %q." , service .Name )
89+ terraformDetails , ok := p .servicesToTerraformDetails [service .Name ]
90+ if ok {
91+ logging .Infof ("Building the Terraform Data for the Service %q.." , service .Name )
92+ data , err = terraform .BuildForService (* data , terraformDetails .resourceLabelToResourceDefinitions , p .opts .ProviderPrefix , terraformDetails .terraformPackageName )
93+ if err != nil {
94+ return fmt .Errorf ("building the Terraform Data for Service %q: %+v" , service .Name , err )
95+ }
96+ logging .Debugf ("Completed - Building the Terraform Data for the Service %q." , service .Name )
97+ } else {
98+ logging .Debugf ("Skipping - no Terraform Definitions for the Service %q.." , service .Name )
99+ }
100+
101+ logging .Infof ("Writing Data for Service %q.." , service .Name )
102+ saveServiceOpts := repository.SaveServiceOptions {
103+ ResourceProvider : service .ResourceProvider ,
104+ Service : * data ,
105+ ServiceName : service .Name ,
106+ SourceCommitSHA : restAPISpecsCommitSHA ,
107+ SourceDataOrigin : p .opts .SourceDataOrigin ,
108+ }
109+ if err := p .repository .SaveService (saveServiceOpts ); err != nil {
110+ return fmt .Errorf ("saving the Service %q: %+v" , service .Name , err )
111+ }
112+ logging .Debugf ("Completed - writing Data for Service %q." , service .Name )
113+
114+ return nil
115+ })
116+ }
117+
118+ if err := g .Wait (); err != nil {
119+ return err
96120 }
97121
98122 logging .Info ("Completed - Importing Data." )
0 commit comments