in src/Cli/func/Actions/AzureActions/PublishFunctionAppAction.cs [943:1019]
private async Task WaitForAppSettingUpdateSCM(
Site functionApp,
IDictionary<string, string> shouldHaveSettings = null,
IDictionary<string, string> shouldNotHaveSettings = null,
int timeOutSeconds = 300)
{
const int retryTimeoutSeconds = 5;
var waitUntil = DateTime.Now + TimeSpan.FromSeconds(timeOutSeconds);
while (DateTime.Now < waitUntil)
{
using (var client = GetRemoteZipClient(functionApp))
using (var request = new HttpRequestMessage(HttpMethod.Get, new Uri("api/settings", UriKind.Relative)))
{
var response = await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
var settingsResponse = await response.Content.ReadAsStringAsync();
var scmSettingsDict = JsonConvert.DeserializeObject<IDictionary<string, string>>(settingsResponse);
if (StaticSettings.IsDebug)
{
ColoredConsole.WriteLine(VerboseColor("SCM settings values:"));
foreach (KeyValuePair<string, string> kvp in scmSettingsDict)
{
ColoredConsole.WriteLine(VerboseColor($"\"{kvp.Key}\" : \"{kvp.Value}\""));
}
ColoredConsole.WriteLine(Environment.NewLine);
}
bool scmUpdated = true;
// Checks for strictly equal or
// if all settings are present in dictionary
if (shouldHaveSettings != null)
{
foreach (KeyValuePair<string, string> keyValuePair in shouldHaveSettings)
{
if (!scmSettingsDict.ContainsKey(keyValuePair.Key) || scmSettingsDict[keyValuePair.Key] != keyValuePair.Value)
{
scmUpdated = false;
break;
}
}
}
if (shouldNotHaveSettings != null)
{
foreach (KeyValuePair<string, string> keyValuePair in shouldNotHaveSettings)
{
if (scmSettingsDict.ContainsKey(keyValuePair.Key) && scmSettingsDict[keyValuePair.Key] == keyValuePair.Value)
{
scmUpdated = false;
break;
}
}
}
if (scmUpdated)
{
return;
}
}
}
if (StaticSettings.IsDebug)
{
ColoredConsole.WriteLine(VerboseColor("SCM update poll timed out. Retrying..."));
}
await Task.Delay(TimeSpan.FromSeconds(retryTimeoutSeconds));
}
throw new CliException("Timed out waiting for SCM to update the Environment Settings");
}