From 28f2e20fada0cac4399d47ba000f2f446071b31f Mon Sep 17 00:00:00 2001 From: Anthony Shaw Date: Fri, 3 May 2024 12:12:05 +1000 Subject: [PATCH 1/2] Check if parameter is a string not an object --- .../ArmTemplateProcessor.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Analyzer.TemplateProcessor/ArmTemplateProcessor.cs b/src/Analyzer.TemplateProcessor/ArmTemplateProcessor.cs index b6f0d218..9118fb6b 100644 --- a/src/Analyzer.TemplateProcessor/ArmTemplateProcessor.cs +++ b/src/Analyzer.TemplateProcessor/ArmTemplateProcessor.cs @@ -8,6 +8,7 @@ using Azure.Deployments.Core.Definitions.Schema; using Azure.Deployments.Core.Resources; using Azure.Deployments.Expression.Engines; +using Azure.Deployments.Expression.Extensions; using Azure.Deployments.Templates.Engines; using Azure.Deployments.Templates.Expressions; using Azure.Deployments.Templates.Extensions; @@ -546,7 +547,15 @@ internal InsensitiveDictionary PopulateParameters(string parameters) foreach (var parameter in parametersObject.InsensitiveToken("parameters").Value()?.Properties() ?? Enumerable.Empty()) { - JToken parameterValueAsJToken = parameter.Value.ToObject().Property("value")?.Value; + JToken parameterValueAsJToken; + if (parameter.Value.IsTextBasedJTokenType()) + { + parameterValueAsJToken = parameter.Value; + } + else + { + parameterValueAsJToken = parameter.Value.ToObject().Property("value")?.Value; + } // See if "reference" was specified instead of "value" bool isReference = false; From 68a0aa9c5dd1d64c3785f98d54683289fa599eb3 Mon Sep 17 00:00:00 2001 From: Anthony Shaw Date: Wed, 5 Jun 2024 12:44:34 +1000 Subject: [PATCH 2/2] Skip template expansion when there is a conditional value which isn't met --- src/Analyzer.Core/TemplateAnalyzer.cs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/Analyzer.Core/TemplateAnalyzer.cs b/src/Analyzer.Core/TemplateAnalyzer.cs index 7b0873ed..87169032 100644 --- a/src/Analyzer.Core/TemplateAnalyzer.cs +++ b/src/Analyzer.Core/TemplateAnalyzer.cs @@ -137,7 +137,9 @@ private IEnumerable AnalyzeAllIncludedTemplates(string populatedTem templatejObject = armTemplateProcessor.ProcessTemplate(parameters); } catch (Exception e) - { + { + // log populated template + this.logger?.LogDebug($"Populated template: {populatedTemplate}"); throw new TemplateAnalyzerException("Error while processing template.", e); } @@ -169,6 +171,23 @@ private IEnumerable AnalyzeAllIncludedTemplates(string populatedTem if (currentProcessedResource.InsensitiveToken("type")?.ToString().Equals("Microsoft.Resources/deployments", StringComparison.OrdinalIgnoreCase) ?? false) { + var resourceCondition = currentProcessedResource.InsensitiveToken("condition"); + + if (resourceCondition != null) + { + bool skip = false; + // Condition is simply false. + if (resourceCondition.ToString().Equals("false", StringComparison.OrdinalIgnoreCase)) + skip = true; + + // TODO: evaluate expressions, e.g. {[not(empty(parameters('dashboardName')))]} + if (skip) + { + this.logger?.LogInformation($"Conditions for template not met, skipping."); + continue; + } + } + var nestedTemplate = currentProcessedResource.InsensitiveToken("properties.template"); if (nestedTemplate == null) {