func()

in cli/azd/pkg/devcenter/platform.go [50:192]


func (p *Platform) ConfigureContainer(container *ioc.NestedContainer) error {
	// DevCenter Config
	container.MustRegisterTransient(func(
		ctx context.Context,
		lazyAzdCtx *lazy.Lazy[*azdcontext.AzdContext],
		userConfigManager config.UserConfigManager,
		lazyProjectConfig *lazy.Lazy[*project.ProjectConfig],
		lazyLocalEnvStore *lazy.Lazy[environment.LocalDataStore],
	) (*Config, error) {
		// Load deventer configuration in the following precedence:
		// 1. Environment variables (AZURE_DEVCENTER_*)
		// 2. Azd Environment configuration (devCenter node)
		// 3. Azd Project configuration from azure.yaml (devCenter node)
		// 4. Azd user configuration from config.json (devCenter node)

		// Shell environment variables
		envVarConfig := &Config{
			Name:                  os.Getenv(DevCenterNameEnvName),
			Project:               os.Getenv(DevCenterProjectEnvName),
			Catalog:               os.Getenv(DevCenterCatalogEnvName),
			EnvironmentType:       os.Getenv(DevCenterEnvTypeEnvName),
			EnvironmentDefinition: os.Getenv(DevCenterEnvDefinitionEnvName),
			User:                  os.Getenv(DevCenterEnvUser),
		}

		azdCtx, _ := lazyAzdCtx.GetValue()
		localEnvStore, _ := lazyLocalEnvStore.GetValue()

		// Local environment configuration
		var environmentConfig *Config
		if azdCtx != nil && localEnvStore != nil {
			defaultEnvName, err := azdCtx.GetDefaultEnvironmentName()
			if err != nil {
				environmentConfig = &Config{}
			} else {
				// Attempt to load any devcenter configuration from local environment
				env, err := localEnvStore.Get(ctx, defaultEnvName)
				if err == nil {
					devCenterNode, exists := env.Config.Get(ConfigPath)
					if exists {
						value, err := ParseConfig(devCenterNode)
						if err != nil {
							return nil, err
						}

						environmentConfig = value
					}
				}
			}
		}

		// User Configuration
		var userConfig *Config
		azdConfig, err := userConfigManager.Load()
		if err != nil {
			userConfig = &Config{}
		} else {
			devCenterNode, exists := azdConfig.Get(ConfigPath)
			if exists {
				value, err := ParseConfig(devCenterNode)
				if err != nil {
					return nil, err
				}

				userConfig = value
			}
		}

		// Project Configuration
		var projectConfig *Config
		projConfig, _ := lazyProjectConfig.GetValue()
		if projConfig != nil && projConfig.Platform != nil {
			value, err := ParseConfig(projConfig.Platform.Config)
			if err == nil {
				projectConfig = value
			}
		}

		return MergeConfigs(
			envVarConfig,
			environmentConfig,
			projectConfig,
			userConfig,
		), nil
	})

	// Override default provision provider
	container.MustRegisterSingleton(func() provisioning.DefaultProviderResolver {
		return func() (provisioning.ProviderKind, error) {
			return ProvisionKindDevCenter, nil
		}
	})

	// Override default template sources
	container.MustRegisterSingleton(func() *templates.SourceOptions {
		return &templates.SourceOptions{
			DefaultSources:        []*templates.SourceConfig{SourceDevCenter},
			LoadConfiguredSources: false,
		}
	})

	// Configure remote environment storage
	container.MustRegisterSingleton(func() *state.RemoteConfig {
		return &state.RemoteConfig{
			Backend: string(RemoteKindDevCenter),
		}
	})

	// Provision Provider
	container.MustRegisterNamedTransient(string(ProvisionKindDevCenter), NewProvisionProvider)

	// Remote Environment Storage
	container.MustRegisterNamedTransient(string(RemoteKindDevCenter), NewEnvironmentStore)

	// Template Sources
	container.MustRegisterNamedTransient(string(SourceKindDevCenter), NewTemplateSource)

	container.MustRegisterSingleton(NewManager)
	container.MustRegisterSingleton(NewPrompter)

	// Other devcenter components
	container.MustRegisterSingleton(func(
		credentialProvider auth.MultiTenantCredentialProvider,
		policyClientOptions *azcore.ClientOptions,
		armClientOptions *arm.ClientOptions,
		cloud *cloud.Cloud,
	) (devcentersdk.DevCenterClient, error) {
		// Use home tenant ID
		cred, err := credentialProvider.GetTokenCredential(context.Background(), "")
		if err != nil {
			return nil, err
		}

		resourceGraphClient, err := armresourcegraph.NewClient(cred, armClientOptions)
		if err != nil {
			return nil, err
		}

		return devcentersdk.NewDevCenterClient(cred, policyClientOptions, resourceGraphClient, cloud)
	})

	return nil
}