private static JObject UpdateDurableFunctionConfig(JObject trigger, DurableConfig durableTaskConfig)
        {
            if (IsDurableTrigger(trigger))
            {
                if (durableTaskConfig.HubName != null)
                {
                    trigger[TaskHubName] = durableTaskConfig.HubName;
                }

                if (durableTaskConfig.Connection != null)
                {
                    trigger[Connection] = durableTaskConfig.Connection;
                }

                if (durableTaskConfig.StorageProvider != null)
                {
                    trigger[DurableTaskV2StorageOptions] = durableTaskConfig.StorageProvider;
                }

                if (durableTaskConfig.MaxConcurrentOrchestratorFunctions != 0)
                {
                    trigger[DurableTaskV2MaxConcurrentOrchestratorFunctions] = durableTaskConfig.MaxConcurrentOrchestratorFunctions;
                }

                if (durableTaskConfig.MaxConcurrentActivityFunctions != 0)
                {
                    trigger[DurableTaskV2MaxConcurrentActivityFunctions] = durableTaskConfig.MaxConcurrentActivityFunctions;
                }
            }
            return(trigger);
        }
        private DurableConfig GetDurableV2Config(JObject durableHostConfig)
        {
            var config = new DurableConfig();

            if (durableHostConfig != null)
            {
                if (durableHostConfig.TryGetValue(HubName, StringComparison.OrdinalIgnoreCase, out JToken nameValue) && nameValue != null)
                {
                    config.HubName = nameValue.ToString();
                }

                if (durableHostConfig.TryGetValue(DurableTaskV2StorageOptions, StringComparison.OrdinalIgnoreCase, out JToken storageOptions) && (storageOptions as JObject) != null)
                {
                    if (((JObject)storageOptions).TryGetValue(DurableTaskV2StorageConnectionName, StringComparison.OrdinalIgnoreCase, out nameValue) && nameValue != null)
                    {
                        config.Connection = nameValue.ToString();
                    }
                }
            }

            if (config.HubName == null)
            {
                config.HubName = GetDefaultDurableV2HubName();
            }

            return(config);
        }
        internal async Task <IEnumerable <JObject> > GetFunctionTriggers(IEnumerable <FunctionMetadata> functionsMetadata, ScriptJobHostOptions hostOptions)
        {
            var triggers = (await functionsMetadata
                            .Where(f => !f.IsProxy)
                            .Select(f => f.ToFunctionTrigger(hostOptions))
                            .WhenAll())
                           .Where(t => t != null);

            if (triggers.Any(IsDurableTrigger))
            {
                DurableConfig durableTaskConfig = await ReadDurableTaskConfig();

                // If any host level durable config values, we need to apply them to all durable triggers
                if (durableTaskConfig.HasValues())
                {
                    triggers = triggers.Select(t => UpdateDurableFunctionConfig(t, durableTaskConfig));
                }
            }

            if (FileUtility.FileExists(Path.Combine(hostOptions.RootScriptPath, ScriptConstants.ProxyMetadataFileName)))
            {
                // This is because we still need to scale function apps that are proxies only
                triggers = triggers.Append(JObject.FromObject(new { type = "routingTrigger" }));
            }

            return(triggers);
        }
        private static JObject UpdateDurableFunctionConfig(JObject trigger, DurableConfig durableTaskConfig)
        {
            if (IsDurableTrigger(trigger))
            {
                if (durableTaskConfig.HubName != null)
                {
                    trigger[TaskHubName] = durableTaskConfig.HubName;
                }

                if (durableTaskConfig.Connection != null)
                {
                    trigger[Connection] = durableTaskConfig.Connection;
                }
            }
            return(trigger);
        }
        private DurableConfig GetDurableV1Config(JObject durableHostConfig)
        {
            var config = new DurableConfig();

            if (durableHostConfig != null)
            {
                if (durableHostConfig.TryGetValue(HubName, StringComparison.OrdinalIgnoreCase, out JToken nameValue) && nameValue != null)
                {
                    config.HubName = nameValue.ToString();
                }

                if (durableHostConfig.TryGetValue(DurableTaskV1StorageConnectionName, StringComparison.OrdinalIgnoreCase, out nameValue) && nameValue != null)
                {
                    config.Connection = nameValue.ToString();
                }
            }

            return(config);
        }
        internal async Task <IEnumerable <JObject> > GetFunctionTriggers(IEnumerable <FunctionMetadata> functionsMetadata, ScriptJobHostOptions hostOptions)
        {
            var triggers = (await functionsMetadata
                            .Select(f => f.ToFunctionTrigger(hostOptions))
                            .WhenAll())
                           .Where(t => t != null);

            if (triggers.Any(IsDurableTrigger))
            {
                DurableConfig durableTaskConfig = await ReadDurableTaskConfig();

                // If any host level durable config values, we need to apply them to all durable triggers
                if (durableTaskConfig.HasValues())
                {
                    triggers = triggers.Select(t => UpdateDurableFunctionConfig(t, durableTaskConfig));
                }
            }

            return(triggers);
        }
        private DurableConfig GetDurableV2Config(JObject durableHostConfig)
        {
            var config = new DurableConfig();

            if (durableHostConfig != null)
            {
                if (durableHostConfig.TryGetValue(HubName, StringComparison.OrdinalIgnoreCase, out JToken nameValue) && nameValue != null)
                {
                    config.HubName = nameValue.ToString();
                }

                if (durableHostConfig.TryGetValue(DurableTaskV2StorageOptions, StringComparison.OrdinalIgnoreCase, out JToken storageOptions) && (storageOptions as JObject) != null)
                {
                    if (((JObject)storageOptions).TryGetValue(DurableTaskV2StorageConnectionName, StringComparison.OrdinalIgnoreCase, out nameValue) && nameValue != null)
                    {
                        config.Connection = nameValue.ToString();
                    }

                    config.StorageProvider = storageOptions;
                }

                if (durableHostConfig.TryGetValue(DurableTaskV2MaxConcurrentOrchestratorFunctions, StringComparison.OrdinalIgnoreCase, out JToken maxConcurrentOrchestratorFunctions) && maxConcurrentOrchestratorFunctions != null)
                {
                    config.MaxConcurrentOrchestratorFunctions = int.Parse(maxConcurrentOrchestratorFunctions.ToString());
                }

                if (durableHostConfig.TryGetValue(DurableTaskV2MaxConcurrentActivityFunctions, StringComparison.OrdinalIgnoreCase, out JToken maxConcurrentActivityFunctions) && maxConcurrentActivityFunctions != null)
                {
                    config.MaxConcurrentActivityFunctions = int.Parse(maxConcurrentActivityFunctions.ToString());
                }
            }

            if (config.HubName == null)
            {
                config.HubName = GetDefaultDurableV2HubName();
            }

            return(config);
        }