From c02790eed831ffe1480a502b4a7ca3ab711c12de Mon Sep 17 00:00:00 2001 From: alhimik45 Date: Sun, 10 Jul 2022 17:09:53 +0200 Subject: [PATCH 1/2] Add support for replace-existing-checks parameter of service registration endpoint --- CHANGELOG.md | 1 + Consul.Test/AgentTest.cs | 94 +++++++++++++++++++++++++++++ Consul/Agent.cs | 18 +++++- Consul/Interfaces/IAgentEndpoint.cs | 1 + 4 files changed, 113 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f5cd1fc5..2a63ebbef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## Unreleased +* Add support for `replace-existing-checks` parameter of service registration endpoint that allows to replace existing checks when re-registering a service ## 1.6.10.6 * Enforce ConfigureAwait(false) on the whole library (#148) diff --git a/Consul.Test/AgentTest.cs b/Consul.Test/AgentTest.cs index fdd84a34d..fe13f2623 100644 --- a/Consul.Test/AgentTest.cs +++ b/Consul.Test/AgentTest.cs @@ -544,5 +544,99 @@ public async Task Agent_FilterServices() Assert.Equal(svcID1, (await _client.Agent.Services(metaSelector[uniqueMeta] == "bar1")).Response.Keys.Single()); Assert.Equal(svcID2, (await _client.Agent.Services(metaSelector[uniqueMeta] == "bar2")).Response.Keys.Single()); } + + [Fact] + public async Task Agent_ReRegister() + { + var svcID = KVTest.GenerateTestKeyName(); + var check1Name = svcID + "1"; + var check2Name = svcID + "2"; + var check3Name = svcID + "3"; + var registration1 = new AgentServiceRegistration + { + Name = svcID, + Port = 8000, + Checks = new[] + { + new AgentServiceCheck + { + Name = check1Name, + TTL = TimeSpan.FromSeconds(15) + }, + new AgentServiceCheck + { + Name = check2Name, + TTL = TimeSpan.FromSeconds(15) + } + } + }; + var registration2 = new AgentServiceRegistration + { + Name = svcID, + Port = 8000, + Check = new AgentServiceCheck + { + Name = check3Name, + TTL = TimeSpan.FromSeconds(15) + } + }; + + await _client.Agent.ServiceRegister(registration1); + await _client.Agent.ServiceRegister(registration2); + + var checks = await _client.Agent.Checks(); + Assert.Contains(check1Name, checks.Response.Values.Select(c => c.Name)); + Assert.Contains(check2Name, checks.Response.Values.Select(c => c.Name)); + Assert.Contains(check3Name, checks.Response.Values.Select(c => c.Name)); + + await _client.Agent.ServiceDeregister(svcID); + } + + [Fact] + public async Task Agent_ReRegister_ReplaceExistingChecks() + { + var svcID = KVTest.GenerateTestKeyName(); + var check1Name = svcID + "1"; + var check2Name = svcID + "2"; + var check3Name = svcID + "3"; + var registration1 = new AgentServiceRegistration + { + Name = svcID, + Port = 8000, + Checks = new[] + { + new AgentServiceCheck + { + Name = check1Name, + TTL = TimeSpan.FromSeconds(15) + }, + new AgentServiceCheck + { + Name = check2Name, + TTL = TimeSpan.FromSeconds(15) + } + } + }; + var registration2 = new AgentServiceRegistration + { + Name = svcID, + Port = 8000, + Check = new AgentServiceCheck + { + Name = check3Name, + TTL = TimeSpan.FromSeconds(15) + } + }; + + await _client.Agent.ServiceRegister(registration1); + await _client.Agent.ServiceRegister(registration2, replaceExistingChecks: true); + + var checks = await _client.Agent.Checks(); + Assert.DoesNotContain(check1Name, checks.Response.Values.Select(c => c.Name)); + Assert.DoesNotContain(check2Name, checks.Response.Values.Select(c => c.Name)); + Assert.Contains(check3Name, checks.Response.Values.Select(c => c.Name)); + + await _client.Agent.ServiceDeregister(svcID); + } } } diff --git a/Consul/Agent.cs b/Consul/Agent.cs index a453e675b..f811e22bc 100644 --- a/Consul/Agent.cs +++ b/Consul/Agent.cs @@ -410,7 +410,23 @@ public string NodeName /// An empty write result public Task ServiceRegister(AgentServiceRegistration service, CancellationToken ct = default(CancellationToken)) { - return _client.Put("/v1/agent/service/register", service, null).Execute(ct); + return ServiceRegister(service, replaceExistingChecks: false, ct); + } + + /// + /// ServiceRegister is used to register a new service with the local agent + /// + /// A service registration object + /// Missing health checks from the request will be deleted from the agent. + /// An empty write result + public Task ServiceRegister(AgentServiceRegistration service, bool replaceExistingChecks, CancellationToken ct = default(CancellationToken)) + { + var req = _client.Put("/v1/agent/service/register", service, null); + if (replaceExistingChecks) + { + req.Params["replace-existing-checks"] = "true"; + } + return req.Execute(ct); } /// diff --git a/Consul/Interfaces/IAgentEndpoint.cs b/Consul/Interfaces/IAgentEndpoint.cs index 2b3e33cc7..ca3687b26 100644 --- a/Consul/Interfaces/IAgentEndpoint.cs +++ b/Consul/Interfaces/IAgentEndpoint.cs @@ -48,6 +48,7 @@ public interface IAgentEndpoint Task>>> Self(CancellationToken ct = default(CancellationToken)); Task ServiceDeregister(string serviceID, CancellationToken ct = default(CancellationToken)); Task ServiceRegister(AgentServiceRegistration service, CancellationToken ct = default(CancellationToken)); + Task ServiceRegister(AgentServiceRegistration service, bool replaceExistingChecks, CancellationToken ct = default(CancellationToken)); Task>> Services(CancellationToken ct = default(CancellationToken)); Task>> Services(Filter filter, CancellationToken ct = default(CancellationToken)); Task UpdateTTL(string checkID, string output, TTLStatus status, CancellationToken ct = default(CancellationToken)); From a4bf764ea6ad47d59b56172bbe48400a7b35312f Mon Sep 17 00:00:00 2001 From: alhimik45 Date: Mon, 11 Jul 2022 11:17:45 +0200 Subject: [PATCH 2/2] Replace two tests with single parametrized --- Consul.Test/AgentTest.cs | 62 +++++++++------------------------------- 1 file changed, 13 insertions(+), 49 deletions(-) diff --git a/Consul.Test/AgentTest.cs b/Consul.Test/AgentTest.cs index fe13f2623..66530f24f 100644 --- a/Consul.Test/AgentTest.cs +++ b/Consul.Test/AgentTest.cs @@ -545,8 +545,10 @@ public async Task Agent_FilterServices() Assert.Equal(svcID2, (await _client.Agent.Services(metaSelector[uniqueMeta] == "bar2")).Response.Keys.Single()); } - [Fact] - public async Task Agent_ReRegister() + [Theory] + [InlineData(false)] + [InlineData(true)] + public async Task Agent_ReRegister_ReplaceExistingChecks(bool replaceExistingChecks) { var svcID = KVTest.GenerateTestKeyName(); var check1Name = svcID + "1"; @@ -582,58 +584,20 @@ public async Task Agent_ReRegister() }; await _client.Agent.ServiceRegister(registration1); - await _client.Agent.ServiceRegister(registration2); + await _client.Agent.ServiceRegister(registration2, replaceExistingChecks: replaceExistingChecks); var checks = await _client.Agent.Checks(); - Assert.Contains(check1Name, checks.Response.Values.Select(c => c.Name)); - Assert.Contains(check2Name, checks.Response.Values.Select(c => c.Name)); - Assert.Contains(check3Name, checks.Response.Values.Select(c => c.Name)); - - await _client.Agent.ServiceDeregister(svcID); - } - [Fact] - public async Task Agent_ReRegister_ReplaceExistingChecks() - { - var svcID = KVTest.GenerateTestKeyName(); - var check1Name = svcID + "1"; - var check2Name = svcID + "2"; - var check3Name = svcID + "3"; - var registration1 = new AgentServiceRegistration + if (replaceExistingChecks) { - Name = svcID, - Port = 8000, - Checks = new[] - { - new AgentServiceCheck - { - Name = check1Name, - TTL = TimeSpan.FromSeconds(15) - }, - new AgentServiceCheck - { - Name = check2Name, - TTL = TimeSpan.FromSeconds(15) - } - } - }; - var registration2 = new AgentServiceRegistration + Assert.DoesNotContain(check1Name, checks.Response.Values.Select(c => c.Name)); + Assert.DoesNotContain(check2Name, checks.Response.Values.Select(c => c.Name)); + } + else { - Name = svcID, - Port = 8000, - Check = new AgentServiceCheck - { - Name = check3Name, - TTL = TimeSpan.FromSeconds(15) - } - }; - - await _client.Agent.ServiceRegister(registration1); - await _client.Agent.ServiceRegister(registration2, replaceExistingChecks: true); - - var checks = await _client.Agent.Checks(); - Assert.DoesNotContain(check1Name, checks.Response.Values.Select(c => c.Name)); - Assert.DoesNotContain(check2Name, checks.Response.Values.Select(c => c.Name)); + Assert.Contains(check1Name, checks.Response.Values.Select(c => c.Name)); + Assert.Contains(check2Name, checks.Response.Values.Select(c => c.Name)); + } Assert.Contains(check3Name, checks.Response.Values.Select(c => c.Name)); await _client.Agent.ServiceDeregister(svcID);