diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 9b32866275..93aff6f7d0 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -34,7 +34,7 @@ - + @@ -47,7 +47,7 @@ - + @@ -92,4 +92,4 @@ - + \ No newline at end of file diff --git a/src/ServiceControl.Transports.ASBS.Tests/ConnectionStringParserTests.cs b/src/ServiceControl.Transports.ASBS.Tests/ConnectionStringParserTests.cs index 90ba3b9f99..2b397516d9 100644 --- a/src/ServiceControl.Transports.ASBS.Tests/ConnectionStringParserTests.cs +++ b/src/ServiceControl.Transports.ASBS.Tests/ConnectionStringParserTests.cs @@ -37,6 +37,9 @@ public static IEnumerable SupportedConnectionStrings //EnablePartitioning yield return new TestCaseData("Endpoint=sb://some.endpoint.name/;EnablePartitioning=True", new ConnectionSettings(new SharedAccessSignatureAuthentication("Endpoint=sb://some.endpoint.name/;EnablePartitioning=True"), enablePartitioning: true)); + //HierarchyNamespace + yield return new TestCaseData("Endpoint=sb://some.endpoint.name/;HierarchyNamespace=my-hierarchy", + new ConnectionSettings(new SharedAccessSignatureAuthentication("Endpoint=sb://some.endpoint.name/;HierarchyNamespace=my-hierarchy"), hierarchyNamespace: "my-hierarchy")); } } @@ -86,4 +89,4 @@ public void VerifyNotSupported(string connectionString) Assert.Throws(() => ConnectionStringParser.Parse(connectionString)); } } -} +} \ No newline at end of file diff --git a/src/ServiceControl.Transports.ASBS/ASBSTransportCustomization.cs b/src/ServiceControl.Transports.ASBS/ASBSTransportCustomization.cs index 5a600a385f..4082fdcc0c 100644 --- a/src/ServiceControl.Transports.ASBS/ASBSTransportCustomization.cs +++ b/src/ServiceControl.Transports.ASBS/ASBSTransportCustomization.cs @@ -42,6 +42,10 @@ protected override AzureServiceBusTransport CreateTransport(TransportSettings tr var transport = connectionSettings.AuthenticationMethod.CreateTransportDefinition(connectionSettings, selectedTopology); transport.UseWebSockets = connectionSettings.UseWebSockets; transport.EnablePartitioning = connectionSettings.EnablePartitioning; + if (!string.IsNullOrWhiteSpace(connectionSettings.HierarchyNamespace)) + { + transport.HierarchyNamespaceOptions = new HierarchyNamespaceOptions { HierarchyNamespace = connectionSettings.HierarchyNamespace }; + } transport.TransportTransactionMode = transport.GetSupportedTransactionModes().Contains(preferredTransactionMode) ? preferredTransactionMode : TransportTransactionMode.ReceiveOnly; @@ -67,7 +71,8 @@ protected override void AddTransportForPrimaryCore(IServiceCollection services, { TopicToPublishTo = connectionSettings.TopicName, TopicToSubscribeOn = connectionSettings.TopicName, - EventsToMigrateMap = [ + EventsToMigrateMap = + [ "ServiceControl.Contracts.CustomCheckFailed", "ServiceControl.Contracts.CustomCheckSucceeded", "ServiceControl.Contracts.HeartbeatRestored", diff --git a/src/ServiceControl.Transports.ASBS/ConnectionSettings.cs b/src/ServiceControl.Transports.ASBS/ConnectionSettings.cs index 202d15b17b..47a36a4835 100644 --- a/src/ServiceControl.Transports.ASBS/ConnectionSettings.cs +++ b/src/ServiceControl.Transports.ASBS/ConnectionSettings.cs @@ -8,13 +8,15 @@ public ConnectionSettings(AuthenticationMethod authenticationSettings, string topicName = default, bool useWebSockets = default, bool enablePartitioning = default, - TimeSpan? queryDelayInterval = default) + TimeSpan? queryDelayInterval = default, + string hierarchyNamespace = default) { AuthenticationMethod = authenticationSettings; TopicName = topicName; UseWebSockets = useWebSockets; EnablePartitioning = enablePartitioning; QueryDelayInterval = queryDelayInterval; + HierarchyNamespace = hierarchyNamespace; } public AuthenticationMethod AuthenticationMethod { get; } @@ -26,5 +28,7 @@ public ConnectionSettings(AuthenticationMethod authenticationSettings, public bool UseWebSockets { get; } public bool EnablePartitioning { get; } + + public string HierarchyNamespace { get; } } } \ No newline at end of file diff --git a/src/ServiceControl.Transports.ASBS/ConnectionStringParser.cs b/src/ServiceControl.Transports.ASBS/ConnectionStringParser.cs index 404a1da13b..b4f8386d99 100644 --- a/src/ServiceControl.Transports.ASBS/ConnectionStringParser.cs +++ b/src/ServiceControl.Transports.ASBS/ConnectionStringParser.cs @@ -35,6 +35,7 @@ public static ConnectionSettings Parse(string connectionString) { throw new Exception($"Can't parse {value} as a valid query delay interval."); } + queryDelayInterval = TimeSpan.FromMilliseconds(delayInterval); } @@ -72,6 +73,12 @@ public static ConnectionSettings Parse(string connectionString) } } + string hierarchyNamespace = null; + if (builder.TryGetValue("HierarchyNamespace", out var hierarchyNamespaceString)) + { + hierarchyNamespace = (string)hierarchyNamespaceString; + } + var shouldUseManagedIdentity = builder.TryGetValue("Authentication", out var authType) && (string)authType == "Managed Identity"; if (shouldUseManagedIdentity) @@ -79,11 +86,12 @@ public static ConnectionSettings Parse(string connectionString) var fullyQualifiedNamespace = endpoint.ToString().TrimEnd('/').Replace("sb://", ""); return new ConnectionSettings( - new TokenCredentialAuthentication(fullyQualifiedNamespace, clientIdString), - topicNameString, - useWebSockets, - enablePartitioning, - queryDelayInterval); + new TokenCredentialAuthentication(fullyQualifiedNamespace, clientIdString), + topicNameString, + useWebSockets, + enablePartitioning, + queryDelayInterval, + hierarchyNamespace); } if (clientIdString != null) @@ -96,7 +104,8 @@ public static ConnectionSettings Parse(string connectionString) topicNameString, useWebSockets, enablePartitioning, - queryDelayInterval); + queryDelayInterval, + hierarchyNamespace); } } -} +} \ No newline at end of file diff --git a/src/ServiceControl.Transports.ASBS/transport.manifest b/src/ServiceControl.Transports.ASBS/transport.manifest index 34b78cd534..65d8e073fa 100644 --- a/src/ServiceControl.Transports.ASBS/transport.manifest +++ b/src/ServiceControl.Transports.ASBS/transport.manifest @@ -5,7 +5,7 @@ "DisplayName": "Azure Service Bus", "AssemblyName": "ServiceControl.Transports.ASBS", "TypeName": "ServiceControl.Transports.ASBS.ASBSTransportCustomization, ServiceControl.Transports.ASBS", - "SampleConnectionString": "Endpoint=sb://[namespace].servicebus.windows.net; SharedSecretIssuer=;SharedSecretValue=;QueueLengthQueryDelayInterval=;TopicName=;EnablePartitioning=", + "SampleConnectionString": "Endpoint=sb://[namespace].servicebus.windows.net; SharedSecretIssuer=;SharedSecretValue=;QueueLengthQueryDelayInterval=;TopicName=;EnablePartitioning=;HierarchyNamespace=", "AvailableInSCMU": true, "Aliases": [ "ServiceControl.Transports.AzureServiceBus.AzureServiceBusTransport, ServiceControl.Transports.AzureServiceBus"