Skip to content
This repository was archived by the owner on Sep 4, 2025. It is now read-only.

Commit a1522ef

Browse files
Add azmcp azuremanagedlustre filesystem list / required-subnet-size (#1003)
* Add support for Azure Managed Lustre List and Subnet size * Fix description of list command * Add documentation for AzureManagedLustre List / RequiredSubnetSize and additional unittests * Fix spell checks for Azure Managed Lustre area commands list and requiredsubnetsize * Exclude AzureManagedLustre from native builds because of StorageCache SDK dependencies * Fix Azure Managed Lustre area after review comments - Moving LustreFileSystem to record, adding missing JSONPropertyNames, removing not required GetError overrides. * Adjust typos in FileSystemListCommandTests.cs * Remove duplicated call in Program.cs of AzureManagedLustreSetup * Add NAT gateway for outbound connectivity in Azure Managed Lustre Live Tests * Add installation of Az.StorageCache module to the test-resources-post * Specify repository in install command of Az.StorageCache * Add Force to Az.StorageCache module install * Remove mcp.json file * Fix duplicated lines in sln and SQL mention in Azure Managed Lustre area
1 parent 890dcda commit a1522ef

33 files changed

+1182
-1
lines changed

‎.github/CODEOWNERS‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@
126126
# ServiceLabel: %area-Monitor
127127
# ServiceOwners: @smritiy @srnagar @jongio
128128

129+
# PRLabel: %area-AzureManagedLustre
130+
/areas/azuremanagedlustre/ @wolfgang-desalvador
131+
# ServiceLabel: %area-AzureManagedLustre
132+
# ServiceOwners: @wolfgang-desalvador
129133

130134
# PRLabel: %area-Postgres
131135
/areas/postgres/ @kk-src @shreyaaithal @maxluk @xiangyan99 @Azure/azure-mcp

‎.vscode/cspell.json‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@
211211
"aksservice",
212212
"alcoop",
213213
"AOAI",
214+
"amlfs",
214215
"Apim",
215216
"appconfig",
216217
"appservice",
@@ -243,6 +244,7 @@
243244
"azurefunctions",
244245
"azureisv",
245246
"azurekeyvault",
247+
"azuremanagedlustre",
246248
"azuremcp",
247249
"azureopenai",
248250
"azureprivateendpoint",
@@ -317,6 +319,8 @@
317319
"exfiltration",
318320
"facetable",
319321
"filefilters",
322+
"filesystem",
323+
"filesystems",
320324
"fnames",
321325
"francecentral",
322326
"frontendservice",

‎AzureMcp.sln‎

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,18 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{75F7911D
354354
EndProject
355355
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureMcp.ResourceHealth.UnitTests", "areas\resourcehealth\tests\AzureMcp.ResourceHealth.UnitTests\AzureMcp.ResourceHealth.UnitTests.csproj", "{2A346B5F-D5FB-4454-ABBB-5E60280CBDF2}"
356356
EndProject
357+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "azuremanagedlustre", "azuremanagedlustre", "{05F4A9AA-E313-F85F-35A7-20E465EB0532}"
358+
EndProject
359+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{AF424C36-FA6C-E60B-A0CD-D3E17D146BD9}"
360+
EndProject
361+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureMcp.AzureManagedLustre", "areas\azuremanagedlustre\src\AzureMcp.AzureManagedLustre\AzureMcp.AzureManagedLustre.csproj", "{65216363-3CC2-458A-B9CC-14C98C89C0A6}"
362+
EndProject
363+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{7351A97E-B2FF-D04C-5414-153081BE3CBC}"
364+
EndProject
365+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureMcp.AzureManagedLustre.UnitTests", "areas\azuremanagedlustre\tests\AzureMcp.AzureManagedLustre.UnitTests\AzureMcp.AzureManagedLustre.UnitTests.csproj", "{4030C38F-B491-460A-9308-BEDB5727819F}"
366+
EndProject
367+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AzureMcp.AzureManagedLustre.LiveTests", "areas\azuremanagedlustre\tests\AzureMcp.AzureManagedLustre.LiveTests\AzureMcp.AzureManagedLustre.LiveTests.csproj", "{297EDCEE-F97C-49AF-8DB1-9E75730EBB23}"
368+
EndProject
357369
Global
358370
GlobalSection(SolutionConfigurationPlatforms) = preSolution
359371
Debug|Any CPU = Debug|Any CPU
@@ -1384,6 +1396,42 @@ Global
13841396
{2A346B5F-D5FB-4454-ABBB-5E60280CBDF2}.Release|x64.Build.0 = Release|Any CPU
13851397
{2A346B5F-D5FB-4454-ABBB-5E60280CBDF2}.Release|x86.ActiveCfg = Release|Any CPU
13861398
{2A346B5F-D5FB-4454-ABBB-5E60280CBDF2}.Release|x86.Build.0 = Release|Any CPU
1399+
{65216363-3CC2-458A-B9CC-14C98C89C0A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1400+
{65216363-3CC2-458A-B9CC-14C98C89C0A6}.Debug|Any CPU.Build.0 = Debug|Any CPU
1401+
{65216363-3CC2-458A-B9CC-14C98C89C0A6}.Debug|x64.ActiveCfg = Debug|Any CPU
1402+
{65216363-3CC2-458A-B9CC-14C98C89C0A6}.Debug|x64.Build.0 = Debug|Any CPU
1403+
{65216363-3CC2-458A-B9CC-14C98C89C0A6}.Debug|x86.ActiveCfg = Debug|Any CPU
1404+
{65216363-3CC2-458A-B9CC-14C98C89C0A6}.Debug|x86.Build.0 = Debug|Any CPU
1405+
{65216363-3CC2-458A-B9CC-14C98C89C0A6}.Release|Any CPU.ActiveCfg = Release|Any CPU
1406+
{65216363-3CC2-458A-B9CC-14C98C89C0A6}.Release|Any CPU.Build.0 = Release|Any CPU
1407+
{65216363-3CC2-458A-B9CC-14C98C89C0A6}.Release|x64.ActiveCfg = Release|Any CPU
1408+
{65216363-3CC2-458A-B9CC-14C98C89C0A6}.Release|x64.Build.0 = Release|Any CPU
1409+
{65216363-3CC2-458A-B9CC-14C98C89C0A6}.Release|x86.ActiveCfg = Release|Any CPU
1410+
{65216363-3CC2-458A-B9CC-14C98C89C0A6}.Release|x86.Build.0 = Release|Any CPU
1411+
{4030C38F-B491-460A-9308-BEDB5727819F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1412+
{4030C38F-B491-460A-9308-BEDB5727819F}.Debug|Any CPU.Build.0 = Debug|Any CPU
1413+
{4030C38F-B491-460A-9308-BEDB5727819F}.Debug|x64.ActiveCfg = Debug|Any CPU
1414+
{4030C38F-B491-460A-9308-BEDB5727819F}.Debug|x64.Build.0 = Debug|Any CPU
1415+
{4030C38F-B491-460A-9308-BEDB5727819F}.Debug|x86.ActiveCfg = Debug|Any CPU
1416+
{4030C38F-B491-460A-9308-BEDB5727819F}.Debug|x86.Build.0 = Debug|Any CPU
1417+
{4030C38F-B491-460A-9308-BEDB5727819F}.Release|Any CPU.ActiveCfg = Release|Any CPU
1418+
{4030C38F-B491-460A-9308-BEDB5727819F}.Release|Any CPU.Build.0 = Release|Any CPU
1419+
{4030C38F-B491-460A-9308-BEDB5727819F}.Release|x64.ActiveCfg = Release|Any CPU
1420+
{4030C38F-B491-460A-9308-BEDB5727819F}.Release|x64.Build.0 = Release|Any CPU
1421+
{4030C38F-B491-460A-9308-BEDB5727819F}.Release|x86.ActiveCfg = Release|Any CPU
1422+
{4030C38F-B491-460A-9308-BEDB5727819F}.Release|x86.Build.0 = Release|Any CPU
1423+
{297EDCEE-F97C-49AF-8DB1-9E75730EBB23}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
1424+
{297EDCEE-F97C-49AF-8DB1-9E75730EBB23}.Debug|Any CPU.Build.0 = Debug|Any CPU
1425+
{297EDCEE-F97C-49AF-8DB1-9E75730EBB23}.Debug|x64.ActiveCfg = Debug|Any CPU
1426+
{297EDCEE-F97C-49AF-8DB1-9E75730EBB23}.Debug|x64.Build.0 = Debug|Any CPU
1427+
{297EDCEE-F97C-49AF-8DB1-9E75730EBB23}.Debug|x86.ActiveCfg = Debug|Any CPU
1428+
{297EDCEE-F97C-49AF-8DB1-9E75730EBB23}.Debug|x86.Build.0 = Debug|Any CPU
1429+
{297EDCEE-F97C-49AF-8DB1-9E75730EBB23}.Release|Any CPU.ActiveCfg = Release|Any CPU
1430+
{297EDCEE-F97C-49AF-8DB1-9E75730EBB23}.Release|Any CPU.Build.0 = Release|Any CPU
1431+
{297EDCEE-F97C-49AF-8DB1-9E75730EBB23}.Release|x64.ActiveCfg = Release|Any CPU
1432+
{297EDCEE-F97C-49AF-8DB1-9E75730EBB23}.Release|x64.Build.0 = Release|Any CPU
1433+
{297EDCEE-F97C-49AF-8DB1-9E75730EBB23}.Release|x86.ActiveCfg = Release|Any CPU
1434+
{297EDCEE-F97C-49AF-8DB1-9E75730EBB23}.Release|x86.Build.0 = Release|Any CPU
13871435
EndGlobalSection
13881436
GlobalSection(SolutionProperties) = preSolution
13891437
HideSolutionNode = FALSE
@@ -1563,5 +1611,11 @@ Global
15631611
{FD987DB2-B19B-42EE-99C9-BF743D1288E3} = {74490446-B0E8-F412-A296-BAE0BDC966AF}
15641612
{75F7911D-A518-6F54-1978-62BEAF400CFE} = {A29DD7BA-996D-C4EA-7CB3-91A08E5445CC}
15651613
{2A346B5F-D5FB-4454-ABBB-5E60280CBDF2} = {75F7911D-A518-6F54-1978-62BEAF400CFE}
1614+
{05F4A9AA-E313-F85F-35A7-20E465EB0532} = {87783708-79E3-AD60-C783-1D52BE7DE4BB}
1615+
{AF424C36-FA6C-E60B-A0CD-D3E17D146BD9} = {05F4A9AA-E313-F85F-35A7-20E465EB0532}
1616+
{65216363-3CC2-458A-B9CC-14C98C89C0A6} = {AF424C36-FA6C-E60B-A0CD-D3E17D146BD9}
1617+
{7351A97E-B2FF-D04C-5414-153081BE3CBC} = {05F4A9AA-E313-F85F-35A7-20E465EB0532}
1618+
{4030C38F-B491-460A-9308-BEDB5727819F} = {7351A97E-B2FF-D04C-5414-153081BE3CBC}
1619+
{297EDCEE-F97C-49AF-8DB1-9E75730EBB23} = {7351A97E-B2FF-D04C-5414-153081BE3CBC}
15661620
EndGlobalSection
15671621
EndGlobal

‎CHANGELOG.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ The Azure MCP Server updates automatically by default whenever a new release com
3030
## 0.5.7 (2025-08-19)
3131

3232
### Features Added
33+
- Added the following Azure Managed Lustre commands:
34+
- `azmcp-azuremanagedlustre-filesystem-list`: List available Azure Managed Lustre filesystem. [[#1001](https://github.com/Azure/azure-mcp/issues/1001)]
35+
- `azmcp-azuremanagedlustre-filesystem-required-subnet-size`: Returns the number of IP addresses required for a specific SKU and size of Azure Managed Lustre filesystem. [[#1002](https://github.com/Azure/azure-mcp/issues/1002)]
3336

3437
- Added support for the following Azure Deploy and Azure Quota operations: [[#626](https://github.com/Azure/azure-mcp/pull/626)]
3538
- `azmcp_deploy_app_logs_get` - Get logs from Azure applications deployed using azd.
@@ -56,6 +59,8 @@ The Azure MCP Server updates automatically by default whenever a new release com
5659
- Updated the following dependencies to improve .NET Ahead-of-Time (AOT) compilation support: [[#893](https://github.com/Azure/azure-mcp/pull/893)]
5760
- Azure.Bicep.Types: `0.5.110``0.6.1`
5861
- Azure.Bicep.Types.Az: `0.2.771``0.2.792`
62+
- Added the following dependencies to support Azure Managed Lustre
63+
- Azure.ResourceManager.StorageCache: `1.3.1`
5964

6065
## 0.5.6 (2025-08-14)
6166

‎Directory.Packages.props‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
<PackageVersion Include="Azure.Storage.Files.DataLake" Version="12.22.0" />
4747
<PackageVersion Include="Azure.Storage.Files.Shares" Version="12.22.0" />
4848
<PackageVersion Include="Azure.Storage.Queues" Version="12.22.0" />
49+
<PackageVersion Include="Azure.ResourceManager.StorageCache" Version="1.3.1" />
4950
<PackageVersion Include="Azure.ResourceManager.Datadog" Version="1.0.0-beta.6" />
5051
<PackageVersion Include="Azure.ResourceManager.CosmosDB" Version="1.4.0-beta.13" />
5152
<PackageVersion Include="Azure.ResourceManager.OperationalInsights" Version="1.3.1" />
@@ -85,5 +86,5 @@
8586
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.0" />
8687
<PackageVersion Include="coverlet.collector" Version="6.0.2" />
8788
<!-- Pin to 6.0.2 until https://github.com/coverlet-coverage/coverlet/issues/1737 is resolved -->
88-
</ItemGroup>
89+
</ItemGroup>
8990
</Project>

‎README.md‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ The Azure MCP Server supercharges your agents with Azure context. Here are some
6868

6969
* "Query my Log Analytics workspace"
7070

71+
### ⚡ Azure Managed Lustre
72+
73+
* "List the Azure Managed Lustre clusters in resource group 'my-resourcegroup'"
74+
* "How many IP Addresses I need to create a 128 TiB cluster of AMLFS 500?"
75+
7176
### 🗄️ Azure SQL Database
7277

7378
* "Show me details about my Azure SQL database 'mydb'"
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
using AzureMcp.AzureManagedLustre.Commands.FileSystem;
5+
using AzureMcp.AzureManagedLustre.Services;
6+
using AzureMcp.Core.Areas;
7+
using AzureMcp.Core.Commands;
8+
using Microsoft.Extensions.DependencyInjection;
9+
using Microsoft.Extensions.Logging;
10+
11+
namespace AzureMcp.AzureManagedLustre;
12+
13+
public class AzureManagedLustreSetup : IAreaSetup
14+
{
15+
public void ConfigureServices(IServiceCollection services)
16+
{
17+
services.AddSingleton<IAzureManagedLustreService, AzureManagedLustreService>();
18+
}
19+
20+
public void RegisterCommands(CommandGroup rootGroup, ILoggerFactory loggerFactory)
21+
{
22+
var azureManagedLustre = new CommandGroup("azuremanagedlustre",
23+
"Azure Managed Lustre operations - Commands for listing and inspecting Azure Managed Lustre file systems (AMLFS) used for high-performance computing workloads.");
24+
rootGroup.AddSubGroup(azureManagedLustre);
25+
26+
var fileSystem = new CommandGroup("filesystem", "Azure Managed Lustre file system operations - Commands for listing managed Lustre file systems.");
27+
azureManagedLustre.AddSubGroup(fileSystem);
28+
29+
fileSystem.AddCommand("list", new FileSystemListCommand(loggerFactory.CreateLogger<FileSystemListCommand>()));
30+
fileSystem.AddCommand("required-subnet-size", new FileSystemSubnetSizeCommand(loggerFactory.CreateLogger<FileSystemSubnetSizeCommand>()));
31+
}
32+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<PropertyGroup>
3+
<IsAotCompatible>true</IsAotCompatible>
4+
</PropertyGroup>
5+
<ItemGroup>
6+
<ProjectReference Include="..\..\..\..\core\src\AzureMcp.Core\AzureMcp.Core.csproj" />
7+
</ItemGroup>
8+
<ItemGroup>
9+
<PackageReference Include="Azure.ResourceManager" />
10+
<PackageReference Include="Azure.ResourceManager.StorageCache" />
11+
<PackageReference Include="Microsoft.Extensions.DependencyInjection" />
12+
<PackageReference Include="ModelContextProtocol" />
13+
<PackageReference Include="System.CommandLine" />
14+
</ItemGroup>
15+
</Project>
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
using System.Text.Json.Serialization;
5+
using AzureMcp.AzureManagedLustre.Commands.FileSystem;
6+
using AzureMcp.AzureManagedLustre.Models;
7+
8+
namespace AzureMcp.AzureManagedLustre.Commands;
9+
10+
[JsonSerializable(typeof(FileSystemSubnetSizeCommand.FileSystemSubnetSizeResult))]
11+
[JsonSerializable(typeof(FileSystemListCommand.FileSystemListResult))]
12+
[JsonSerializable(typeof(LustreFileSystem))]
13+
[JsonSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase, WriteIndented = true, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull)]
14+
internal partial class AzureManagedLustreJsonContext : JsonSerializerContext;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
using System.Diagnostics.CodeAnalysis;
5+
using AzureMcp.AzureManagedLustre.Options;
6+
using AzureMcp.Core.Commands;
7+
using AzureMcp.Core.Commands.Subscription;
8+
using Microsoft.Extensions.Logging;
9+
10+
namespace AzureMcp.AzureManagedLustre.Commands;
11+
12+
public abstract class BaseAzureManagedLustreCommand<
13+
[DynamicallyAccessedMembers(TrimAnnotations.CommandAnnotations)] TOptions>(ILogger<BaseAzureManagedLustreCommand<TOptions>> logger)
14+
: SubscriptionCommand<TOptions> where TOptions : BaseAzureManagedLustreOptions, new()
15+
{
16+
// Currently no additional options beyond subscription + resource group
17+
protected readonly ILogger<BaseAzureManagedLustreCommand<TOptions>> _logger = logger;
18+
}

0 commit comments

Comments
 (0)