Skip to content
This repository has been archived by the owner on May 2, 2023. It is now read-only.

Commit

Permalink
A null reference error was being thrown if connection strings were no…
Browse files Browse the repository at this point in the history
…t supplied.

Closes OctopusDeploy/Issues#6891
  • Loading branch information
MJRichardson committed May 24, 2021
1 parent 9d85041 commit 3e6054d
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 25 deletions.
42 changes: 32 additions & 10 deletions source/Calamari.Tests/AppServiceSettingsBehaviourFixture.cs
Expand Up @@ -113,7 +113,7 @@ public async Task CleanupCode()
}

[Test]
public async Task TestSiteSettings()
public async Task TestSiteAppSettings()
{
await webMgmtClient.WebApps.UpdateApplicationSettingsWithHttpMessagesAsync(resourceGroupName, site.Name,
existingSettings);
Expand All @@ -132,20 +132,39 @@ public async Task TestSiteSettings()
("ReplaceSetting", "Bar", false)
});

iVars.Add(SpecialVariables.Action.Azure.AppSettings, appSettings.json);

await new AzureAppServiceSettingsBehaviour(new InMemoryLog()).Execute(runningContext);

await AssertAppSettings(appSettings.setting, new ConnectionStringDictionary());
}

[Test]
public async Task TestSiteConnectionStrings()
{
await webMgmtClient.WebApps.UpdateApplicationSettingsWithHttpMessagesAsync(resourceGroupName, site.Name,
existingSettings);
await webMgmtClient.WebApps.UpdateConnectionStringsAsync(resourceGroupName, site.Name,
existingConnectionStrings);

var iVars = new CalamariVariables();
AddVariables(iVars);
var runningContext = new RunningDeployment("", iVars);
iVars.Add("Greeting", "Calamari");

var connectionStrings = BuildConnectionStringJson(new[]
{
("ReplaceConnectionString", "replacedConnectionStringValue", ConnectionStringType.SQLServer, false),
("NewConnectionString","newValue", ConnectionStringType.SQLAzure, false),
("NewConnectionString", "newValue", ConnectionStringType.SQLAzure, false),
("ReplaceSlotConnectionString", "replacedSlotConnectionStringValue", ConnectionStringType.MySql, true)
});


iVars.Add(SpecialVariables.Action.Azure.ConnectionStrings, connectionStrings.json);
iVars.Add(SpecialVariables.Action.Azure.AppSettings, appSettings.json);


await new AzureAppServiceSettingsBehaviour(new InMemoryLog()).Execute(runningContext);

await AssertAppSettings(appSettings.setting, connectionStrings.connStrings);
await AssertAppSettings(new AppSetting[]{}, connectionStrings.connStrings);
}

[Test]
Expand Down Expand Up @@ -237,12 +256,15 @@ async Task AssertAppSettings(IEnumerable<AppSetting> expectedAppSettings, Connec
{
existingSettings.Properties[name] = value;
}
foreach(var item in expectedConnStrings.Properties)

if (expectedConnStrings?.Properties != null && expectedConnStrings.Properties.Any())
{
existingConnectionStrings.Properties[item.Key] = item.Value;
foreach (var item in expectedConnStrings.Properties)
{
existingConnectionStrings.Properties[item.Key] = item.Value;
}
}

// for each existing setting that isn't defined in the expected settings object, add it
var expectedSettingsList = expectedSettingsArray.ToList();

Expand Down
41 changes: 26 additions & 15 deletions source/Calamari/Behaviors/AzureAppServiceSettingsBehaviour.cs
Expand Up @@ -36,9 +36,16 @@ public async Task Execute(RunningDeployment context)
Log.Verbose("Starting App Settings Deploy");
var variables = context.Variables;

//if there are no app settings to deploy
if (!variables.GetNames().Contains(SpecialVariables.Action.Azure.AppSettings) &&
!string.IsNullOrEmpty(variables[SpecialVariables.Action.Azure.AppSettings]))
var appSettingsSpecified =
variables.GetNames().Contains(SpecialVariables.Action.Azure.AppSettings) &&
!string.IsNullOrWhiteSpace(variables[SpecialVariables.Action.Azure.AppSettings]);

var connectionStringsSpecified =
variables.GetNames().Contains(SpecialVariables.Action.Azure.ConnectionStrings) &&
!string.IsNullOrWhiteSpace(variables[SpecialVariables.Action.Azure.ConnectionStrings]);

//if there are no app settings or connection strings
if (!appSettingsSpecified && !connectionStringsSpecified)
return;

var principalAccount = new ServicePrincipalAccount(variables);
Expand Down Expand Up @@ -66,19 +73,23 @@ public async Task Execute(RunningDeployment context)
HttpClient = {BaseAddress = new Uri(principalAccount.ResourceManagementEndpointBaseUri)}
};

var appSettings =
JsonConvert.DeserializeObject<AppSetting[]>(
variables.Get(SpecialVariables.Action.Azure.AppSettings, ""));

var connStrings =
JsonConvert.DeserializeObject<ConnectionStringSetting[]>(
variables.Get(SpecialVariables.Action.Azure.ConnectionStrings, ""));

Log.Verbose($"Deploy publishing app settings to webapp {webAppName} in resource group {resourceGroupName}");
if (appSettingsSpecified)
{
var appSettingsJson = variables.Get(SpecialVariables.Action.Azure.AppSettings, "");
Log.Verbose($"Updating application settings:\n{appSettingsJson}");
var appSettings = JsonConvert.DeserializeObject<AppSetting[]>(appSettingsJson);
await PublishAppSettings(webAppClient, targetSite, appSettings, token);
Log.Info("Updated application settings");
}

// publish defined settings (automatically merges with existing settings
await PublishAppSettings(webAppClient, targetSite, appSettings, token);
await PublishConnectionStrings(webAppClient, targetSite, connStrings);
if (connectionStringsSpecified)
{
var connectionStringsJson = variables.Get(SpecialVariables.Action.Azure.ConnectionStrings, "");
Log.Verbose($"Updating connection strings:\n{connectionStringsJson}");
var connectionStrings = JsonConvert.DeserializeObject<ConnectionStringSetting[]>(connectionStringsJson);
await PublishConnectionStrings(webAppClient, targetSite, connectionStrings);
Log.Info("Updated connection strings");
}
}

/// <summary>
Expand Down

0 comments on commit 3e6054d

Please sign in to comment.