Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 138 additions & 0 deletions Consul.Test/DiscoveryChainTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,144 @@ public async Task DiscoveryChain_Get()
Assert.Equal(targetCheck.SNI, targetChain.SNI);
Assert.Equal(targetCheck.Name, targetChain.Name);

check = new CompiledDiscoveryChain
{
ServiceName = "web",
Namespace = "default",
Datacenter = "dc2",
Protocol = "tcp",
StartNode = "resolver:web." + defaultPart + ".dc2",
Nodes = new Dictionary<string, DiscoveryGraphNode>()
{
{ "resolver:web." + defaultPart + ".dc2",
new DiscoveryGraphNode {
Type = DiscoveryChain.DiscoveryGraphNodeTypeResolver,
Name = "web." + defaultPart + ".dc2",
Resolver = new DiscoveryResolver
{
Default = true,
ConnectTimeout = new TimeSpan(0, 0, 5),
Target = "web." + defaultPart + ".dc2"
}
}
}
},
Targets = new Dictionary<string, DiscoveryTarget>()
{
{ "web." + defaultPart + ".dc2",
new DiscoveryTarget
{
ID = "web." + defaultPart + ".dc2",
Service = "web",
Namespace = "default",
Datacenter = "dc2",
SNI = "web.default.dc2.internal." + TestClusterID + ".consul",
Name = "web.default.dc2.internal." + TestClusterID + ".consul"
}
}
}
};

var options = new DiscoveryChainOptions { };

var responsePost = await _client.DiscoveryChain.Get("web", options, "dc2");

Assert.NotNull(response.Response);
chain = responsePost.Response.Chain;
Assert.Equal(check.ServiceName, chain.ServiceName);
Assert.Equal(check.Namespace, chain.Namespace);
Assert.Equal(check.Datacenter, chain.Datacenter);
Assert.Equal(check.Protocol, chain.Protocol);
Assert.Equal(check.StartNode, chain.StartNode);
nodeCheck = check.Nodes["resolver:web." + defaultPart + ".dc2"];
nodeChain = chain.Nodes["resolver:web." + defaultPart + ".dc2"];
Assert.Equal(nodeCheck.Type, nodeChain.Type);
Assert.Equal(nodeCheck.Name, nodeChain.Name);
Assert.Equal(nodeCheck.Resolver.Default, nodeChain.Resolver.Default);
Assert.Equal(nodeCheck.Resolver.Target, nodeChain.Resolver.Target);
Assert.Equal(nodeCheck.Resolver.ConnectTimeout.ToString(), nodeChain.Resolver.ConnectTimeout.ToString());
targetCheck = check.Targets["web." + defaultPart + ".dc2"];
targetChain = chain.Targets["web." + defaultPart + ".dc2"];
Assert.Equal(targetCheck.ID, targetChain.ID);
Assert.Equal(targetCheck.Service, targetChain.Service);
Assert.Equal(targetCheck.Namespace, targetChain.Namespace);
Assert.Equal(targetCheck.Datacenter, targetChain.Datacenter);
Assert.Equal(targetCheck.SNI, targetChain.SNI);
Assert.Equal(targetCheck.Name, targetChain.Name);


check = new CompiledDiscoveryChain
{
ServiceName = "web",
Namespace = "default",
Datacenter = "dc2",
Protocol = "grpc",
CustomizationHash = "98809527",
StartNode = "resolver:web." + defaultPart + ".dc2",
Nodes = new Dictionary<string, DiscoveryGraphNode>()
{
{ "resolver:web." + defaultPart + ".dc2",
new DiscoveryGraphNode {
Type = DiscoveryChain.DiscoveryGraphNodeTypeResolver,
Name = "web." + defaultPart + ".dc2",
Resolver = new DiscoveryResolver
{
ConnectTimeout = new TimeSpan(0, 0, 22),
Target = "web." + defaultPart + ".dc2"
}
}
}
},
Targets = new Dictionary<string, DiscoveryTarget>()
{
{ "web." + defaultPart + ".dc2",
new DiscoveryTarget
{
ID = "web." + defaultPart + ".dc2",
Service = "web",
Namespace = "default",
Datacenter = "dc2",
MeshGateway = new MeshGatewayConfig { Mode = "local" },
SNI = "web.default.dc2.internal." + TestClusterID + ".consul",
Name = "web.default.dc2.internal." + TestClusterID + ".consul"
}
}
}
};

options = new DiscoveryChainOptions
{
OverrideMeshGateway = new MeshGatewayConfig { Mode = "local" },
OverrideProtocol = "grpc",
OverrideConnectTimeout = new TimeSpan(0, 0, 22)
};

responsePost = await _client.DiscoveryChain.Get("web", options, "dc2");

