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) { 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;