Skip to content

Commit e8cd3c2

Browse files
authored
Configuration updates. (#128)
1 parent d5141a9 commit e8cd3c2

36 files changed

+1321
-909
lines changed

src/Elastic.Transport.VirtualizedCluster/Components/ExposingPipelineFactory.cs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,25 +8,23 @@ namespace Elastic.Transport.VirtualizedCluster.Components;
88
/// <summary>
99
/// An implementation that exposes all the components so that <see cref="VirtualCluster"/> can reference them directly.
1010
/// </summary>
11-
public sealed class ExposingPipelineFactory<TConfiguration> : RequestPipelineFactory<TConfiguration> where TConfiguration : class, ITransportConfiguration
11+
public sealed class ExposingPipelineFactory<TConfiguration> : RequestPipelineFactory
12+
where TConfiguration : class, ITransportConfiguration
1213
{
1314
public ExposingPipelineFactory(TConfiguration configuration, DateTimeProvider dateTimeProvider)
1415
{
1516
DateTimeProvider = dateTimeProvider;
16-
MemoryStreamFactory = TransportConfiguration.DefaultMemoryStreamFactory;
1717
Configuration = configuration;
18-
Pipeline = Create(Configuration, DateTimeProvider, MemoryStreamFactory, null);
19-
RequestHandler = new DistributedTransport<TConfiguration>(Configuration, this, DateTimeProvider, MemoryStreamFactory);
18+
Pipeline = Create(new RequestData(Configuration, null, null), DateTimeProvider);
19+
RequestHandler = new DistributedTransport<TConfiguration>(Configuration, this, DateTimeProvider);
2020
}
2121

2222
// ReSharper disable once MemberCanBePrivate.Global
2323
public RequestPipeline Pipeline { get; }
2424
private DateTimeProvider DateTimeProvider { get; }
25-
private MemoryStreamFactory MemoryStreamFactory { get; }
2625
private TConfiguration Configuration { get; }
2726
public ITransport<TConfiguration> RequestHandler { get; }
2827

29-
public override RequestPipeline Create(TConfiguration configurationValues, DateTimeProvider dateTimeProvider,
30-
MemoryStreamFactory memoryStreamFactory, IRequestConfiguration? requestConfiguration) =>
31-
new DefaultRequestPipeline<TConfiguration>(Configuration, DateTimeProvider, MemoryStreamFactory, requestConfiguration);
28+
public override RequestPipeline Create(RequestData requestData, DateTimeProvider dateTimeProvider) =>
29+
new DefaultRequestPipeline(requestData, DateTimeProvider);
3230
}

src/Elastic.Transport.VirtualizedCluster/Components/SealedVirtualCluster.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace Elastic.Transport.VirtualizedCluster.Components;
1010

1111
/// <summary>
1212
/// A continuation of <see cref="VirtualCluster"/>'s builder methods that creates
13-
/// an instance of <see cref="TransportConfiguration"/> for the cluster after which the components such as
13+
/// an instance of <see cref="TransportConfigurationDescriptor"/> for the cluster after which the components such as
1414
/// <see cref="IRequestInvoker"/> and <see cref="NodePool"/> can no longer be updated.
1515
/// </summary>
1616
public sealed class SealedVirtualCluster
@@ -28,23 +28,23 @@ internal SealedVirtualCluster(VirtualCluster cluster, NodePool pool, TestableDat
2828
_productRegistration = productRegistration;
2929
}
3030

31-
private TransportConfiguration CreateSettings() =>
31+
private TransportConfigurationDescriptor CreateSettings() =>
3232
new(_nodePool, _requestInvoker, serializer: null, _productRegistration.ProductRegistration);
3333

34-
/// <summary> Create the cluster using all defaults on <see cref="TransportConfiguration"/> </summary>
34+
/// <summary> Create the cluster using all defaults on <see cref="TransportConfigurationDescriptor"/> </summary>
3535
public VirtualizedCluster AllDefaults() =>
3636
new(_dateTimeProvider, CreateSettings());
3737

3838
/// <summary> Create the cluster using <paramref name="selector"/> to provide configuration changes </summary>
3939
/// <param name="selector">Provide custom configuration options</param>
40-
public VirtualizedCluster Settings(Func<TransportConfiguration, TransportConfiguration> selector) =>
40+
public VirtualizedCluster Settings(Func<TransportConfigurationDescriptor, TransportConfigurationDescriptor> selector) =>
4141
new(_dateTimeProvider, selector(CreateSettings()));
4242

4343
/// <summary>
4444
/// Allows you to create an instance of `<see cref="VirtualClusterConnection"/> using the DSL provided by <see cref="Virtual"/>
4545
/// </summary>
4646
/// <param name="selector">Provide custom configuration options</param>
47-
public VirtualClusterRequestInvoker VirtualClusterConnection(Func<TransportConfiguration, TransportConfiguration> selector = null) =>
47+
public VirtualClusterRequestInvoker VirtualClusterConnection(Func<TransportConfigurationDescriptor, TransportConfigurationDescriptor> selector = null) =>
4848
new VirtualizedCluster(_dateTimeProvider, selector == null ? CreateSettings() : selector(CreateSettings()))
4949
.Connection;
5050
}

