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);
        }
Esempio n. 3
0
        /// <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);
        }