diff --git a/CHANGELOG.md b/CHANGELOG.md index 55f9d0172..a415bbd87 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## v1.9.0 (unreleased) - Introduce default version setting to DurableTaskClient and expose to orchestrator ([#393](https://github.com/microsoft/durabletask-dotnet/pull/393)) +- Add support for local credential types in DTS libraries ([#396](https://github.com/microsoft/durabletask-dotnet/pull/396)) ## v1.8.1 diff --git a/src/Client/AzureManaged/DurableTaskSchedulerClientOptions.cs b/src/Client/AzureManaged/DurableTaskSchedulerClientOptions.cs index 9f6829fca..c1a0da7e8 100644 --- a/src/Client/AzureManaged/DurableTaskSchedulerClientOptions.cs +++ b/src/Client/AzureManaged/DurableTaskSchedulerClientOptions.cs @@ -1,5 +1,6 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. + using System.ComponentModel.DataAnnotations; using Azure.Core; using Azure.Identity; @@ -152,6 +153,12 @@ this.Credential is not null return new AzureCliCredential(); case "azurepowershell": return new AzurePowerShellCredential(); + case "visualstudio": + return new VisualStudioCredential(); + case "visualstudiocode": + return new VisualStudioCodeCredential(); + case "interactivebrowser": + return new InteractiveBrowserCredential(); case "none": return null; default: diff --git a/src/Worker/AzureManaged/DurableTaskSchedulerWorkerOptions.cs b/src/Worker/AzureManaged/DurableTaskSchedulerWorkerOptions.cs index 4a92d91dc..023b2d8b8 100644 --- a/src/Worker/AzureManaged/DurableTaskSchedulerWorkerOptions.cs +++ b/src/Worker/AzureManaged/DurableTaskSchedulerWorkerOptions.cs @@ -1,5 +1,6 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. + using System.ComponentModel.DataAnnotations; using Azure.Core; using Azure.Identity; @@ -159,6 +160,12 @@ this.Credential is not null return new AzureCliCredential(); case "azurepowershell": return new AzurePowerShellCredential(); + case "visualstudio": + return new VisualStudioCredential(); + case "visualstudiocode": + return new VisualStudioCodeCredential(); + case "interactivebrowser": + return new InteractiveBrowserCredential(); case "none": return null; default: diff --git a/test/Client/AzureManaged.Tests/DurableTaskSchedulerClientOptionsTests.cs b/test/Client/AzureManaged.Tests/DurableTaskSchedulerClientOptionsTests.cs index d0790c3fb..05b8bd67e 100644 --- a/test/Client/AzureManaged.Tests/DurableTaskSchedulerClientOptionsTests.cs +++ b/test/Client/AzureManaged.Tests/DurableTaskSchedulerClientOptionsTests.cs @@ -60,14 +60,87 @@ public void FromConnectionString_WithWorkloadIdentity_ShouldCreateValidInstance( options.Credential.Should().BeOfType(); } - [Theory] - [InlineData("Environment")] - [InlineData("AzureCLI")] - [InlineData("AzurePowerShell")] - public void FromConnectionString_WithValidAuthTypes_ShouldCreateValidInstance(string authType) + + [Fact] + public void FromConnectionString_WithEnvironmentCredential_ShouldCreateValidInstance() + { + // Arrange + string connectionString = $"Endpoint={ValidEndpoint};Authentication=Environment;TaskHub={ValidTaskHub}"; + + // Act + DurableTaskSchedulerClientOptions options = DurableTaskSchedulerClientOptions.FromConnectionString(connectionString); + + // Assert + options.EndpointAddress.Should().Be(ValidEndpoint); + options.TaskHubName.Should().Be(ValidTaskHub); + options.Credential.Should().BeOfType(); + } + + [Fact] + public void FromConnectionString_WithAzureCliCredential_ShouldCreateValidInstance() + { + // Arrange + string connectionString = $"Endpoint={ValidEndpoint};Authentication=AzureCLI;TaskHub={ValidTaskHub}"; + + // Act + DurableTaskSchedulerClientOptions options = DurableTaskSchedulerClientOptions.FromConnectionString(connectionString); + + // Assert + options.EndpointAddress.Should().Be(ValidEndpoint); + options.TaskHubName.Should().Be(ValidTaskHub); + options.Credential.Should().BeOfType(); + } + + [Fact] + public void FromConnectionString_WithAzurePowerShellCredential_ShouldCreateValidInstance() + { + // Arrange + string connectionString = $"Endpoint={ValidEndpoint};Authentication=AzurePowerShell;TaskHub={ValidTaskHub}"; + + // Act + DurableTaskSchedulerClientOptions options = DurableTaskSchedulerClientOptions.FromConnectionString(connectionString); + + // Assert + options.EndpointAddress.Should().Be(ValidEndpoint); + options.TaskHubName.Should().Be(ValidTaskHub); + options.Credential.Should().BeOfType(); + } + + [Fact] + public void FromConnectionString_WithVisualStudioCredential_ShouldCreateValidInstance() + { + // Arrange + string connectionString = $"Endpoint={ValidEndpoint};Authentication=VisualStudio;TaskHub={ValidTaskHub}"; + + // Act + DurableTaskSchedulerClientOptions options = DurableTaskSchedulerClientOptions.FromConnectionString(connectionString); + + // Assert + options.EndpointAddress.Should().Be(ValidEndpoint); + options.TaskHubName.Should().Be(ValidTaskHub); + options.Credential.Should().BeOfType(); + } + + [Fact] + public void FromConnectionString_WithVisualStudioCodeCredential_ShouldCreateValidInstance() + { + // Arrange + string connectionString = $"Endpoint={ValidEndpoint};Authentication=VisualStudioCode;TaskHub={ValidTaskHub}"; + + // Act + DurableTaskSchedulerClientOptions options = DurableTaskSchedulerClientOptions.FromConnectionString(connectionString); + + // Assert + options.EndpointAddress.Should().Be(ValidEndpoint); + options.TaskHubName.Should().Be(ValidTaskHub); + options.Credential.Should().BeOfType(); + } + + [Fact] + public void FromConnectionString_WithInteractiveCredential_ShouldCreateValidInstance() { // Arrange - string connectionString = $"Endpoint={ValidEndpoint};Authentication={authType};TaskHub={ValidTaskHub}"; + string connectionString = $"Endpoint={ValidEndpoint};Authentication=InteractiveBrowser;TaskHub={ValidTaskHub}"; // Act DurableTaskSchedulerClientOptions options = DurableTaskSchedulerClientOptions.FromConnectionString(connectionString); @@ -75,7 +148,7 @@ public void FromConnectionString_WithValidAuthTypes_ShouldCreateValidInstance(st // Assert options.EndpointAddress.Should().Be(ValidEndpoint); options.TaskHubName.Should().Be(ValidTaskHub); - options.Credential.Should().NotBeNull(); + options.Credential.Should().BeOfType(); } [Fact] diff --git a/test/Worker/AzureManaged.Tests/DurableTaskSchedulerWorkerOptionsTests.cs b/test/Worker/AzureManaged.Tests/DurableTaskSchedulerWorkerOptionsTests.cs index 03150b433..3cc03c035 100644 --- a/test/Worker/AzureManaged.Tests/DurableTaskSchedulerWorkerOptionsTests.cs +++ b/test/Worker/AzureManaged.Tests/DurableTaskSchedulerWorkerOptionsTests.cs @@ -60,14 +60,86 @@ public void FromConnectionString_WithWorkloadIdentity_ShouldCreateValidInstance( options.Credential.Should().BeOfType(); } - [Theory] - [InlineData("Environment")] - [InlineData("AzureCLI")] - [InlineData("AzurePowerShell")] - public void FromConnectionString_WithValidAuthTypes_ShouldCreateValidInstance(string authType) + [Fact] + public void FromConnectionString_WithEnvironmentCredential_ShouldCreateValidInstance() + { + // Arrange + string connectionString = $"Endpoint={ValidEndpoint};Authentication=Environment;TaskHub={ValidTaskHub}"; + + // Act + DurableTaskSchedulerWorkerOptions options = DurableTaskSchedulerWorkerOptions.FromConnectionString(connectionString); + + // Assert + options.EndpointAddress.Should().Be(ValidEndpoint); + options.TaskHubName.Should().Be(ValidTaskHub); + options.Credential.Should().BeOfType(); + } + + [Fact] + public void FromConnectionString_WithAzureCliCredential_ShouldCreateValidInstance() + { + // Arrange + string connectionString = $"Endpoint={ValidEndpoint};Authentication=AzureCLI;TaskHub={ValidTaskHub}"; + + // Act + DurableTaskSchedulerWorkerOptions options = DurableTaskSchedulerWorkerOptions.FromConnectionString(connectionString); + + // Assert + options.EndpointAddress.Should().Be(ValidEndpoint); + options.TaskHubName.Should().Be(ValidTaskHub); + options.Credential.Should().BeOfType(); + } + + [Fact] + public void FromConnectionString_WithAzurePowerShellCredential_ShouldCreateValidInstance() + { + // Arrange + string connectionString = $"Endpoint={ValidEndpoint};Authentication=AzurePowerShell;TaskHub={ValidTaskHub}"; + + // Act + DurableTaskSchedulerWorkerOptions options = DurableTaskSchedulerWorkerOptions.FromConnectionString(connectionString); + + // Assert + options.EndpointAddress.Should().Be(ValidEndpoint); + options.TaskHubName.Should().Be(ValidTaskHub); + options.Credential.Should().BeOfType(); + } + + [Fact] + public void FromConnectionString_WithVisualStudioCredential_ShouldCreateValidInstance() + { + // Arrange + string connectionString = $"Endpoint={ValidEndpoint};Authentication=VisualStudio;TaskHub={ValidTaskHub}"; + + // Act + DurableTaskSchedulerWorkerOptions options = DurableTaskSchedulerWorkerOptions.FromConnectionString(connectionString); + + // Assert + options.EndpointAddress.Should().Be(ValidEndpoint); + options.TaskHubName.Should().Be(ValidTaskHub); + options.Credential.Should().BeOfType(); + } + + [Fact] + public void FromConnectionString_WithVisualStudioCodeCredential_ShouldCreateValidInstance() + { + // Arrange + string connectionString = $"Endpoint={ValidEndpoint};Authentication=VisualStudioCode;TaskHub={ValidTaskHub}"; + + // Act + DurableTaskSchedulerWorkerOptions options = DurableTaskSchedulerWorkerOptions.FromConnectionString(connectionString); + + // Assert + options.EndpointAddress.Should().Be(ValidEndpoint); + options.TaskHubName.Should().Be(ValidTaskHub); + options.Credential.Should().BeOfType(); + } + + [Fact] + public void FromConnectionString_WithInteractiveCredential_ShouldCreateValidInstance() { // Arrange - string connectionString = $"Endpoint={ValidEndpoint};Authentication={authType};TaskHub={ValidTaskHub}"; + string connectionString = $"Endpoint={ValidEndpoint};Authentication=InteractiveBrowser;TaskHub={ValidTaskHub}"; // Act DurableTaskSchedulerWorkerOptions options = DurableTaskSchedulerWorkerOptions.FromConnectionString(connectionString); @@ -75,7 +147,7 @@ public void FromConnectionString_WithValidAuthTypes_ShouldCreateValidInstance(st // Assert options.EndpointAddress.Should().Be(ValidEndpoint); options.TaskHubName.Should().Be(ValidTaskHub); - options.Credential.Should().NotBeNull(); + options.Credential.Should().BeOfType(); } [Fact]