func()

in internal/meta/base_meta.go [798:872]


func (meta *baseMeta) initProvider(ctx context.Context) error {
	meta.Logger().Info("Init provider")

	module, diags := tfconfig.LoadModule(meta.outdir)
	if diags.HasErrors() {
		return diags.Err()
	}

	tfblock, err := utils.InspecTerraformBlock(meta.outdir)
	if err != nil {
		return err
	}

	if module.ProviderConfigs[meta.providerName] == nil {
		meta.Logger().Info("Output directory doesn't contain provider setting, create one then")
		cfgFile := filepath.Join(meta.outdir, meta.outputFileNames.ProviderFileName)
		// #nosec G306
		if err := os.WriteFile(cfgFile, []byte(meta.buildProviderConfig()), 0644); err != nil {
			return fmt.Errorf("error creating provider config: %w", err)
		}
	}

	if tfblock == nil {
		meta.Logger().Info("Output directory doesn't contain terraform block, create one then")
		cfgFile := filepath.Join(meta.outdir, meta.outputFileNames.TerraformFileName)
		// #nosec G306
		if err := os.WriteFile(cfgFile, []byte(meta.buildTerraformConfig(meta.backendType)), 0644); err != nil {
			return fmt.Errorf("error creating terraform config: %w", err)
		}
	}

	// Initialize provider for the output directory.
	var opts []tfexec.InitOption
	for _, opt := range meta.backendConfig {
		opts = append(opts, tfexec.BackendConfig(opt))
	}

	meta.Logger().Debug(`Run "terraform init" for the output directory`, "dir", meta.outdir)
	if err := meta.tf.Init(ctx, opts...); err != nil {
		return fmt.Errorf("error running terraform init for the output directory: %s", err)
	}

	// Initialize provider for the import directories.
	wp := workerpool.NewWorkPool(meta.parallelism)
	wp.Run(nil)
	for i := range meta.importBaseDirs {
		i := i
		wp.AddTask(func() (interface{}, error) {
			providerFile := filepath.Join(meta.importBaseDirs[i], "provider.tf")
			// #nosec G306
			if err := os.WriteFile(providerFile, []byte(meta.buildProviderConfig()), 0644); err != nil {
				return nil, fmt.Errorf("error creating provider config: %w", err)
			}
			terraformFile := filepath.Join(meta.importBaseDirs[i], "terraform.tf")
			// #nosec G306
			if err := os.WriteFile(terraformFile, []byte(meta.buildTerraformConfig("")), 0644); err != nil {
				return nil, fmt.Errorf("error creating terraform config: %w", err)
			}
			if meta.devProvider {
				meta.Logger().Debug(`Skip running "terraform init" for the import directory (dev provider)`, "dir", meta.importBaseDirs[i])
			} else {
				meta.Logger().Debug(`Run "terraform init" for the import directory`, "dir", meta.importBaseDirs[i])
				if err := meta.importTFs[i].Init(ctx); err != nil {
					return nil, fmt.Errorf("error running terraform init: %s", err)
				}
			}
			return nil, nil
		})
	}
	if err := wp.Done(); err != nil {
		return fmt.Errorf("initializing provider for the import directories: %v", err)
	}

	return nil
}