func()

in flag.go [359:493]


func (f FlagSet) BuildCommonConfig() (config.CommonConfig, error) {
	// Logger is only enabled when the log path is specified.
	// This is because either interactive/non-interactive mode controls the terminal rendering,
	// logging to stdout/stderr will impact the rendering.
	logger := slog.New(slog.NewTextHandler(io.Discard, nil))
	if path := f.flagLogPath; path != "" {
		level, err := logLevel(f.flagLogLevel)
		if err != nil {
			return config.CommonConfig{}, err
		}

		// #nosec G304
		f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0600)
		if err != nil {
			return config.CommonConfig{}, fmt.Errorf("creating log file %s: %v", path, err)
		}

		logger = slog.New(slog.NewTextHandler(f, &slog.HandlerOptions{Level: level}))

		// Enable log for azure sdk
		os.Setenv("AZURE_SDK_GO_LOGGING", "all") // #nosec G104
		azlog.SetListener(func(cls azlog.Event, msg string) {
			logger.Log(context.Background(), log.LevelTrace, msg, "event", cls)
		})
	}

	authConfig, err := f.buildAuthConfig()
	if err != nil {
		return config.CommonConfig{}, err
	}

	var cloudCfg cloud.Configuration
	switch env := f.flagEnv; strings.ToLower(env) {
	case "public":
		cloudCfg = cloud.AzurePublic
	case "usgovernment":
		cloudCfg = cloud.AzureGovernment
	case "china":
		cloudCfg = cloud.AzureChina
	default:
		return config.CommonConfig{}, fmt.Errorf("unknown environment specified: %q", env)
	}

	clientOpt := arm.ClientOptions{
		ClientOptions: policy.ClientOptions{
			Cloud: cloudCfg,
			Telemetry: policy.TelemetryOptions{
				ApplicationID: fmt.Sprintf("aztfexport(%s)", f.flagProviderName),
				Disabled:      false,
			},
			Logging: policy.LogOptions{
				IncludeBody: true,
			},
		},
		AuxiliaryTenants:      authConfig.AuxiliaryTenantIDs,
		DisableRPRegistration: true,
	}

	cred, err := NewDefaultAzureCredential(*logger, &DefaultAzureCredentialOptions{
		AuthConfig:               *authConfig,
		ClientOptions:            clientOpt.ClientOptions,
		DisableInstanceDiscovery: false,
		SendCertificateChain:     false,
	})
	if err != nil {
		return config.CommonConfig{}, fmt.Errorf("failed to new credential: %v", err)
	}

	excludeAzureResource := f.flagExcludeAzureResource.Value()
	if p := f.flagExcludeAzureResourceFile; p != "" {
		// #nosec G304
		f, err := os.Open(p)
		if err != nil {
			return config.CommonConfig{}, fmt.Errorf("opening %s: %v", p, err)
		}
		defer f.Close()

		scanner := bufio.NewScanner(f)
		for scanner.Scan() {
			v := strings.TrimSpace(scanner.Text())
			excludeAzureResource = append(excludeAzureResource, v)
		}
	}

	excludeTerraformResource := f.flagExcludeTerraformResource.Value()
	if p := f.flagExcludeTerraformResourceFile; p != "" {
		// #nosec G304
		f, err := os.Open(p)
		if err != nil {
			return config.CommonConfig{}, fmt.Errorf("opening %s: %v", p, err)
		}
		defer f.Close()

		scanner := bufio.NewScanner(f)
		for scanner.Scan() {
			v := strings.TrimSpace(scanner.Text())
			excludeTerraformResource = append(excludeTerraformResource, v)
		}
	}

	cfg := config.CommonConfig{
		Logger:                    logger,
		AuthConfig:                *authConfig,
		SubscriptionId:            f.flagSubscriptionId,
		AzureSDKCredential:        cred,
		AzureSDKClientOption:      clientOpt,
		OutputDir:                 f.flagOutputDir,
		ProviderVersion:           f.flagProviderVersion,
		ProviderName:              f.flagProviderName,
		DevProvider:               f.flagDevProvider,
		ContinueOnError:           f.flagContinue,
		BackendType:               f.flagBackendType,
		BackendConfig:             f.flagBackendConfig.Value(),
		FullConfig:                f.flagFullConfig,
		MaskSensitive:             f.flagMaskSensitive,
		Parallelism:               f.flagParallelism,
		HCLOnly:                   f.flagHCLOnly,
		ModulePath:                f.flagModulePath,
		GenerateImportBlock:       f.flagGenerateImportBlock,
		TelemetryClient:           initTelemetryClient(f.flagSubscriptionId),
		ExcludeAzureResources:     excludeAzureResource,
		ExcludeTerraformResources: excludeTerraformResource,
	}

	if f.flagAppend {
		cfg.OutputFileNames = config.OutputFileNames{
			TerraformFileName:   "terraform.aztfexport.tf",
			ProviderFileName:    "provider.aztfexport.tf",
			MainFileName:        "main.aztfexport.tf",
			ImportBlockFileName: "import.aztfexport.tf",
		}
	}

	return cfg, nil
}