diff --git a/Consul.Test/ConfigurationTest.cs b/Consul.Test/ConfigurationTest.cs index ab542d5e1..fafdaf743 100644 --- a/Consul.Test/ConfigurationTest.cs +++ b/Consul.Test/ConfigurationTest.cs @@ -49,5 +49,68 @@ public async Task Configuration_ApplyConfig(string protocol) Assert.Equal(payload.Kind, queryResult.Response.Kind); Assert.Equal(payload.Protocol, queryResult.Response.Protocol); } + + [Fact] + public async Task Configuration_ListConfig() + { + var firstPayload = new ServiceDefaultsEntry + { + Kind = "service-defaults", + Name = "web", + Protocol = "https" + }; + + var secondPayload = new ServiceDefaultsEntry + { + Kind = "service-defaults", + Name = "db", + Protocol = "https" + }; + var writeResult = await _client.Configuration.ApplyConfig(firstPayload); + Assert.Equal(HttpStatusCode.OK, writeResult.StatusCode); + writeResult = await _client.Configuration.ApplyConfig(secondPayload); + Assert.Equal(HttpStatusCode.OK, writeResult.StatusCode); + var queryResult = await _client.Configuration.ListConfig(firstPayload.Kind); + var configurations = queryResult.Response; + var webConfig = configurations.SingleOrDefault(c => c.Name == firstPayload.Name); + var dbConfig = configurations.SingleOrDefault(c => c.Name == secondPayload.Name); + Assert.NotNull(dbConfig); + Assert.NotNull(webConfig); + + Assert.Equal(firstPayload.Name, webConfig.Name); + Assert.Equal(firstPayload.Kind, webConfig.Kind); + Assert.Equal(firstPayload.Protocol, webConfig.Protocol); + + Assert.Equal(secondPayload.Name, dbConfig.Name); + Assert.Equal(secondPayload.Kind, dbConfig.Kind); + Assert.Equal(secondPayload.Protocol, dbConfig.Protocol); + } + + [Fact] + public async Task Configuration_DeleteConfig() + { + var payload = new ServiceDefaultsEntry + { + Kind = "service-defaults", + Name = "test-service", + Protocol = "http" + }; + + var writeResult = await _client.Configuration.ApplyConfig(payload); + Assert.Equal(HttpStatusCode.OK, writeResult.StatusCode); + + var getConfigResult = await _client.Configuration.GetConfig(payload.Kind, payload.Name); + Assert.Equal(HttpStatusCode.OK, getConfigResult.StatusCode); + Assert.Equal(payload.Name, getConfigResult.Response.Name); + Assert.Equal(payload.Kind, getConfigResult.Response.Kind); + Assert.Equal(payload.Protocol, getConfigResult.Response.Protocol); + + var deleteResult = await _client.Configuration.DeleteConfig(payload.Kind, payload.Name); + Assert.Equal(HttpStatusCode.OK, deleteResult.StatusCode); + + var getDeletedConfigResult = await _client.Configuration.GetConfig(payload.Kind, payload.Name); + Assert.Equal(HttpStatusCode.NotFound, getDeletedConfigResult.StatusCode); + Assert.Null(getDeletedConfigResult.Response); + } } } diff --git a/Consul/Configuration.cs b/Consul/Configuration.cs index 8020a37e2..1a70e4e80 100644 --- a/Consul/Configuration.cs +++ b/Consul/Configuration.cs @@ -1721,6 +1721,59 @@ public Task> GetConfig(string kind, string name, C { return GetConfig(kind, name, QueryOptions.Default, ct); } + + /// + /// This Retrieves the list of config for an entry kind. + /// + /// + /// The kind of config entry + /// Query Options + /// Cancellation Token + /// A config entry + public Task>> ListConfig(string kind, QueryOptions q, CancellationToken ct = default) where TConfig : IConfigurationEntry + { + var req = _client.Get>($"/v1/config/{kind}", q); + return req.Execute(ct); + } + /// + /// This Retrieves the list of config for an entry kind. + /// + /// + /// The kind of config entry + /// Cancellation Token + /// A list of config entries + public Task>> ListConfig(string kind, CancellationToken ct = default) where TConfig : IConfigurationEntry + { + return ListConfig(kind, QueryOptions.Default, ct); + } + + /// + /// This Deletes the given config entry. + /// + /// + /// The kind of config entry + /// The name of config entry + /// Write Options + /// Cancellation Token + /// A Write Result + public Task DeleteConfig(string kind, string name, WriteOptions q, CancellationToken ct = default) + { + var req = _client.Delete($"/v1/config/{kind}/{name}", q); + return req.Execute(ct); + } + + /// + /// This Deletes the given config entry. + /// + /// + /// The kind of config entry + /// The name of config entry + /// Cancellation Token + /// A config entry + public Task DeleteConfig(string kind, string name, CancellationToken ct = default) + { + return DeleteConfig(kind, name, WriteOptions.Default, ct); + } } public partial class ConsulClient : IConsulClient { diff --git a/Consul/Interfaces/IConfigurationEndpoint.cs b/Consul/Interfaces/IConfigurationEndpoint.cs index 7cd0e897f..6aa0f3aad 100644 --- a/Consul/Interfaces/IConfigurationEndpoint.cs +++ b/Consul/Interfaces/IConfigurationEndpoint.cs @@ -30,5 +30,9 @@ public interface IConfigurationEndpoint Task ApplyConfig(TConfig configurationEntry, CancellationToken ct = default) where TConfig : IConfigurationEntry; Task> GetConfig(string kind, string name, QueryOptions q, CancellationToken ct = default) where TConfig : IConfigurationEntry; Task> GetConfig(string kind, string name, CancellationToken ct = default) where TConfig : IConfigurationEntry; + Task>> ListConfig(string kind, QueryOptions q, CancellationToken ct = default) where TConfig : IConfigurationEntry; + Task>> ListConfig(string kind, CancellationToken ct = default) where TConfig : IConfigurationEntry; + Task DeleteConfig(string kind, string name, WriteOptions q, CancellationToken ct = default); + Task DeleteConfig(string kind, string name, CancellationToken ct = default); } }