tfplan2cai/tfplan2cai.go (51 lines of code) (raw):
package tfplan2cai
import (
"context"
"fmt"
"net/http"
"github.com/GoogleCloudPlatform/terraform-google-conversion/v6/caiasset"
"github.com/GoogleCloudPlatform/terraform-google-conversion/v6/tfplan2cai/ancestrymanager"
convert "github.com/GoogleCloudPlatform/terraform-google-conversion/v6/tfplan2cai/converters/google"
resources "github.com/GoogleCloudPlatform/terraform-google-conversion/v6/tfplan2cai/converters/google/resources"
"github.com/GoogleCloudPlatform/terraform-google-conversion/v6/tfplan2cai/tfplan"
"go.uber.org/zap"
)
// Options struct to avoid updating function signatures all along the pipe.
type Options struct {
ConvertUnchanged bool
ErrorLogger *zap.Logger
Offline bool
DefaultProject string
DefaultRegion string
DefaultZone string
// UserAgent for all requests (if online)
UserAgent string
// HTTPClient for all requests (if online)
HTTPClient *http.Client
// Map hierarchy resource (like projects/<number> or folders/<number>)
// to an ancestry path (like organizations/123/folders/456/projects/789)
AncestryCache map[string]string
}
// Convert converts terraform json plan to CAI Assets.
func Convert(ctx context.Context, jsonPlan []byte, o *Options) ([]caiasset.Asset, error) {
// Creates ancestry manager and converter internally; they are
// implementation details private to this package.
errorLogger := o.ErrorLogger
if errorLogger == nil {
logger, err := zap.NewDevelopment()
if err != nil {
return nil, fmt.Errorf("building logger: %w", err)
}
errorLogger = logger
}
// contents of newConverter
// Set up config and ancestry manager using the same http client and user agent
cfg, err := resources.NewConfig(ctx, o.DefaultProject, o.DefaultZone, o.DefaultRegion, o.Offline, o.UserAgent, o.HTTPClient)
if err != nil {
return nil, fmt.Errorf("building config: %w", err)
}
ancestryManager, err := ancestrymanager.New(cfg, o.Offline, o.AncestryCache, errorLogger)
if err != nil {
return nil, fmt.Errorf("building ancestry manager: %w", err)
}
converter := convert.NewConverter(cfg, ancestryManager, o.Offline, o.ConvertUnchanged, errorLogger)
// ReadResourceChanges
changes, err := tfplan.ReadResourceChanges(jsonPlan)
if err != nil {
return nil, err
}
err = converter.AddResourceChanges(changes)
if err != nil {
return nil, err
}
return converter.Assets(), nil
}