Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
changes:
- section: Breaking Changes
description: Removed custom retry policy options from Virtual Desktop and Workbooks tools.
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,13 @@ public override async Task<CommandResponse> ExecuteAsync(CommandContext context,
options.Subscription!,
options.ResourceGroup,
options.Tenant,
options.RetryPolicy,
cancellationToken);
}
else
{
hostpools = await _virtualDesktopService.ListHostpoolsAsync(
options.Subscription!,
options.Tenant,
options.RetryPolicy,
cancellationToken);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ public override async Task<CommandResponse> ExecuteAsync(CommandContext context,
options.Subscription!,
options.HostpoolResourceId,
options.Tenant,
options.RetryPolicy,
cancellationToken);
}
else if (!string.IsNullOrEmpty(options.ResourceGroup))
Expand All @@ -55,7 +54,6 @@ public override async Task<CommandResponse> ExecuteAsync(CommandContext context,
options.ResourceGroup,
options.Hostpool!,
options.Tenant,
options.RetryPolicy,
cancellationToken);
}
else
Expand All @@ -64,7 +62,6 @@ public override async Task<CommandResponse> ExecuteAsync(CommandContext context,
options.Subscription!,
options.Hostpool!,
options.Tenant,
options.RetryPolicy,
cancellationToken);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ public override async Task<CommandResponse> ExecuteAsync(CommandContext context,
options.HostpoolResourceId,
options.Sessionhost,
options.Tenant,
options.RetryPolicy,
cancellationToken);
}
else if (!string.IsNullOrEmpty(options.ResourceGroup))
Expand All @@ -58,7 +57,6 @@ public override async Task<CommandResponse> ExecuteAsync(CommandContext context,
options.Hostpool!,
options.Sessionhost,
options.Tenant,
options.RetryPolicy,
cancellationToken);
}
else
Expand All @@ -68,7 +66,6 @@ public override async Task<CommandResponse> ExecuteAsync(CommandContext context,
options.Hostpool!,
options.Sessionhost,
options.Tenant,
options.RetryPolicy,
cancellationToken);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,4 @@ public class BaseHostPoolOptions : ISubscriptionOption

[Option(Description = OptionDescriptions.Tenant)]
public string? Tenant { get; set; }

