diff --git a/src/Resources/ResourceManager/Entities/ResourceGroup/ExportTemplateParameters.cs b/src/Resources/ResourceManager/Entities/ResourceGroup/ExportTemplateParameters.cs
index 10de0a2ab114..644d109684e3 100644
--- a/src/Resources/ResourceManager/Entities/ResourceGroup/ExportTemplateParameters.cs
+++ b/src/Resources/ResourceManager/Entities/ResourceGroup/ExportTemplateParameters.cs
@@ -32,5 +32,10 @@ public class ExportTemplateParameters
///
[JsonProperty(Required = Required.Always)]
public string[] Resources { get; set; }
+
+ ///
+ /// Gets or sets the output format.
+ ///
+ public string OutputFormat { get; set; }
}
}
\ No newline at end of file
diff --git a/src/Resources/ResourceManager/Implementation/ResourceGroups/ExportAzureResourceGroupCmdlet.cs b/src/Resources/ResourceManager/Implementation/ResourceGroups/ExportAzureResourceGroupCmdlet.cs
index 10ebfc6b8a02..c0c83825d60e 100644
--- a/src/Resources/ResourceManager/Implementation/ResourceGroups/ExportAzureResourceGroupCmdlet.cs
+++ b/src/Resources/ResourceManager/Implementation/ResourceGroups/ExportAzureResourceGroupCmdlet.cs
@@ -96,6 +96,13 @@ public class ExportAzureResourceGroupCmdlet : ResourceManagerCmdletBaseWithApiVe
[ValidateNotNullOrEmpty]
public override string ApiVersion { get; set; }
+ ///
+ /// Gets or sets the output format.
+ ///
+ [Parameter(Mandatory = false, HelpMessage = "The output format of the template. Allowed values are 'Json', 'Bicep'.")]
+ [ValidateSet(ExportTemplateOutputFormat.Json, ExportTemplateOutputFormat.Bicep, IgnoreCase = true)]
+ public string OutputFormat { get; set; } = ExportTemplateOutputFormat.Json;
+
///
/// Executes the cmdlet.
///
@@ -106,7 +113,6 @@ protected override void OnProcessRecord()
if (ShouldProcess(ResourceGroupName, VerbsData.Export))
{
-
var resourceGroupId = this.GetResourceGroupId();
if (! this.IsParameterBound(c => c.ApiVersion))
@@ -115,6 +121,7 @@ protected override void OnProcessRecord()
{
Resources = this.GetResourcesFilter(resourceGroupId: resourceGroupId),
Options = this.GetExportOptions(),
+ OutputFormat = this.OutputFormat
};
var exportedTemplate = NewResourceManagerSdkClient.ExportResourceGroup(ResourceGroupName, parameters);
@@ -139,6 +146,7 @@ protected override void OnProcessRecord()
{
Resources = this.GetResourcesFilter(resourceGroupId: resourceGroupId),
Options = this.GetExportOptions(),
+ OutputFormat = this.OutputFormat
};
var apiVersion = this.ApiVersion;
var operationResult = this.GetResourcesClient()
@@ -177,6 +185,9 @@ protected override void OnProcessRecord()
}
}
+ // Determine the correct file extension based on OutputFormat
+ string extension = OutputFormat.Equals(ExportTemplateOutputFormat.Bicep, StringComparison.OrdinalIgnoreCase) ? ".bicep" : ".json";
+
string path = FileUtility.SaveTemplateFile(
templateName: this.ResourceGroupName,
contents: contents,
@@ -185,7 +196,9 @@ protected override void OnProcessRecord()
? System.IO.Path.Combine(CurrentPath(), this.ResourceGroupName)
: this.TryResolvePath(this.Path),
overwrite: Force.IsPresent,
- shouldContinue: ShouldContinue);
+ shouldContinue: ShouldContinue,
+ extension: extension // Pass the extension
+ );
WriteObject(PowerShellUtilities.ConstructPSObject(null, "Path", path));
}
diff --git a/src/Resources/ResourceManager/Utilities/FileUtility.cs b/src/Resources/ResourceManager/Utilities/FileUtility.cs
index e382043e9687..99dd309e62e2 100644
--- a/src/Resources/ResourceManager/Utilities/FileUtility.cs
+++ b/src/Resources/ResourceManager/Utilities/FileUtility.cs
@@ -36,7 +36,7 @@ public static class FileUtility
/// Overrides existing file
/// The confirmation action
/// The file path
- public static string SaveTemplateFile(string templateName, string contents, string outputPath, bool overwrite, Func shouldContinue)
+ public static string SaveTemplateFile(string templateName, string contents, string outputPath, bool overwrite, Func shouldContinue, string extension = ".json") // Added extension parameter with default
{
StringBuilder finalOutputPath = new StringBuilder();
diff --git a/src/Resources/Resources.Test/ScenarioTests/ResourceGroupTests.cs b/src/Resources/Resources.Test/ScenarioTests/ResourceGroupTests.cs
index f26bfa135603..32a8ead83cb1 100644
--- a/src/Resources/Resources.Test/ScenarioTests/ResourceGroupTests.cs
+++ b/src/Resources/Resources.Test/ScenarioTests/ResourceGroupTests.cs
@@ -81,6 +81,13 @@ public void TestExportResourceGroup()
TestRunner.RunTestScript("Test-ExportResourceGroup");
}
+ [Fact]
+ [Trait(Category.AcceptanceType, Category.CheckIn)]
+ public void TestExportResourceGroupBicep()
+ {
+ TestRunner.RunTestScript("Test-ExportResourceGroupBicep");
+ }
+
[Fact]
[Trait(Category.AcceptanceType, Category.CheckIn)]
public void TestExportResourceGroupAsyncRoute()
diff --git a/src/Resources/Resources.Test/ScenarioTests/ResourceGroupTests.ps1 b/src/Resources/Resources.Test/ScenarioTests/ResourceGroupTests.ps1
index 7a4ccc8abf23..146590dc1976 100644
--- a/src/Resources/Resources.Test/ScenarioTests/ResourceGroupTests.ps1
+++ b/src/Resources/Resources.Test/ScenarioTests/ResourceGroupTests.ps1
@@ -392,6 +392,37 @@ function Test-ExportResourceGroup
}
}
+<#
+.SYNOPSIS
+Tests export resource group template file as bicep.
+#>
+function Test-ExportResourceGroupBicep
+{
+ # Setup
+ $rgname = Get-ResourceGroupName
+ $rname = Get-ResourceName
+ $rglocation = Get-Location "Microsoft.Resources" "resourceGroups" "West US"
+ $apiversion = "2014-04-01"
+ $resourceType = "Providers.Test/statefulResources"
+
+ try {
+ # Test
+ New-AzResourceGroup -Name $rgname -Location $rglocation
+
+ $r = New-AzResource -Name $rname -Location "centralus" -Tags @{ testtag = "testval" } -ResourceGroupName $rgname -ResourceType $resourceType -SkuObject @{ Name = "A0" } -ApiVersion $apiversion -Force
+ Assert-AreEqual $r.ResourceGroupName $rgname
+
+ $exportOutput = Export-AzResourceGroup -ResourceGroupName $rgname -OutputFormat Bicep -Force
+ Assert-NotNull $exportOutput
+ Assert-True { $exportOutput.Path.Contains($rgname + ".bicep") }
+ }
+ finally {
+ # Cleanup
+ Clean-ResourceGroup $rgname
+ }
+ }
+
+
<#
.SYNOPSIS
Tests async export to export resource group template file.