Skip to content

Commit 24c44e2

Browse files
authored
Fix Null Reference for ScaledObject without Extensions (#2793)
* Fix possible null reference * Refactor tests
1 parent e0679a2 commit 24c44e2

File tree

2 files changed

+26
-16
lines changed

2 files changed

+26
-16
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ private static bool IsDurable(JToken trigger) =>
5656
private static IEnumerable<ScaledObjectTriggerV1Alpha1> GetDurableScalar(JObject hostJson)
5757
{
5858
// Reference: https://docs.microsoft.com/azure/azure-functions/durable/durable-functions-bindings#durable-functions-2-0-host-json
59-
DurableTaskConfig durableTaskConfig = hostJson.SelectToken("extensions.durableTask").ToObject<DurableTaskConfig>();
59+
DurableTaskConfig durableTaskConfig = hostJson.SelectToken("extensions.durableTask")?.ToObject<DurableTaskConfig>();
6060
string storageType = durableTaskConfig?.StorageProvider?["type"]?.ToString();
6161

6262
// Custom storage types are supported starting in Durable Functions v2.4.2

test/Azure.Functions.Cli.Tests/KedaV2ResourceTests.cs

+25-15
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,20 @@ public KedaV2ResourceTests()
3535
"));
3636
}
3737

38+
[Theory]
39+
[InlineData("{ }")]
40+
[InlineData("{ \"extensions\": null }")]
41+
[InlineData("{ \"extensions\": { } }")]
42+
[InlineData("{ \"extensions\": { \"durableTask\": null } }")]
43+
public void GetDurableScalarNoExtension(string hostSnippet)
44+
{
45+
JObject hostConfig = JObject.Parse(hostSnippet);
46+
ScaledObjectKedaV2 scaledObject = GetKubernetesResource(hostConfig);
47+
48+
Assert.NotNull(scaledObject);
49+
Assert.Empty(scaledObject.Spec.Triggers);
50+
}
51+
3852
[Theory]
3953
[InlineData(null)]
4054
[InlineData("{ }")]
@@ -58,16 +72,7 @@ public void GetUnsupportedDurableScalar(string providerJson)
5872
if (providerJson != null)
5973
durableTaskConfig.Add("storageProvider", JObject.Parse(providerJson));
6074

61-
KedaV2Resource resource = new KedaV2Resource();
62-
ScaledObjectKedaV2 scaledObject = resource.GetKubernetesResource(
63-
"HelloWorld",
64-
"default",
65-
new TriggersPayload { HostJson = hostConfig, FunctionsJson = _functions },
66-
new DeploymentV1Apps { Metadata = new ObjectMetadataV1 { Name = "HelloDeployment" } },
67-
30,
68-
300,
69-
1,
70-
8) as ScaledObjectKedaV2;
75+
ScaledObjectKedaV2 scaledObject = GetKubernetesResource(hostConfig);
7176

7277
Assert.NotNull(scaledObject);
7378
Assert.Empty(scaledObject.Spec.Triggers);
@@ -106,19 +111,24 @@ public void GetMsSqlDurableScalar(
106111
if (configuredMaxActivities.HasValue)
107112
durableTaskConfig.Add("maxConcurrentActivityFunctions", configuredMaxActivities);
108113

114+
ScaledObjectKedaV2 scaledObject = GetKubernetesResource(hostConfig);
115+
116+
Assert.NotNull(scaledObject);
117+
AssertMsSqlDurableScalar(scaledObject.Spec.Triggers.Single(), expectedMaxOrchestrations, expectedMaxActivities, "MySqlConnection");
118+
}
119+
120+
private ScaledObjectKedaV2 GetKubernetesResource(JObject hostJson)
121+
{
109122
KedaV2Resource resource = new KedaV2Resource();
110-
ScaledObjectKedaV2 scaledObject = resource.GetKubernetesResource(
123+
return resource.GetKubernetesResource(
111124
"HelloWorld",
112125
"default",
113-
new TriggersPayload { HostJson = hostConfig, FunctionsJson = _functions },
126+
new TriggersPayload { HostJson = hostJson, FunctionsJson = _functions },
114127
new DeploymentV1Apps { Metadata = new ObjectMetadataV1 { Name = "HelloDeployment" } },
115128
30,
116129
300,
117130
1,
118131
8) as ScaledObjectKedaV2;
119-
120-
Assert.NotNull(scaledObject);
121-
AssertMsSqlDurableScalar(scaledObject.Spec.Triggers.Single(), expectedMaxOrchestrations, expectedMaxActivities, "MySqlConnection");
122132
}
123133

124134
private static void AssertMsSqlDurableScalar(ScaledObjectTriggerV1Alpha1 actual, int maxOrchestrations, int maxActivities, string connectionString)

0 commit comments

Comments
 (0)