in src/Amazon.Lambda.Tools/Commands/UpdateFunctionConfigCommand.cs [434:730]
private UpdateFunctionConfigurationRequest CreateConfigurationRequestIfDifferent(GetFunctionConfigurationResponse existingConfiguration, string dotnetSharedStoreValue)
{
bool different = false;
var request = new UpdateFunctionConfigurationRequest
{
FunctionName = this.GetStringValueOrDefault(this.FunctionName, LambdaDefinedCommandOptions.ARGUMENT_FUNCTION_NAME, true)
};
var description = this.GetStringValueOrDefault(this.Description, LambdaDefinedCommandOptions.ARGUMENT_FUNCTION_DESCRIPTION, false);
if (!string.IsNullOrEmpty(description) && !string.Equals(description, existingConfiguration.Description, StringComparison.Ordinal))
{
request.Description = description;
different = true;
}
var role = this.GetStringValueOrDefault(this.Role, LambdaDefinedCommandOptions.ARGUMENT_FUNCTION_ROLE, false);
if (!string.IsNullOrEmpty(role))
{
string fullRole;
if (role.StartsWith(LambdaConstants.IAM_ARN_PREFIX))
fullRole = role;
else
fullRole = RoleHelper.ExpandRoleName(this.IAMClient, role);
if (!string.Equals(fullRole, existingConfiguration.Role, StringComparison.Ordinal))
{
request.Role = fullRole;
different = true;
}
}
var memorySize = this.GetIntValueOrDefault(this.MemorySize, LambdaDefinedCommandOptions.ARGUMENT_FUNCTION_MEMORY_SIZE, false);
if(memorySize.HasValue && memorySize.Value != existingConfiguration.MemorySize)
{
request.MemorySize = memorySize.Value;
different = true;
}
var ephemeralSize = this.GetIntValueOrDefault(this.EphemeralStorageSize, LambdaDefinedCommandOptions.ARGUMENT_EPHEMERAL_STORAGE_SIZE, false);
if (ephemeralSize.HasValue && ephemeralSize.Value != existingConfiguration.EphemeralStorage?.Size)
{
request.EphemeralStorage = new EphemeralStorage { Size = ephemeralSize.Value };
}
var timeout = this.GetIntValueOrDefault(this.Timeout, LambdaDefinedCommandOptions.ARGUMENT_FUNCTION_TIMEOUT, false);
if (timeout.HasValue && timeout.Value != existingConfiguration.Timeout)
{
request.Timeout = timeout.Value;
different = true;
}
var layerVersionArns = this.GetStringValuesOrDefault(this.LayerVersionArns, LambdaDefinedCommandOptions.ARGUMENT_FUNCTION_LAYERS, false);
if(layerVersionArns != null && AreDifferent(layerVersionArns, existingConfiguration.Layers?.Select(x => x.Arn)))
{
request.Layers = layerVersionArns.ToList();
request.IsLayersSet = true;
different = true;
}
var subnetIds = this.GetStringValuesOrDefault(this.SubnetIds, LambdaDefinedCommandOptions.ARGUMENT_FUNCTION_SUBNETS, false);
if (subnetIds != null)
{
if (request.VpcConfig == null)
{
request.VpcConfig = new VpcConfig();
}
request.VpcConfig.SubnetIds = subnetIds.ToList();
request.VpcConfig.IsSubnetIdsSet = true;
if (existingConfiguration.VpcConfig == null || AreDifferent(subnetIds, existingConfiguration.VpcConfig.SubnetIds))
{
different = true;
}
}
var securityGroupIds = this.GetStringValuesOrDefault(this.SecurityGroupIds, LambdaDefinedCommandOptions.ARGUMENT_FUNCTION_SECURITY_GROUPS, false);
if (securityGroupIds != null)
{
if (request.VpcConfig == null)
{
request.VpcConfig = new VpcConfig();
}
request.VpcConfig.SecurityGroupIds = securityGroupIds.ToList();
request.VpcConfig.IsSecurityGroupIdsSet = true;
if (existingConfiguration.VpcConfig == null || AreDifferent(securityGroupIds, existingConfiguration.VpcConfig.SecurityGroupIds))
{
different = true;
}
}
var deadLetterTargetArn = this.GetStringValueOrDefault(this.DeadLetterTargetArn, LambdaDefinedCommandOptions.ARGUMENT_DEADLETTER_TARGET_ARN, false);
if (deadLetterTargetArn != null)
{
if (!string.IsNullOrEmpty(deadLetterTargetArn) && !string.Equals(deadLetterTargetArn, existingConfiguration.DeadLetterConfig?.TargetArn, StringComparison.Ordinal))
{
request.DeadLetterConfig = existingConfiguration.DeadLetterConfig ?? new DeadLetterConfig();
request.DeadLetterConfig.TargetArn = deadLetterTargetArn;
different = true;
}
else if (string.IsNullOrEmpty(deadLetterTargetArn) && !string.IsNullOrEmpty(existingConfiguration.DeadLetterConfig?.TargetArn))
{
request.DeadLetterConfig = null;
request.DeadLetterConfig = existingConfiguration.DeadLetterConfig ?? new DeadLetterConfig();
request.DeadLetterConfig.TargetArn = string.Empty;
different = true;
}
}
var tracingMode = this.GetStringValueOrDefault(this.TracingMode, LambdaDefinedCommandOptions.ARGUMENT_TRACING_MODE, false);
if (tracingMode != null)
{
var eTraceMode = !string.Equals(tracingMode, string.Empty) ? Amazon.Lambda.TracingMode.FindValue(tracingMode) : null;
if (eTraceMode != existingConfiguration.TracingConfig?.Mode)
{
request.TracingConfig = new TracingConfig();
request.TracingConfig.Mode = eTraceMode;
different = true;
}
}
var kmsKeyArn = this.GetStringValueOrDefault(this.KMSKeyArn, LambdaDefinedCommandOptions.ARGUMENT_KMS_KEY_ARN, false);
if (!string.IsNullOrEmpty(kmsKeyArn) && !string.Equals(kmsKeyArn, existingConfiguration.KMSKeyArn, StringComparison.Ordinal))
{
request.KMSKeyArn = kmsKeyArn;
different = true;
}
var environmentVariables = GetEnvironmentVariables(existingConfiguration?.Environment?.Variables);
// If runtime package store layers were set, then set the environment variable to tell the .NET Core runtime
// to look for assemblies in the folder where the layer will be expanded.
if(!string.IsNullOrEmpty(dotnetSharedStoreValue))
{
if(environmentVariables == null)
{
environmentVariables = new Dictionary<string, string>();
}
environmentVariables[LambdaConstants.ENV_DOTNET_SHARED_STORE] = dotnetSharedStoreValue;
}
if (environmentVariables != null && AreDifferent(environmentVariables, existingConfiguration?.Environment?.Variables))
{
request.Environment = new Model.Environment { Variables = environmentVariables };
request.Environment.IsVariablesSet = true;
different = true;
}
if (existingConfiguration.PackageType == Lambda.PackageType.Zip)
{
var handler = this.GetStringValueOrDefault(this.Handler, LambdaDefinedCommandOptions.ARGUMENT_FUNCTION_HANDLER, false);
if (!string.IsNullOrEmpty(handler) && !string.Equals(handler, existingConfiguration.Handler, StringComparison.Ordinal))
{
request.Handler = handler;
different = true;
}
var runtime = this.GetStringValueOrDefault(this.Runtime, LambdaDefinedCommandOptions.ARGUMENT_FUNCTION_RUNTIME, false);
if (runtime != null && runtime != existingConfiguration.Runtime)
{
request.Runtime = runtime;
different = true;
}
}
else if (existingConfiguration.PackageType == Lambda.PackageType.Image)
{
{
var imageEntryPoints = this.GetStringValuesOrDefault(this.ImageEntryPoint, LambdaDefinedCommandOptions.ARGUMENT_IMAGE_ENTRYPOINT, false);
if (imageEntryPoints != null)
{
if (AreDifferent(imageEntryPoints, existingConfiguration.ImageConfigResponse?.ImageConfig?.EntryPoint))
{
if (request.ImageConfig == null)
{
request.ImageConfig = new ImageConfig();
}
request.ImageConfig.EntryPoint = imageEntryPoints.ToList();
request.ImageConfig.IsEntryPointSet = true;
different = true;
}
}
}
{
var imageCommands = this.GetStringValuesOrDefault(this.ImageCommand, LambdaDefinedCommandOptions.ARGUMENT_IMAGE_COMMAND, false);
if (imageCommands != null)
{
if (AreDifferent(imageCommands, existingConfiguration.ImageConfigResponse?.ImageConfig?.Command))
{
if (request.ImageConfig == null)
{
request.ImageConfig = new ImageConfig();
}
request.ImageConfig.Command = imageCommands.ToList();
request.ImageConfig.IsCommandSet = true;
different = true;
}
}
}
var imageWorkingDirectory = this.GetStringValueOrDefault(this.ImageWorkingDirectory, LambdaDefinedCommandOptions.ARGUMENT_IMAGE_WORKING_DIRECTORY, false);
if (imageWorkingDirectory != null)
{
if (request.ImageConfig == null)
{
request.ImageConfig = new ImageConfig();
}
if(!string.Equals(imageWorkingDirectory, existingConfiguration.ImageConfigResponse?.ImageConfig?.WorkingDirectory, StringComparison.Ordinal))
{
request.ImageConfig.WorkingDirectory = imageWorkingDirectory;
different = true;
}
}
}
var logFormat = this.GetStringValueOrDefault(this.LogFormat, LambdaDefinedCommandOptions.ARGUMENT_LOG_FORMAT, false);
if (!string.IsNullOrEmpty(logFormat))
{
if (request.LoggingConfig == null)
{
request.LoggingConfig = new LoggingConfig();
}
if (!string.Equals(logFormat, existingConfiguration.LoggingConfig?.LogFormat, StringComparison.Ordinal))
{
request.LoggingConfig.LogFormat = logFormat;
different = true;
}
}
var logApplicationLevel = this.GetStringValueOrDefault(this.LogApplicationLevel, LambdaDefinedCommandOptions.ARGUMENT_LOG_APPLICATION_LEVEL, false);
if (!string.IsNullOrEmpty(logApplicationLevel))
{
if (request.LoggingConfig == null)
{
request.LoggingConfig = new LoggingConfig();
}
if (!string.Equals(logApplicationLevel, existingConfiguration.LoggingConfig?.ApplicationLogLevel, StringComparison.Ordinal))
{
request.LoggingConfig.ApplicationLogLevel = logApplicationLevel;
different = true;
}
}
var logSystemLevel = this.GetStringValueOrDefault(this.LogSystemLevel, LambdaDefinedCommandOptions.ARGUMENT_LOG_SYSTEM_LEVEL, false);
if (!string.IsNullOrEmpty(logSystemLevel))
{
if (request.LoggingConfig == null)
{
request.LoggingConfig = new LoggingConfig();
}
if (!string.Equals(logSystemLevel, existingConfiguration.LoggingConfig?.SystemLogLevel, StringComparison.Ordinal))
{
request.LoggingConfig.SystemLogLevel = logSystemLevel;
different = true;
}
}
var logGroup = this.GetStringValueOrDefault(this.LogGroup, LambdaDefinedCommandOptions.ARGUMENT_LOG_GROUP, false);
if (logGroup != null) // Allow empty string to reset back to Lambda's default log group.
{
if (request.LoggingConfig == null)
{
request.LoggingConfig = new LoggingConfig();
}
if (!string.Equals(logGroup, existingConfiguration.LoggingConfig?.LogGroup, StringComparison.Ordinal))
{
request.LoggingConfig.LogGroup = logGroup;
different = true;
}
}
var snapStartApplyOn = this.GetStringValueOrDefault(this.SnapStartApplyOn, LambdaDefinedCommandOptions.ARGUMENT_SNAP_START_APPLY_ON, false);
if (!string.IsNullOrEmpty(snapStartApplyOn))
{
if (null == request.SnapStart)
request.SnapStart = new SnapStart();
if (!string.Equals(existingConfiguration?.SnapStart?.ApplyOn?.Value, snapStartApplyOn, StringComparison.Ordinal))
{
request.SnapStart.ApplyOn = snapStartApplyOn;
different = true;
}
}
if (!different)
return null;
return request;
}