From 4b53983ff939a7b5a6a4a90ec027117869b5770d Mon Sep 17 00:00:00 2001 From: Neil South <104848880+neildsouth@users.noreply.github.com> Date: Mon, 7 Aug 2023 19:19:15 +0100 Subject: [PATCH 1/9] Release/0.1.24 (#209) +semver: patch * adding new fields to messages for external app executions Signed-off-by: Neil South * added forgot licence header Signed-off-by: Neil South * added export request to export cmplete message event Signed-off-by: Neil South * Update ExportRequestEvent and update dependencies (#210) * Update dependencies * Remove ExportRequestType enum and replace with a list of plug-in assembly names * Update dependencies decisions * Include taskId in WorkflowRequestEvent to support multiple external app executions Signed-off-by: Victor Chang --------- Signed-off-by: Neil South Signed-off-by: Victor Chang Co-authored-by: Victor Chang --- doc/dependency_decisions.yml | 54 ++++---- .../API/IMessageBrokerSubscriberService.cs | 24 ---- src/Messaging/Common/ServiceException.cs | 39 ++++++ src/Messaging/Events/ExportCompleteEvent.cs | 6 +- src/Messaging/Events/ExportRequestEvent.cs | 9 ++ src/Messaging/Events/WorkflowRequestEvent.cs | 16 +++ src/Messaging/Monai.Deploy.Messaging.csproj | 4 +- .../IServiceCollectionExtensionsTests.cs | 3 + .../Tests/Monai.Deploy.Messaging.Tests.csproj | 8 +- .../Tests/WorkflowRequestMessageTest.cs | 4 +- .../Factory/RabbitMqConnectionFactory.cs | 10 +- .../Monai.Deploy.Messaging.RabbitMQ.csproj | 4 +- .../RabbitMqMessagePublisherService.cs | 8 +- .../RabbitMqMessageSubscriberService.cs | 51 +++---- ...nai.Deploy.Messaging.RabbitMQ.Tests.csproj | 12 +- .../RabbitMqMessageSubscriberServiceTest.cs | 10 +- third-party-licenses.md | 124 +++++++++--------- 17 files changed, 212 insertions(+), 174 deletions(-) create mode 100644 src/Messaging/Common/ServiceException.cs mode change 100644 => 100755 src/Messaging/Events/ExportCompleteEvent.cs mode change 100644 => 100755 src/Messaging/Events/ExportRequestEvent.cs mode change 100644 => 100755 src/Messaging/Events/WorkflowRequestEvent.cs diff --git a/doc/dependency_decisions.yml b/doc/dependency_decisions.yml index 4e2afb6..39508bf 100755 --- a/doc/dependency_decisions.yml +++ b/doc/dependency_decisions.yml @@ -4,7 +4,7 @@ - :who: mocsharp :why: MIT (https://github.com/ardalis/GuardClauses.Analyzers/raw/master/LICENSE) :versions: - - 4.0.1 + - 4.1.1 :when: 2022-08-16 21:39:30.077666354 Z - - :approve - Castle.Core @@ -23,10 +23,10 @@ - - :approve - Microsoft.CodeCoverage - :who: woodheadio - :why: MIT (https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) + :why: MIT (https://github.com/microsoft/vstest/raw/v17.7.0/LICENSE) :versions: - - 17.4.1 - - 17.5.0 + - 17.7.0 + - Microsoft.CodeCoverage :when: 2023-08-16 16:49:26.950721112 Z - - :approve - Microsoft.Extensions.Diagnostics.HealthChecks @@ -34,7 +34,7 @@ :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) :versions: - 6.0.12 - - 6.0.14 + - 6.0.20 :when: 2023-08-16 16:49:26.950721112 Z - - :approve - Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions @@ -42,7 +42,7 @@ :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) :versions: - 6.0.12 - - 6.0.14 + - 6.0.20 :when: 2023-08-16 16:49:26.950721112 Z - - :approve - Microsoft.Extensions.Configuration @@ -162,7 +162,7 @@ - :who: mocsharp :why: MIT (https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) :versions: - - 6.0.3 + - 6.0.4 :when: 2022-08-16 21:39:44.471693654 Z - - :approve - Microsoft.Extensions.Logging.Configuration @@ -223,9 +223,9 @@ - - :approve - Microsoft.NET.Test.Sdk - :who: woodheadio - :why: MIT (https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) + :why: MIT (https://github.com/microsoft/vstest/raw/v17.7.0/LICENSE) :versions: - - 17.4.1 + - 17.7.0 - 17.5.0 :when: 2023-08-16 16:49:26.950721112 Z - - :approve @@ -245,17 +245,17 @@ - - :approve - Microsoft.TestPlatform.ObjectModel - :who: woodheadio - :why: MIT (https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) + :why: MIT (https://github.com/microsoft/vstest/raw/v17.7.0/LICENSE) :versions: - - 17.4.1 + - 17.7.0 - 17.5.0 :when: 2023-08-16 16:49:26.950721112 Z - - :approve - Microsoft.TestPlatform.TestHost - :who: woodheadio - :why: MIT (https://github.com/microsoft/vstest/raw/v17.4.1/LICENSE) + :why: MIT (https://github.com/microsoft/vstest/raw/v17.7.0/LICENSE) :versions: - - 17.4.1 + - 17.7.0 - 17.5.0 :when: 2023-08-16 16:49:26.950721112 Z - - :approve @@ -292,14 +292,14 @@ - :who: mocsharp :why: Apache-2.0 (https://github.com/NuGet/NuGet.Client/raw/dev/LICENSE.txt) :versions: - - 5.11.0 + - 6.5.0 :when: 2022-08-16 21:39:52.061412838 Z - - :approve - RabbitMQ.Client - :who: mocsharp :why: Apache-2.0 (https://github.com/rabbitmq/rabbitmq-dotnet-client/raw/main/LICENSE-APACHE2) :versions: - - 6.4.0 + - 6.5.0 :when: 2022-08-16 21:39:52.474284611 Z - - :approve - System.AppContext @@ -481,7 +481,7 @@ - :who: mocsharp :why: MIT (https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) :versions: - - 4.5.4 + - 4.5.5 :when: 2022-08-16 21:40:03.543731192 Z - - :approve - System.Net.Http @@ -740,7 +740,7 @@ - :who: mocsharp :why: MIT ( https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) :versions: - - 4.7.1 + - 7.0.0 :when: 2022-08-16 21:40:19.306691187 Z - - :approve - System.Threading.Tasks @@ -782,7 +782,7 @@ - :who: mocsharp :why: MIT (https://github.com/coverlet-coverage/coverlet/raw/master/LICENSE) :versions: - - 3.2.0 + - 6.0.0 :when: 2022-08-16 21:40:21.855388365 Z - - :approve - runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl @@ -901,7 +901,7 @@ - :who: mocsharp :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) :versions: - - 2.4.2 + - 2.5.0 :when: 2022-08-16 21:40:29.166018542 Z - - :approve - xunit.abstractions @@ -915,49 +915,49 @@ - :who: mocsharp :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit.analyzers/master/LICENSE) :versions: - - 1.0.0 + - 1.2.0 :when: 2022-08-16 21:40:30.047067134 Z - - :approve - xunit.assert - :who: mocsharp :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) :versions: - - 2.4.2 + - 2.5.0 :when: 2022-08-16 21:40:30.526718458 Z - - :approve - xunit.core - :who: mocsharp :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) :versions: - - 2.4.2 + - 2.5.0 :when: 2022-08-16 21:40:30.973515441 Z - - :approve - xunit.extensibility.core - :who: mocsharp :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) :versions: - - 2.4.2 + - 2.5.0 :when: 2022-08-16 21:40:31.401607230 Z - - :approve - xunit.extensibility.execution - :who: mocsharp :why: Apache-2.0 ( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) :versions: - - 2.4.2 + - 2.5.0 :when: 2022-08-16 21:40:31.845685693 Z - - :approve - xunit.runner.visualstudio - :who: mocsharp :why: MIT ( https://licenses.nuget.org/MIT) :versions: - - 2.4.5 + - 2.5.0 :when: 2022-08-16 21:40:32.294717110 Z - - :approve - Polly - :who: mocsharp :why: MIT ( https://licenses.nuget.org/MIT) :versions: - - 7.2.3 + - 7.2.4 :when: 2022-11-09 18:57:32.294717110 Z - - :approve - Microsoft.AspNetCore.Hosting.Abstractions @@ -993,7 +993,7 @@ :why: MIT (https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) :versions: - 6.0.12 - - 6.0.14 + - 6.0.20 :when: 2023-08-16 16:49:26.950721112 Z - - :approve - System.IO.Pipelines diff --git a/src/Messaging/API/IMessageBrokerSubscriberService.cs b/src/Messaging/API/IMessageBrokerSubscriberService.cs index 49c4613..e43de1e 100755 --- a/src/Messaging/API/IMessageBrokerSubscriberService.cs +++ b/src/Messaging/API/IMessageBrokerSubscriberService.cs @@ -31,30 +31,6 @@ public interface IMessageBrokerSubscriberService : IDisposable /// string Name { get; } - /// - /// Subscribe to a message topic & queue and executes messageReceivedCallback for every message that is received. - /// Either provide a topic, a queue or both. - /// A queue is generated if the name of the queue is not provided. - /// - /// Topic/routing key to bind to - /// Name of the queue to consume - /// Action to be performed when message is received - /// Number of unacknowledged messages to receive at once. Defaults to 0. - [Obsolete("This method is obsolete, use SubscribeAsync instead")] - void Subscribe(string topic, string queue, Action messageReceivedCallback, ushort prefetchCount = 0); - - /// - /// Subscribe to a message topic & queue and executes messageReceivedCallback for every message that is received. - /// Either provide a topic, a queue or both. - /// A queue is generated if the name of the queue is not provided. - /// - /// Topics/routing keys to bind to - /// Name of the queue to consume - /// Action to be performed when message is received - /// Number of unacknowledged messages to receive at once. Defaults to 0. - [Obsolete("This method is obsolete, use SubscribeAsync instead")] - void Subscribe(string[] topics, string queue, Action messageReceivedCallback, ushort prefetchCount = 0); - /// /// Subscribe to a message topic & queue and executes messageReceivedCallback asynchronously for every message that is received. /// Either provide a topic, a queue or both. diff --git a/src/Messaging/Common/ServiceException.cs b/src/Messaging/Common/ServiceException.cs new file mode 100644 index 0000000..6bdaf30 --- /dev/null +++ b/src/Messaging/Common/ServiceException.cs @@ -0,0 +1,39 @@ +/* + * Copyright 2023 MONAI Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System.Runtime.Serialization; + +namespace Monai.Deploy.Messaging.Common +{ + public class ServiceException : Exception + { + public ServiceException() + { + } + + public ServiceException(string? message) : base(message) + { + } + + public ServiceException(string? message, Exception? innerException) : base(message, innerException) + { + } + + protected ServiceException(SerializationInfo info, StreamingContext context) : base(info, context) + { + } + } +} diff --git a/src/Messaging/Events/ExportCompleteEvent.cs b/src/Messaging/Events/ExportCompleteEvent.cs old mode 100644 new mode 100755 index fe0d2e7..1af942e --- a/src/Messaging/Events/ExportCompleteEvent.cs +++ b/src/Messaging/Events/ExportCompleteEvent.cs @@ -66,9 +66,9 @@ public ExportCompleteEvent() public ExportCompleteEvent(ExportRequestEvent exportRequest, ExportStatus exportStatus, Dictionary fileStatuses) { - Guard.Against.Null(exportRequest); - Guard.Against.Null(exportStatus); - Guard.Against.Null(fileStatuses); + Guard.Against.Null(exportRequest, nameof(exportRequest)); + Guard.Against.Null(exportStatus, nameof(exportStatus)); + Guard.Against.Null(fileStatuses, nameof(fileStatuses)); WorkflowInstanceId = exportRequest.WorkflowInstanceId; ExportTaskId = exportRequest.ExportTaskId; diff --git a/src/Messaging/Events/ExportRequestEvent.cs b/src/Messaging/Events/ExportRequestEvent.cs old mode 100644 new mode 100755 index 71388f3..f6bfef9 --- a/src/Messaging/Events/ExportRequestEvent.cs +++ b/src/Messaging/Events/ExportRequestEvent.cs @@ -75,9 +75,18 @@ public class ExportRequestEvent : EventBase /// public List ErrorMessages { get; private set; } + /// + /// A list of data output plug-in type names to be executed by the export services. + /// Each string must be a fully-qualified type name. + /// E.g. MyCompnay.MyProject.MyNamepsace.MyPlugin, MyCompnay.MyProject.MyNamepsace where + /// MyCompnay.MyProject.MyNamepsace is the name of the assembly (DLL). + /// + public List PluginAssemblies { get; private set; } + public ExportRequestEvent() { ErrorMessages = new List(); + PluginAssemblies = new List(); } public void AddErrorMessages(IList errorMessages) diff --git a/src/Messaging/Events/WorkflowRequestEvent.cs b/src/Messaging/Events/WorkflowRequestEvent.cs old mode 100644 new mode 100755 index b437233..1f0be31 --- a/src/Messaging/Events/WorkflowRequestEvent.cs +++ b/src/Messaging/Events/WorkflowRequestEvent.cs @@ -81,6 +81,22 @@ public class WorkflowRequestEvent : EventBase [Required] public DateTime Timestamp { get; set; } + /// + /// Sets the workflow instance ID for the Workflow Manager. + /// This is only applicable to resume events (after external app executions) + /// In standard workflows this will not be set + /// + [JsonProperty(PropertyName = "workflow_instance_id")] + public string? WorkflowInstanceId { get; set; } = default; + + /// + /// Sets the task ID for the Workflow Manager. + /// This is only applicable to resume events (after external app executions) + /// In standard workflows this will not be set + /// + [JsonProperty(PropertyName = "task_id")] + public string? TaskId { get; set; } = default; + /// /// Gets or sets a list of files and metadata files in this request. /// diff --git a/src/Messaging/Monai.Deploy.Messaging.csproj b/src/Messaging/Monai.Deploy.Messaging.csproj index edade87..70325b7 100644 --- a/src/Messaging/Monai.Deploy.Messaging.csproj +++ b/src/Messaging/Monai.Deploy.Messaging.csproj @@ -74,9 +74,9 @@ - + - + diff --git a/src/Messaging/Tests/IServiceCollectionExtensionsTests.cs b/src/Messaging/Tests/IServiceCollectionExtensionsTests.cs index 6c9042a..473ef81 100644 --- a/src/Messaging/Tests/IServiceCollectionExtensionsTests.cs +++ b/src/Messaging/Tests/IServiceCollectionExtensionsTests.cs @@ -203,7 +203,10 @@ internal class GoodSubscriberService : IMessageBrokerSubscriberService { public string Name => throw new NotImplementedException(); +#pragma warning disable CS0067 // The event 'GoodSubscriberService.OnConnectionError' is never used + // event used by users of this library public event ConnectionErrorHandler? OnConnectionError; +#pragma warning restore CS0067 // The event 'GoodSubscriberService.OnConnectionError' is never used public void Acknowledge(MessageBase message) => throw new NotImplementedException(); diff --git a/src/Messaging/Tests/Monai.Deploy.Messaging.Tests.csproj b/src/Messaging/Tests/Monai.Deploy.Messaging.Tests.csproj index 35ddd1f..c1e398d 100644 --- a/src/Messaging/Tests/Monai.Deploy.Messaging.Tests.csproj +++ b/src/Messaging/Tests/Monai.Deploy.Messaging.Tests.csproj @@ -32,14 +32,14 @@ - + - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/Messaging/Tests/WorkflowRequestMessageTest.cs b/src/Messaging/Tests/WorkflowRequestMessageTest.cs index 09729b6..dcec857 100644 --- a/src/Messaging/Tests/WorkflowRequestMessageTest.cs +++ b/src/Messaging/Tests/WorkflowRequestMessageTest.cs @@ -36,7 +36,9 @@ public void ConvertsJsonMessageToMessage() FileCount = 10, PayloadId = Guid.NewGuid(), Timestamp = DateTime.Now, - Workflows = new List { Guid.NewGuid().ToString() } + Workflows = new List { Guid.NewGuid().ToString() }, + WorkflowInstanceId = Guid.NewGuid().ToString(), + TaskId = Guid.NewGuid().ToString(), }; var files = new List() diff --git a/src/Plugins/RabbitMQ/Factory/RabbitMqConnectionFactory.cs b/src/Plugins/RabbitMQ/Factory/RabbitMqConnectionFactory.cs index 5fcf592..9fa63cd 100755 --- a/src/Plugins/RabbitMQ/Factory/RabbitMqConnectionFactory.cs +++ b/src/Plugins/RabbitMQ/Factory/RabbitMqConnectionFactory.cs @@ -48,10 +48,10 @@ public RabbitMQConnectionFactory(ILogger logger) public IModel CreateChannel(ChannelType type, string hostName, string username, string password, string virtualHost, string useSSL, string portNumber) { - Guard.Against.NullOrWhiteSpace(hostName); - Guard.Against.NullOrWhiteSpace(username); - Guard.Against.NullOrWhiteSpace(password); - Guard.Against.NullOrWhiteSpace(virtualHost); + Guard.Against.NullOrWhiteSpace(hostName, nameof(hostName)); + Guard.Against.NullOrWhiteSpace(username, nameof(username)); + Guard.Against.NullOrWhiteSpace(password, nameof(password)); + Guard.Against.NullOrWhiteSpace(virtualHost, nameof(virtualHost)); var key = $"{type}{hostName}{username}{HashPassword(password)}{virtualHost}"; @@ -154,7 +154,7 @@ private IConnection CreateConnectionOnly(string hostName, string username, strin private static object HashPassword(string password) { - Guard.Against.NullOrWhiteSpace(password); + Guard.Against.NullOrWhiteSpace(password, nameof(password)); var sha256 = SHA256.Create(); var hash = sha256.ComputeHash(Encoding.UTF8.GetBytes(password)); return string.Join("", hash.Select(x => x.ToString("x2", CultureInfo.InvariantCulture))); diff --git a/src/Plugins/RabbitMQ/Monai.Deploy.Messaging.RabbitMQ.csproj b/src/Plugins/RabbitMQ/Monai.Deploy.Messaging.RabbitMQ.csproj index 85fa9c6..5451616 100644 --- a/src/Plugins/RabbitMQ/Monai.Deploy.Messaging.RabbitMQ.csproj +++ b/src/Plugins/RabbitMQ/Monai.Deploy.Messaging.RabbitMQ.csproj @@ -63,8 +63,8 @@ - - + + diff --git a/src/Plugins/RabbitMQ/Publisher/RabbitMqMessagePublisherService.cs b/src/Plugins/RabbitMQ/Publisher/RabbitMqMessagePublisherService.cs index 5059ec9..cf49876 100755 --- a/src/Plugins/RabbitMQ/Publisher/RabbitMqMessagePublisherService.cs +++ b/src/Plugins/RabbitMQ/Publisher/RabbitMqMessagePublisherService.cs @@ -49,7 +49,7 @@ public RabbitMQMessagePublisherService(IOptions logger, IRabbitMQConnectionFactory rabbitMqConnectionFactory) { - Guard.Against.Null(options); + Guard.Against.Null(options, nameof(options)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _rabbitMqConnectionFactory = rabbitMqConnectionFactory ?? throw new ArgumentNullException(nameof(rabbitMqConnectionFactory)); @@ -83,7 +83,7 @@ public RabbitMQMessagePublisherService(IOptions configuration) { - Guard.Against.Null(configuration); + Guard.Against.Null(configuration, nameof(configuration)); foreach (var key in ConfigurationKeys.PublisherRequiredKeys) { @@ -96,8 +96,8 @@ internal static void ValidateConfiguration(Dictionary configurat public Task Publish(string topic, Message message) { - Guard.Against.NullOrWhiteSpace(topic); - Guard.Against.Null(message); + Guard.Against.NullOrWhiteSpace(topic, nameof(topic)); + Guard.Against.Null(message, nameof(message)); using var loggingScope = _logger.BeginScope(new LoggingDataDictionary { diff --git a/src/Plugins/RabbitMQ/Subscriber/RabbitMqMessageSubscriberService.cs b/src/Plugins/RabbitMQ/Subscriber/RabbitMqMessageSubscriberService.cs index e96603d..cc70e32 100755 --- a/src/Plugins/RabbitMQ/Subscriber/RabbitMqMessageSubscriberService.cs +++ b/src/Plugins/RabbitMQ/Subscriber/RabbitMqMessageSubscriberService.cs @@ -58,7 +58,7 @@ public RabbitMQMessageSubscriberService(IOptions logger, IRabbitMQConnectionFactory rabbitMqConnectionFactory) { - Guard.Against.Null(options); + Guard.Against.Null(options, nameof(options)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _rabbitMqConnectionFactory = rabbitMqConnectionFactory ?? throw new ArgumentNullException(nameof(rabbitMqConnectionFactory)); @@ -109,7 +109,7 @@ private void CreateChannel() .Execute(() => { _logger.ConnectingToRabbitMQ(Name, _endpoint, _virtualHost); - _channel = _rabbitMqConnectionFactory.CreateChannel(ChannelType.Subscriber, _endpoint, _username, _password, _virtualHost, _useSSL, _portNumber); + _channel = _rabbitMqConnectionFactory.CreateChannel(ChannelType.Subscriber, _endpoint, _username, _password, _virtualHost, _useSSL, _portNumber) ?? throw new ServiceException("Failed to create a new channel to RabbitMQ"); _channel.ExchangeDeclare(_exchange, ExchangeType.Topic, durable: true, autoDelete: false); _channel.ExchangeDeclare(_deadLetterExchange, ExchangeType.Topic, durable: true, autoDelete: false); _channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false); @@ -137,7 +137,7 @@ private void Channel_ModelShutdown(object? sender, ShutdownEventArgs e) internal static void ValidateConfiguration(Dictionary configuration) { - Guard.Against.Null(configuration); + Guard.Against.Null(configuration, nameof(configuration)); foreach (var key in ConfigurationKeys.SubscriberRequiredKeys) { @@ -162,23 +162,14 @@ internal static void ValidateConfiguration(Dictionary configurat throw new ConfigurationException($"{ConfigurationKeys.SubscriberServiceName} has int values of less than 1"); } } - [Obsolete("This method is obsolete, use SubscribeAsync instead")] - public void Subscribe(string topic, string queue, Action messageReceivedCallback, ushort prefetchCount = 0) - => Subscribe(new string[] { topic }, queue, messageReceivedCallback, prefetchCount); - - [Obsolete("This method is obsolete, use SubscribeAsync instead")] - public void Subscribe(string[] topics, string queue, Action messageReceivedCallback, ushort prefetchCount = 0) - { - SubscribeAsync(topics, queue, new Func((args) => { messageReceivedCallback.Invoke(args); return Task.FromResult(0); })); - } public void SubscribeAsync(string topic, string queue, Func messageReceivedCallback, ushort prefetchCount = 0) => SubscribeAsync(new string[] { topic }, queue, messageReceivedCallback, prefetchCount); public void SubscribeAsync(string[] topics, string queue, Func messageReceivedCallback, ushort prefetchCount = 0) { - Guard.Against.Null(topics); - Guard.Against.Null(messageReceivedCallback); + Guard.Against.Null(topics, nameof(topics)); + Guard.Against.Null(messageReceivedCallback, nameof(messageReceivedCallback)); var queueDeclareResult = DeclareQueues(topics, queue, prefetchCount); var consumer = CreateConsumer(messageReceivedCallback, queueDeclareResult); @@ -212,7 +203,7 @@ private EventingBasicConsumer CreateConsumer(Func - + - + - - + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/Plugins/RabbitMQ/Tests/Unit/RabbitMqMessageSubscriberServiceTest.cs b/src/Plugins/RabbitMQ/Tests/Unit/RabbitMqMessageSubscriberServiceTest.cs index 72a369c..7e3412a 100755 --- a/src/Plugins/RabbitMQ/Tests/Unit/RabbitMqMessageSubscriberServiceTest.cs +++ b/src/Plugins/RabbitMQ/Tests/Unit/RabbitMqMessageSubscriberServiceTest.cs @@ -133,7 +133,7 @@ public void SubscribesToATopic() var service = new RabbitMQMessageSubscriberService(_options, _logger.Object, _connectionFactory.Object); - service.Subscribe("topic", "queue", (args) => + service.SubscribeAsync("topic", "queue", async (args) => { Assert.Equal(message.ApplicationId, args.Message.ApplicationId); Assert.Equal(message.ContentType, args.Message.ContentType); @@ -143,6 +143,7 @@ public void SubscribesToATopic() Assert.Equal("topic", args.Message.MessageDescription); Assert.Equal(message.MessageId, args.Message.MessageId); Assert.Equal(message.Body, args.Message.Body); + await Task.CompletedTask.ConfigureAwait(false); }); service.SubscribeAsync("topic", "queue", async (args) => @@ -240,7 +241,7 @@ public void SubscribesToATopicAndDeadLetterQueueIsDown() var service = new RabbitMQMessageSubscriberService(_options, _logger.Object, _connectionFactory.Object); - service.Subscribe("topic", "queue", (args) => + service.SubscribeAsync("topic", "queue", async (args) => { Assert.Equal(message.ApplicationId, args.Message.ApplicationId); Assert.Equal(message.ContentType, args.Message.ContentType); @@ -250,6 +251,7 @@ public void SubscribesToATopicAndDeadLetterQueueIsDown() Assert.Equal("topic", args.Message.MessageDescription); Assert.Equal(message.MessageId, args.Message.MessageId); Assert.Equal(message.Body, args.Message.Body); + await Task.CompletedTask; }); service.SubscribeAsync("topic", "queue", async (args) => @@ -349,7 +351,7 @@ public void SubscribesToATopicAndDeadLetterQueueSubscriptionFailsWithGenericExce var act = () => { - service.Subscribe("topic", "queue", (args) => + service.SubscribeAsync("topic", "queue", async (args) => { Assert.Equal(message.ApplicationId, args.Message.ApplicationId); Assert.Equal(message.ContentType, args.Message.ContentType); @@ -359,7 +361,7 @@ public void SubscribesToATopicAndDeadLetterQueueSubscriptionFailsWithGenericExce Assert.Equal("topic", args.Message.MessageDescription); Assert.Equal(message.MessageId, args.Message.MessageId); Assert.Equal(message.Body, args.Message.Body); - + await Task.CompletedTask; }); }; Assert.Throws(act); diff --git a/third-party-licenses.md b/third-party-licenses.md index 83f195d..5b4ad43 100644 --- a/third-party-licenses.md +++ b/third-party-licenses.md @@ -61,14 +61,14 @@ SOFTWARE.
-Ardalis.GuardClauses 4.0.1 +Ardalis.GuardClauses 4.1.1 ## Ardalis.GuardClauses -- Version: 4.0.1 +- Version: 4.1.1 - Authors: Steve Smith (@ardalis) - Project URL: https://github.com/ardalis/guardclauses -- Source: [NuGet](https://www.nuget.org/packages/Ardalis.GuardClauses/4.0.1) +- Source: [NuGet](https://www.nuget.org/packages/Ardalis.GuardClauses/4.1.1) - License: [MIT](https://github.com/ardalis/GuardClauses.Analyzers/raw/master/LICENSE) @@ -171,15 +171,15 @@ SOFTWARE.
-Microsoft.CodeCoverage 17.4.0 +Microsoft.CodeCoverage 17.7.0 ## Microsoft.CodeCoverage -- Version: 17.4.0 +- Version: 17.7.0 - Authors: Microsoft - Owners: Microsoft - Project URL: https://github.com/microsoft/vstest/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.CodeCoverage/17.4.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.CodeCoverage/17.7.0) - License: [MIT](https://github.com/microsoft/vstest/raw/v17.3.0/LICENSE) @@ -619,14 +619,14 @@ SOFTWARE.
-Microsoft.Extensions.Diagnostics.HealthChecks 6.0.11 +Microsoft.Extensions.Diagnostics.HealthChecks 6.0.20 ## Microsoft.Extensions.Diagnostics.HealthChecks -- Version: 6.0.11 +- Version: 6.0.20 - Authors: Microsoft - Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks/6.0.11) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks/6.0.20) - License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) @@ -660,14 +660,14 @@ SOFTWARE.
-Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions 6.0.11 +Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions 6.0.20 ## Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions -- Version: 6.0.11 +- Version: 6.0.20 - Authors: Microsoft - Project URL: https://asp.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions/6.0.11) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions/6.0.20) - License: [MIT](https://github.com/dotnet/aspnetcore/raw/main/LICENSE.txt) @@ -947,14 +947,14 @@ SOFTWARE.
-Microsoft.Extensions.Logging.Abstractions 6.0.3 +Microsoft.Extensions.Logging.Abstractions 6.0.4 ## Microsoft.Extensions.Logging.Abstractions -- Version: 6.0.3 +- Version: 6.0.4 - Authors: Microsoft - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Abstractions/6.0.3) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.Extensions.Logging.Abstractions/6.0.4) - License: [MIT](https://github.com/dotnet/runtime/raw/main/LICENSE.TXT) @@ -1316,15 +1316,15 @@ SOFTWARE.
-Microsoft.NET.Test.Sdk 17.4.0 +Microsoft.NET.Test.Sdk 17.7.0 ## Microsoft.NET.Test.Sdk -- Version: 17.4.0 +- Version: 17.7.0 - Authors: Microsoft - Owners: Microsoft - Project URL: https://github.com/microsoft/vstest/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.NET.Test.Sdk/17.4.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.NET.Test.Sdk/17.7.0) - License: [MIT](https://github.com/microsoft/vstest/raw/v17.3.1/LICENSE) @@ -1754,15 +1754,15 @@ consequential or other damages.
-Microsoft.TestPlatform.ObjectModel 17.4.0 +Microsoft.TestPlatform.ObjectModel 17.7.0 ## Microsoft.TestPlatform.ObjectModel -- Version: 17.4.0 +- Version: 17.7.0 - Authors: Microsoft - Owners: Microsoft - Project URL: https://github.com/microsoft/vstest/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform.ObjectModel/17.4.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform.ObjectModel/17.7.0) - License: [MIT](https://github.com/microsoft/vstest/raw/v17.3.1/LICENSE) @@ -1792,15 +1792,15 @@ SOFTWARE.
-Microsoft.TestPlatform.TestHost 17.4.0 +Microsoft.TestPlatform.TestHost 17.7.0 ## Microsoft.TestPlatform.TestHost -- Version: 17.4.0 +- Version: 17.7.0 - Authors: Microsoft - Owners: Microsoft - Project URL: https://github.com/microsoft/vstest/ -- Source: [NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform.TestHost/17.4.0) +- Source: [NuGet](https://www.nuget.org/packages/Microsoft.TestPlatform.TestHost/17.7.0) - License: [MIT](https://github.com/microsoft/vstest/raw/v17.3.1/LICENSE) @@ -2315,14 +2315,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-NuGet.Frameworks 5.11.0 +NuGet.Frameworks 6.5.0 ## NuGet.Frameworks -- Version: 5.11.0 +- Version: 6.5.0 - Authors: Microsoft - Project URL: https://aka.ms/nugetprj -- Source: [NuGet](https://www.nuget.org/packages/NuGet.Frameworks/5.11.0) +- Source: [NuGet](https://www.nuget.org/packages/NuGet.Frameworks/6.5.0) - License: [Apache-2.0](https://github.com/NuGet/NuGet.Client/raw/dev/LICENSE.txt) @@ -2348,14 +2348,14 @@ specific language governing permissions and limitations under the License.
-Polly 7.2.3 +Polly 7.2.4 ## Polly -- Version: 7.2.3 +- Version: 7.2.4 - Authors: Michael Wolfenden, App vNext - Project URL: https://github.com/App-vNext/Polly -- Source: [NuGet](https://www.nuget.org/packages/Polly/7.2.3) +- Source: [NuGet](https://www.nuget.org/packages/Polly/7.2.4) - License: [MIT]( https://licenses.nuget.org/MIT) @@ -2380,14 +2380,14 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
-RabbitMQ.Client 6.4.0 +RabbitMQ.Client 6.5.0 ## RabbitMQ.Client -- Version: 6.4.0 +- Version: 6.5.0 - Authors: VMware - Project URL: https://www.rabbitmq.com/dotnet.html -- Source: [NuGet](https://www.nuget.org/packages/RabbitMQ.Client/6.4.0) +- Source: [NuGet](https://www.nuget.org/packages/RabbitMQ.Client/6.5.0) - License: [Apache-2.0](https://github.com/rabbitmq/rabbitmq-dotnet-client/raw/main/LICENSE-APACHE2) @@ -6489,15 +6489,15 @@ consequential or other damages.
-System.Memory 4.5.4 +System.Memory 4.5.5 ## System.Memory -- Version: 4.5.4 +- Version: 4.5.5 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://dot.net/ -- Source: [NuGet](https://www.nuget.org/packages/System.Memory/4.5.4) +- Source: [NuGet](https://www.nuget.org/packages/System.Memory/4.5.5) - License: [MIT](https://github.com/dotnet/corefx/raw/master/LICENSE.TXT) @@ -12613,15 +12613,15 @@ consequential or other damages.
-System.Threading.Channels 4.7.1 +System.Threading.Channels 7.0.0 ## System.Threading.Channels -- Version: 4.7.1 +- Version: 7.0.0 - Authors: Microsoft - Owners: microsoft,dotnetframework - Project URL: https://github.com/dotnet/corefx -- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Channels/4.7.1) +- Source: [NuGet](https://www.nuget.org/packages/System.Threading.Channels/7.0.0) - License: [MIT]( https://github.com/dotnet/corefx/blob/master/LICENSE.TXT) @@ -14740,14 +14740,14 @@ consequential or other damages.
-coverlet.collector 3.2.0 +coverlet.collector 6.0.0 ## coverlet.collector -- Version: 3.2.0 +- Version: 6.0.0 - Authors: tonerdo - Project URL: https://github.com/coverlet-coverage/coverlet -- Source: [NuGet](https://www.nuget.org/packages/coverlet.collector/3.2.0) +- Source: [NuGet](https://www.nuget.org/packages/coverlet.collector/6.0.0) - License: [MIT](https://github.com/coverlet-coverage/coverlet/raw/master/LICENSE) @@ -17983,9 +17983,9 @@ consequential or other damages. ## xunit -- Version: 2.4.2 +- Version: 2.5.0 - Authors: jnewkirk,bradwilson -- Source: [NuGet](https://www.nuget.org/packages/xunit/2.4.2) +- Source: [NuGet](https://www.nuget.org/packages/xunit/2.5.0) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) @@ -18111,13 +18111,13 @@ Both sets of code are covered by the following license:
-xunit.analyzers 1.0.0 +xunit.analyzers 1.2.0 ## xunit.analyzers -- Version: 1.0.0 +- Version: 1.2.0 - Authors: jnewkirk,bradwilson,marcind -- Source: [NuGet](https://www.nuget.org/packages/xunit.analyzers/1.0.0) +- Source: [NuGet](https://www.nuget.org/packages/xunit.analyzers/1.2.0) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit.analyzers/master/LICENSE) @@ -18142,13 +18142,13 @@ limitations under the License.
-xunit.assert 2.4.2 +xunit.assert 2.5.0 ## xunit.assert -- Version: 2.4.2 +- Version: 2.5.0 - Authors: jnewkirk,bradwilson -- Source: [NuGet](https://www.nuget.org/packages/xunit.assert/2.4.2) +- Source: [NuGet](https://www.nuget.org/packages/xunit.assert/2.5.0) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) @@ -18207,13 +18207,13 @@ Both sets of code are covered by the following license:
-xunit.core 2.4.2 +xunit.core 2.5.0 ## xunit.core -- Version: 2.4.2 +- Version: 2.5.0 - Authors: jnewkirk,bradwilson -- Source: [NuGet](https://www.nuget.org/packages/xunit.core/2.4.2) +- Source: [NuGet](https://www.nuget.org/packages/xunit.core/2.5.0) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) @@ -18272,13 +18272,13 @@ Both sets of code are covered by the following license:
-xunit.extensibility.core 2.4.2 +xunit.extensibility.core 2.5.0 ## xunit.extensibility.core -- Version: 2.4.2 +- Version: 2.5.0 - Authors: jnewkirk,bradwilson -- Source: [NuGet](https://www.nuget.org/packages/xunit.extensibility.core/2.4.2) +- Source: [NuGet](https://www.nuget.org/packages/xunit.extensibility.core/2.5.0) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) @@ -18337,13 +18337,13 @@ Both sets of code are covered by the following license:
-xunit.extensibility.execution 2.4.2 +xunit.extensibility.execution 2.5.0 ## xunit.extensibility.execution -- Version: 2.4.2 +- Version: 2.5.0 - Authors: jnewkirk,bradwilson -- Source: [NuGet](https://www.nuget.org/packages/xunit.extensibility.execution/2.4.2) +- Source: [NuGet](https://www.nuget.org/packages/xunit.extensibility.execution/2.5.0) - License: [Apache-2.0]( https://raw.githubusercontent.com/xunit/xunit/master/license.txt) @@ -18402,14 +18402,14 @@ Both sets of code are covered by the following license:
-xunit.runner.visualstudio 2.4.5 +xunit.runner.visualstudio 2.5.0 ## xunit.runner.visualstudio -- Version: 2.4.5 +- Version: 2.5.0 - Authors: .NET Foundation and Contributors - Project URL: https://github.com/xunit/visualstudio.xunit -- Source: [NuGet](https://www.nuget.org/packages/xunit.runner.visualstudio/2.4.5) +- Source: [NuGet](https://www.nuget.org/packages/xunit.runner.visualstudio/2.5.0) - License: [MIT]( https://licenses.nuget.org/MIT) From 7b828227bd3e26acd5295908fc77daef8e1b8489 Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Wed, 16 Aug 2023 09:07:46 -0700 Subject: [PATCH 2/9] Release/0.1.25 (#214) +semver: patch * Update dependency decisions Signed-off-by: Victor Chang * Release/0.1.24 (#209) (#213) +semver: patch * adding new fields to messages for external app executions * added forgot licence header * added export request to export cmplete message event * Update ExportRequestEvent and update dependencies (#210) * Update dependencies * Remove ExportRequestType enum and replace with a list of plug-in assembly names * Update dependencies decisions * Include taskId in WorkflowRequestEvent to support multiple external app executions --------- Signed-off-by: Neil South Signed-off-by: Victor Chang * Fix merge issues Signed-off-by: Victor Chang --------- Signed-off-by: Victor Chang Signed-off-by: Neil South --- src/Messaging/Events/ExportCompleteEvent.cs | 9 --------- .../RabbitMQ/Tests/Unit/ServiceRegistrationTest.cs | 5 ++--- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/Messaging/Events/ExportCompleteEvent.cs b/src/Messaging/Events/ExportCompleteEvent.cs index 432b8b5..7893189 100755 --- a/src/Messaging/Events/ExportCompleteEvent.cs +++ b/src/Messaging/Events/ExportCompleteEvent.cs @@ -58,15 +58,6 @@ public class ExportCompleteEvent : EventBase [JsonProperty(PropertyName = "file_statuses")] public Dictionary FileStatuses { get; set; } - /// - /// Gets or set the ExportRequest type. - /// For standard exports this will be ExportRequestType.None - /// but for exports to external apps this will be ExportRequestType.ExternalProcessing - /// - [JsonProperty(PropertyName = "export_request")] - [Required] - public ExportRequestType ExportRequest { get; set; } = default!; - [JsonConstructor] public ExportCompleteEvent() { diff --git a/src/Plugins/RabbitMQ/Tests/Unit/ServiceRegistrationTest.cs b/src/Plugins/RabbitMQ/Tests/Unit/ServiceRegistrationTest.cs index 67d142e..ac7b026 100644 --- a/src/Plugins/RabbitMQ/Tests/Unit/ServiceRegistrationTest.cs +++ b/src/Plugins/RabbitMQ/Tests/Unit/ServiceRegistrationTest.cs @@ -1,5 +1,5 @@ /* - * Copyright 2022 MONAI Consortium + * Copyright 2023 MONAI Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,8 +32,7 @@ public class ValidationTest [Fact(DisplayName = "Validates TaskUpdateEvent")] public void TaskUpdateEventTest() { - //var json = "{\"workflow_instance_id\":\"6caf0cf6-75f8-4120-8117-8f5f0927eb5f\",\"task_id\":\"argo-task\",\"execution_id\":\"1f599e30-626a-4c7b-962a-fc221a574488\",\"correlation_id\":\"e4b06f00-5ce3-4477-86cb-4f3bf20680c2\",\"status\":\"Succeeded\",\"taskStats\":{\"workflowId\":\"6caf0cf6-75f8-4120-8117-8f5f0927eb5f\",\"duration\":-1,\"resourceDuration\":{\"cpu\":12,\"memory\":7},\"nodeInfo\":{\"md-wonderful-bear-f8hjz\":{\"children\":[\"md-wonderful-bear-f8hjz-190249463\"],\"displayName\":\"md-wonderful-bear-f8hjz\",\"finishedAt\":\"2022-07-18T17:13:21+01:00\",\"id\":\"md-wonderful-bear-f8hjz\",\"name\":\"md-wonderful-bear-f8hjz\",\"outboundNodes\":[\"md-wonderful-bear-f8hjz-2400127581\"],\"phase\":\"Succeeded\",\"progress\":\"1/1\",\"resourcesDuration\":{\"cpu\":3,\"memory\":2},\"startedAt\":\"2022-07-18T17:13:11+01:00\",\"templateName\":\"md-workflow-entrypoint\",\"templateScope\":\"local/md-wonderful-bear-f8hjz\",\"type\":\"Steps\"},\"md-wonderful-bear-f8hjz-190249463\":{\"boundaryID\":\"md-wonderful-bear-f8hjz\",\"children\":[\"md-wonderful-bear-f8hjz-2400127581\"],\"displayName\":\"[0]\",\"finishedAt\":\"2022-07-18T17:13:21+01:00\",\"id\":\"md-wonderful-bear-f8hjz-190249463\",\"name\":\"md-wonderful-bear-f8hjz[0]\",\"phase\":\"Succeeded\",\"progress\":\"1/1\",\"resourcesDuration\":{\"cpu\":3,\"memory\":2},\"startedAt\":\"2022-07-18T17:13:11+01:00\",\"templateScope\":\"local/md-wonderful-bear-f8hjz\",\"type\":\"StepGroup\"},\"md-wonderful-bear-f8hjz-2400127581\":{\"boundaryID\":\"md-wonderful-bear-f8hjz\",\"displayName\":\"md-workflow-entrypoint\",\"finishedAt\":\"2022-07-18T17:13:18+01:00\",\"hostNodeName\":\"docker-desktop\",\"id\":\"md-wonderful-bear-f8hjz-2400127581\",\"inputs\":{\"parameters\":[{\"name\":\"message\",\"value\":\"{{workflow.parameters.message}}\"}]},\"name\":\"md-wonderful-bear-f8hjz[0].md-workflow-entrypoint\",\"outputs\":{\"artifacts\":[{\"name\":\"main-logs\",\"s3\":{\"key\":\"md-wonderful-bear-f8hjz/md-wonderful-bear-f8hjz-argosay-2400127581/main.log\"}}],\"exitCode\":\"0\"},\"phase\":\"Succeeded\",\"progress\":\"1/1\",\"resourcesDuration\":{\"cpu\":3,\"memory\":2},\"startedAt\":\"2022-07-18T17:13:11+01:00\",\"templateName\":\"argosay\",\"templateScope\":\"local/md-wonderful-bear-f8hjz\",\"type\":\"Pod\"},\"md-wonderful-bear-f8hjz-2674993913\":{\"boundaryID\":\"md-wonderful-bear-f8hjz-2706448002\",\"children\":[\"md-wonderful-bear-f8hjz-3069151573\"],\"displayName\":\"[1]\",\"finishedAt\":\"2022-07-18T17:13:52+01:00\",\"id\":\"md-wonderful-bear-f8hjz-2674993913\",\"name\":\"md-wonderful-bear-f8hjz.onExit[1]\",\"phase\":\"Succeeded\",\"progress\":\"1/1\",\"resourcesDuration\":{\"cpu\":4,\"memory\":2},\"startedAt\":\"2022-07-18T17:13:42+01:00\",\"templateScope\":\"local/md-wonderful-bear-f8hjz\",\"type\":\"StepGroup\"},\"md-wonderful-bear-f8hjz-2706448002\":{\"children\":[\"md-wonderful-bear-f8hjz-3681798148\"],\"displayName\":\"md-wonderful-bear-f8hjz.onExit\",\"finishedAt\":\"2022-07-18T17:13:52+01:00\",\"id\":\"md-wonderful-bear-f8hjz-2706448002\",\"name\":\"md-wonderful-bear-f8hjz.onExit\",\"outboundNodes\":[\"md-wonderful-bear-f8hjz-3069151573\"],\"phase\":\"Succeeded\",\"progress\":\"2/2\",\"resourcesDuration\":{\"cpu\":9,\"memory\":5},\"startedAt\":\"2022-07-18T17:13:21+01:00\",\"templateName\":\"exit-message-template\",\"templateScope\":\"local/md-wonderful-bear-f8hjz\",\"type\":\"Steps\"},\"md-wonderful-bear-f8hjz-3069151573\":{\"boundaryID\":\"md-wonderful-bear-f8hjz-2706448002\",\"displayName\":\"send-message\",\"finishedAt\":\"2022-07-18T17:13:50+01:00\",\"hostNodeName\":\"docker-desktop\",\"id\":\"md-wonderful-bear-f8hjz-3069151573\",\"inputs\":{\"artifacts\":[{\"archive\":{\"none\":{}},\"name\":\"message\",\"path\":\"/tmp/b2d64917-32c5-4c1a-b299-3386dbc144eb.json\",\"s3\":{\"accessKeySecret\":{\"key\":\"accessKey\",\"name\":\"argo-task-637937575309296430\"},\"bucket\":\"test-bucket\",\"endpoint\":\"minio:9000\",\"insecure\":true,\"key\":\"00000000-1000-0000-0000-000000000000/workflows/6caf0cf6-75f8-4120-8117-8f5f0927eb5f/1f599e30-626a-4c7b-962a-fc221a574488/tmp/md-wonderful-bear-f8hjz/messaging/b2d64917-32c5-4c1a-b299-3386dbc144eb.json\",\"secretKeySecret\":{\"key\":\"secretKey\",\"name\":\"argo-task-637937575309296430\"}}}]},\"name\":\"md-wonderful-bear-f8hjz.onExit[1].send-message\",\"outputs\":{\"artifacts\":[{\"name\":\"main-logs\",\"s3\":{\"key\":\"md-wonderful-bear-f8hjz/md-wonderful-bear-f8hjz-send-message-3069151573/main.log\"}}],\"exitCode\":\"0\"},\"phase\":\"Succeeded\",\"progress\":\"1/1\",\"resourcesDuration\":{\"cpu\":4,\"memory\":2},\"startedAt\":\"2022-07-18T17:13:42+01:00\",\"templateName\":\"send-message\",\"templateScope\":\"local/md-wonderful-bear-f8hjz\",\"type\":\"Pod\"},\"md-wonderful-bear-f8hjz-3681798148\":{\"boundaryID\":\"md-wonderful-bear-f8hjz-2706448002\",\"children\":[\"md-wonderful-bear-f8hjz-743574115\"],\"displayName\":\"[0]\",\"finishedAt\":\"2022-07-18T17:13:42+01:00\",\"id\":\"md-wonderful-bear-f8hjz-3681798148\",\"name\":\"md-wonderful-bear-f8hjz.onExit[0]\",\"phase\":\"Succeeded\",\"progress\":\"2/2\",\"resourcesDuration\":{\"cpu\":9,\"memory\":5},\"startedAt\":\"2022-07-18T17:13:21+01:00\",\"templateScope\":\"local/md-wonderful-bear-f8hjz\",\"type\":\"StepGroup\"},\"md-wonderful-bear-f8hjz-743574115\":{\"boundaryID\":\"md-wonderful-bear-f8hjz-2706448002\",\"children\":[\"md-wonderful-bear-f8hjz-2674993913\"],\"displayName\":\"generate-message\",\"finishedAt\":\"2022-07-18T17:13:31+01:00\",\"hostNodeName\":\"docker-desktop\",\"id\":\"md-wonderful-bear-f8hjz-743574115\",\"inputs\":{\"parameters\":[{\"name\":\"event\",\"value\":\"{\\\"workflow_instance_id\\\":\\\"6caf0cf6-75f8-4120-8117-8f5f0927eb5f\\\",\\\"task_id\\\":\\\"argo-task\\\",\\\"execution_id\\\":\\\"1f599e30-626a-4c7b-962a-fc221a574488\\\",\\\"correlation_id\\\":\\\"e4b06f00-5ce3-4477-86cb-4f3bf20680c2\\\",\\\"identity\\\":\\\"md-wonderful-bear-f8hjz\\\",\\\"metadata\\\":{},\\\"outputs\\\":[]}\"},{\"name\":\"message\",\"value\":\"\\\"{\\\\\\\"ContentType\\\\\\\":\\\\\\\"application/json\\\\\\\",\\\\\\\"CorrelationID\\\\\\\":\\\\\\\"e4b06f00-5ce3-4477-86cb-4f3bf20680c2\\\\\\\",\\\\\\\"MessageID\\\\\\\":\\\\\\\"b2d64917-32c5-4c1a-b299-3386dbc144eb\\\\\\\",\\\\\\\"Type\\\\\\\":\\\\\\\"TaskCallbackEvent\\\\\\\",\\\\\\\"AppID\\\\\\\":\\\\\\\"Argo\\\\\\\",\\\\\\\"Exchange\\\\\\\":\\\\\\\"monaideploy\\\\\\\",\\\\\\\"RoutingKey\\\\\\\":\\\\\\\"md.tasks.callback\\\\\\\",\\\\\\\"DeliveryMode\\\\\\\":2,\\\\\\\"Body\\\\\\\":\\\\\\\"eyJ3b3JrZmxvd19pbnN0YW5jZV9pZCI6IjZjYWYwY2Y2LTc1ZjgtNDEyMC04MTE3LThmNWYwOTI3ZWI1ZiIsInRhc2tfaWQiOiJhcmdvLXRhc2siLCJleGVjdXRpb25faWQiOiIxZjU5OWUzMC02MjZhLTRjN2ItOTYyYS1mYzIyMWE1NzQ0ODgiLCJjb3JyZWxhdGlvbl9pZCI6ImU0YjA2ZjAwLTVjZTMtNDQ3Ny04NmNiLTRmM2JmMjA2ODBjMiIsImlkZW50aXR5IjoibWQtd29uZGVyZnVsLWJlYXItZjhoanoiLCJtZXRhZGF0YSI6e30sIm91dHB1dHMiOltdfQ==\\\\\\\"}\\\"\"}]},\"name\":\"md-wonderful-bear-f8hjz.onExit[0].generate-message\",\"outputs\":{\"artifacts\":[{\"archive\":{\"none\":{}},\"name\":\"output\",\"path\":\"/tmp\",\"s3\":{\"accessKeySecret\":{\"key\":\"accessKey\",\"name\":\"argo-task-637937575309296430\"},\"bucket\":\"test-bucket\",\"endpoint\":\"minio:9000\",\"insecure\":true,\"key\":\"00000000-1000-0000-0000-000000000000/workflows/6caf0cf6-75f8-4120-8117-8f5f0927eb5f/1f599e30-626a-4c7b-962a-fc221a574488/tmp/md-wonderful-bear-f8hjz/messaging\",\"secretKeySecret\":{\"key\":\"secretKey\",\"name\":\"argo-task-637937575309296430\"}}},{\"name\":\"main-logs\",\"s3\":{\"key\":\"md-wonderful-bear-f8hjz/md-wonderful-bear-f8hjz-generate-message-743574115/main.log\"}}],\"exitCode\":\"0\"},\"phase\":\"Succeeded\",\"progress\":\"1/1\",\"resourcesDuration\":{\"cpu\":5,\"memory\":3},\"startedAt\":\"2022-07-18T17:13:21+01:00\",\"templateName\":\"generate-message\",\"templateScope\":\"local/md-wonderful-bear-f8hjz\",\"type\":\"Pod\"}},\"startedAt\":\"2022-07-18T17:13:11+01:00\",\"finishedAt\":\"2022-07-18T17:13:52+01:00\"},\"reason\":\"None\",\"message\":\"\",\"outputs\":[],\"metadata\":{\"JobIdentity\":\"md-wonderful-bear-f8hjz\"}}"; - var json = """{"taskStats":{"workflowId":"6caf0cf6-75f8-4120-8117-8f5f0927eb5f","resourceDuration.cpu":12,"resourceDuration.memory":7}}"""; + var json = "{'taskStats':{'workflowId':'6caf0cf6-75f8-4120-8117-8f5f0927eb5f','resourceDuration.cpu':12,'resourceDuration.memory':7}}"; var updateEvent = Newtonsoft.Json.JsonConvert.DeserializeObject(json); var message = Assert.Throws(() => updateEvent?.Validate()); var expectedError = "Invalid message: The WorkflowInstanceId field is required. Path: WorkflowInstanceId.,The TaskId field is required. Path: TaskId.,The ExecutionId field is required. Path: ExecutionId.,The CorrelationId field is required. Path: CorrelationId."; From a50ae54aab83712b2af94182d59c51a626537243 Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Tue, 22 Aug 2023 09:20:06 -0700 Subject: [PATCH 3/9] Release 0.2.0 (#216) +semver: minor * adding new fields to messages for external app executions * added forgot licence header * added export request to export cmplete message event * Update ExportRequestEvent and update dependencies (#210) * Update dependencies * Remove ExportRequestType enum and replace with a list of plug-in assembly names * Update dependencies decisions * Include taskId in WorkflowRequestEvent to support multiple external app executions * gh-127 (#215) New data trigger and data origins to support multiple data sources/modalities Signed-off-by: Victor Chang Signed-off-by: Neil South --- src/Messaging/Events/WorkflowRequestEvent.cs | 66 ++++++++++++++++--- .../Tests/WorkflowRequestMessageTest.cs | 36 +++++++++- 2 files changed, 91 insertions(+), 11 deletions(-) diff --git a/src/Messaging/Events/WorkflowRequestEvent.cs b/src/Messaging/Events/WorkflowRequestEvent.cs index 1f0be31..3438f69 100755 --- a/src/Messaging/Events/WorkflowRequestEvent.cs +++ b/src/Messaging/Events/WorkflowRequestEvent.cs @@ -20,6 +20,56 @@ namespace Monai.Deploy.Messaging.Events { + public class DataOrigin + { + [JsonProperty(PropertyName = "type")] + public DataType DataType { get; set; } + + /// + /// Gets or sets the source of the data: + /// + /// DIMSE: the sender or calling AE Title of the DICOM dataset. + /// ACR inference request: the transaction ID. + /// FHIR/HL7: host name or IP address. + /// DICOMWeb: host name or IP address. + /// + /// + [JsonProperty(PropertyName = "source")] + [Required] + public string Source { get; set; } = default!; + + /// + /// Gets or set the receiving service. + /// + /// DIMSE: the MONAI Deploy AE Title that received the DICOM dataset. + /// ACR inference request: IP address of the receiving service. + /// FHIR/HL7: IP address of the receiving service. + /// DICOMWeb: IP address of the receiving service or the named virtual AE Title. + /// + /// + [JsonProperty(PropertyName = "destination")] + public string Destination { get; set; } = default!; + } + public enum DataType + { + /// + /// Data received via DIMSE services + /// + DIMSE, + /// + /// Data received via DICOMWeb services + /// + DICOMWEB, + /// + /// Data received via FHIR services + /// + FHIR, + /// + /// Data received via HL7 services + /// + HL7, + } + public class WorkflowRequestEvent : EventBase { private readonly List _payload; @@ -60,19 +110,16 @@ public class WorkflowRequestEvent : EventBase public string Bucket { get; set; } = default!; /// - /// For DIMSE, the sender or calling AE Title of the DICOM dataset. - /// For an ACR inference request, the transaction ID. + /// Gets or sets the service that received the original request. /// - [JsonProperty(PropertyName = "calling_aetitle")] - [Required] - public string CallingAeTitle { get; set; } = default!; + [JsonProperty(PropertyName = "trigger")] + public DataOrigin DataTrigger { get; set; } = default!; /// - /// For DIMSE, the MONAI Deploy AE Title received the DICOM dataset. - /// For an ACR inference request, this field is empty. + /// Gets or sets the data origins that were involved in triggering this workflow request. /// - [JsonProperty(PropertyName = "called_aetitle")] - public string CalledAeTitle { get; set; } = default!; + [JsonProperty(PropertyName = "data_origins")] + public List DataOrigins { get; private set; } /// /// Gets or sets the time the data was received. @@ -108,6 +155,7 @@ public WorkflowRequestEvent() { _payload = new List(); Workflows = new List(); + DataOrigins = new List(); } public void AddFiles(IEnumerable files) diff --git a/src/Messaging/Tests/WorkflowRequestMessageTest.cs b/src/Messaging/Tests/WorkflowRequestMessageTest.cs index dcec857..517d478 100644 --- a/src/Messaging/Tests/WorkflowRequestMessageTest.cs +++ b/src/Messaging/Tests/WorkflowRequestMessageTest.cs @@ -30,8 +30,12 @@ public void ConvertsJsonMessageToMessage() var input = new WorkflowRequestEvent() { Bucket = Guid.NewGuid().ToString(), - CalledAeTitle = Guid.NewGuid().ToString(), - CallingAeTitle = Guid.NewGuid().ToString(), + DataTrigger = new DataOrigin + { + DataType = DataType.DIMSE, + Source = Guid.NewGuid().ToString(), + Destination = Guid.NewGuid().ToString(), + }, CorrelationId = Guid.NewGuid().ToString(), FileCount = 10, PayloadId = Guid.NewGuid(), @@ -40,6 +44,34 @@ public void ConvertsJsonMessageToMessage() WorkflowInstanceId = Guid.NewGuid().ToString(), TaskId = Guid.NewGuid().ToString(), }; + input.DataOrigins.Add(new DataOrigin + { + DataType = DataType.DICOMWEB, + Source = Guid.NewGuid().ToString(), + Destination = Guid.NewGuid().ToString(), + + }); + input.DataOrigins.Add(new DataOrigin + { + DataType = DataType.FHIR, + Source = Guid.NewGuid().ToString(), + Destination = Guid.NewGuid().ToString(), + + }); + input.DataOrigins.Add(new DataOrigin + { + DataType = DataType.DIMSE, + Source = Guid.NewGuid().ToString(), + Destination = Guid.NewGuid().ToString(), + + }); + input.DataOrigins.Add(new DataOrigin + { + DataType = DataType.HL7, + Source = Guid.NewGuid().ToString(), + Destination = Guid.NewGuid().ToString(), + + }); var files = new List() { From 1b6c66e7cbf95c7b95d5f062dabfd866e229cf4a Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Thu, 24 Aug 2023 08:48:05 -0700 Subject: [PATCH 4/9] Release/0.2.1 (#218) +semver: patch * Add ACR enum in DataService (#217) Signed-off-by: Victor Chang --- src/Messaging/Common/BlockStorageInfo.cs | 5 +- src/Messaging/Common/Credentials.cs | 6 ++- src/Messaging/Common/Storage.cs | 9 +++- src/Messaging/Events/EmailRequestEvent.cs | 10 +++- src/Messaging/Events/ExportCompleteEvent.cs | 16 +++++-- src/Messaging/Events/ExportRequestEvent.cs | 17 ++++++- src/Messaging/Events/TaskCallbackEvent.cs | 10 +++- src/Messaging/Events/TaskCancellationEvent.cs | 12 ++++- src/Messaging/Events/TaskDispatchEvent.cs | 18 +++++++- src/Messaging/Events/TaskUpdateEvent.cs | 19 ++++++-- src/Messaging/Events/WorkflowRequestEvent.cs | 46 +++++++++++++++++-- src/Messaging/Monai.Deploy.Messaging.csproj | 1 + .../Tests/WorkflowRequestMessageTest.cs | 10 ++-- .../Monai.Deploy.Messaging.RabbitMQ.csproj | 1 + 14 files changed, 153 insertions(+), 27 deletions(-) diff --git a/src/Messaging/Common/BlockStorageInfo.cs b/src/Messaging/Common/BlockStorageInfo.cs index 4fed0e3..67645f3 100644 --- a/src/Messaging/Common/BlockStorageInfo.cs +++ b/src/Messaging/Common/BlockStorageInfo.cs @@ -1,5 +1,5 @@ /* - * Copyright 2021-2022 MONAI Consortium + * Copyright 2021-2023 MONAI Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,6 +14,7 @@ * limitations under the License. */ +using System.Text.Json.Serialization; using Newtonsoft.Json; namespace Monai.Deploy.Messaging.Common @@ -24,12 +25,14 @@ public class BlockStorageInfo /// Gets or sets the root path to the file. /// [JsonProperty(PropertyName = "path")] + [JsonPropertyName("path")] public string Path { get; set; } = default!; /// /// Gets or sets the root path to the metadata file. /// [JsonProperty(PropertyName = "metadata")] + [JsonPropertyName("metadata")] public string Metadata { get; set; } = default!; } } diff --git a/src/Messaging/Common/Credentials.cs b/src/Messaging/Common/Credentials.cs index de0bdb5..4a9fc16 100644 --- a/src/Messaging/Common/Credentials.cs +++ b/src/Messaging/Common/Credentials.cs @@ -1,5 +1,5 @@ /* - * Copyright 2022 MONAI Consortium + * Copyright 2022-2023 MONAI Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; using Newtonsoft.Json; namespace Monai.Deploy.Messaging.Common @@ -25,6 +26,7 @@ public class Credentials /// Gets or sets the access key or user name of the credentials pair. /// [JsonProperty(PropertyName = "access_key")] + [JsonPropertyName("access_key")] [Required] public string AccessKey { get; set; } @@ -32,6 +34,7 @@ public class Credentials /// Gets or sets the access token or password of the credentials pair. /// [JsonProperty(PropertyName = "access_token")] + [JsonPropertyName("access_token")] [Required] public string AccessToken { get; set; } @@ -39,6 +42,7 @@ public class Credentials /// Gets or sets the session token of the credentials pair. /// [JsonProperty(PropertyName = "session_token")] + [JsonPropertyName("session_token")] public string SessionToken { get; set; } public Credentials() diff --git a/src/Messaging/Common/Storage.cs b/src/Messaging/Common/Storage.cs index 3d71135..3c6ea74 100644 --- a/src/Messaging/Common/Storage.cs +++ b/src/Messaging/Common/Storage.cs @@ -1,5 +1,5 @@ /* - * Copyright 2022 MONAI Consortium + * Copyright 2022-2023 MONAI Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; using Newtonsoft.Json; namespace Monai.Deploy.Messaging.Common @@ -26,6 +27,7 @@ public class Storage : ICloneable /// For Argo, name of the artifact used in the template. /// [JsonProperty(PropertyName = "name")] + [JsonPropertyName("name")] [Required] public string Name { get; set; } @@ -33,6 +35,7 @@ public class Storage : ICloneable /// Gets or sets the endpoint of the storage service. /// [JsonProperty(PropertyName = "endpoint")] + [JsonPropertyName("endpoint")] [Required] public string Endpoint { get; set; } @@ -40,12 +43,14 @@ public class Storage : ICloneable /// Gets or sets credentials for accessing the storage service. /// [JsonProperty(PropertyName = "credentials")] + [JsonPropertyName("credentials")] public Credentials? Credentials { get; set; } /// /// Gets or sets name of the bucket. /// [JsonProperty(PropertyName = "bucket")] + [JsonPropertyName("bucket")] [Required] public string Bucket { get; set; } @@ -53,12 +58,14 @@ public class Storage : ICloneable /// Gets or sets whether the connection should be secured or not. /// [JsonProperty(PropertyName = "secured_connection")] + [JsonPropertyName("secured_connection")] public bool SecuredConnection { get; set; } /// /// Gets or sets the optional relative root path to the data. /// [JsonProperty(PropertyName = "relative_root_path")] + [JsonPropertyName("relative_root_path")] [Required] public string RelativeRootPath { get; set; } diff --git a/src/Messaging/Events/EmailRequestEvent.cs b/src/Messaging/Events/EmailRequestEvent.cs index 195eb37..4ffb2a7 100644 --- a/src/Messaging/Events/EmailRequestEvent.cs +++ b/src/Messaging/Events/EmailRequestEvent.cs @@ -1,5 +1,5 @@ /* - * Copyright 2022 MONAI Consortium + * Copyright 2022-2023 MONAI Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; using Newtonsoft.Json; namespace Monai.Deploy.Messaging.Events @@ -22,29 +23,36 @@ namespace Monai.Deploy.Messaging.Events public class EmailRequestEvent : EventBase { [JsonProperty(PropertyName = "id")] + [JsonPropertyName("id")] [Required] public Guid Id { get; set; } [JsonProperty(PropertyName = "workflow_instance_id")] + [JsonPropertyName("workflow_instance_id")] [Required] public string WorkflowInstanceId { get; set; } [JsonProperty(PropertyName = "workflow_name")] + [JsonPropertyName("workflow_name")] [Required] public string WorkflowName { get; set; } [JsonProperty(PropertyName = "task_id")] + [JsonPropertyName("task_id")] [Required] public string TaskId { get; set; } [JsonProperty(PropertyName = "roles")] + [JsonPropertyName("roles")] public string Roles { get; set; } [JsonProperty(PropertyName = "emails")] + [JsonPropertyName("emails")] public string Emails { get; set; } [Required] [JsonProperty(PropertyName = "metadata")] + [JsonPropertyName("metadata")] public Dictionary Metadata { get; set; } public EmailRequestEvent() diff --git a/src/Messaging/Events/ExportCompleteEvent.cs b/src/Messaging/Events/ExportCompleteEvent.cs index 7893189..ac3de11 100755 --- a/src/Messaging/Events/ExportCompleteEvent.cs +++ b/src/Messaging/Events/ExportCompleteEvent.cs @@ -1,5 +1,5 @@ /* - * Copyright 2021-2022 MONAI Consortium + * Copyright 2021-2023 MONAI Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,8 +15,8 @@ */ using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; using Ardalis.GuardClauses; -using Monai.Deploy.Messaging.Common; using Newtonsoft.Json; using Newtonsoft.Json.Converters; @@ -28,6 +28,7 @@ public class ExportCompleteEvent : EventBase /// Gets or sets the workflow instanceID generated by the Workflow Manager. /// [JsonProperty(PropertyName = "workflow_instance_id")] + [JsonPropertyName("workflow_instance_id")] [Required] public string WorkflowInstanceId { get; set; } = default!; @@ -35,6 +36,7 @@ public class ExportCompleteEvent : EventBase /// Gets or sets the export task ID generated by the Workflow Manager. /// [JsonProperty(PropertyName = "export_task_id")] + [JsonPropertyName("export_task_id")] [Required] public string ExportTaskId { get; set; } = default!; @@ -42,7 +44,9 @@ public class ExportCompleteEvent : EventBase /// Gets or sets the state of the export task. /// [JsonProperty(PropertyName = "status")] - [JsonConverter(typeof(StringEnumConverter))] + [JsonPropertyName("status")] + [Newtonsoft.Json.JsonConverter(typeof(StringEnumConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(JsonStringEnumConverter))] [Required] public ExportStatus Status { get; set; } @@ -50,15 +54,19 @@ public class ExportCompleteEvent : EventBase /// Gets or sets error messages, if any, when exporting. /// [JsonProperty(PropertyName = "message")] + [JsonPropertyName("message")] public string Message { get; set; } = default!; /// /// Gets or sets files exported with its status /// [JsonProperty(PropertyName = "file_statuses")] + [JsonPropertyName("file_statuses")] public Dictionary FileStatuses { get; set; } - [JsonConstructor] + [Newtonsoft.Json.JsonConstructor] + [System.Text.Json.Serialization.JsonConstructor] + public ExportCompleteEvent() { Status = ExportStatus.Unknown; diff --git a/src/Messaging/Events/ExportRequestEvent.cs b/src/Messaging/Events/ExportRequestEvent.cs index 2d6c89e..b5fd258 100755 --- a/src/Messaging/Events/ExportRequestEvent.cs +++ b/src/Messaging/Events/ExportRequestEvent.cs @@ -1,5 +1,5 @@ /* - * Copyright 2021-2022 MONAI Consortium + * Copyright 2021-2023 MONAI Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,7 @@ */ using System.ComponentModel.DataAnnotations; -using Monai.Deploy.Messaging.Common; +using System.Text.Json.Serialization; using Newtonsoft.Json; namespace Monai.Deploy.Messaging.Events @@ -26,6 +26,7 @@ public class ExportRequestEvent : EventBase /// Gets or sets the workflow instance ID generated by the Workflow Manager. /// [JsonProperty(PropertyName = "workflow_instance_id")] + [JsonPropertyName("workflow_instance_id")] [Required] public string WorkflowInstanceId { get; set; } = default!; @@ -33,6 +34,7 @@ public class ExportRequestEvent : EventBase /// Gets or sets the export task ID generated by the Workflow Manager. /// [JsonProperty(PropertyName = "export_task_id")] + [JsonPropertyName("export_task_id")] [Required] public string ExportTaskId { get; set; } = default!; @@ -40,6 +42,7 @@ public class ExportRequestEvent : EventBase /// Gets or sets a list of files to be exported. /// [JsonProperty(PropertyName = "files")] + [JsonPropertyName("files")] [Required, MinLength(1)] public IEnumerable Files { get; set; } = default!; @@ -49,6 +52,7 @@ public class ExportRequestEvent : EventBase /// For ACR, the Transaction ID in the original inference request. /// [JsonProperty(PropertyName = "destinations")] + [JsonPropertyName("destinations")] [Required] public string[] Destinations { get; set; } = default!; @@ -58,22 +62,29 @@ public class ExportRequestEvent : EventBase /// For ACR, use the Transaction ID in the original request. /// [JsonProperty(PropertyName = "correlation_id")] + [JsonPropertyName("correlation_id")] [Required] public string CorrelationId { get; set; } = default!; /// /// Gets or sets the delivery tag or acknowledge token for the task. /// + [JsonProperty(PropertyName = "delivery_tag")] + [JsonPropertyName("delivery_tag")] public string DeliveryTag { get; set; } = default!; /// /// Gets or sets the message ID set by the message broker. /// + [JsonProperty(PropertyName = "message_id")] + [JsonPropertyName("message_id")] public string MessageId { get; set; } = default!; /// /// Gets or sets error messages related to this export task. /// + [JsonProperty(PropertyName = "error_messages")] + [JsonPropertyName("error_messages")] public List ErrorMessages { get; private set; } /// @@ -82,6 +93,8 @@ public class ExportRequestEvent : EventBase /// E.g. MyCompnay.MyProject.MyNamepsace.MyPlugin, MyCompnay.MyProject.MyNamepsace where /// MyCompnay.MyProject.MyNamepsace is the name of the assembly (DLL). /// + [JsonProperty(PropertyName = "plug_in_assemblies")] + [JsonPropertyName("plug_in_assemblies")] public List PluginAssemblies { get; private set; } public ExportRequestEvent() diff --git a/src/Messaging/Events/TaskCallbackEvent.cs b/src/Messaging/Events/TaskCallbackEvent.cs index 0601b88..c088910 100644 --- a/src/Messaging/Events/TaskCallbackEvent.cs +++ b/src/Messaging/Events/TaskCallbackEvent.cs @@ -1,5 +1,5 @@ /* - * Copyright 2022 MONAI Consortium + * Copyright 2022-2023 MONAI Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; using Monai.Deploy.Messaging.Common; using Newtonsoft.Json; @@ -26,6 +27,7 @@ public class TaskCallbackEvent : EventBase /// Gets or sets the ID representing the instance of the workflow. /// [JsonProperty(PropertyName = "workflow_instance_id")] + [JsonPropertyName("workflow_instance_id")] [Required] public string WorkflowInstanceId { get; set; } @@ -34,12 +36,14 @@ public class TaskCallbackEvent : EventBase /// [Required] [JsonProperty(PropertyName = "task_id")] + [JsonPropertyName("task_id")] public string TaskId { get; set; } /// /// Gets or sets the execution ID representing the instance of the task. /// [JsonProperty(PropertyName = "execution_id")] + [JsonPropertyName("execution_id")] [Required] public string ExecutionId { get; set; } @@ -47,6 +51,7 @@ public class TaskCallbackEvent : EventBase /// Gets or sets the correlation ID. /// [JsonProperty(PropertyName = "correlation_id")] + [JsonPropertyName("correlation_id")] [Required] public string CorrelationId { get; set; } @@ -54,6 +59,7 @@ public class TaskCallbackEvent : EventBase /// Gets or sets the identity provided by the external service. /// [JsonProperty(PropertyName = "identity")] + [JsonPropertyName("identity")] [Required] public string Identity { get; set; } @@ -61,12 +67,14 @@ public class TaskCallbackEvent : EventBase /// Gets or sets any metadata generated by the task, including any output generated. /// [JsonProperty(PropertyName = "metadata")] + [JsonPropertyName("metadata")] public Dictionary Metadata { get; set; } /// /// Gets or sets the output storage information. /// [JsonProperty(PropertyName = "outputs")] + [JsonPropertyName("outputs")] public List Outputs { get; set; } public TaskCallbackEvent() diff --git a/src/Messaging/Events/TaskCancellationEvent.cs b/src/Messaging/Events/TaskCancellationEvent.cs index 8498384..aae9879 100644 --- a/src/Messaging/Events/TaskCancellationEvent.cs +++ b/src/Messaging/Events/TaskCancellationEvent.cs @@ -1,5 +1,5 @@ /* - * Copyright 2022 MONAI Consortium + * Copyright 2022-2023 MONAI Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,9 @@ */ using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; using Newtonsoft.Json; +using Newtonsoft.Json.Converters; namespace Monai.Deploy.Messaging.Events { @@ -25,6 +27,7 @@ public class TaskCancellationEvent : EventBase /// Gets or sets the ID representing the instance of the workflow. /// [JsonProperty(PropertyName = "workflow_instance_id")] + [JsonPropertyName("workflow_instance_id")] [Required] public string WorkflowInstanceId { get; set; } = string.Empty; @@ -32,6 +35,7 @@ public class TaskCancellationEvent : EventBase /// Gets or sets the execution ID representing the instance of the task. /// [JsonProperty(PropertyName = "execution_id")] + [JsonPropertyName("execution_id")] [Required] public string ExecutionId { get; set; } = string.Empty; @@ -40,12 +44,14 @@ public class TaskCancellationEvent : EventBase /// [Required] [JsonProperty(PropertyName = "task_id")] + [JsonPropertyName("task_id")] public string TaskId { get; set; } = string.Empty; /// /// Gets or sets the identity provided by the external service. /// [JsonProperty(PropertyName = "identity")] + [JsonPropertyName("identity")] [Required, MaxLength(63)] public string Identity { get; set; } = string.Empty; @@ -53,6 +59,9 @@ public class TaskCancellationEvent : EventBase /// Gets or sets the reason for the cancellation. /// [JsonProperty(PropertyName = "reason")] + [JsonPropertyName("reason")] + [Newtonsoft.Json.JsonConverter(typeof(StringEnumConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(JsonStringEnumConverter))] [Required] public FailureReason Reason { get; set; } = FailureReason.Unknown; @@ -60,6 +69,7 @@ public class TaskCancellationEvent : EventBase /// Gets or sets a message relating to the cancellation. /// [JsonProperty(PropertyName = "message")] + [JsonPropertyName("message")] [Required, MaxLength(63)] public string Message { get; set; } = string.Empty; } diff --git a/src/Messaging/Events/TaskDispatchEvent.cs b/src/Messaging/Events/TaskDispatchEvent.cs index 726f7c3..c1aa168 100644 --- a/src/Messaging/Events/TaskDispatchEvent.cs +++ b/src/Messaging/Events/TaskDispatchEvent.cs @@ -1,5 +1,5 @@ /* - * Copyright 2022 MONAI Consortium + * Copyright 2022-2023 MONAI Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; using Monai.Deploy.Messaging.Common; using Newtonsoft.Json; using Newtonsoft.Json.Converters; @@ -27,6 +28,7 @@ public class TaskDispatchEvent : EventBase /// Gets or sets the ID representing the instance of the workflow. /// [JsonProperty(PropertyName = "workflow_instance_id")] + [JsonPropertyName("workflow_instance_id")] [Required] public string WorkflowInstanceId { get; set; } @@ -35,12 +37,14 @@ public class TaskDispatchEvent : EventBase /// [Required] [JsonProperty(PropertyName = "task_id")] + [JsonPropertyName("task_id")] public string TaskId { get; set; } /// /// Gets or sets the execution ID representing the instance of the task. /// [JsonProperty(PropertyName = "execution_id")] + [JsonPropertyName("execution_id")] [Required] public string ExecutionId { get; set; } @@ -48,6 +52,7 @@ public class TaskDispatchEvent : EventBase /// Gets or sets the payload ID of the current workflow instance. /// [JsonProperty(PropertyName = "payload_id")] + [JsonPropertyName("payload_id")] [Required] public string PayloadId { get; set; } @@ -55,6 +60,7 @@ public class TaskDispatchEvent : EventBase /// Gets or sets the correlation ID. /// [JsonProperty(PropertyName = "correlation_id")] + [JsonPropertyName("correlation_id")] [Required] public string CorrelationId { get; set; } @@ -62,6 +68,7 @@ public class TaskDispatchEvent : EventBase /// Gets or sets the type of plug-in the task is associated with. /// [JsonProperty(PropertyName = "type")] + [JsonPropertyName("type")] [Required] public string TaskPluginType { get; set; } @@ -69,13 +76,16 @@ public class TaskDispatchEvent : EventBase /// Gets or sets the task execution arguments. /// [JsonProperty(PropertyName = "task_plugin_arguments")] + [JsonPropertyName("task_plugin_arguments")] public Dictionary TaskPluginArguments { get; set; } /// /// Gets or set the status of the task. /// [JsonProperty(PropertyName = "status")] - [JsonConverter(typeof(StringEnumConverter))] + [JsonPropertyName("status")] + [Newtonsoft.Json.JsonConverter(typeof(StringEnumConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(JsonStringEnumConverter))] [Required] public TaskExecutionStatus Status { get; set; } @@ -83,6 +93,7 @@ public class TaskDispatchEvent : EventBase /// Gets or sets the input storage information. /// [JsonProperty(PropertyName = "inputs")] + [JsonPropertyName("inputs")] [Required, MinLength(1, ErrorMessage = "At least input is required.")] public List Inputs { get; set; } @@ -90,6 +101,7 @@ public class TaskDispatchEvent : EventBase /// Gets or sets the output storage information. /// [JsonProperty(PropertyName = "outputs")] + [JsonPropertyName("outputs")] [Required] public List Outputs { get; set; } @@ -97,6 +109,7 @@ public class TaskDispatchEvent : EventBase /// Gets or sets the intermediate storage information. /// [JsonProperty(PropertyName = "intermediate_storage")] + [JsonPropertyName("intermediate_storage")] [Required] public Storage IntermediateStorage { get; set; } @@ -104,6 +117,7 @@ public class TaskDispatchEvent : EventBase /// Gets or sets any metadata relevant to the task. /// [JsonProperty(PropertyName = "metadata")] + [JsonPropertyName("metadata")] public Dictionary Metadata { get; set; } public TaskDispatchEvent() diff --git a/src/Messaging/Events/TaskUpdateEvent.cs b/src/Messaging/Events/TaskUpdateEvent.cs index 2c2c9fb..b9ea839 100644 --- a/src/Messaging/Events/TaskUpdateEvent.cs +++ b/src/Messaging/Events/TaskUpdateEvent.cs @@ -1,5 +1,5 @@ /* - * Copyright 2022 MONAI Consortium + * Copyright 2022-2023 MONAI Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; using Monai.Deploy.Messaging.Common; using Newtonsoft.Json; using Newtonsoft.Json.Converters; @@ -27,6 +28,7 @@ public class TaskUpdateEvent : EventBase /// Gets or sets the ID representing the instance of the workflow. /// [JsonProperty(PropertyName = "workflow_instance_id")] + [JsonPropertyName("workflow_instance_id")] [Required] public string WorkflowInstanceId { get; set; } @@ -35,12 +37,14 @@ public class TaskUpdateEvent : EventBase /// [Required] [JsonProperty(PropertyName = "task_id")] + [JsonPropertyName("task_id")] public string TaskId { get; set; } /// /// Gets or sets the execution ID representing the instance of the task. /// [JsonProperty(PropertyName = "execution_id")] + [JsonPropertyName("execution_id")] [Required] public string ExecutionId { get; set; } @@ -48,6 +52,7 @@ public class TaskUpdateEvent : EventBase /// Gets or sets the correlation ID. /// [JsonProperty(PropertyName = "correlation_id")] + [JsonPropertyName("correlation_id")] [Required] public string CorrelationId { get; set; } @@ -55,7 +60,9 @@ public class TaskUpdateEvent : EventBase /// Gets or set the status of the task. /// [JsonProperty(PropertyName = "status")] - [JsonConverter(typeof(StringEnumConverter))] + [JsonPropertyName("status")] + [Newtonsoft.Json.JsonConverter(typeof(StringEnumConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(JsonStringEnumConverter))] [Required] public TaskExecutionStatus Status { get; set; } @@ -63,13 +70,16 @@ public class TaskUpdateEvent : EventBase /// Gets or set the execution stats of the task. /// [JsonProperty(PropertyName = "taskStats")] + [JsonPropertyName("taskStats")] public Dictionary ExecutionStats { get; set; } /// /// Gets or set the failure reason of the task. /// [JsonProperty(PropertyName = "reason")] - [JsonConverter(typeof(StringEnumConverter))] + [JsonPropertyName("reason")] + [Newtonsoft.Json.JsonConverter(typeof(StringEnumConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(JsonStringEnumConverter))] [Required] public FailureReason Reason { get; set; } @@ -77,18 +87,21 @@ public class TaskUpdateEvent : EventBase /// Gets or set any additional (error) message related to the task. /// [JsonProperty(PropertyName = "message")] + [JsonPropertyName("message")] public string Message { get; set; } /// /// Gets or sets any output artifacts relevent to the output of the task. /// [JsonProperty(PropertyName = "outputs")] + [JsonPropertyName("outputs")] public List Outputs { get; set; } /// /// Gets or sets any metadata relevant to the output of the task. /// [JsonProperty(PropertyName = "metadata")] + [JsonPropertyName("metadata")] public Dictionary Metadata { get; set; } public TaskUpdateEvent() diff --git a/src/Messaging/Events/WorkflowRequestEvent.cs b/src/Messaging/Events/WorkflowRequestEvent.cs index 3438f69..982b430 100755 --- a/src/Messaging/Events/WorkflowRequestEvent.cs +++ b/src/Messaging/Events/WorkflowRequestEvent.cs @@ -1,5 +1,5 @@ /* - * Copyright 2021-2022 MONAI Consortium + * Copyright 2021-2023 MONAI Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ */ using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; using Monai.Deploy.Messaging.Common; using Newtonsoft.Json; @@ -22,8 +23,9 @@ namespace Monai.Deploy.Messaging.Events { public class DataOrigin { - [JsonProperty(PropertyName = "type")] - public DataType DataType { get; set; } + [JsonProperty(PropertyName = "dataService")] + [JsonPropertyName("dataService")] + public DataService DataService { get; set; } = DataService.Unknown; /// /// Gets or sets the source of the data: @@ -35,6 +37,7 @@ public class DataOrigin /// /// [JsonProperty(PropertyName = "source")] + [JsonPropertyName("source")] [Required] public string Source { get; set; } = default!; @@ -48,10 +51,28 @@ public class DataOrigin /// /// [JsonProperty(PropertyName = "destination")] + [JsonPropertyName("destination")] public string Destination { get; set; } = default!; + + public override int GetHashCode() + { + return HashCode.Combine(Source, Destination, DataService); + } + + public override bool Equals(object? obj) + { + return obj is DataOrigin dataOrigin && + Source.Equals(dataOrigin.Source, StringComparison.Ordinal) && + Destination.Equals(dataOrigin.Destination, StringComparison.Ordinal) && + DataService.Equals(dataOrigin.DataService); + } } - public enum DataType + public enum DataService { + /// + /// Unknown data service + /// + Unknown, /// /// Data received via DIMSE services /// @@ -59,7 +80,7 @@ public enum DataType /// /// Data received via DICOMWeb services /// - DICOMWEB, + DicomWeb, /// /// Data received via FHIR services /// @@ -68,6 +89,10 @@ public enum DataType /// Data received via HL7 services /// HL7, + /// + /// Data received via ACR API call + /// + ACR, } public class WorkflowRequestEvent : EventBase @@ -78,6 +103,7 @@ public class WorkflowRequestEvent : EventBase /// Gets or sets the ID of the payload which is also used as the root path of the payload. /// [JsonProperty(PropertyName = "payload_id")] + [JsonPropertyName("payload_id")] [Required] public Guid PayloadId { get; set; } @@ -85,12 +111,14 @@ public class WorkflowRequestEvent : EventBase /// Gets or sets the associated workflows to be launched. /// [JsonProperty(PropertyName = "workflows")] + [JsonPropertyName("workflows")] public IEnumerable Workflows { get; set; } /// /// Gets or sets number of files in the payload. /// [JsonProperty(PropertyName = "file_count")] + [JsonPropertyName("file_count")] [Required] public int FileCount { get; set; } @@ -99,6 +127,7 @@ public class WorkflowRequestEvent : EventBase /// For an ACR inference request, the correlation ID is the Transaction ID in the original request. /// [JsonProperty(PropertyName = "correlation_id")] + [JsonPropertyName("correlation_id")] [Required] public string CorrelationId { get; set; } = default!; @@ -106,6 +135,7 @@ public class WorkflowRequestEvent : EventBase /// Gets or set the name of the bucket where the files in are stored. /// [JsonProperty(PropertyName = "bucket")] + [JsonPropertyName("bucket")] [Required] public string Bucket { get; set; } = default!; @@ -113,18 +143,21 @@ public class WorkflowRequestEvent : EventBase /// Gets or sets the service that received the original request. /// [JsonProperty(PropertyName = "trigger")] + [JsonPropertyName("trigger")] public DataOrigin DataTrigger { get; set; } = default!; /// /// Gets or sets the data origins that were involved in triggering this workflow request. /// [JsonProperty(PropertyName = "data_origins")] + [JsonPropertyName("data_origins")] public List DataOrigins { get; private set; } /// /// Gets or sets the time the data was received. /// [JsonProperty(PropertyName = "timestamp")] + [JsonPropertyName("timestamp")] [Required] public DateTime Timestamp { get; set; } @@ -134,6 +167,7 @@ public class WorkflowRequestEvent : EventBase /// In standard workflows this will not be set /// [JsonProperty(PropertyName = "workflow_instance_id")] + [JsonPropertyName("workflow_instance_id")] public string? WorkflowInstanceId { get; set; } = default; /// @@ -142,6 +176,7 @@ public class WorkflowRequestEvent : EventBase /// In standard workflows this will not be set /// [JsonProperty(PropertyName = "task_id")] + [JsonPropertyName("task_id")] public string? TaskId { get; set; } = default; /// @@ -149,6 +184,7 @@ public class WorkflowRequestEvent : EventBase /// [JsonProperty(PropertyName = "payload")] [Required, MinLength(1, ErrorMessage = "At least one file is required.")] + [JsonPropertyName("payload")] public IReadOnlyList Payload { get => _payload; } public WorkflowRequestEvent() diff --git a/src/Messaging/Monai.Deploy.Messaging.csproj b/src/Messaging/Monai.Deploy.Messaging.csproj index 4c5df90..3d8f483 100644 --- a/src/Messaging/Monai.Deploy.Messaging.csproj +++ b/src/Messaging/Monai.Deploy.Messaging.csproj @@ -22,6 +22,7 @@ enable false ..\.sonarlint\project-monai_monai-deploy-messagingcsharp.ruleset + true diff --git a/src/Messaging/Tests/WorkflowRequestMessageTest.cs b/src/Messaging/Tests/WorkflowRequestMessageTest.cs index 517d478..22a3553 100644 --- a/src/Messaging/Tests/WorkflowRequestMessageTest.cs +++ b/src/Messaging/Tests/WorkflowRequestMessageTest.cs @@ -32,7 +32,7 @@ public void ConvertsJsonMessageToMessage() Bucket = Guid.NewGuid().ToString(), DataTrigger = new DataOrigin { - DataType = DataType.DIMSE, + DataService = DataService.DIMSE, Source = Guid.NewGuid().ToString(), Destination = Guid.NewGuid().ToString(), }, @@ -46,28 +46,28 @@ public void ConvertsJsonMessageToMessage() }; input.DataOrigins.Add(new DataOrigin { - DataType = DataType.DICOMWEB, + DataService = DataService.DicomWeb, Source = Guid.NewGuid().ToString(), Destination = Guid.NewGuid().ToString(), }); input.DataOrigins.Add(new DataOrigin { - DataType = DataType.FHIR, + DataService = DataService.FHIR, Source = Guid.NewGuid().ToString(), Destination = Guid.NewGuid().ToString(), }); input.DataOrigins.Add(new DataOrigin { - DataType = DataType.DIMSE, + DataService = DataService.DIMSE, Source = Guid.NewGuid().ToString(), Destination = Guid.NewGuid().ToString(), }); input.DataOrigins.Add(new DataOrigin { - DataType = DataType.HL7, + DataService = DataService.HL7, Source = Guid.NewGuid().ToString(), Destination = Guid.NewGuid().ToString(), diff --git a/src/Plugins/RabbitMQ/Monai.Deploy.Messaging.RabbitMQ.csproj b/src/Plugins/RabbitMQ/Monai.Deploy.Messaging.RabbitMQ.csproj index 4628a97..a8b20e4 100644 --- a/src/Plugins/RabbitMQ/Monai.Deploy.Messaging.RabbitMQ.csproj +++ b/src/Plugins/RabbitMQ/Monai.Deploy.Messaging.RabbitMQ.csproj @@ -23,6 +23,7 @@ Monai.Deploy.Messaging.RabbitMQ false $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb + true From 12cd750f35edcf7e9e06f7fbee7c43e6337a8e0b Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Thu, 24 Aug 2023 08:50:56 -0700 Subject: [PATCH 5/9] Update GitVersion.yml Signed-off-by: Victor Chang --- GitVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GitVersion.yml b/GitVersion.yml index 77eb439..0bf6cdb 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -56,4 +56,4 @@ branches: ignore: sha: [] merge-message-formats: {} -next-version: 0.1.19 +next-version: 0.2.0 From 1f1c13f41cf95a47227d69031fa1afd1f0bff89a Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Thu, 24 Aug 2023 08:52:49 -0700 Subject: [PATCH 6/9] Update GitVersion.yml Signed-off-by: Victor Chang --- GitVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GitVersion.yml b/GitVersion.yml index 0bf6cdb..f60383e 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -56,4 +56,4 @@ branches: ignore: sha: [] merge-message-formats: {} -next-version: 0.2.0 +next-version: 0.2.1 From 01cecc80d08f71a4e9b6c03c86c768781d249d0d Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Thu, 24 Aug 2023 08:54:21 -0700 Subject: [PATCH 7/9] Update GitVersion.yml +semver: patch Signed-off-by: Victor Chang --- GitVersion.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GitVersion.yml b/GitVersion.yml index f60383e..0bf6cdb 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -56,4 +56,4 @@ branches: ignore: sha: [] merge-message-formats: {} -next-version: 0.2.1 +next-version: 0.2.0 From 3e31a26af6b2f7d5578a0111dac6c011be46306d Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Thu, 24 Aug 2023 08:56:26 -0700 Subject: [PATCH 8/9] Release/0.2.1 (#219) +semver: patch From 50c561acf4a8d4d40b74c780d5c9565e2f8161b4 Mon Sep 17 00:00:00 2001 From: Victor Chang Date: Thu, 24 Aug 2023 09:10:37 -0700 Subject: [PATCH 9/9] Release/0.2.2 (#221) +semver: patch --- GitVersion.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/GitVersion.yml b/GitVersion.yml index 0bf6cdb..d6d5b0e 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -57,3 +57,4 @@ ignore: sha: [] merge-message-formats: {} next-version: 0.2.0 +