Skip to content

Commit 86ac64b

Browse files
Merge branch 'v3.x' into use-next-available-port
2 parents b026a0c + 4e93f0d commit 86ac64b

File tree

10 files changed

+339
-41
lines changed

10 files changed

+339
-41
lines changed

build/BuildSteps.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,7 @@ public static void CreateIntegrationTestsBuildManifest()
616616

617617
private static List<Package> GetV3PackageList()
618618
{
619-
const string CoreToolsBuildPackageList = "https://raw.githubusercontent.com/Azure/azure-functions-integration-tests/dev/integrationTestsBuild/V3/CoreToolsBuild2.json";
619+
const string CoreToolsBuildPackageList = "https://raw.githubusercontent.com/Azure/azure-functions-integration-tests/main/integrationTestsBuild/V3/CoreToolsBuild.json";
620620
Uri address = new Uri(CoreToolsBuildPackageList);
621621

622622
string content = null;

src/Azure.Functions.Cli/Actions/HostActions/StartHostAction.cs

+4-3
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ internal static async Task CheckNonOptionalSettings(IEnumerable<KeyValuePair<str
453453
.All(t => Constants.TriggersWithoutStorage.Any(tws => tws.Equals(t, StringComparison.OrdinalIgnoreCase)));
454454

455455
if (!skipAzureWebJobsStorageCheck && string.IsNullOrWhiteSpace(azureWebJobsStorage) &&
456-
!StorageConnectionExists(secrets, storageConnectionKey) && !allNonStorageTriggers)
456+
!ConnectionExists(secrets, storageConnectionKey) && !allNonStorageTriggers)
457457
{
458458
throw new CliException($"Missing value for AzureWebJobsStorage in {SecretsManager.AppSettingsFileName}. " +
459459
$"This is required for all triggers other than {string.Join(", ", Constants.TriggersWithoutStorage)}. "
@@ -473,7 +473,8 @@ internal static async Task CheckNonOptionalSettings(IEnumerable<KeyValuePair<str
473473
{
474474
ColoredConsole.WriteLine(WarningColor($"Warning: '{token.Key}' property in '{filePath}' is empty."));
475475
}
476-
else if (!secrets.Any(v => v.Key.Equals(appSettingName, StringComparison.OrdinalIgnoreCase)))
476+
else if (token.Key == "connection" && !ConnectionExists(secrets, appSettingName) ||
477+
token.Key != "connection" && !secrets.Any(v => v.Key.Equals(appSettingName, StringComparison.OrdinalIgnoreCase)))
477478
{
478479
ColoredConsole
479480
.WriteLine(WarningColor($"Warning: Cannot find value named '{appSettingName}' in {SecretsManager.AppSettingsFileName} that matches '{token.Key}' property set on '{binding["type"]?.ToString()}' in '{filePath}'. " +
@@ -494,7 +495,7 @@ internal static async Task CheckNonOptionalSettings(IEnumerable<KeyValuePair<str
494495
}
495496
}
496497

497-
internal static bool StorageConnectionExists(IEnumerable<KeyValuePair<string, string>> secrets, string connectionStringKey)
498+
internal static bool ConnectionExists(IEnumerable<KeyValuePair<string, string>> secrets, string connectionStringKey)
498499
{
499500
// convert secrets into IConfiguration object, check for storage connection in config section
500501
var convertedEnv = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

src/Azure.Functions.Cli/Helpers/GlobalCoreToolsSettings.cs

+4
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ public static void Init(ISecretsManager secretsManager, string[] args)
4444
{
4545
_currentWorkerRuntime = WorkerRuntime.dotnet;
4646
}
47+
else if (args.Contains("--dotnet-isolated"))
48+
{
49+
_currentWorkerRuntime = WorkerRuntime.dotnetIsolated;
50+
}
4751
else if (args.Contains("--javascript"))
4852
{
4953
_currentWorkerRuntime = WorkerRuntime.node;

src/Azure.Functions.Cli/Kubernetes/KEDA/V2/KedaV2Resource.cs

+13-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Globalization;
34
using System.Linq;
45
using Azure.Functions.Cli.Kubernetes.KEDA.Models;
56
using Azure.Functions.Cli.Kubernetes.KEDA.V2.Models;
@@ -47,31 +48,38 @@ public override IKubernetesResource GetKubernetesResource(string name, string @n
4748
};
4849
}
4950

50-
private static bool IsDurable(JToken trigger) =>
51+
private static bool IsDurable(JToken trigger) =>
5152
trigger["type"].ToString().Equals("orchestrationTrigger", StringComparison.OrdinalIgnoreCase) ||
5253
trigger["type"].ToString().Equals("activityTrigger", StringComparison.OrdinalIgnoreCase) ||
5354
trigger["type"].ToString().Equals("entityTrigger", StringComparison.OrdinalIgnoreCase);
5455

5556
private static IEnumerable<ScaledObjectTriggerV1Alpha1> GetDurableScalar(JObject hostJson)
5657
{
5758
// Reference: https://docs.microsoft.com/azure/azure-functions/durable/durable-functions-bindings#durable-functions-2-0-host-json
58-
JObject storageProviderConfig = hostJson.SelectToken("extensions.durableTask.storageProvider") as JObject;
59-
string storageType = storageProviderConfig?["type"]?.ToString();
59+
DurableTaskConfig durableTaskConfig = hostJson.SelectToken("extensions.durableTask")?.ToObject<DurableTaskConfig>();
60+
string storageType = durableTaskConfig?.StorageProvider?["type"]?.ToString();
6061

6162
// Custom storage types are supported starting in Durable Functions v2.4.2
6263
if (string.Equals(storageType, "MicrosoftSQL", StringComparison.OrdinalIgnoreCase) ||
6364
string.Equals(storageType, "mssql", StringComparison.OrdinalIgnoreCase))
6465
{
66+
// By default, max 10 orchestrations and 1 activity per replica
67+
string query = string.Format(
68+
CultureInfo.InvariantCulture,
69+
"SELECT dt.GetScaleRecommendation({0}, {1})",
70+
durableTaskConfig.MaxConcurrentOrchestratorFunctions,
71+
durableTaskConfig.MaxConcurrentActivityFunctions);
72+
6573
yield return new ScaledObjectTriggerV1Alpha1
6674
{
6775
// MSSQL scaler reference: https://keda.sh/docs/2.2/scalers/mssql/
6876
Type = "mssql",
6977
Metadata = new Dictionary<string, string>
7078
{
7179
// Durable SQL scaling: https://microsoft.github.io/durabletask-mssql/#/scaling?id=worker-auto-scale
72-
["query"] = "SELECT dt.GetScaleRecommendation(10, 1)", // max 10 orchestrations and 1 activity per replica
80+
["query"] = query,
7381
["targetValue"] = "1",
74-
["connectionStringFromEnv"] = storageProviderConfig?["connectionStringName"]?.ToString(),
82+
["connectionStringFromEnv"] = durableTaskConfig.StorageProvider["connectionStringName"]?.ToString(),
7583
}
7684
};
7785
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
using Newtonsoft.Json;
2+
using Newtonsoft.Json.Linq;
3+
using System.ComponentModel;
4+
5+
namespace Azure.Functions.Cli.Kubernetes.Models
6+
{
7+
internal class DurableTaskConfig
8+
{
9+
[JsonProperty("maxConcurrentOrchestratorFunctions")]
10+
public int MaxConcurrentOrchestratorFunctions { get; set; } = 10;
11+
12+
[JsonProperty("maxConcurrentActivityFunctions")]
13+
public int MaxConcurrentActivityFunctions { get; set; } = 1;
14+
15+
[JsonProperty("storageProvider")]
16+
public JObject StorageProvider { get; set; }
17+
}
18+
}

0 commit comments

Comments
 (0)