private static void SetAppPool()

in src/Microsoft.IIS.Administration.WebServer.AppPools/AppPoolHelper.cs [304:484]


        private static void SetAppPool(ApplicationPool appPool, dynamic model)
        {
            Debug.Assert(appPool != null);
            Debug.Assert((bool)(model != null));

            DynamicHelper.If((object)model.name, v => SetName(appPool, v));

            appPool.ManagedPipelineMode = DynamicHelper.To<ManagedPipelineMode>(model.pipeline_mode) ?? appPool.ManagedPipelineMode;
            appPool.ManagedRuntimeVersion = DynamicHelper.Value(model.managed_runtime_version) ?? appPool.ManagedRuntimeVersion; 
            appPool.Enable32BitAppOnWin64 = DynamicHelper.To<bool>(model.enable_32bit_win64) ?? appPool.Enable32BitAppOnWin64;
            appPool.QueueLength = DynamicHelper.To(model.queue_length, 10, 65535) ?? appPool.QueueLength;
            appPool.AutoStart = DynamicHelper.To<bool>(model.auto_start) ?? appPool.AutoStart;

            // CPU
            if (model.cpu != null) {
                dynamic cpu = model.cpu;

                appPool.Cpu.Limit = DynamicHelper.To(cpu.limit, 0, 100000) ?? appPool.Cpu.Limit;
                appPool.Cpu.SmpAffinitized = DynamicHelper.To<bool>(cpu.processor_affinity_enabled) ?? appPool.Cpu.SmpAffinitized;
                appPool.Cpu.SmpProcessorAffinityMask = DynamicHelper.ToLong(cpu.processor_affinity_mask32, 16, 0, 4294967295) ?? appPool.Cpu.SmpProcessorAffinityMask;
                appPool.Cpu.SmpProcessorAffinityMask2 = DynamicHelper.ToLong(cpu.processor_affinity_mask64, 16, 0, 4294967295) ?? appPool.Cpu.SmpProcessorAffinityMask2;

                try {
                    appPool.Cpu.Action = DynamicHelper.To<ProcessorAction>(cpu.action) ?? appPool.Cpu.Action;
                }
                catch (COMException e) {
                    throw new ApiArgumentException("cpu.action", e);
                }

                long? resetInterval = DynamicHelper.To(cpu.limit_interval, 0, 1440);
                appPool.Cpu.ResetInterval = (resetInterval != null) ? TimeSpan.FromMinutes(resetInterval.Value) : appPool.Cpu.ResetInterval;
            }

            // Process Model
            if (model.process_model != null) {
                dynamic processModel = model.process_model;

                if (appPool.ProcessModel.Schema.HasAttribute(IdleTimeoutActionAttribute)) {
                    appPool.ProcessModel.IdleTimeoutAction = DynamicHelper.To<IdleTimeoutAction>(processModel.idle_timeout_action) ?? appPool.ProcessModel.IdleTimeoutAction;
                }
                appPool.ProcessModel.MaxProcesses = DynamicHelper.To(processModel.max_processes, 0, 2147483647) ?? appPool.ProcessModel.MaxProcesses;
                appPool.ProcessModel.PingingEnabled = DynamicHelper.To<bool>(processModel.pinging_enabled) ?? appPool.ProcessModel.PingingEnabled;

                long? idleTimeout = DynamicHelper.To(processModel.idle_timeout, 0, 43200);
                appPool.ProcessModel.IdleTimeout = (idleTimeout != null) ? TimeSpan.FromMinutes(idleTimeout.Value) : appPool.ProcessModel.IdleTimeout;

                long? pingInterval = DynamicHelper.To(processModel.ping_interval, 1, 4294967);
                appPool.ProcessModel.PingInterval = (pingInterval != null) ? TimeSpan.FromSeconds(pingInterval.Value) : appPool.ProcessModel.PingInterval;

                long? pingResponseTime = DynamicHelper.To(processModel.ping_response_time, 1, 4294967);
                appPool.ProcessModel.PingResponseTime = (pingResponseTime != null) ? TimeSpan.FromSeconds(pingResponseTime.Value) : appPool.ProcessModel.PingResponseTime;

                long? shutDownTimeLimit = DynamicHelper.To(processModel.shutdown_time_limit, 1, 4294967);
                appPool.ProcessModel.ShutdownTimeLimit = (shutDownTimeLimit != null) ? TimeSpan.FromSeconds(shutDownTimeLimit.Value) : appPool.ProcessModel.ShutdownTimeLimit;

                long? startupTimeLimit = DynamicHelper.To(processModel.startup_time_limit, 1, 4294967);
                appPool.ProcessModel.StartupTimeLimit = (startupTimeLimit != null) ? TimeSpan.FromSeconds(startupTimeLimit.Value): appPool.ProcessModel.StartupTimeLimit;
            }

            // Identity
            if (model.identity != null) {
                dynamic identity = model.identity;

                appPool.ProcessModel.IdentityType = DynamicHelper.To<ProcessModelIdentityType>(identity.identity_type) ?? appPool.ProcessModel.IdentityType;
                appPool.ProcessModel.LoadUserProfile = DynamicHelper.To<bool>(identity.load_user_profile) ?? appPool.ProcessModel.LoadUserProfile;
                appPool.ProcessModel.UserName = DynamicHelper.Value(identity.username) ?? appPool.ProcessModel.UserName;
                DynamicHelper.If((object)identity.password, v => appPool.ProcessModel.Password = v);
            }

            // Recycling
            if (model.recycling != null) {
                dynamic recycling = model.recycling;

                appPool.Recycling.DisallowOverlappingRotation = DynamicHelper.To<bool>(recycling.disable_overlapped_recycle) ?? appPool.Recycling.DisallowOverlappingRotation;
                appPool.Recycling.DisallowRotationOnConfigChange = DynamicHelper.To<bool>(recycling.disable_recycle_on_config_change) ?? appPool.Recycling.DisallowRotationOnConfigChange;

                // Check if log event collection provided
                if (recycling.log_events != null) {

                    try {
                        // Convert the log_events dynamic into a string and then deserialize it into a Dictionary<string,bool>, from there we turn it into a flags enum
                        Dictionary<string, bool> logEvents = JsonConvert.DeserializeObject<Dictionary<string, bool>>(recycling.log_events.ToString());

                        var flags = appPool.Recycling.LogEventOnRecycle;

                        if (logEvents == null) {
                            throw new ApiArgumentException("recycling.log_events");
                        }

                        Dictionary<string, RecyclingLogEventOnRecycle> flagPairs = new Dictionary<string, RecyclingLogEventOnRecycle>
                        {
                            { "time", RecyclingLogEventOnRecycle.Time },
                            { "requests", RecyclingLogEventOnRecycle.Requests },
                            { "schedule", RecyclingLogEventOnRecycle.Schedule },
                            { "memory", RecyclingLogEventOnRecycle.Memory },
                            { "isapi_unhealthy", RecyclingLogEventOnRecycle.IsapiUnhealthy },
                            { "on_demand", RecyclingLogEventOnRecycle.OnDemand },
                            { "config_change", RecyclingLogEventOnRecycle.ConfigChange },
                            { "private_memory", RecyclingLogEventOnRecycle.PrivateMemory }
                        };

                        foreach (var key in flagPairs.Keys) {
                            if (logEvents.ContainsKey(key)) {
                                if (logEvents[key]) {
                                    flags |= flagPairs[key];
                                }
                                else {
                                    flags &= ~flagPairs[key];
                                }
                            }
                        }

                        appPool.Recycling.LogEventOnRecycle = flags;
                    }
                    catch(JsonSerializationException e) {
                        throw new ApiArgumentException("recycling.log_events", e);
                    }
                }                
                
                // Periodic Restart
                if (recycling.periodic_restart != null) {
                    dynamic periodicRestart = recycling.periodic_restart;

                    appPool.Recycling.PeriodicRestart.PrivateMemory = DynamicHelper.To(periodicRestart.private_memory, 0, 4294967295) ?? appPool.Recycling.PeriodicRestart.PrivateMemory;
                    appPool.Recycling.PeriodicRestart.Requests = DynamicHelper.To(periodicRestart.request_limit, 0, 4294967295) ?? appPool.Recycling.PeriodicRestart.Requests;
                    appPool.Recycling.PeriodicRestart.Memory = DynamicHelper.To(periodicRestart.virtual_memory, 0, 4294967295) ?? appPool.Recycling.PeriodicRestart.Memory;

                    long? timeInterval = DynamicHelper.To(periodicRestart.time_interval, 0, 432000);
                    appPool.Recycling.PeriodicRestart.Time = timeInterval != null ? TimeSpan.FromMinutes(timeInterval.Value) : appPool.Recycling.PeriodicRestart.Time;


                    // Check if schedule provided
                    if (periodicRestart.schedule != null) {

                        if (!(periodicRestart.schedule is JArray)) {
                            throw new ApiArgumentException("recyclying.periodic_restart.schedule", ApiArgumentException.EXPECTED_ARRAY);
                        }

                        // Clear the old time spans in the schedule
                        appPool.Recycling.PeriodicRestart.Schedule.Clear();
                        IEnumerable<dynamic> schedule = periodicRestart.schedule;

                        // Add the time spans
                        foreach (var d in schedule) {
                            var value = DynamicHelper.Value(d);

                            DateTime dt = default(DateTime);
                            if (value == null || !DateTime.TryParseExact(value, "HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt)) {
                                throw new ApiArgumentException("recyclying.periodic_restart.schedule.item", "Expected hh:mm");
                            }

                            appPool.Recycling.PeriodicRestart.Schedule.Add(dt.TimeOfDay);
                        }
                    }
                }
            }

            // Rapid Fail Protection
            if (model.rapid_fail_protection != null) {
                var protection = model.rapid_fail_protection;

                appPool.Failure.RapidFailProtection = DynamicHelper.To<bool>(protection.enabled) ?? appPool.Failure.RapidFailProtection;
                appPool.Failure.LoadBalancerCapabilities = DynamicHelper.To<LoadBalancerCapabilities>(protection.load_balancer_capabilities) ?? appPool.Failure.LoadBalancerCapabilities;
                appPool.Failure.RapidFailProtectionMaxCrashes = DynamicHelper.To(protection.max_crashes, 1, 2147483647) ?? appPool.Failure.RapidFailProtectionMaxCrashes;
                appPool.Failure.AutoShutdownExe = DynamicHelper.Value(protection.auto_shutdown_exe) ?? appPool.Failure.AutoShutdownExe;
                appPool.Failure.AutoShutdownParams = DynamicHelper.Value(protection.auto_shutdown_params) ?? appPool.Failure.AutoShutdownParams;

                long? protectionInterval = DynamicHelper.To(protection.interval, 1, 144400);
                appPool.Failure.RapidFailProtectionInterval = (protectionInterval != null) ? TimeSpan.FromMinutes(protectionInterval.Value) : appPool.Failure.RapidFailProtectionInterval;
            }

            // Process Orphaning
            if (model.process_orphaning != null) {
                var orphaning = model.process_orphaning;

                appPool.Failure.OrphanWorkerProcess = DynamicHelper.To<bool>(orphaning.enabled) ?? appPool.Failure.OrphanWorkerProcess;
                appPool.Failure.OrphanActionExe = DynamicHelper.Value(orphaning.orphan_action_exe) ?? appPool.Failure.OrphanActionExe;
                appPool.Failure.OrphanActionParams = DynamicHelper.Value(orphaning.orphan_action_params) ?? appPool.Failure.OrphanActionParams;
            }

        }