public static IResourceBuilder AddElasticsearch()

in src/Aspire.Hosting.Elasticsearch/ElasticsearchBuilderExtensions.cs [44:93]


    public static IResourceBuilder<ElasticsearchResource> AddElasticsearch(
        this IDistributedApplicationBuilder builder,
        string name,
        IResourceBuilder<ParameterResource>? password = null,
        int? port = null)
    {
        ArgumentNullException.ThrowIfNull(builder);
        ArgumentException.ThrowIfNullOrEmpty(name);

        var passwordParameter = password?.Resource ?? ParameterResourceBuilderExtensions.CreateDefaultPasswordParameter(builder, $"{name}-password");

        var elasticsearch = new ElasticsearchResource(name, passwordParameter);

        string? connectionString = null;
        ElasticsearchClient? elasticsearchClient = null;

        builder.Eventing.Subscribe<ConnectionStringAvailableEvent>(elasticsearch, async (@event, ct) =>
        {
            connectionString = await elasticsearch.ConnectionStringExpression.GetValueAsync(ct).ConfigureAwait(false);
            if (connectionString is null)
            {
                throw new DistributedApplicationException($"ConnectionStringAvailableEvent was published for the '{elasticsearch.Name}' resource but the connection string was null.");
            }
            elasticsearchClient = new ElasticsearchClient(new Uri(connectionString));
        });

        var healthCheckKey = $"{name}_check";
        // todo: Use health check from AspNetCore.Diagnostics.HealthChecks once following PR released:
        // https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks/pull/2244
        builder.Services.AddHealthChecks()
          .Add(new HealthCheckRegistration(
              healthCheckKey,
              sp => new ElasticsearchHealthCheck(elasticsearchClient!),
              failureStatus: default,
              tags: default,
              timeout: default));

        return builder.AddResource(elasticsearch)
             .WithImage(ElasticsearchContainerImageTags.Image, ElasticsearchContainerImageTags.Tag)
             .WithImageRegistry(ElasticsearchContainerImageTags.Registry)
             .WithHttpEndpoint(targetPort: ElasticsearchPort, port: port, name: ElasticsearchResource.PrimaryEndpointName)
             .WithEndpoint(targetPort: ElasticsearchInternalPort, port: port, name: ElasticsearchResource.InternalEndpointName)
             .WithEnvironment("discovery.type", "single-node")
             .WithEnvironment("xpack.security.enabled", "true")
             .WithEnvironment(context =>
             {
                 context.EnvironmentVariables["ELASTIC_PASSWORD"] = elasticsearch.PasswordParameter;
             })
             .WithHealthCheck(healthCheckKey);
    }