Skip to content

Commit b562b75

Browse files
committed
Merge pull request Azure#471 from Azure/dev
HPF PR: dev <- Azure:dev
2 parents c172b13 + 9721615 commit b562b75

File tree

14 files changed

+1851
-3
lines changed

14 files changed

+1851
-3
lines changed

src/ResourceManager/Resources/Commands.ResourceManager/Cmdlets/Commands.Resources.Rest.csproj

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@
136136
<Compile Include="Handlers\CmdletInfoHandler.cs" />
137137
<Compile Include="Handlers\UserAgentHandler.cs" />
138138
<Compile Include="Implementation\FindAzureResourceGroupCmdlet.cs" />
139+
<Compile Include="Implementation\SaveAzureResourceGroupDeploymentTemplateCmdlet.cs" />
139140
<Compile Include="Implementation\GetAzureResourceGroupDeploymentOperationCmdlet.cs" />
140141
<Compile Include="Implementation\Lock\GetAzureResourceLockCmdlet.cs" />
141142
<Compile Include="Implementation\InvokeAzureResourceActionCmdlet.cs" />
@@ -170,8 +171,14 @@
170171
<Compile Include="Json\TimeSpanConverter.cs" />
171172
<Compile Include="Properties\AssemblyInfo.cs" />
172173
<Compile Include="Implementation\Resource\GetAzureResourceCmdlet.cs" />
174+
<Compile Include="Properties\Resources.Designer.cs">
175+
<DependentUpon>Resources.resx</DependentUpon>
176+
<AutoGen>True</AutoGen>
177+
<DesignTime>True</DesignTime>
178+
</Compile>
173179
<Compile Include="RestClients\ResourceManagerRestClientBase.cs" />
174180
<Compile Include="RestClients\ResourceManagerRestRestClient.cs" />
181+
<Compile Include="Utilities\FileUtility.cs" />
175182
<Compile Include="Utilities\HttpUtility.cs" />
176183
</ItemGroup>
177184
<ItemGroup>
@@ -207,5 +214,12 @@
207214
<Name>Commands.Tags</Name>
208215
</ProjectReference>
209216
</ItemGroup>
217+
<ItemGroup>
218+
<EmbeddedResource Include="Properties\Resources.resx">
219+
<Generator>ResXFileCodeGenerator</Generator>
220+
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
221+
<SubType>Designer</SubType>
222+
</EmbeddedResource>
223+
</ItemGroup>
210224
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
211225
</Project>

src/ResourceManager/Resources/Commands.ResourceManager/Cmdlets/Components/Constants.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ public static class Constants
5959
/// </summary>
6060
public static readonly string MoveResources = "moveResources";
6161

62+
/// <summary>
63+
/// The export action.
64+
/// </summary>
65+
public static readonly string ExportTemplate = "exportTemplate";
66+
6267
/// <summary>
6368
/// The locks resource type.
6469
/// </summary>

