Skip to content

azd init fails when External Service Parameter has no default value and configuration key is missing #10789

@eerhardt

Description

@eerhardt

Is there an existing issue for this?

  • I have searched the existing issues

Describe the bug

When running azd init against an Aspire distributed application that includes a Parameter with no default value, the initialization fails if the configuration key for that parameter is missing. The error indicates a MissingParameterValueException is thrown and the distributed application cannot be published.

Sample code:

var builder = DistributedApplication.CreateBuilder(args);

var externalServiceUrl = builder.AddParameter("externalServiceUrl");

var externalService = builder.AddExternalService("external-service", externalServiceUrl);

builder.AddProject<Projects.ParameterTest_Web>("webfrontend")
    .WithEnvironment("EXTERNAL_SERVICE", externalService);

builder.Build().Run();

Command:
azd init

Expected Behavior

I expected azd init to succeed or prompt for the missing parameter, rather than fail with a runtime exception. Ideally, the tool should either require the configuration key to be present or guide the user to supply a value, instead of crashing.

Steps To Reproduce

  1. Create an Aspire distributed app with a parameter with no default value, as shown above.
  2. Run azd init in the app directory.
  3. Observe the failure and exception output.

Exceptions (if any)

Aspire.Hosting.MissingParameterValueException: Parameter resource could not be used because configuration key 'Parameters:externalServiceUrl' is missing and the Parameter has no default value.

Full stack trace:

Aspire.Hosting.MissingParameterValueException: Parameter resource could not be used because configuration key 'Parameters:externalServiceUrl' is missing and the Parameter has no default value.
   at Aspire.Hosting.ParameterResourceBuilderExtensions.GetParameterValue(ConfigurationManager configuration, String name, ParameterDefault parameterDefault, String configurationKey) in /_/src/Aspire.Hosting/ParameterResourceBuilderExtensions.cs:line 207
   at Aspire.Hosting.ParameterResourceBuilderExtensions.<>c__DisplayClass0_0.<AddParameter>b__0(ParameterDefault parameterDefault) in /_/src/Aspire.Hosting/ParameterResourceBuilderExtensions.cs:line 32
   at Aspire.Hosting.ApplicationModel.ParameterResource.<.ctor>b__3_0() in /_/src/Aspire.Hosting/ApplicationModel/ParameterResource.cs:line 27
   at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
   at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
   at System.Lazy`1.CreateValue()
   at Aspire.Hosting.ApplicationModel.ParameterResource.get_ValueInternal() in /_/src/Aspire.Hosting/ApplicationModel/ParameterResource.cs:line 36
   at Aspire.Hosting.ApplicationModel.ParameterResource.GetValueAsync(CancellationToken cancellationToken) in /_/src/Aspire.Hosting/ApplicationModel/ParameterResource.cs:line 87
   at Aspire.Hosting.ResourceBuilderExtensions.<>c__DisplayClass8_0`1.<<WithEnvironment>b__0>d.MoveNext() in /_/src/Aspire.Hosting/ResourceBuilderExtensions.cs:line 182
--- End of stack trace from previous location ---
   at Aspire.Hosting.ApplicationModel.ResourceExtensions.ProcessEnvironmentVariableValuesAsync(IResource resource, DistributedApplicationExecutionContext executionContext, Action`4 processValue, ILogger logger, String containerHostName, CancellationToken cancellationToken) in /_/src/Aspire.Hosting/ApplicationModel/ResourceExtensions.cs:line 352
   at Aspire.Hosting.Publishing.ManifestPublishingContext.WriteEnvironmentVariablesAsync(IResource resource) in /_/src/Aspire.Hosting/Publishing/ManifestPublishingContext.cs:line 490
   at Aspire.Hosting.Publishing.ManifestPublishingContext.WriteProjectAsync(ProjectResource project) in /_/src/Aspire.Hosting/Publishing/ManifestPublishingContext.cs:line 177
   at Aspire.Hosting.Publishing.ManifestPublishingContext.<>c__DisplayClass20_0.<<WriteResourceAsync>g__WriteResourceObjectAsync|1>d`1.MoveNext() in /_/src/Aspire.Hosting/Publishing/ManifestPublishingContext.cs:line 129
--- End of stack trace from previous location ---
   at Aspire.Hosting.Publishing.ManifestPublishingContext.WriteResourceAsync(IResource resource) in /_/src/Aspire.Hosting/Publishing/ManifestPublishingContext.cs:line 107
   at Aspire.Hosting.Publishing.ManifestPublishingContext.WriteModel(DistributedApplicationModel model, CancellationToken cancellationToken) in /_/src/Aspire.Hosting/Publishing/ManifestPublishingContext.cs:line 79
   at Aspire.Hosting.Publishing.ManifestPublisher.WriteManifestAsync(DistributedApplicationModel model, Utf8JsonWriter jsonWriter, CancellationToken cancellationToken) in /_/src/Aspire.Hosting/Publishing/ManifestPublisher.cs:line 67
   at Aspire.Hosting.Publishing.ManifestPublisher.PublishInternalAsync(DistributedApplicationModel model, CancellationToken cancellationToken) in /_/src/Aspire.Hosting/Publishing/ManifestPublisher.cs:line 55
   at Aspire.Hosting.Publishing.ManifestPublisher.PublishAsync(DistributedApplicationModel model, CancellationToken cancellationToken) in /_/src/Aspire.Hosting/Publishing/ManifestPublisher.cs:line 23
   at Aspire.Hosting.DistributedApplicationRunner.ExecuteAsync(CancellationToken stoppingToken) in /_/src/Aspire.Hosting/DistributedApplicationRunner.cs:line 41
fail: Microsoft.Extensions.Hosting.Internal.Host[11]
      Hosting failed to start

.NET Version info

No response

Anything else?

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    area-app-modelIssues pertaining to the APIs in Aspire.Hosting, e.g. DistributedApplication

    Type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions