private UpdateFunctionConfigurationRequest CreateConfigurationRequestIfDifferent()

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