private async Task UpdateEnvironmentInternalAsync(Environment environment, List<ConfigurationOptionSetting> baseConfigurationOptionSettings)
{
using (var ebClient = new AmazonElasticBeanstalkClient(creds, configurationProvider.RegionEndpoint))
{
loggerProvider.GetLogger().Debug("Existing environment - updating...");
var targetEnvironment = await GetEnvironmentDescription(environment, ebClient);
if (targetEnvironment == null)
{
var msg = "Error state: On environment update, next environment is null";
loggerProvider.GetLogger().Error(msg);
throw new ElasticBeanstalkDeployerException(msg);
}
loggerProvider.GetLogger().Debug("Updating environment.");
var optionSettings = baseConfigurationOptionSettings;
loggerProvider.GetLogger().Debug($"Updating environment: global option settings count - {optionSettings.Count}");
var optionSettingsApp = GetAppSpecificUpdateConfigurationOptionSettings();
optionSettings = InjectAppSpecificOptionSettings(optionSettings, optionSettingsApp);
loggerProvider.GetLogger().Debug($"Updating environment: total option settings count - {optionSettings.Count}");
var updateEnvironmentRequest = new UpdateEnvironmentRequest
{
VersionLabel = configurationProvider.Version,
EnvironmentId = targetEnvironment.EnvironmentId,
OptionSettings = optionSettings
};
loggerProvider.GetLogger()
.Debug("Updating environment: {@updateEnvironmentRequest}", updateEnvironmentRequest);
updateEnvironmentRequest.OptionSettings.ForEach(option => loggerProvider.GetLogger().Debug($"Updating environment option setting: namespace={option.Namespace} option name={option.OptionName}"));
int tryCount = 0;
bool isSuccessful = false;
while (!isSuccessful)
{
try
{
var updateEnvironmentResponse = await ebClient.UpdateEnvironmentAsync(updateEnvironmentRequest);
isSuccessful = true;
loggerProvider.GetLogger()
.Debug("Updated environment: {@updateEnvironmentResponse}", updateEnvironmentResponse);
}
catch (Exception ex)
{
loggerProvider.GetLogger().Debug($"Failed update with exception: {ex.Message}");
if (tryCount >= 5)
{
throw;
}
tryCount++;
await Task.Delay(TIME_BETWEEN_STATUS_CHECKS_IN_MILLISECONDS);
}
}
await WaitForEnvironmentCompletionAsync(targetEnvironment.EnvironmentId);
}
}