private async Task WaitForAppSettingUpdateSCM()

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");
        }