[OptionContainer(Prefix = "retry")]
public RetryPolicyOptions? RetryPolicy { get; set; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,4 @@ public sealed class HostpoolListOptions : ISubscriptionOption

[Option(Description = OptionDescriptions.Tenant)]
public string? Tenant { get; set; }

[OptionContainer(Prefix = "retry")]
public RetryPolicyOptions? RetryPolicy { get; set; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
// Licensed under the MIT License.

using Azure.Mcp.Tools.VirtualDesktop.Models;
using Microsoft.Mcp.Core.Options;

namespace Azure.Mcp.Tools.VirtualDesktop.Services;

Expand All @@ -11,52 +10,45 @@ public interface IVirtualDesktopService
Task<IReadOnlyList<HostPool>> ListHostpoolsAsync(
string subscription,
string? tenant = null,
RetryPolicyOptions? retryPolicy = null,
CancellationToken cancellationToken = default);

Task<IReadOnlyList<HostPool>> ListHostpoolsByResourceGroupAsync(
string subscription,
string resourceGroup,
string? tenant = null,
RetryPolicyOptions? retryPolicy = null,
CancellationToken cancellationToken = default);

Task<IReadOnlyList<SessionHost>> ListSessionHostsAsync(
string subscription,
string hostPoolName,
string? tenant = null,
RetryPolicyOptions? retryPolicy = null,
CancellationToken cancellationToken = default);

Task<IReadOnlyList<SessionHost>> ListSessionHostsByResourceIdAsync(
string subscription,
string hostPoolResourceId,
string? tenant = null,
RetryPolicyOptions? retryPolicy = null,
CancellationToken cancellationToken = default);

Task<IReadOnlyList<SessionHost>> ListSessionHostsByResourceGroupAsync(
string subscription,
string resourceGroup,
string hostPoolName,
string? tenant = null,
RetryPolicyOptions? retryPolicy = null,
CancellationToken cancellationToken = default);

Task<IReadOnlyList<UserSession>> ListUserSessionsAsync(
string subscription,
string hostPoolName,
string sessionHostName,
string? tenant = null,
RetryPolicyOptions? retryPolicy = null,
CancellationToken cancellationToken = default);

Task<IReadOnlyList<UserSession>> ListUserSessionsByResourceIdAsync(
string subscription,
string hostPoolResourceId,
string sessionHostName,
string? tenant = null,
RetryPolicyOptions? retryPolicy = null,
CancellationToken cancellationToken = default);

Task<IReadOnlyList<UserSession>> ListUserSessionsByResourceGroupAsync(
Expand All @@ -65,6 +57,5 @@ Task<IReadOnlyList<UserSession>> ListUserSessionsByResourceGroupAsync(
string hostPoolName,
string sessionHostName,
string? tenant = null,
RetryPolicyOptions? retryPolicy = null,
CancellationToken cancellationToken = default);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
using Azure.Mcp.Core.Services.Azure;
using Azure.Mcp.Tools.VirtualDesktop.Models;
using Azure.ResourceManager.DesktopVirtualization;
using Microsoft.Mcp.Core.Options;

namespace Azure.Mcp.Tools.VirtualDesktop.Services;

Expand All @@ -15,10 +14,9 @@ public class VirtualDesktopService(IAzureService azureService) : IVirtualDesktop
public async Task<IReadOnlyList<HostPool>> ListHostpoolsAsync(
string subscription,
string? tenant = null,
RetryPolicyOptions? retryPolicy = null,
CancellationToken cancellationToken = default)
{
var sub = await _azureService.GetSubscription(subscription, tenant, retryPolicy, cancellationToken);
var sub = await _azureService.GetSubscription(subscription, tenant, cancellationToken: cancellationToken);
var hostpools = new List<HostPool>();
await foreach (HostPoolResource resource in sub.GetHostPoolsAsync(cancellationToken))
{
Expand All @@ -31,10 +29,9 @@ public async Task<IReadOnlyList<HostPool>> ListHostpoolsByResourceGroupAsync(
string subscription,
string resourceGroup,
string? tenant = null,
RetryPolicyOptions? retryPolicy = null,
CancellationToken cancellationToken = default)
{
var sub = await _azureService.GetSubscription(subscription, tenant, retryPolicy, cancellationToken);
var sub = await _azureService.GetSubscription(subscription, tenant, cancellationToken: cancellationToken);
var hostpools = new List<HostPool>();

var resourceGroupResource = await sub.GetResourceGroupAsync(resourceGroup, cancellationToken);
Expand All @@ -49,10 +46,9 @@ public async Task<IReadOnlyList<SessionHost>> ListSessionHostsAsync(
string subscription,
string hostPoolName,
string? tenant = null,
RetryPolicyOptions? retryPolicy = null,
CancellationToken cancellationToken = default)
{
var sub = await _azureService.GetSubscription(subscription, tenant, retryPolicy, cancellationToken);
var sub = await _azureService.GetSubscription(subscription, tenant, cancellationToken: cancellationToken);
var sessionHosts = new List<SessionHost>();

await foreach (HostPoolResource resource in sub.GetHostPoolsAsync(cancellationToken))
Expand All @@ -77,10 +73,9 @@ public async Task<IReadOnlyList<UserSession>> ListUserSessionsAsync(
string hostPoolName,
string sessionHostName,
string? tenant = null,
RetryPolicyOptions? retryPolicy = null,
CancellationToken cancellationToken = default)
{
var sub = await _azureService.GetSubscription(subscription, tenant, retryPolicy, cancellationToken);
var sub = await _azureService.GetSubscription(subscription, tenant, cancellationToken: cancellationToken);
var userSessions = new List<UserSession>();

await foreach (HostPoolResource resource in sub.GetHostPoolsAsync(cancellationToken))
Expand Down Expand Up @@ -111,10 +106,9 @@ public async Task<IReadOnlyList<SessionHost>> ListSessionHostsByResourceIdAsync(
string subscription,
string hostPoolResourceId,
string? tenant = null,
RetryPolicyOptions? retryPolicy = null,
CancellationToken cancellationToken = default)
{
var sub = await _azureService.GetSubscription(subscription, tenant, retryPolicy, cancellationToken);
var sub = await _azureService.GetSubscription(subscription, tenant, cancellationToken: cancellationToken);
var sessionHosts = new List<SessionHost>();

var armClient = sub.GetCachedClient(client => client);
Expand All @@ -132,10 +126,9 @@ public async Task<IReadOnlyList<UserSession>> ListUserSessionsByResourceIdAsync(
string hostPoolResourceId,
string sessionHostName,
string? tenant = null,
RetryPolicyOptions? retryPolicy = null,
CancellationToken cancellationToken = default)
{
var sub = await _azureService.GetSubscription(subscription, tenant, retryPolicy, cancellationToken);
var sub = await _azureService.GetSubscription(subscription, tenant, cancellationToken: cancellationToken);
var userSessions = new List<UserSession>();

var armClient = sub.GetCachedClient(client => client);
Expand All @@ -160,10 +153,9 @@ public async Task<IReadOnlyList<SessionHost>> ListSessionHostsByResourceGroupAsy
string resourceGroup,
string hostPoolName,
string? tenant = null,
RetryPolicyOptions? retryPolicy = null,
CancellationToken cancellationToken = default)
{
var sub = await _azureService.GetSubscription(subscription, tenant, retryPolicy, cancellationToken);
var sub = await _azureService.GetSubscription(subscription, tenant, cancellationToken: cancellationToken);
var sessionHosts = new List<SessionHost>();

var resourceGroupResource = await sub.GetResourceGroupAsync(resourceGroup, cancellationToken);
Expand All @@ -183,10 +175,9 @@ public async Task<IReadOnlyList<UserSession>> ListUserSessionsByResourceGroupAsy
string hostPoolName,
string sessionHostName,
string? tenant = null,
RetryPolicyOptions? retryPolicy = null,
CancellationToken cancellationToken = default)
{
var sub = await _azureService.GetSubscription(subscription, tenant, retryPolicy, cancellationToken);
var sub = await _azureService.GetSubscription(subscription, tenant, cancellationToken: cancellationToken);
var userSessions = new List<UserSession>();

var resourceGroupResource = await sub.GetResourceGroupAsync(resourceGroup, cancellationToken);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
using Azure.Mcp.Tools.VirtualDesktop.Commands.Hostpool;
using Azure.Mcp.Tools.VirtualDesktop.Models;
using Azure.Mcp.Tools.VirtualDesktop.Services;
using Microsoft.Mcp.Core.Options;
using NSubstitute;
using NSubstitute.ExceptionExtensions;
using Xunit;
Expand Down Expand Up @@ -40,9 +39,9 @@ public async Task ExecuteAsync_ValidatesInputCorrectly(string args, bool shouldS
new() { Name = "hostpool1" },
new() { Name = "hostpool2" }
}.AsReadOnly();
Service.ListHostpoolsAsync(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<RetryPolicyOptions>(), Arg.Any<CancellationToken>())
Service.ListHostpoolsAsync(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<CancellationToken>())
.Returns(hostpools);
Service.ListHostpoolsByResourceGroupAsync(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<RetryPolicyOptions>(), Arg.Any<CancellationToken>())
Service.ListHostpoolsByResourceGroupAsync(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<CancellationToken>())
.Returns(hostpools);
Comment thread
alzimmermsft marked this conversation as resolved.
}

Expand All @@ -66,9 +65,9 @@ public async Task ExecuteAsync_ValidatesInputCorrectly(string args, bool shouldS
public async Task ExecuteAsync_ReturnsEmptyResult_WhenNoHostpools()
{
// Arrange
Service.ListHostpoolsAsync(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<RetryPolicyOptions>(), Arg.Any<CancellationToken>())
Service.ListHostpoolsAsync(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<CancellationToken>())
.Returns([]);
Service.ListHostpoolsByResourceGroupAsync(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<RetryPolicyOptions>(), Arg.Any<CancellationToken>())
Service.ListHostpoolsByResourceGroupAsync(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<CancellationToken>())
.Returns([]);

// Act
Expand All @@ -83,7 +82,7 @@ public async Task ExecuteAsync_ReturnsEmptyResult_WhenNoHostpools()
public async Task ExecuteAsync_HandlesServiceErrors()
{
// Arrange
Service.ListHostpoolsAsync(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<RetryPolicyOptions>(), Arg.Any<CancellationToken>())
Service.ListHostpoolsAsync(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<CancellationToken>())
.ThrowsAsync(new Exception("Test error"));

// Act
Expand All @@ -104,7 +103,7 @@ public async Task ExecuteAsync_ReturnsHostpools_WhenSuccessful()
new() { Name = "hostpool1" },
new() { Name = "hostpool2" }
}.AsReadOnly();
Service.ListHostpoolsAsync("test-sub", null, Arg.Any<RetryPolicyOptions>(), Arg.Any<CancellationToken>())
Service.ListHostpoolsAsync("test-sub", null, Arg.Any<CancellationToken>())
.Returns(expectedHostpools);

// Act
Expand All @@ -114,7 +113,7 @@ public async Task ExecuteAsync_ReturnsHostpools_WhenSuccessful()
Assert.Equal(HttpStatusCode.OK, response.Status);
Assert.NotNull(response.Results);

await Service.Received(1).ListHostpoolsAsync("test-sub", null, Arg.Any<RetryPolicyOptions>(), Arg.Any<CancellationToken>());
await Service.Received(1).ListHostpoolsAsync("test-sub", null, Arg.Any<CancellationToken>());
}

[Fact]
Expand All @@ -126,7 +125,7 @@ public async Task ExecuteAsync_CallsAzureService_WhenResourceGroupProvided()
new() { Name = "hostpool1" },
new() { Name = "hostpool2" }
}.AsReadOnly();
Service.ListHostpoolsByResourceGroupAsync("test-sub", "test-rg", null, Arg.Any<RetryPolicyOptions>(), Arg.Any<CancellationToken>())
Service.ListHostpoolsByResourceGroupAsync("test-sub", "test-rg", null, Arg.Any<CancellationToken>())
.Returns(expectedHostpools);

// Act
Expand All @@ -136,8 +135,8 @@ public async Task ExecuteAsync_CallsAzureService_WhenResourceGroupProvided()
Assert.Equal(HttpStatusCode.OK, response.Status);
Assert.NotNull(response.Results);

await Service.Received(1).ListHostpoolsByResourceGroupAsync("test-sub", "test-rg", null, Arg.Any<RetryPolicyOptions>(), Arg.Any<CancellationToken>());
await Service.DidNotReceive().ListHostpoolsAsync(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<RetryPolicyOptions>(), Arg.Any<CancellationToken>());
await Service.Received(1).ListHostpoolsByResourceGroupAsync("test-sub", "test-rg", null, Arg.Any<CancellationToken>());
await Service.DidNotReceive().ListHostpoolsAsync(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<CancellationToken>());
}

[Fact]
Expand All @@ -149,7 +148,7 @@ public async Task ExecuteAsync_CallsAzureService_WhenNoResourceGroup()
new() { Name = "hostpool1" },
new() { Name = "hostpool2" }
}.AsReadOnly();
Service.ListHostpoolsAsync("test-sub", null, Arg.Any<RetryPolicyOptions>(), Arg.Any<CancellationToken>())
Service.ListHostpoolsAsync("test-sub", null, Arg.Any<CancellationToken>())
.Returns(expectedHostpools);

// Act
Expand All @@ -159,15 +158,15 @@ public async Task ExecuteAsync_CallsAzureService_WhenNoResourceGroup()
Assert.Equal(HttpStatusCode.OK, response.Status);
Assert.NotNull(response.Results);

await Service.Received(1).ListHostpoolsAsync("test-sub", null, Arg.Any<RetryPolicyOptions>(), Arg.Any<CancellationToken>());
await Service.DidNotReceive().ListHostpoolsByResourceGroupAsync(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<RetryPolicyOptions>(), Arg.Any<CancellationToken>());
await Service.Received(1).ListHostpoolsAsync("test-sub", null, Arg.Any<CancellationToken>());
await Service.DidNotReceive().ListHostpoolsByResourceGroupAsync(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<CancellationToken>());
}

[Fact]
public async Task ExecuteAsync_ReturnsEmptyResult_WhenNoHostpoolsInResourceGroup()
{
// Arrange
Service.ListHostpoolsByResourceGroupAsync(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<RetryPolicyOptions>(), Arg.Any<CancellationToken>())
Service.ListHostpoolsByResourceGroupAsync(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>(), Arg.Any<CancellationToken>())
.Returns([]);

// Act
Expand Down
Loading
Loading