public void VerifyVariableFileGenerationWithSubstitution2(string template) { var metadata = new TerraformHclCloudTemplateHandler().ParseTypes(template); var variables = @"{""test"": ""#{MyVariable}"", ""list"": ""[#{MyListVariable}, 2, 3]"", ""map"": ""{\""key\"": #{MyMap}}""}"; var jsonVariables = TerraformVariableFileGenerator.ConvertStringPropsToObjects( TerraformTemplateFormat.Json, new TestVariableDictionary(), variables, metadata); jsonVariables.Should().Match(@"{""test"": ""#{MyVariable}"",""list"": [#{MyListVariable}, 2, 3],""map"": {""key"": #{MyMap}}}"); }
public void VerifyVariableFileGeneration(string template) { var metadata = new TerraformHclCloudTemplateHandler().ParseTypes(template); var variables = @"{""test"": ""string"", ""list"": ""[1]"", ""map"": ""{\""key\"": \""value\""}""}"; var jsonVariables = TerraformVariableFileGenerator.ConvertStringPropsToObjects( TerraformTemplateFormat.Json, new TestVariableDictionary(), variables, metadata); jsonVariables.Should().Match(@"{""test"": ""string"",""list"": [1],""map"": {""key"": ""value""}}"); // This should be valid json JObject.Parse(jsonVariables); }
/// <summary> /// Find maps and lists in the supplied variables, and attempt to parse them as HCL or JSON /// structures. Any that fail are returned in the list. /// </summary> /// <param name="properties">JSON string containing the raw strings for the data structures</param> /// <returns>The names of any variables that failed to be parsed</returns> IEnumerable <string> ValidationVariables(IReadOnlyDictionary <string, string> properties) { // If we switched from an inline script to a package script, we may have variables // defined. So don't process anything if we are currently deploying a package. if (IsTemplateFromPackage(properties)) { return(Enumerable.Empty <string>()); } var variables = properties.ContainsKey(TerraformSpecialVariables.Action.Terraform.TemplateParameters) ? properties[TerraformSpecialVariables.Action.Terraform.TemplateParameters] ?? DefaultTemplate : DefaultTemplate; var template = properties.ContainsKey(TerraformSpecialVariables.Action.Terraform.Template) ? properties[TerraformSpecialVariables.Action.Terraform.Template] ?? DefaultTemplate : DefaultTemplate; var templateHandler = cloudTemplateHandlerFactory.GetHandler(TerraformConstants.CloudTemplateProviderId, template); if (templateHandler == null) { return new[] { TerraformSpecialVariables.Action.Terraform.Template } } ; var metadata = templateHandler.ParseTypes(template); var invalidProperties = JObject.Parse(variables) .Properties() .Select(prop => new { Prop = prop, Type = TerraformVariableFileGenerator.GetPropertyType(metadata, prop.Name) }) // Don't validate empty values .Where(propDetails => !string.IsNullOrWhiteSpace(propDetails.Prop.Value.ToString())) // Only validate raw values .Where(propDetails => propDetails.Type?.StartsWith(TerraformDataTypes.RawPrefix) ?? false) // Don't validate values with variable substitution .Where(propDetails => !propDetails.Prop.Value.ToString().Contains("#{")) // Limit the results to those that fail validation .Where(propDetails => { if (templateHandler is TerraformHclCloudTemplateHandler) { if (propDetails.Type == TerraformDataTypes.RawMap) { return(!HclParser.MapValue.End().TryParse(propDetails.Prop.Value.ToString()).WasSuccessful); } return(!HclParser.ListValue.End().TryParse(propDetails.Prop.Value.ToString()).WasSuccessful); } try { if (propDetails.Type == TerraformDataTypes.RawMap) { JObject.Parse(propDetails.Prop.Value.ToString()); return(false); } JArray.Parse(propDetails.Prop.Value.ToString()); return(false); } catch (Exception) { return(true); } }) // Generate an error message .Select(propDetails => propDetails.Prop.Name + $" (expected a {propDetails.Type?.Replace(TerraformDataTypes.RawPrefix, "")})") .ToList(); return(invalidProperties); }