diff --git a/Source/EasyNetQ.Management.Client.ApprovalTests/EasyNetQ.Management.Client.approved.txt b/Source/EasyNetQ.Management.Client.ApprovalTests/EasyNetQ.Management.Client.approved.txt index 2b9de93a..ddc6b260 100644 --- a/Source/EasyNetQ.Management.Client.ApprovalTests/EasyNetQ.Management.Client.approved.txt +++ b/Source/EasyNetQ.Management.Client.ApprovalTests/EasyNetQ.Management.Client.approved.txt @@ -59,6 +59,7 @@ namespace EasyNetQ.Management.Client System.Threading.Tasks.Task> GetQueuesAsync(string vhostName, System.Threading.CancellationToken cancellationToken = default); System.Threading.Tasks.Task> GetQueuesByPageAsync(EasyNetQ.Management.Client.Model.PageCriteria pageCriteria, System.Threading.CancellationToken cancellationToken = default); System.Threading.Tasks.Task> GetQueuesByPageAsync(string vhostName, EasyNetQ.Management.Client.Model.PageCriteria pageCriteria, System.Threading.CancellationToken cancellationToken = default); + System.Threading.Tasks.Task> GetQueuesWithoutStatsAsync(System.Threading.CancellationToken cancellationToken = default); System.Threading.Tasks.Task> GetTopicPermissionsAsync(System.Threading.CancellationToken cancellationToken = default); System.Threading.Tasks.Task GetUserAsync(string userName, System.Threading.CancellationToken cancellationToken = default); System.Threading.Tasks.Task> GetUsersAsync(System.Threading.CancellationToken cancellationToken = default); @@ -137,6 +138,7 @@ namespace EasyNetQ.Management.Client public System.Threading.Tasks.Task> GetQueuesAsync(string vhostName, System.Threading.CancellationToken cancellationToken = default) { } public System.Threading.Tasks.Task> GetQueuesByPageAsync(EasyNetQ.Management.Client.Model.PageCriteria pageCriteria, System.Threading.CancellationToken cancellationToken = default) { } public System.Threading.Tasks.Task> GetQueuesByPageAsync(string vhostName, EasyNetQ.Management.Client.Model.PageCriteria pageCriteria, System.Threading.CancellationToken cancellationToken = default) { } + public System.Threading.Tasks.Task> GetQueuesWithoutStatsAsync(System.Threading.CancellationToken cancellationToken = default) { } public System.Threading.Tasks.Task> GetTopicPermissionsAsync(System.Threading.CancellationToken cancellationToken = default) { } public System.Threading.Tasks.Task GetUserAsync(string userName, System.Threading.CancellationToken cancellationToken = default) { } public System.Threading.Tasks.Task> GetUsersAsync(System.Threading.CancellationToken cancellationToken = default) { } @@ -209,14 +211,18 @@ namespace EasyNetQ.Management.Client public static System.Threading.Tasks.Task> GetBindingsWithSourceAsync(this EasyNetQ.Management.Client.IManagementClient client, EasyNetQ.Management.Client.Model.Exchange exchange, System.Threading.CancellationToken cancellationToken = default) { } public static EasyNetQ.Management.Client.Model.Channel GetChannel(this EasyNetQ.Management.Client.IManagementClient client, string channelName, EasyNetQ.Management.Client.Model.RatesCriteria? ratesCriteria = null, System.Threading.CancellationToken cancellationToken = default) { } public static System.Collections.Generic.IReadOnlyList GetChannels(this EasyNetQ.Management.Client.IManagementClient client, System.Threading.CancellationToken cancellationToken = default) { } + public static System.Collections.Generic.IReadOnlyList GetChannels(this EasyNetQ.Management.Client.IManagementClient client, EasyNetQ.Management.Client.Model.Connection connection, System.Threading.CancellationToken cancellationToken = default) { } + public static System.Collections.Generic.IReadOnlyList GetChannels(this EasyNetQ.Management.Client.IManagementClient client, string connectionName, System.Threading.CancellationToken cancellationToken = default) { } public static System.Threading.Tasks.Task> GetChannelsAsync(this EasyNetQ.Management.Client.IManagementClient client, EasyNetQ.Management.Client.Model.Connection connection, System.Threading.CancellationToken cancellationToken = default) { } public static System.Collections.Generic.IReadOnlyList GetConnections(this EasyNetQ.Management.Client.IManagementClient client, System.Threading.CancellationToken cancellationToken = default) { } + public static System.Collections.Generic.IReadOnlyList GetConnections(this EasyNetQ.Management.Client.IManagementClient client, string vhostName, System.Threading.CancellationToken cancellationToken = default) { } public static EasyNetQ.Management.Client.Model.Definitions GetDefinitions(this EasyNetQ.Management.Client.IManagementClient client, System.Threading.CancellationToken cancellationToken = default) { } public static EasyNetQ.Management.Client.Model.Exchange GetExchange(this EasyNetQ.Management.Client.IManagementClient client, string exchangeName, EasyNetQ.Management.Client.Model.Vhost vhost, EasyNetQ.Management.Client.Model.RatesCriteria? ratesCriteria = null, System.Threading.CancellationToken cancellationToken = default) { } public static System.Threading.Tasks.Task GetExchangeAsync(this EasyNetQ.Management.Client.IManagementClient client, EasyNetQ.Management.Client.Model.Vhost vhost, string exchangeName, EasyNetQ.Management.Client.Model.RatesCriteria? ratesCriteria = null, System.Threading.CancellationToken cancellationToken = default) { } public static System.Collections.Generic.IReadOnlyList GetExchangeBindings(this EasyNetQ.Management.Client.IManagementClient client, EasyNetQ.Management.Client.Model.Exchange fromExchange, EasyNetQ.Management.Client.Model.Exchange toExchange, System.Threading.CancellationToken cancellationToken = default) { } public static System.Threading.Tasks.Task> GetExchangeBindingsAsync(this EasyNetQ.Management.Client.IManagementClient client, EasyNetQ.Management.Client.Model.Exchange fromExchange, EasyNetQ.Management.Client.Model.Exchange toExchange, System.Threading.CancellationToken cancellationToken = default) { } public static System.Collections.Generic.IReadOnlyList GetExchanges(this EasyNetQ.Management.Client.IManagementClient client, System.Threading.CancellationToken cancellationToken = default) { } + public static System.Collections.Generic.IReadOnlyList GetExchanges(this EasyNetQ.Management.Client.IManagementClient client, string vhostName, System.Threading.CancellationToken cancellationToken = default) { } public static EasyNetQ.Management.Client.Model.Parameter GetFederationUpstream(this EasyNetQ.Management.Client.IManagementClient client, string vhostName, string federationUpstreamName, System.Threading.CancellationToken cancellationToken = default) { } public static System.Threading.Tasks.Task GetFederationUpstreamAsync(this EasyNetQ.Management.Client.IManagementClient client, string vhostName, string federationUpstreamName, System.Threading.CancellationToken cancellationToken = default) { } public static System.Collections.Generic.IReadOnlyList GetFederations(this EasyNetQ.Management.Client.IManagementClient client, System.Threading.CancellationToken cancellationToken = default) { } @@ -233,10 +239,12 @@ namespace EasyNetQ.Management.Client public static System.Threading.Tasks.Task> GetQueueBindingsAsync(this EasyNetQ.Management.Client.IManagementClient client, EasyNetQ.Management.Client.Model.Exchange exchange, EasyNetQ.Management.Client.Model.Queue queue, System.Threading.CancellationToken cancellationToken = default) { } public static System.Collections.Generic.IReadOnlyList GetQueues(this EasyNetQ.Management.Client.IManagementClient client, System.Threading.CancellationToken cancellationToken = default) { } public static System.Collections.Generic.IReadOnlyList GetQueues(this EasyNetQ.Management.Client.IManagementClient client, EasyNetQ.Management.Client.Model.Vhost vhost, System.Threading.CancellationToken cancellationToken = default) { } + public static System.Collections.Generic.IReadOnlyList GetQueues(this EasyNetQ.Management.Client.IManagementClient client, string vhostName, System.Threading.CancellationToken cancellationToken = default) { } public static System.Threading.Tasks.Task> GetQueuesAsync(this EasyNetQ.Management.Client.IManagementClient client, EasyNetQ.Management.Client.Model.Vhost vhost, System.Threading.CancellationToken cancellationToken = default) { } public static EasyNetQ.Management.Client.Model.PageResult GetQueuesByPage(this EasyNetQ.Management.Client.IManagementClient client, EasyNetQ.Management.Client.Model.PageCriteria pageCriteria, System.Threading.CancellationToken cancellationToken = default) { } public static EasyNetQ.Management.Client.Model.PageResult GetQueuesByPage(this EasyNetQ.Management.Client.IManagementClient client, EasyNetQ.Management.Client.Model.Vhost vhost, EasyNetQ.Management.Client.Model.PageCriteria pageCriteria, System.Threading.CancellationToken cancellationToken = default) { } public static System.Threading.Tasks.Task> GetQueuesByPageAsync(this EasyNetQ.Management.Client.IManagementClient client, EasyNetQ.Management.Client.Model.Vhost vhost, EasyNetQ.Management.Client.Model.PageCriteria pageCriteria, System.Threading.CancellationToken cancellationToken = default) { } + public static System.Collections.Generic.IReadOnlyList GetQueuesWithoutStats(this EasyNetQ.Management.Client.IManagementClient client, System.Threading.CancellationToken cancellationToken = default) { } public static EasyNetQ.Management.Client.Model.Parameter GetShovel(this EasyNetQ.Management.Client.IManagementClient client, string vhostName, string shovelName, System.Threading.CancellationToken cancellationToken = default) { } public static System.Threading.Tasks.Task GetShovelAsync(this EasyNetQ.Management.Client.IManagementClient client, string vhostName, string shovelName, System.Threading.CancellationToken cancellationToken = default) { } public static System.Collections.Generic.IReadOnlyList GetTopicPermissions(this EasyNetQ.Management.Client.IManagementClient client, System.Threading.CancellationToken cancellationToken = default) { } @@ -431,7 +439,7 @@ namespace EasyNetQ.Management.Client.Model long SendOct, long SendCnt, long SendPend, - string State, + string? State, string? LastBlockedBy, string? LastBlockedAge, long Channels, @@ -440,13 +448,13 @@ namespace EasyNetQ.Management.Client.Model string Name, string? Address, int Port, - string PeerHost, + string? PeerHost, int PeerPort, bool Ssl, string? PeerCertSubject, string? PeerCertIssuer, string? PeerCertValidity, - string AuthMechanism, + string? AuthMechanism, string? SslProtocol, string? SslKeyExchange, string? SslCipher, @@ -458,7 +466,7 @@ namespace EasyNetQ.Management.Client.Model long FrameMax, System.Collections.Generic.IReadOnlyDictionary ClientProperties) { } public string? Address { get; init; } - public string AuthMechanism { get; init; } + public string? AuthMechanism { get; init; } public long Channels { get; init; } [System.Text.Json.Serialization.JsonConverter(typeof(EasyNetQ.Management.Client.Serialization.StringObjectReadOnlyDictionaryConverter?))] public System.Collections.Generic.IReadOnlyDictionary ClientProperties { get; init; } @@ -470,7 +478,7 @@ namespace EasyNetQ.Management.Client.Model public string? PeerCertIssuer { get; init; } public string? PeerCertSubject { get; init; } public string? PeerCertValidity { get; init; } - public string PeerHost { get; init; } + public string? PeerHost { get; init; } public int PeerPort { get; init; } public int Port { get; init; } public string Protocol { get; init; } @@ -484,7 +492,7 @@ namespace EasyNetQ.Management.Client.Model public string? SslKeyExchange { get; init; } public string? SslProtocol { get; init; } public bool Ssl { get; init; } - public string State { get; init; } + public string? State { get; init; } public long Timeout { get; init; } public string Type { get; init; } public string User { get; init; } @@ -980,6 +988,8 @@ namespace EasyNetQ.Management.Client.Model string? FederationUpstream = null, string? FederationUpstreamSet = null, string? QueueMode = null) { } + [System.Text.Json.Serialization.JsonExtensionData] + public System.Collections.Generic.Dictionary? ExtensionData { get; set; } [System.Text.Json.Serialization.JsonPropertyName("alternate-exchange")] public string? AlternateExchange { get; init; } [System.Text.Json.Serialization.JsonPropertyName("consumer-timeout")] @@ -1062,60 +1072,55 @@ namespace EasyNetQ.Management.Client.Model public PublishResult(bool Routed) { } public bool Routed { get; init; } } - public class Queue : System.IEquatable + public class Queue : EasyNetQ.Management.Client.Model.QueueWithoutStats, System.IEquatable { public Queue( + string Name, + string Vhost, + EasyNetQ.Management.Client.Model.QueueType Type, + string? Node, + string? State, + System.Collections.Generic.IReadOnlyDictionary Arguments, + bool Durable, + bool Exclusive, + bool AutoDelete, + long MessagesReady, + long MessagesUnacknowledged, + long Messages, long Memory, string? IdleSince, string? Policy, string? ExclusiveConsumerTag, - long MessagesReady, - long MessagesUnacknowledged, - long Messages, + long MessageBytes, long Consumers, long ActiveConsumers, EasyNetQ.Management.Client.Model.BackingQueueStatus? BackingQueueStatus, System.Collections.Generic.IReadOnlyList? ConsumerDetails, long? HeadMessageTimestamp, - string Name, - string Vhost, - bool Durable, - bool Exclusive, - bool AutoDelete, - System.Collections.Generic.IReadOnlyDictionary Arguments, - string? Node, System.Collections.Generic.IReadOnlyList? SlaveNodes, System.Collections.Generic.IReadOnlyList? SynchronisedSlaveNodes, EasyNetQ.Management.Client.Model.LengthsDetails? MessagesDetails, EasyNetQ.Management.Client.Model.LengthsDetails? MessagesReadyDetails, EasyNetQ.Management.Client.Model.LengthsDetails? MessagesUnacknowledgedDetails, EasyNetQ.Management.Client.Model.MessageStats? MessageStats) { } + [System.Text.Json.Serialization.JsonExtensionData] + public System.Collections.Generic.Dictionary? ExtensionData { get; set; } public long ActiveConsumers { get; init; } - [System.Text.Json.Serialization.JsonConverter(typeof(EasyNetQ.Management.Client.Serialization.StringObjectReadOnlyDictionaryConverter?))] - public System.Collections.Generic.IReadOnlyDictionary Arguments { get; init; } - public bool AutoDelete { get; init; } public EasyNetQ.Management.Client.Model.BackingQueueStatus? BackingQueueStatus { get; init; } public System.Collections.Generic.IReadOnlyList? ConsumerDetails { get; init; } public long Consumers { get; init; } - public bool Durable { get; init; } public string? ExclusiveConsumerTag { get; init; } - public bool Exclusive { get; init; } public long? HeadMessageTimestamp { get; init; } public string? IdleSince { get; init; } public long Memory { get; init; } + public long MessageBytes { get; init; } public EasyNetQ.Management.Client.Model.MessageStats? MessageStats { get; init; } public EasyNetQ.Management.Client.Model.LengthsDetails? MessagesDetails { get; init; } public EasyNetQ.Management.Client.Model.LengthsDetails? MessagesReadyDetails { get; init; } - public long MessagesReady { get; init; } public EasyNetQ.Management.Client.Model.LengthsDetails? MessagesUnacknowledgedDetails { get; init; } - public long MessagesUnacknowledged { get; init; } - public long Messages { get; init; } - public string Name { get; init; } - public string? Node { get; init; } public string? Policy { get; init; } public System.Collections.Generic.IReadOnlyList? SlaveNodes { get; init; } public System.Collections.Generic.IReadOnlyList? SynchronisedSlaveNodes { get; init; } - public string Vhost { get; init; } } public class QueueInfo : System.IEquatable { @@ -1149,11 +1154,32 @@ namespace EasyNetQ.Management.Client.Model public long MessagesUnacknowledged { get; init; } public long Messages { get; init; } } + public enum QueueType + { + Classic = 0, + Quorum = 1, + Stream = 2, + } public enum QueueVersion { V1 = 1, V2 = 2, } + public class QueueWithoutStats : EasyNetQ.Management.Client.Model.QueueName, System.IEquatable + { + public QueueWithoutStats(string Name, string Vhost, EasyNetQ.Management.Client.Model.QueueType Type, string? Node, string? State, System.Collections.Generic.IReadOnlyDictionary Arguments, bool Durable, bool Exclusive, bool AutoDelete, long MessagesReady, long MessagesUnacknowledged, long Messages) { } + [System.Text.Json.Serialization.JsonConverter(typeof(EasyNetQ.Management.Client.Serialization.StringObjectReadOnlyDictionaryConverter?))] + public System.Collections.Generic.IReadOnlyDictionary Arguments { get; init; } + public bool AutoDelete { get; init; } + public bool Durable { get; init; } + public bool Exclusive { get; init; } + public long MessagesReady { get; init; } + public long MessagesUnacknowledged { get; init; } + public long Messages { get; init; } + public string? Node { get; init; } + public string? State { get; init; } + public EasyNetQ.Management.Client.Model.QueueType Type { get; init; } + } public class RatesCriteria : System.IEquatable { public RatesCriteria(int MsgRatesAge, int MsgRatesIncr) { } diff --git a/Source/EasyNetQ.Management.Client.IntegrationTests/ManagementClientTests.cs b/Source/EasyNetQ.Management.Client.IntegrationTests/ManagementClientTests.cs index 92fee6d4..ab65405b 100644 --- a/Source/EasyNetQ.Management.Client.IntegrationTests/ManagementClientTests.cs +++ b/Source/EasyNetQ.Management.Client.IntegrationTests/ManagementClientTests.cs @@ -234,6 +234,7 @@ public async Task Should_be_able_to_create_all_the_definitions_in_a_policy() const long maxLengthBytes = 5000; const Overflow overflow = Overflow.RejectPublish; uint? consumerTimeout = fixture.RabbitmqVersion >= new Version("3.12") ? 3600000 : null; + Dictionary extensionData = new Dictionary { { "max-in-memory-length", 1000000 } }; await fixture.ManagementClient.CreatePolicyAsync( new Policy( @@ -265,7 +266,8 @@ await fixture.ManagementClient.CreatePolicyAsync( MaxLengthBytes: maxLengthBytes, Overflow: overflow, ConsumerTimeout: consumerTimeout - ), + ) + { ExtensionData = extensionData }, Priority: priority ) ); @@ -292,7 +294,8 @@ await fixture.ManagementClient.CreatePolicyAsync( && p.Definition.MaxLength == maxLength && p.Definition.MaxLengthBytes == maxLengthBytes && p.Definition.Overflow == overflow - && p.Definition.ConsumerTimeout == consumerTimeout) + && p.Definition.ConsumerTimeout == consumerTimeout + && p.Definition.ExtensionData.Keys.Order().SequenceEqual(extensionData.Keys.Order())) ); } @@ -1207,7 +1210,24 @@ public async Task Should_get_permissions() public async Task Should_get_queues() { await CreateTestQueue(TestQueue); - (await fixture.ManagementClient.GetQueuesAsync()).Count.Should().BeGreaterThan(0); + while (true) + { + var queues = await fixture.ManagementClient.GetQueuesAsync(); + queues.Should().NotBeNullOrEmpty(); + if (queues[0].State != null) + { + queues[0].ExtensionData.Should().NotBeNullOrEmpty(); + break; + } + } + } + + [Fact] + public async Task Should_get_queues_without_stats() + { + await CreateTestQueue(TestQueue); + var queues = await fixture.ManagementClient.GetQueuesWithoutStatsAsync(); + queues.Should().NotBeNullOrEmpty(); } diff --git a/Source/EasyNetQ.Management.Client/IManagementClient.cs b/Source/EasyNetQ.Management.Client/IManagementClient.cs index bc6a36ff..dad5582e 100755 --- a/Source/EasyNetQ.Management.Client/IManagementClient.cs +++ b/Source/EasyNetQ.Management.Client/IManagementClient.cs @@ -99,7 +99,7 @@ Task GetChannelAsync( Task> GetExchangesByPageAsync(PageCriteria pageCriteria, CancellationToken cancellationToken = default); /// - /// A list of all exchanges. + /// A list of all exchanges for a virtual host. /// /// /// @@ -147,6 +147,13 @@ Task GetChannelAsync( /// Task> GetQueuesByPageAsync(string vhostName, PageCriteria pageCriteria, CancellationToken cancellationToken = default); + /// + /// A list of all queues. + /// + /// + /// + Task> GetQueuesWithoutStatsAsync(CancellationToken cancellationToken = default); + /// /// A list of all bindings. /// diff --git a/Source/EasyNetQ.Management.Client/ManagementClient.cs b/Source/EasyNetQ.Management.Client/ManagementClient.cs index b7137ac3..7c43d9dc 100644 --- a/Source/EasyNetQ.Management.Client/ManagementClient.cs +++ b/Source/EasyNetQ.Management.Client/ManagementClient.cs @@ -42,6 +42,11 @@ public class ManagementClient : IManagementClient private static readonly RelativePath Health = Api / "health"; private static readonly RelativePath Rebalance = Api / "rebalance"; + private static readonly Dictionary GetQueuesWithoutStatsQueryParameters = new Dictionary { + { "disable_stats", "true" }, + { "enable_queue_totals", "true" } + }; + internal static readonly JsonSerializerOptions SerializerOptions; private readonly HttpClient httpClient; @@ -313,6 +318,11 @@ public Task> GetQueuesByPageAsync(string vhostName, PageCriter return GetAsync>(Queues / vhostName, pageCriteria.ToQueryParameters(), cancellationToken); } + public Task> GetQueuesWithoutStatsAsync(CancellationToken cancellationToken = default) + { + return GetAsync>(Queues, GetQueuesWithoutStatsQueryParameters, cancellationToken); + } + public Task CreateQueueAsync( string vhostName, QueueInfo queueInfo, diff --git a/Source/EasyNetQ.Management.Client/ManagementClientExtensions.cs b/Source/EasyNetQ.Management.Client/ManagementClientExtensions.cs index 8e55406b..ff8f2c67 100644 --- a/Source/EasyNetQ.Management.Client/ManagementClientExtensions.cs +++ b/Source/EasyNetQ.Management.Client/ManagementClientExtensions.cs @@ -24,7 +24,6 @@ public static Overview GetOverview( .GetResult(); } - /// /// A list of nodes in the RabbitMQ cluster. /// @@ -74,6 +73,24 @@ public static IReadOnlyList GetConnections( .GetResult(); } + /// + /// A list of all open connections on the specified VHost. + /// + /// + /// + /// + /// + public static IReadOnlyList GetConnections( + this IManagementClient client, + string vhostName, + CancellationToken cancellationToken = default + ) + { + return client.GetConnectionsAsync(vhostName, cancellationToken) + .GetAwaiter() + .GetResult(); + } + /// /// A list of all open channels. /// @@ -91,7 +108,25 @@ public static IReadOnlyList GetChannels( } /// - /// A list of all open channels. + /// A list of all open channels for the given connection. + /// + /// + /// + /// + /// + public static IReadOnlyList GetChannels( + this IManagementClient client, + string connectionName, + CancellationToken cancellationToken = default + ) + { + return client.GetChannelsAsync(connectionName, cancellationToken) + .GetAwaiter() + .GetResult(); + } + + /// + /// A list of all open channels for the given connection. /// /// /// @@ -103,6 +138,24 @@ public static Task> GetChannelsAsync( CancellationToken cancellationToken = default ) => client.GetChannelsAsync(connection.Name, cancellationToken); + /// + /// A list of all open channels for the given connection. + /// + /// + /// + /// + /// + public static IReadOnlyList GetChannels( + this IManagementClient client, + Connection connection, + CancellationToken cancellationToken = default + ) + { + return client.GetChannelsAsync(connection, cancellationToken) + .GetAwaiter() + .GetResult(); + } + /// /// Gets the channel. This returns more detail, including consumers than the GetChannels method. /// @@ -139,6 +192,24 @@ public static IReadOnlyList GetExchanges( .GetResult(); } + /// + /// A list of all exchanges for a virtual host. + /// + /// + /// + /// + /// + public static IReadOnlyList GetExchanges( + this IManagementClient client, + string vhostName, + CancellationToken cancellationToken = default + ) + { + return client.GetExchangesAsync(vhostName, cancellationToken) + .GetAwaiter() + .GetResult(); + } + /// /// A list of all queues. /// @@ -155,6 +226,24 @@ public static IReadOnlyList GetQueues( .GetResult(); } + /// + /// A list of all queues for a virtual host. + /// + /// + /// + /// + /// + public static IReadOnlyList GetQueues( + this IManagementClient client, + string vhostName, + CancellationToken cancellationToken = default + ) + { + return client.GetQueuesAsync(vhostName, cancellationToken) + .GetAwaiter() + .GetResult(); + } + /// /// A list of all queues for a virtual host. /// @@ -239,6 +328,17 @@ public static PageResult GetQueuesByPage( .GetResult(); } + /// + /// A list of all queues without stats. + /// + /// + /// + /// + public static IReadOnlyList GetQueuesWithoutStats( + this IManagementClient client, + CancellationToken cancellationToken = default + ) => client.GetQueuesWithoutStatsAsync(cancellationToken).GetAwaiter().GetResult(); + /// /// A list of all bindings. /// @@ -1658,13 +1758,13 @@ public static Parameter GetShovel( string vhostName, string shovelName, CancellationToken cancellationToken = default - ) - { - return client.GetParameterAsync(vhostName, "shovel", shovelName, cancellationToken) - .GetAwaiter() - .GetResult(); + ) + { + return client.GetParameterAsync(vhostName, "shovel", shovelName, cancellationToken) + .GetAwaiter() + .GetResult(); } - + /// /// Creates a federation upstream in a specific vhost /// @@ -1680,7 +1780,7 @@ public static Task CreateFederationUpstreamAsync( ParameterFederationValue federationUpstreamDescription, CancellationToken cancellationToken = default ) => client.CreateParameterAsync("federation-upstream", vhostName, federationUpstreamName, federationUpstreamDescription, cancellationToken); - + /// /// Creates a federation upstream in a specific vhost /// @@ -1695,11 +1795,11 @@ public static void CreateFederationUpstream( string federationUpstreamName, ParameterFederationValue federationUpstreamDescription, CancellationToken cancellationToken = default - ) - { + ) + { client.CreateParameterAsync("federation-upstream", vhostName, federationUpstreamName, federationUpstreamDescription, cancellationToken) .GetAwaiter() - .GetResult(); + .GetResult(); } /// @@ -1728,10 +1828,10 @@ public static Parameter GetFederationUpstream( string vhostName, string federationUpstreamName, CancellationToken cancellationToken = default - ) - { - return client.GetParameterAsync(vhostName, "federation-upstream", federationUpstreamName, cancellationToken) - .GetAwaiter() - .GetResult(); + ) + { + return client.GetParameterAsync(vhostName, "federation-upstream", federationUpstreamName, cancellationToken) + .GetAwaiter() + .GetResult(); } } diff --git a/Source/EasyNetQ.Management.Client/Model/Connection.cs b/Source/EasyNetQ.Management.Client/Model/Connection.cs index d9bdbd8b..dd29acac 100755 --- a/Source/EasyNetQ.Management.Client/Model/Connection.cs +++ b/Source/EasyNetQ.Management.Client/Model/Connection.cs @@ -1,4 +1,4 @@ -using System.Text.Json.Serialization; +using System.Text.Json.Serialization; using EasyNetQ.Management.Client.Serialization; namespace EasyNetQ.Management.Client.Model; @@ -9,7 +9,7 @@ public record Connection( long SendOct, long SendCnt, long SendPend, - string State, + string? State, string? LastBlockedBy, string? LastBlockedAge, long Channels, @@ -18,13 +18,13 @@ public record Connection( string Name, string? Address, int Port, - string PeerHost, + string? PeerHost, int PeerPort, bool Ssl, string? PeerCertSubject, string? PeerCertIssuer, string? PeerCertValidity, - string AuthMechanism, + string? AuthMechanism, string? SslProtocol, string? SslKeyExchange, string? SslCipher, diff --git a/Source/EasyNetQ.Management.Client/Model/PolicyDefinition.cs b/Source/EasyNetQ.Management.Client/Model/PolicyDefinition.cs index d04c3687..52c7d51e 100644 --- a/Source/EasyNetQ.Management.Client/Model/PolicyDefinition.cs +++ b/Source/EasyNetQ.Management.Client/Model/PolicyDefinition.cs @@ -67,4 +67,8 @@ public record PolicyDefinition [property: JsonPropertyName("queue-mode")] string? QueueMode = null -); +) +{ + [JsonExtensionData()] + public Dictionary? ExtensionData { get; set; } +}; diff --git a/Source/EasyNetQ.Management.Client/Model/Queue.cs b/Source/EasyNetQ.Management.Client/Model/Queue.cs index 02c0df6a..cd5240f5 100755 --- a/Source/EasyNetQ.Management.Client/Model/Queue.cs +++ b/Source/EasyNetQ.Management.Client/Model/Queue.cs @@ -1,33 +1,39 @@ using System.Text.Json.Serialization; -using EasyNetQ.Management.Client.Serialization; namespace EasyNetQ.Management.Client.Model; public record Queue( + string Name, + string Vhost, + QueueType Type, + string? Node, + string? State, + IReadOnlyDictionary Arguments, + bool Durable, + bool Exclusive, + bool AutoDelete, + long MessagesReady, + long MessagesUnacknowledged, + long Messages, + long Memory, string? IdleSince, string? Policy, string? ExclusiveConsumerTag, - long MessagesReady, - long MessagesUnacknowledged, - long Messages, + long MessageBytes, long Consumers, long ActiveConsumers, BackingQueueStatus? BackingQueueStatus, IReadOnlyList? ConsumerDetails, long? HeadMessageTimestamp, - string Name, - string Vhost, - bool Durable, - bool Exclusive, - bool AutoDelete, - [property: JsonConverter(typeof(StringObjectReadOnlyDictionaryConverter))] - IReadOnlyDictionary Arguments, - string? Node, IReadOnlyList? SlaveNodes, IReadOnlyList? SynchronisedSlaveNodes, LengthsDetails? MessagesDetails, LengthsDetails? MessagesReadyDetails, LengthsDetails? MessagesUnacknowledgedDetails, MessageStats? MessageStats -); +) : QueueWithoutStats(Name, Vhost, Type, Node, State, Arguments, Durable, Exclusive, AutoDelete, MessagesReady, MessagesUnacknowledged, Messages) +{ + [JsonExtensionData()] + public Dictionary? ExtensionData { get; set; } +}; diff --git a/Source/EasyNetQ.Management.Client/Model/QueueType.cs b/Source/EasyNetQ.Management.Client/Model/QueueType.cs new file mode 100644 index 00000000..404f66a9 --- /dev/null +++ b/Source/EasyNetQ.Management.Client/Model/QueueType.cs @@ -0,0 +1,8 @@ +namespace EasyNetQ.Management.Client.Model; + +public enum QueueType +{ + Classic, + Quorum, + Stream +} diff --git a/Source/EasyNetQ.Management.Client/Model/QueueWithoutStats.cs b/Source/EasyNetQ.Management.Client/Model/QueueWithoutStats.cs new file mode 100644 index 00000000..2c398975 --- /dev/null +++ b/Source/EasyNetQ.Management.Client/Model/QueueWithoutStats.cs @@ -0,0 +1,21 @@ +using System.Text.Json.Serialization; +using EasyNetQ.Management.Client.Serialization; + +namespace EasyNetQ.Management.Client.Model; + +public record QueueWithoutStats( + string Name, + string Vhost, + + QueueType Type, + string? Node, + string? State, + [property: JsonConverter(typeof(StringObjectReadOnlyDictionaryConverter))] + IReadOnlyDictionary Arguments, + bool Durable, + bool Exclusive, + bool AutoDelete, + long MessagesReady, + long MessagesUnacknowledged, + long Messages +) : QueueName(Name, Vhost);