Skip to content

Commit 6a43c15

Browse files
committed
Added optional -UpdateBehavior for New cmdlets and added polling to New and Set cmdlets
1 parent 0b8f12c commit 6a43c15

File tree

3 files changed

+95
-5
lines changed

3 files changed

+95
-5
lines changed

src/Resources/ResourceManager/Implementation/DeploymentStacks/NewAzResourceGroupDeploymentStack.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,10 @@ public class NewAzResourceGroupDeploymentStack : DeploymentStacksCmdletBase
101101
HelpMessage = "Description for the stack")]
102102
public string Description { get; set; }
103103

104+
[Parameter(Mandatory = false, ValueFromPipeline = true,
105+
HelpMessage = "Update behavior for the stack. Value can be \"Detach\" or \"Purge\".")]
106+
public String UpdateBehavior { get; set; }
107+
104108
[Parameter(Mandatory = false,
105109
HelpMessage = "Do not ask for confirmation when overwriting an existing stack.")]
106110
public SwitchParameter Force { get; set; }
@@ -152,8 +156,8 @@ public override void ExecuteCmdlet()
152156
ParameterUri,
153157
parameters,
154158
Description,
155-
"Detach"
156-
);
159+
UpdateBehavior == null ? "detach" : UpdateBehavior
160+
) ;
157161
WriteObject(deploymentStack);
158162
};
159163

src/Resources/ResourceManager/Implementation/DeploymentStacks/NewAzSubscriptionDeploymentStack.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,10 @@ public class NewAzSubscriptionDeploymentStack : DeploymentStacksCmdletBase
9999
HelpMessage = "Location of the stack")]
100100
public string Location { get; set; }
101101

102+
[Parameter(Mandatory = false, ValueFromPipeline = true,
103+
HelpMessage = "Update behavior for the stack. Value can be \"Detach\" or \"Purge\".")]
104+
public String UpdateBehavior { get; set; }
105+
102106
[Parameter(Mandatory = false,
103107
HelpMessage = "Do not ask for confirmation when overwriting an existing stack.")]
104108
public SwitchParameter Force { get; set; }
@@ -150,7 +154,7 @@ public override void ExecuteCmdlet()
150154
ParameterUri,
151155
parameters,
152156
Description,
153-
"Detach"
157+
UpdateBehavior == null ? "detach" : UpdateBehavior
154158
);
155159
WriteObject(deploymentStack);
156160
};

src/Resources/ResourceManager/SdkClient/DeploymentStacksSdkClient.cs

Lines changed: 84 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
using Microsoft.WindowsAzure.Commands.Utilities.Common;
1717
using System.Management.Automation;
1818
using System.Linq;
19+
using Microsoft.Rest.Azure;
20+
using System.Threading.Tasks;
1921

2022
namespace Microsoft.Azure.Commands.ResourceManager.Cmdlets.SdkClient
2123
{
@@ -25,6 +27,8 @@ public class DeploymentStacksSdkClient
2527

2628
private IAzureContext azureContext;
2729

30+
public Action<string> VerboseLogger { get; set; }
31+
2832
public DeploymentStacksSdkClient(IDeploymentStacksClient deploymentStacksClient)
2933
{
3034
this.DeploymentStacksClient = deploymentStacksClient;
@@ -350,7 +354,14 @@ string updateBehavior
350354

351355

352356
var deploymentStack = DeploymentStacksClient.DeploymentStacks.BeginCreateOrUpdateAtResourceGroup(resourceGroupName, deploymentStackName, deploymentStackModel);
353-
return new PSDeploymentStack(deploymentStack);
357+
var getStackFunc = this.GetStackAction(deploymentStackName, "resourceGroup", resourceGroupName);
358+
359+
var finalStack = this.waitStackCompletion(
360+
getStackFunc,
361+
"succeeded",
362+
"failed"
363+
);
364+
return new PSDeploymentStack(finalStack);
354365
}
355366

356367
internal void DeleteResourceGroupDeploymentStackSnapshot(string resourceGroupName, string name, string snapshotName)
@@ -474,7 +485,70 @@ string updateBehavior
474485
}
475486

476487
var deploymentStack = DeploymentStacksClient.DeploymentStacks.BeginCreateOrUpdateAtSubscription(deploymentStackName, deploymentStackModel);
477-
return new PSDeploymentStack(deploymentStack);
488+
var getStackFunc = this.GetStackAction(deploymentStackName, "subscription");
489+
490+
var finalStack = this.waitStackCompletion(
491+
getStackFunc,
492+
"succeeded",
493+
"failed"
494+
);
495+
496+
return new PSDeploymentStack(finalStack);
497+
}
498+
499+
private DeploymentStack waitStackCompletion(Func<Task<AzureOperationResponse<DeploymentStack>>> getStack, params string[] status)
500+
{
501+
//Poll stack deployment based on RetryAfter. If no RetyrAfter is present, polling status in two phases.
502+
//Phase one: poll every 5 seconds for 400 seconds. If not completed in this duration, move to phase two
503+
//Phase two: poll every 60 seconds
504+
DeploymentStack stack;
505+
506+
const int counterUnit = 1000;
507+
int step = 5;
508+
int phaseOne = 400;
509+
do
510+
{
511+
WriteVerbose(string.Format("Checking stack deployment status", step));
512+
TestMockSupport.Delay(step * counterUnit);
513+
514+
if (phaseOne > 0)
515+
phaseOne -= step;
516+
517+
var getStackTask = getStack();
518+
519+
using (var getResult = getStackTask.ConfigureAwait(false).GetAwaiter().GetResult())
520+
{
521+
stack = getResult.Body;
522+
var response = getResult.Response;
523+
524+
if (response != null && response.Headers.RetryAfter != null && response.Headers.RetryAfter.Delta.HasValue)
525+
{
526+
step = response.Headers.RetryAfter.Delta.Value.Seconds;
527+
}
528+
else
529+
{
530+
step = phaseOne > 0 ? 5 : 60;
531+
}
532+
}
533+
534+
} while (!status.Any(s => s.Equals(stack.ProvisioningState, StringComparison.OrdinalIgnoreCase)));
535+
536+
return stack;
537+
}
538+
539+
Func<Task<AzureOperationResponse<DeploymentStack>>> GetStackAction(string stackName, string scope, string rgName = null)
540+
{
541+
switch(scope)
542+
{
543+
case "subscription":
544+
return () => DeploymentStacksClient.DeploymentStacks.GetAtSubscriptionWithHttpMessagesAsync(stackName);
545+
546+
case "resourceGroup":
547+
return () => DeploymentStacksClient.DeploymentStacks.GetAtResourceGroupWithHttpMessagesAsync(rgName, stackName);
548+
549+
default:
550+
throw new NotImplementedException();
551+
}
478552
}
479553

480554
public PSDeploymentStack UpdateResourceGroupDeploymentStack(
@@ -529,5 +603,13 @@ string description
529603
var deploymentStack = DeploymentStacksClient.DeploymentStacks.BeginCreateOrUpdateAtResourceGroup(resourceGroupName, deploymentStackName, deploymentStackModel);
530604
return new PSDeploymentStack(deploymentStack);
531605
}
606+
607+
private void WriteVerbose(string progress)
608+
{
609+
if (VerboseLogger != null)
610+
{
611+
VerboseLogger(progress);
612+
}
613+
}
532614
}
533615
}

0 commit comments

Comments
 (0)