Skip to content

Commit 2bc5517

Browse files
committed
parallelise the importer for speed - note logging output becomes non-sequential, needs a sequence number prefix maybe?
1 parent c503aa7 commit 2bc5517

2 files changed

Lines changed: 53 additions & 29 deletions

File tree

tools/importer-rest-api-specs/internal/components/apidefinitions/parse_service.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ func ParseService(input discoveryModels.AvailableDataSet) (*sdkModels.Service, e
2323
apiVersions := make(map[string]sdkModels.APIVersion)
2424

2525
for apiVersionName, dataSet := range input.DataSetsForAPIVersions {
26-
logging.Infof("Parsing Data for API Version %q..", apiVersionName)
26+
logging.Infof("Parsing Data for %q API Version %q..", input.ServiceName, apiVersionName)
2727
parsed, err := parseAPIVersion(input.ServiceName, dataSet, input.ResourceProvider)
2828
if err != nil {
29-
return nil, fmt.Errorf("parsing API Version %q: %+v", apiVersionName, err)
29+
return nil, fmt.Errorf("parsing %q API Version %q: %+v", input.ServiceName, apiVersionName, err)
3030
}
3131

3232
apiVersions[apiVersionName] = *parsed

tools/importer-rest-api-specs/internal/pipeline/import.go

Lines changed: 51 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44
package pipeline
55

66
import (
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

Comments
 (0)