Assert.NotNull(response.Response);
chain = responsePost.Response.Chain;
Assert.Equal(check.ServiceName, chain.ServiceName);
Assert.Equal(check.Namespace, chain.Namespace);
Assert.Equal(check.Datacenter, chain.Datacenter);
Assert.Equal(check.Protocol, chain.Protocol);
Assert.Equal(check.StartNode, chain.StartNode);
nodeCheck = check.Nodes["resolver:web." + defaultPart + ".dc2"];
nodeChain = chain.Nodes["resolver:web." + defaultPart + ".dc2"];
Assert.Equal(nodeCheck.Type, nodeChain.Type);
Assert.Equal(nodeCheck.Name, nodeChain.Name);
Assert.Equal(nodeCheck.Resolver.Target, nodeChain.Resolver.Target);
Assert.Equal(nodeCheck.Resolver.ConnectTimeout.ToString(), nodeChain.Resolver.ConnectTimeout.ToString());
targetCheck = check.Targets["web." + defaultPart + ".dc2"];
targetChain = chain.Targets["web." + defaultPart + ".dc2"];
Assert.Equal(targetCheck.ID, targetChain.ID);
Assert.Equal(targetCheck.Service, targetChain.Service);
Assert.Equal(targetCheck.Namespace, targetChain.Namespace);
Assert.Equal(targetCheck.Datacenter, targetChain.Datacenter);
Assert.Equal(targetCheck.SNI, targetChain.SNI);
Assert.Equal(targetCheck.Name, targetChain.Name);
}
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Please remove extra empty lines

}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Please remove extra empty lines


Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Please remove extra empty lines

61 changes: 61 additions & 0 deletions Consul/DiscoveryChain.cs
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,34 @@ public class DiscoveryTarget
public string Name { get; set; }
}

public class DiscoveryChainOptions
{
/// <summary>
/// OverrideMeshGateway allows for the mesh gateway setting to be overridden
/// For any resolver in the compiled chain.
/// </summary>
public MeshGatewayConfig OverrideMeshGateway { get; set; }

/// <summary>
/// OverrideProtocol allows for the final protocol for the chain to be
/// altered.
///
/// - If the chain ordinarily would be TCP and an L7 protocol is passed here
/// the chain will not include Routers or Splitters.
///
/// - If the chain ordinarily would be L7 and TCP is passed here the chain
/// will not include Routers or Splitters.
/// </summary>
public string OverrideProtocol { get; set; }

/// <summary>
/// OverrideConnectTimeout allows for the ConnectTimeout setting to be
/// Overridden for any resolver in the compiled chain.
/// </summary>
[JsonConverter(typeof(DurationTimespanConverter))]
public TimeSpan? OverrideConnectTimeout { get; set; }
}

public class DiscoveryChain : IDiscoveryChainEndpoint
{
public const string DiscoveryGraphNodeTypeRouter = "router";
Expand Down Expand Up @@ -159,6 +187,39 @@ public Task<QueryResult<DiscoveryChainResponse>> Get(string name, CancellationTo
{
return Get(name, QueryOptions.Default, ct);
}

/// <summary>
/// Get is used to return the compiled discovery chain for a service.
/// </summary>
/// <param name="name">Name of the service</param>
/// <param name="options">Discovery Chain Options</param>
/// <param name="ct">Cancellation Token</param>
/// <param name="compileDataCenter">Datacenter to evaluate the discovery chain in</param>
/// <returns>An empty write result</returns>
public Task<WriteResult<DiscoveryChainResponse>> Get(string name, DiscoveryChainOptions options, string compileDataCenter = null, CancellationToken ct = default)
{
return Get(name, options, WriteOptions.Default, compileDataCenter, ct);
}

/// <summary>
/// Get is used to return the compiled discovery chain for a service.
/// </summary>
/// <param name="name">Name of the service</param>
/// <param name="options">Discovery Chain Options</param>
/// <param name="compileDataCenter">Datacenter to evaluate the discovery chain in</param>
/// <param name="q">Write Options</param>
/// <param name="ct">Cancellation Token</param>
/// <returns>An empty write result</returns>
public Task<WriteResult<DiscoveryChainResponse>> Get(string name, DiscoveryChainOptions options, WriteOptions q, string compileDataCenter = null, CancellationToken ct = default)
{
var request = _client.Post<DiscoveryChainOptions, DiscoveryChainResponse>($"/v1/discovery-chain/{name}", options, q);
if (!string.IsNullOrEmpty(compileDataCenter))
{
request.Params["compile-dc"] = compileDataCenter;
}
return request.Execute(ct);
}

}

public partial class ConsulClient : IConsulClient
Expand Down
2 changes: 2 additions & 0 deletions Consul/Interfaces/IDiscoveryChainEndpoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,7 @@ public interface IDiscoveryChainEndpoint
{
Task<QueryResult<DiscoveryChainResponse>> Get(string name, QueryOptions q, CancellationToken ct = default);
Task<QueryResult<DiscoveryChainResponse>> Get(string name, CancellationToken ct = default);
Task<WriteResult<DiscoveryChainResponse>> Get(string name, DiscoveryChainOptions options, WriteOptions q, string compileDataCenter = null, CancellationToken ct = default);
Task<WriteResult<DiscoveryChainResponse>> Get(string name, DiscoveryChainOptions options, string compileDataCenter = null, CancellationToken ct = default);
}
}
Loading