src/ResourceManager/Resources/Commands.ResourceManager/Cmdlets/Implementation/GetAzureResourceGroupDeploymentOperationCmdlet.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ namespace Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation
2929
public class GetAzureResourceGroupDeploymentOperationCmdlet : ResourceManagerCmdletBase
3030
{
3131
/// <summary>
32-
/// Gets or sets the resource group name parameter.
32+
/// Gets or sets the deployment name parameter.
3333
/// </summary>
3434
[Alias("Name")]
3535
[Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = "The deployment name.")]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
// ----------------------------------------------------------------------------------
2+
//
3+
// Copyright Microsoft Corporation
4+
// Licensed under the Apache License, Version 2.0 (the "License");
5+
// you may not use this file except in compliance with the License.
6+
// You may obtain a copy of the License at
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
// ----------------------------------------------------------------------------------
14+
15+
namespace Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation
16+
{
17+
using System.Management.Automation;
18+
using Microsoft.Azure.Commands.ResourceManager.Cmdlets.Components;
19+
using Microsoft.WindowsAzure.Commands.Utilities.Common;
20+
using Newtonsoft.Json.Linq;
21+
using Microsoft.Azure.Commands.ResourceManager.Cmdlets.Utilities;
22+
23+
/// <summary>
24+
/// Saves the deployment template to a file on disk.
25+
/// </summary>
26+
[Cmdlet(VerbsData.Save, "AzureRmResourceGroupDeploymentTemplate"), OutputType(typeof(PSObject))]
27+
public class GetAzureResourceGroupDeploymentTemplateCmdlet : ResourceManagerCmdletBase
28+
{
29+
/// <summary>
30+
/// Gets or sets the resource group name parameter.
31+
/// </summary>
32+
[Alias("ResourceGroup")]
33+
[Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = "The resource group name.")]
34+
[ValidateNotNullOrEmpty]
35+
public string ResourceGroupName { get; set; }
36+
37+
/// <summary>
38+
/// Gets or sets the deployment name parameter.
39+
/// </summary>
40+
[Alias("Name")]
41+
[Parameter(Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = "The deployment name.")]
42+
[ValidateNotNullOrEmpty]
43+
public string DeploymentName { get; set; }
44+
45+
/// <summary>
46+
/// Gets or sets the file path.
47+
/// </summary>
48+
[Parameter(Mandatory = false, ValueFromPipelineByPropertyName = true, HelpMessage = "The output path of the template file.")]
49+
[ValidateNotNullOrEmpty]
50+
public string Path { get; set; }
51+
52+
/// <summary>
53+
/// Gets or sets the force parameter.
54+
/// </summary>
55+
[Parameter(Mandatory = false, HelpMessage = "Do not ask for confirmation.")]
56+
public SwitchParameter Force { get; set; }
57+
58+
/// <summary>
59+
/// Executes the cmdlet.
60+
/// </summary>
61+
protected override void OnProcessRecord()
62+
{
63+
base.OnProcessRecord();
64+
65+
var resourceId = this.GetResourceId();
66+
67+
var apiVersion = this.DetermineApiVersion(resourceId: resourceId).Result;
68+
69+
var operationResult = this.GetResourcesClient()
70+
.InvokeActionOnResource<JObject>(
71+
resourceId: resourceId,
72+
action: Constants.ExportTemplate,
73+
apiVersion: apiVersion,
74+
cancellationToken: this.CancellationToken.Value)
75+
.Result;
76+
77+
var managementUri = this.GetResourcesClient()
78+
.GetResourceManagementRequestUri(
79+
resourceId: resourceId,
80+
apiVersion: apiVersion,
81+
action: Constants.ExportTemplate);
82+
83+
var activity = string.Format("POST {0}", managementUri.PathAndQuery);
84+
var resultString = this.GetLongRunningOperationTracker(activityName: activity, isResourceCreateOrUpdate: false)
85+
.WaitOnOperation(operationResult: operationResult);
86+
87+
var template = JToken.FromObject(JObject.Parse(resultString)["template"]);
88+
89+
string path = FileUtility.SaveTemplateFile(
90+
deploymentName: this.DeploymentName,
91+
contents: template.ToString(),
92+
outputPath: string.IsNullOrEmpty(this.Path) ? System.IO.Path.Combine(CurrentPath(), this.DeploymentName) : this.TryResolvePath(this.Path),
93+
overwrite: this.Force,
94+
confirmAction: ConfirmAction);
95+
96+
WriteObject(PowerShellUtilities.ConstructPSObject(null, "Path", path));
97+
}
98+
99+
/// <summary>
100+
/// Gets the resource Id from the supplied PowerShell parameters.
101+
/// </summary>
102+
protected string GetResourceId()
103+
{
104+
return ResourceIdUtility.GetResourceId(
105+
subscriptionId: DefaultContext.Subscription.Id,
106+
resourceGroupName: this.ResourceGroupName,
107+
resourceType: Constants.MicrosoftResourcesDeploymentType,
108+
resourceName: this.DeploymentName);
109+
}
110+
}
111+
}

0 commit comments

Comments
 (0)