using System;
using System.IO;
using System.Linq;
namespace ServiceClientGenerator.DefaultConfiguration
{
///
public interface IDefaultConfigurationController
{
///
/// Fully loads and populates by parsing the
/// sdk-default-configurations.json file from disk. Also adds the 'Legacy'
/// with the correct defaults.
///
///
/// Full path to the root directory, ie contains the 'sdk' directory.
///
///
/// The sdk-default-configuration.json file is placed into the
/// repository by an upstream process in ServiceBuildAutomation.
///
DefaultConfigurationModel LoadDefaultConfiguration(string repositoryRootDirectoryPath);
}
///
public class DefaultConfigurationController : IDefaultConfigurationController
{
private readonly IFileReader _fileReader;
private readonly IDefaultConfigurationParser _defaultConfigurationParser;
public DefaultConfigurationController(
IFileReader fileReader,
IDefaultConfigurationParser defaultConfigurationParser)
{
_fileReader = fileReader;
_defaultConfigurationParser = defaultConfigurationParser;
}
///
public DefaultConfigurationModel LoadDefaultConfiguration(string repositoryRootDirectoryPath)
{
var filePath = Utils.PathCombineAlt(repositoryRootDirectoryPath, "sdk","src","Core","sdk-default-configuration.json");
string json;
try
{
json = _fileReader.ReadAllText(filePath);
}
catch (Exception e)
{
throw new Exception($"Error reading Json from [{filePath}]: {e.Message}", e);
}
var parsedModel = _defaultConfigurationParser.Parse(json);
EnrichLegacyMode(parsedModel);
return parsedModel;
}
private void EnrichLegacyMode(DefaultConfigurationModel parsedModel)
{
var legacyMode =
parsedModel
.Modes
.FirstOrDefault(x => string.Equals(x.Name, "Legacy", StringComparison.OrdinalIgnoreCase));
if (legacyMode == null)
throw new Exception(
"Did not find required Default Configuration mode 'Legacy'. " +
$"Found: {string.Join(",", parsedModel.Modes.Select(x => x.Name))}");
legacyMode.RetryMode = RequestRetryMode.Legacy;
legacyMode.S3UsEast1RegionalEndpoint = S3UsEast1RegionalEndpointValue.Legacy;
legacyMode.StsRegionalEndpoints = StsRegionalEndpointsValue.Legacy;
// default to null for timeouts - this preserves the ServiceConfig
// behavior of defaulting configurable timeouts to null
legacyMode.TimeToFirstByteTimeout = null;
legacyMode.ConnectTimeout = null;
legacyMode.HttpRequestTimeout = null;
legacyMode.TlsNegotiationTimeout = null;
}
}
}