src/Elastic.Transport.VirtualizedCluster/Components/VirtualizedCluster.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class VirtualizedCluster
1313
{
1414
private readonly ExposingPipelineFactory<ITransportConfiguration> _exposingRequestPipeline;
1515
private readonly TestableDateTimeProvider _dateTimeProvider;
16-
private readonly TransportConfiguration _settings;
16+
private readonly TransportConfigurationDescriptor _settings;
1717

1818
private Func<ITransport<ITransportConfiguration>, Func<RequestConfigurationDescriptor, IRequestConfiguration>, Task<TransportResponse>> _asyncCall;
1919
private Func<ITransport<ITransportConfiguration>, Func<RequestConfigurationDescriptor, IRequestConfiguration>, TransportResponse> _syncCall;
@@ -22,7 +22,7 @@ private class VirtualResponse : TransportResponse;
2222

2323
private static readonly EndpointPath RootPath = new(HttpMethod.GET, "/");
2424

25-
internal VirtualizedCluster(TestableDateTimeProvider dateTimeProvider, TransportConfiguration settings)
25+
internal VirtualizedCluster(TestableDateTimeProvider dateTimeProvider, TransportConfigurationDescriptor settings)
2626
{
2727
_dateTimeProvider = dateTimeProvider;
2828
_settings = settings;
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// Licensed to Elasticsearch B.V under one or more agreements.
2+
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3+
// See the LICENSE file in the project root for more information
4+
5+
using System;
6+
7+
namespace Elastic.Transport;
8+
9+
/// <summary>
10+
/// Represents the path of an endpoint in a transport request, including the HTTP method
11+
/// and the path and query information.
12+
/// </summary>
13+
/// <remarks>
14+
/// This struct is used to store information about the HTTP method and the path and query of an endpoint,
15+
/// which are essential components when constructing a request URI.
16+
/// </remarks>
17+
public readonly record struct EndpointPath(HttpMethod Method, string PathAndQuery);
18+
19+
/// <summary>
20+
/// Represents an endpoint in a transport request, encapsulating the HTTP method, path and query,
21+
/// and the node to which the request is being sent.
22+
/// </summary>
23+
/// <remarks>
24+
/// This class is used to construct the URI for the request based on the node's URI and the path and query.
25+
/// An empty endpoint can be created using the <see cref="Empty"/> method as a default or placeholder instance.
26+
/// </remarks>
27+
public record Endpoint(in EndpointPath Path, Node Node)
28+
{
29+
/// <summary> Represents an empty endpoint used as a default or placeholder instance of <see cref="Endpoint"/>. </summary>
30+
public static Endpoint Empty(in EndpointPath path) => new(path, EmptyNode);
31+
32+
private static readonly Node EmptyNode = new(new Uri("http://empty.example"));
33+
34+
/// <summary> Indicates whether the endpoint is an empty placeholder instance. </summary>
35+
public bool IsEmpty => Node == EmptyNode;
36+
37+
/// <summary> The <see cref="Uri" /> for the request. </summary>
38+
public Uri Uri { get; private init; } = new(Node.Uri, Path.PathAndQuery);
39+
40+
/// <summary> The HTTP method used for the request (e.g., GET, POST, PUT, DELETE, HEAD). </summary>
41+
public HttpMethod Method => Path.Method;
42+
43+
/// <summary> Gets the path and query of the endpoint.</summary>
44+
public string PathAndQuery => Path.PathAndQuery;
45+
46+
private readonly Node _node = Node;
47+
48+
/// <summary>
49+
/// Represents a node within the transport layer of the Elastic search client.
50+
/// This object encapsulates the characteristics of a node, allowing for comparisons and operations
51+
/// within the broader search infrastructure.
52+
/// </summary>
53+
public Node Node
54+
{
55+
get => _node;
56+
init
57+
{
58+
_node = value;
59+
Uri = new(Node.Uri, Path.PathAndQuery);
60+
}
61+
}
62+
63+
/// <inheritdoc/>
64+
public override string ToString() => $"{Path.Method.GetStringValue()} {Uri}";
65+
66+
}

src/Elastic.Transport/Components/Pipeline/DefaultRequestPipeline.cs

Lines changed: 29 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -16,43 +16,40 @@
1616
namespace Elastic.Transport;
1717

1818
/// <inheritdoc cref="RequestPipeline" />
19-
public class DefaultRequestPipeline<TConfiguration> : RequestPipeline
20-
where TConfiguration : class, ITransportConfiguration
19+
public class DefaultRequestPipeline : RequestPipeline
2120
{
2221
private readonly IRequestInvoker _requestInvoker;
2322
private readonly NodePool _nodePool;
23+
private readonly RequestData _requestData;
2424
private readonly DateTimeProvider _dateTimeProvider;
2525
private readonly MemoryStreamFactory _memoryStreamFactory;
2626
private readonly Func<Node, bool> _nodePredicate;
2727
private readonly ProductRegistration _productRegistration;
28-
private readonly TConfiguration _settings;
2928
private readonly ResponseBuilder _responseBuilder;
3029

3130
private RequestConfiguration? _pingAndSniffRequestConfiguration;
32-
private List<Audit> _auditTrail = null;
31+
private List<Audit>? _auditTrail;
32+
private readonly ITransportConfiguration _settings;
3333

3434
/// <inheritdoc cref="RequestPipeline" />
35-
internal DefaultRequestPipeline(
36-
TConfiguration configurationValues,
37-
DateTimeProvider dateTimeProvider,
38-
MemoryStreamFactory memoryStreamFactory,
39-
IRequestConfiguration? requestConfiguration
40-
)
35+
internal DefaultRequestPipeline(RequestData requestData, DateTimeProvider dateTimeProvider)
4136
{
42-
_settings = configurationValues;
43-
_nodePool = _settings.NodePool;
44-
_requestInvoker = _settings.Connection;
37+
_requestData = requestData;
38+
_settings = requestData.ConnectionSettings;
39+
40+
_nodePool = requestData.ConnectionSettings.NodePool;
41+
_requestInvoker = requestData.ConnectionSettings.Connection;
4542
_dateTimeProvider = dateTimeProvider;
46-
_memoryStreamFactory = memoryStreamFactory;
47-
_productRegistration = configurationValues.ProductRegistration;
43+
_memoryStreamFactory = requestData.MemoryStreamFactory;
44+
_productRegistration = requestData.ConnectionSettings.ProductRegistration;
4845
_responseBuilder = _productRegistration.ResponseBuilder;
49-
_nodePredicate = _settings.NodePredicate ?? _productRegistration.NodePredicate;
50-
RequestConfig = requestConfiguration;
46+
_nodePredicate = requestData.ConnectionSettings.NodePredicate ?? _productRegistration.NodePredicate;
47+
5148
StartedOn = dateTimeProvider.Now();
5249
}
5350

5451
/// <inheritdoc cref="RequestPipeline.AuditTrail" />
55-
public override IEnumerable<Audit> AuditTrail => _auditTrail ?? (IEnumerable<Audit>)Array.Empty<Audit>();
52+
public override IEnumerable<Audit> AuditTrail => _auditTrail;
5653

5754
private RequestConfiguration PingAndSniffRequestConfiguration
5855
{
@@ -66,9 +63,9 @@ private RequestConfiguration PingAndSniffRequestConfiguration
6663
{
6764
PingTimeout = PingTimeout,
6865
RequestTimeout = PingTimeout,
69-
Authentication = RequestConfig?.Authentication ?? _settings.Authentication,
70-
EnableHttpPipelining = RequestConfig?.HttpPipeliningEnabled ?? _settings.HttpPipeliningEnabled,
71-
ForceNode = RequestConfig?.ForceNode
66+
Authentication = _requestData.AuthenticationHeader,
67+
EnableHttpPipelining = _requestData.HttpPipeliningEnabled,
68+
ForceNode = _requestData.ForceNode
7269
};
7370

7471
return _pingAndSniffRequestConfiguration;
@@ -99,10 +96,7 @@ public override bool IsTakingTooLong
9996
}
10097
}
10198

102-
public override int MaxRetries =>
103-
RequestConfig?.ForceNode != null
104-
? 0
105-
: Math.Min(RequestConfig?.MaxRetries ?? _settings.MaxRetries.GetValueOrDefault(int.MaxValue), _nodePool.MaxRetries);
99+
public override int MaxRetries => _requestData.MaxRetries;
106100

107101
public bool Refresh { get; private set; }
108102

@@ -140,18 +134,13 @@ public override bool StaleClusterState
140134

141135
public override DateTimeOffset StartedOn { get; }
142136

143-
private TimeSpan PingTimeout =>
144-
RequestConfig?.PingTimeout
145-
?? _settings.PingTimeout
146-
?? (_nodePool.UsingSsl ? RequestConfiguration.DefaultPingTimeoutOnSsl : RequestConfiguration.DefaultPingTimeout);
137+
private TimeSpan PingTimeout => _requestData.PingTimeout;
147138

148-
private IRequestConfiguration RequestConfig { get; }
139+
private bool RequestDisabledSniff => _requestData.DisableSniff;
149140

150-
private bool RequestDisabledSniff => RequestConfig != null && (RequestConfig.DisableSniff ?? false);
141+
private TimeSpan RequestTimeout => _requestData.RequestTimeout;
151142

152-
private TimeSpan RequestTimeout => RequestConfig?.RequestTimeout ?? _settings.RequestTimeout ?? RequestConfiguration.DefaultRequestTimeout;
153-
154-
public override void AuditCancellationRequested() => Audit(CancellationRequested).Dispose();
143+
public override void AuditCancellationRequested() => Audit(CancellationRequested)?.Dispose();
155144

156145
public override void BadResponse<TResponse>(ref TResponse response, ApiCallDetails callDetails, Endpoint endpoint, RequestData data, PostData? postData, TransportException exception)
157146
{
@@ -362,9 +351,9 @@ public override bool TryGetSingleNode(out Node node)
362351

363352
public override IEnumerable<Node> NextNode()
364353
{
365-
if (RequestConfig?.ForceNode != null)
354+
if (_requestData.ForceNode != null)
366355
{
367-
yield return new Node(RequestConfig.ForceNode);
356+
yield return new Node(_requestData.ForceNode);
368357

369358
yield break;
370359
}
@@ -416,15 +405,12 @@ public async ValueTask PingCoreAsync(bool isAsync, Node node, CancellationToken
416405

417406
TransportResponse response;
418407

419-
//TODO remove
420-
var requestData = new RequestData(_settings, null, null, _memoryStreamFactory);
421-
422408
try
423409
{
424410
if (isAsync)
425-
response = await _productRegistration.PingAsync(_requestInvoker, pingEndpoint, requestData, cancellationToken).ConfigureAwait(false);
411+
response = await _productRegistration.PingAsync(_requestInvoker, pingEndpoint, _requestData, cancellationToken).ConfigureAwait(false);
426412
else
427-
response = _productRegistration.Ping(_requestInvoker, pingEndpoint, requestData);
413+
response = _productRegistration.Ping(_requestInvoker, pingEndpoint, _requestData);
428414

429415
ThrowBadAuthPipelineExceptionWhenNeeded(response.ApiCallDetails);
430416

@@ -462,7 +448,7 @@ public async ValueTask SniffCoreAsync(bool isAsync, CancellationToken cancellati
462448
{
463449
var sniffEndpoint = _productRegistration.CreateSniffEndpoint(node, PingAndSniffRequestConfiguration, _settings);
464450
//TODO remove
465-
var requestData = new RequestData(_settings, null, null, _memoryStreamFactory);
451+
var requestData = new RequestData(_settings, null, null);
466452

467453
using var audit = Audit(SniffSuccess, node);
468454

@@ -554,9 +540,7 @@ public override void ThrowNoNodesAttempted(Endpoint endpoint, List<PipelineExcep
554540
throw new UnexpectedTransportException(clientException, seenExceptions) { Endpoint = endpoint, AuditTrail = AuditTrail };
555541
}
556542

557-
private bool PingDisabled(Node node) =>
558-
(RequestConfig?.DisablePings).GetValueOrDefault(false)
559-
|| (_settings.DisablePings ?? false) || !_nodePool.SupportsPinging || !node.IsResurrected;
543+
private bool PingDisabled(Node node) => _requestData.DisablePings || !node.IsResurrected;
560544

561545
private Auditable? Audit(AuditEvent type, Node node = null) =>
562546
!_settings.DisableAuditTrail ?? true ? new(type, ref _auditTrail, _dateTimeProvider, node) : null;

src/Elastic.Transport/Components/Pipeline/DefaultResponseBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ private async ValueTask<TResponse> SetBodyCoreAsync<TResponse>(bool isAsync,
228228
return response;
229229
}
230230

231-
if (!requestData.ValidateResponseContentType(mimeType))
231+
if (!ValidateResponseContentType(requestData.Accept, mimeType))
232232
{
233233
ConditionalDisposal(responseStream, ownsStream, response);
234234
return default;

src/Elastic.Transport/Components/Pipeline/PipelineException.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
namespace Elastic.Transport;
88

99
/// <summary>
10-
/// A pipeline exception is throw when ever a known failing exit point is reached in <see cref="DefaultRequestPipeline{TConfiguration}"/>
10+
/// A pipeline exception is throw when ever a known failing exit point is reached in <see cref="DefaultRequestPipeline"/>
1111
/// <para>See <see cref="PipelineFailure"/> for known exits points</para>
1212
/// </summary>
1313
public class PipelineException : Exception

src/Elastic.Transport/Components/Pipeline/PipelineFailure.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
namespace Elastic.Transport;
88

99
/// <summary>
10-
/// A failure in <see cref="DefaultRequestPipeline{TConfiguration}"/>'s workflow that caused it to end prematurely.
10+
/// A failure in <see cref="DefaultRequestPipeline"/>'s workflow that caused it to end prematurely.
1111
/// </summary>
1212
public enum PipelineFailure
1313
{
@@ -43,7 +43,7 @@ public enum PipelineFailure
4343
MaxRetriesReached,
4444

4545
/// <summary>
46-
/// An exception occurred during <see cref="DefaultRequestPipeline{TConfiguration}"/> that could not be handled
46+
/// An exception occurred during <see cref="DefaultRequestPipeline"/> that could not be handled
4747
/// </summary>
4848
Unexpected,
4949

0 commit comments

Comments
 (0)