Skip to content

Commit

Permalink
Request Authorization-Token for each poll during Azure Resource Group…
Browse files Browse the repository at this point in the history
… deployments.

Closes OctopusDeploy/Issues#2439
  • Loading branch information
MJRichardson committed Mar 21, 2016
1 parent fa6cdb8 commit 075e7b8
Showing 1 changed file with 47 additions and 40 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,11 @@ public void Install(RunningDeployment deployment)
Log.Info(
$"Deploying Resource Group {resourceGroupName} in subscription {subscriptionId}.\nDeployment name: {deploymentName}\nDeployment mode: {deploymentMode}");

using (var armClient = new ResourceManagementClient(
new TokenCloudCredentials(subscriptionId, ServicePrincipal.GetAuthorizationToken(tenantId, clientId, password)) ))
{
CreateDeployment(armClient, resourceGroupName, deploymentName, deploymentMode, template, parameters);
PollForCompletion(armClient, resourceGroupName, deploymentName, variables);
}
// We re-create the client each time it is required in order to get a new authorization-token. Else, the token can expire during long-running deployments.
Func<IResourceManagementClient> createArmClient = () => new ResourceManagementClient(new TokenCloudCredentials(subscriptionId, ServicePrincipal.GetAuthorizationToken(tenantId, clientId, password)));

CreateDeployment(createArmClient, resourceGroupName, deploymentName, deploymentMode, template, parameters);
PollForCompletion(createArmClient, resourceGroupName, deploymentName, variables);
}

static string GenerateDeploymentNameFromStepName(string stepName)
Expand All @@ -79,7 +78,7 @@ static string GenerateDeploymentNameFromStepName(string stepName)
return deploymentName;
}

static void CreateDeployment(ResourceManagementClient armClient, string resourceGroupName, string deploymentName,
static void CreateDeployment(Func<IResourceManagementClient> createArmClient, string resourceGroupName, string deploymentName,
DeploymentMode deploymentMode, string template, IDictionary<string, ResourceGroupTemplateParameter> parameters)
{
var parameterJson = parameters != null ? JsonConvert.SerializeObject(parameters, Formatting.Indented) : null;
Expand All @@ -90,21 +89,24 @@ static string GenerateDeploymentNameFromStepName(string stepName)
Log.Verbose($"Parameters:\n{parameterJson}\n");
}

var createDeploymentResult = armClient.Deployments.CreateOrUpdate(resourceGroupName, deploymentName,
new Microsoft.Azure.Management.Resources.Models.Deployment
{
Properties = new DeploymentProperties
using (var armClient = createArmClient())
{
var createDeploymentResult = armClient.Deployments.CreateOrUpdate(resourceGroupName, deploymentName,
new Microsoft.Azure.Management.Resources.Models.Deployment
{
Mode = deploymentMode,
Template = template,
Parameters = parameterJson
}
});
Properties = new DeploymentProperties
{
Mode = deploymentMode,
Template = template,
Parameters = parameterJson
}
});

Log.Info($"Deployment created: {createDeploymentResult.Deployment.Id}");
Log.Info($"Deployment created: {createDeploymentResult.Deployment.Id}");
}
}

static void PollForCompletion(IResourceManagementClient armClient, string resourceGroupName,
static void PollForCompletion(Func<IResourceManagementClient> createArmClient, string resourceGroupName,
string deploymentName, VariableDictionary variables)
{
// While the deployment is running, we poll to check it's state.
Expand All @@ -119,29 +121,34 @@ static string GenerateDeploymentNameFromStepName(string stepName)
Thread.Sleep(TimeSpan.FromSeconds(Math.Min(currentPollWait, maxWaitSeconds)));

Log.Verbose("Polling for status of deployment...");
var deployment = armClient.Deployments.Get(resourceGroupName, deploymentName).Deployment;
Log.Verbose($"Provisioning state: {deployment.Properties.ProvisioningState}");

switch (deployment.Properties.ProvisioningState)
using (var armClient = createArmClient())
{
case "Succeeded":
Log.Info($"Deployment {deploymentName} complete.");
Log.Info(GetOperationResults(armClient, resourceGroupName, deploymentName));
CaptureOutputs(deployment.Properties.Outputs, variables);
continueToPoll = false;
break;

case "Failed":
throw new CommandException($"Azure Resource Group deployment {deploymentName} failed:\n" + GetOperationResults(armClient, resourceGroupName, deploymentName));

default:
if (currentPollWait < maxWaitSeconds)
{
var temp = previousPollWait;
previousPollWait = currentPollWait;
currentPollWait = temp + currentPollWait;
}
break;
var deployment = armClient.Deployments.Get(resourceGroupName, deploymentName).Deployment;

Log.Verbose($"Provisioning state: {deployment.Properties.ProvisioningState}");

switch (deployment.Properties.ProvisioningState)
{
case "Succeeded":
Log.Info($"Deployment {deploymentName} complete.");
Log.Info(GetOperationResults(armClient, resourceGroupName, deploymentName));
CaptureOutputs(deployment.Properties.Outputs, variables);
continueToPoll = false;
break;

case "Failed":
throw new CommandException($"Azure Resource Group deployment {deploymentName} failed:\n" +
GetOperationResults(armClient, resourceGroupName, deploymentName));

default:
if (currentPollWait < maxWaitSeconds)
{
var temp = previousPollWait;
previousPollWait = currentPollWait;
currentPollWait = temp + currentPollWait;
}
break;
}
}
}
}
Expand Down

0 comments on commit 075e7b8

Please sign in to comment.