public void Validate_MissingDescriptions_ThrowsException()
        {
            var mainArmTemplateFile        = MainArmTemplateFile.ReadFromFileSystem(this.fileSystem);
            var mainArmTemplateFileElement = JsonElementFactory.CreateElement(mainArmTemplateFile.Content);

            var patchedElement = mainArmTemplateFileElement.Patch(
                JsonPatchOperations.Remove("/parameters/sshRSAPublicKey/metadata/description"),
                JsonPatchOperations.Remove("/parameters/clusterName/metadata/description"),
                JsonPatchOperations.Remove("/parameters/osDiskSizeGB/metadata/description"),
                JsonPatchOperations.Remove("/outputs/controlPlaneFQDN/metadata/description"));

            fileSystem.AddFile(mainArmTemplateFile.Path, patchedElement.ToJsonString());

            var latestArmTemplateFile = MainArmTemplateFile.ReadFromFileSystem(this.fileSystem);
            var sut = this.CreateDescriptionsValidator(latestArmTemplateFile);

            FluentActions.Invoking(() => sut.Validate(this.fileToValidate)).Should()
            .Throw <InvalidModuleFileException>()
            .WithMessage(
                $@"The file ""{this.fileToValidate.Path}"" is invalid. Descriptions for the following parameters are missing:
  - sshRSAPublicKey
  - clusterName
  - osDiskSizeGB

The file ""{this.fileToValidate.Path}"" is invalid. Descriptions for the following outputs are missing:
  - controlPlaneFQDN
".ReplaceLineEndings());
        }
Exemplo n.º 2
0
 public TestValidator(IFileSystem fileSystem, ILogger logger, BicepCliProxy bicepCliProxy, MainArmTemplateFile latestMainArmTemplateFile)
 {
     this.fileSystem                = fileSystem;
     this.logger                    = logger;
     this.bicepCliProxy             = bicepCliProxy;
     this.latestMainArmTemplateFile = latestMainArmTemplateFile;
 }
        public void Validate_ValidFile_Succeeds()
        {
            var latestArmTemplateFile = MainArmTemplateFile.ReadFromFileSystem(this.fileSystem);
            var sut = this.CreateDescriptionsValidator(latestArmTemplateFile);

            FluentActions.Invoking(() => sut.Validate(this.fileToValidate)).Should().NotThrow();
        }
Exemplo n.º 4
0
        public void Validate_ModifiedMainArmTemplateFile_ThrowsException()
        {
            this.fileSystem.AddFile(this.latestMainArmTemplateFile.Path, "modified");

            var fileToValidate = MainArmTemplateFile.ReadFromFileSystem(this.fileSystem);

            Invoking(() => this.sut.Validate(fileToValidate)).Should()
            .Throw <InvalidModuleException>()
            .WithMessage($"The file \"{fileToValidate.Path}\" is modified or outdated. Please regenerate the file to fix it.{Environment.NewLine}");
        }
        public static MainArmTemplateParametersFile Generate(IFileSystem fileSystem, MainArmTemplateFile mainArmTemplateFile)
        {
            var bufferWriter = new ArrayBufferWriter <byte>();

            using (var writer = new Utf8JsonWriter(bufferWriter, new JsonWriterOptions {
                Indented = true
            }))
            {
                writer.WriteStartObject();

                writer.WriteString("$schema", "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#");
                writer.WriteString("contentVersion", "1.0.0.0");

                writer.WritePropertyName("parameters");
                writer.WriteStartObject();

                var parameterInstances = GenerateParameterInstances(fileSystem, mainArmTemplateFile);

                foreach (var(parameterName, parameterValue) in parameterInstances)
                {
                    writer.WritePropertyName(parameterName);
                    writer.WriteStartObject();

                    if (parameterValue is not null)
                    {
                        writer.WritePropertyName("value");
                        JsonElementFactory.CreateElement(parameterValue).WriteTo(writer);
                    }

                    writer.WriteEndObject();
                }

                writer.WriteEndObject();

                writer.WriteEndObject();
            }

            var path        = fileSystem.Path.GetFullPath(FileName);
            var content     = Encoding.UTF8.GetString(bufferWriter.WrittenSpan);
            var rootElement = JsonElementFactory.CreateElement(bufferWriter.WrittenMemory);

            return(new(path, content, rootElement));
        }
Exemplo n.º 6
0
            protected override int Invoke(InvocationContext context)
            {
                var valid = true;

                this.Logger.LogInformation("Validating module path...");
                valid &= Validate(context.Console, () => ValidateModulePath(this.FileSystem));

                this.Logger.LogInformation("Validating main Bicep file...");

                var bicepCliProxy = new BicepCliProxy(this.environmentProxy, this.processProxy, this.FileSystem, this.Logger, context.Console);
                var mainBicepFile = MainBicepFile.ReadFromFileSystem(this.FileSystem);

                // This also validates that the main Bicep file can be built without errors.
                var latestMainArmTemplateFile = MainArmTemplateFile.Generate(this.FileSystem, bicepCliProxy, mainBicepFile);
                var descriptionsValidator     = new DescriptionsValidator(this.Logger, latestMainArmTemplateFile);

                valid &= Validate(context.Console, () => mainBicepFile.ValidatedBy(descriptionsValidator));

                var testValidator       = new TestValidator(this.FileSystem, this.Logger, bicepCliProxy, latestMainArmTemplateFile);
                var jsonSchemaValidator = new JsonSchemaValidator(this.Logger);
                var diffValidator       = new DiffValidator(this.FileSystem, this.Logger, latestMainArmTemplateFile);

                this.Logger.LogInformation("Validating main Bicep test file...");
                valid &= Validate(context.Console, () => MainBicepTestFile.ReadFromFileSystem(this.FileSystem).ValidatedBy(testValidator));

                this.Logger.LogInformation("Validating main ARM template file...");
                valid &= Validate(context.Console, () => MainArmTemplateFile.ReadFromFileSystem(this.FileSystem).ValidatedBy(diffValidator));

                this.Logger.LogInformation("Validating metadata file...");
                valid &= Validate(context.Console, () => MetadataFile.ReadFromFileSystem(this.FileSystem).ValidatedBy(jsonSchemaValidator));

                this.Logger.LogInformation("Validating README file...");
                valid &= Validate(context.Console, () => ReadmeFile.ReadFromFileSystem(this.FileSystem).ValidatedBy(diffValidator));

                this.Logger.LogInformation("Validating version file...");
                valid &= Validate(context.Console, () => VersionFile.ReadFromFileSystem(this.FileSystem).ValidatedBy(jsonSchemaValidator, diffValidator));

                return(valid ? 0 : 1);
            }
Exemplo n.º 7
0
 public DiffValidator(IFileSystem fileSystem, ILogger logger, MainArmTemplateFile latestMainArmTemplateFile)
 {
     this.fileSystem = fileSystem;
     this.logger     = logger;
     this.latestMainArmTemplateFile = latestMainArmTemplateFile;
 }
Exemplo n.º 8
0
        public static ReadmeFile Generate(IFileSystem fileSystem, MetadataFile metadataFile, MainArmTemplateFile mainArmTemplateFile)
        {
            var builder = new StringBuilder();

            builder.AppendLine($"# {metadataFile.Name}");
            builder.AppendLine();

            builder.AppendLine(metadataFile.Description);
            builder.AppendLine();

            BuildParametersTable(builder, mainArmTemplateFile.Parameters);
            BuildOutputsTable(builder, mainArmTemplateFile.Outputs);

            return(new(fileSystem.Path.GetFullPath(FileName), builder.ToString()));
        }
Exemplo n.º 9
0
        public void Validate_ValidMainArmTemplateFile_Succeeds()
        {
            var fileToValidate = MainArmTemplateFile.ReadFromFileSystem(this.fileSystem);

            Invoking(() => this.sut.Validate(fileToValidate)).Should().NotThrow();
        }
        private static IEnumerable <MainArmTemplateParameterInstance> GenerateParameterInstances(IFileSystem fileSystem, MainArmTemplateFile mainArmTemplateFile)
        {
            var parameterInstances = new List <MainArmTemplateParameterInstance>();
            var parametersByName   = mainArmTemplateFile.Parameters.ToDictionary(x => x.Name, x => x);
            var existingParameterInstancesByName = new Dictionary <string, MainArmTemplateParameterInstance>();

            try
            {
                var existingParametersFile = ReadFromFileSystem(fileSystem);
                existingParameterInstancesByName = existingParametersFile.ParameterInstances.ToDictionary(x => x.Name, x => x);

                foreach (var parameterInstance in existingParametersFile.ParameterInstances)
                {
                    if (parametersByName.ContainsKey(parameterInstance.Name))
                    {
                        parameterInstances.Add(parameterInstance);
                    }
                }
            }
            catch (FileNotFoundException)
            {
                // Nothing to do.
            }

            foreach (var parameter in mainArmTemplateFile.Parameters)
            {
                if (parameter.Required && !existingParameterInstancesByName.ContainsKey(parameter.Name))
                {
                    parameterInstances.Add(CreateBlankParameterInstance(parameter));
                }
            }

            return(parameterInstances);
        }
 private DescriptionsValidator CreateDescriptionsValidator(MainArmTemplateFile latestMainArmTemplateFile) =>
Exemplo n.º 12
0
            protected override int Invoke(InvocationContext context)
            {
                // Read or create main Bicep file.
                this.Logger.LogInformation("Ensure {MainBicepFile} exists...", "main Bicep file");
                var mainBicepFile = MainBicepFile.EnsureInFileSystem(this.FileSystem);

                // Read or create metadata file.
                this.Logger.LogInformation("Ensure {MetadataFile} exists...", "metadata file");
                var metadataFile = MetadataFile.EnsureInFileSystem(this.FileSystem);

                // Generate main ARM template file.
                var bicepCliProxy       = new BicepCliProxy(this.environmentProxy, this.processProxy, this.FileSystem, this.Logger, context.Console);
                var mainArmTemplateFile = this.GenerateFileAndLogInformation("main ARM template file", () => MainArmTemplateFile
                                                                             .Generate(this.FileSystem, bicepCliProxy, mainBicepFile)
                                                                             .WriteToFileSystem(FileSystem));

                // Generate main ARM template parameters file.
                var mainArmTemplateParametersFile = this.GenerateFileAndLogInformation("main ARM template parameters file", () => MainArmTemplateParametersFile
                                                                                       .Generate(this.FileSystem, mainArmTemplateFile)
                                                                                       .WriteToFileSystem(this.FileSystem));

                // Generate README file.
                this.GenerateFileAndLogInformation("README file", () => ReadmeFile
                                                   .Generate(this.FileSystem, metadataFile, mainArmTemplateFile)
                                                   .WriteToFileSystem(this.FileSystem));

                // Generate version file.
                this.GenerateFileAndLogInformation("version file", () => VersionFile
                                                   .Generate(this.FileSystem)
                                                   .WriteToFileSystem(this.FileSystem));

                return(0);
            }
Exemplo n.º 13
0
        public static ReadmeFile Generate(IFileSystem fileSystem, MetadataFile metadataFile, MainArmTemplateFile mainArmTemplateFile)
        {
            var builder = new StringBuilder();

            builder.AppendLine($"# {metadataFile.ItemDisplayName}");
            builder.AppendLine();

            var path          = fileSystem.Path.GetFullPath(FileName);
            var directoryPath = fileSystem.Path.GetDirectoryName(path);
            var directoryInfo = fileSystem.DirectoryInfo.FromDirectoryName(directoryPath);

            BuildBadgesAndButtons(builder, directoryInfo);

            builder.AppendLine(metadataFile.Description);
            builder.AppendLine();

            BuildParametersTable(builder, mainArmTemplateFile.Parameters);
            BuildOutputsTable(builder, mainArmTemplateFile.Outputs);

            return(new(fileSystem.Path.GetFullPath(FileName), builder.ToString()));
        }
Exemplo n.º 14
0
        public static ReadmeFile Generate(IFileSystem fileSystem, MetadataFile metadataFile, MainArmTemplateFile mainArmTemplateFile)
        {
            var descriptionSection = DescriptionSectionTemplate;
            var examplesSection    = ExamplesSectionTemplate;

            try
            {
                var existingFile = ReadFromFileSystem(fileSystem);

                UseExistingSectionIfNotEmpty(existingFile, "## Description", ref descriptionSection);
                UseExistingSectionIfNotEmpty(existingFile, "## Examples", ref examplesSection);
            }
            catch (FileNotFoundException)
            {
                // Do thing.
            }

            var builder = new StringBuilder();

            builder.AppendLine($"# {metadataFile.Name}");
            builder.AppendLine();

            builder.AppendLine(metadataFile.Summary);
            builder.AppendLine();

            builder.AppendLine(descriptionSection);

            BuildParametersTable(builder, mainArmTemplateFile.Parameters);
            BuildOutputsTable(builder, mainArmTemplateFile.Outputs);

            builder.AppendLine(examplesSection);

            var contents           = builder.ToString();
            var normalizedContents = Markdown.Normalize(contents);

            return(new(fileSystem.Path.GetFullPath(FileName), normalizedContents));
        }
Exemplo n.º 15
0
 public void Validate(MainArmTemplateFile file) => this.Validate(file.Path, file.Content, latestMainArmTemplateFile.Content);
Exemplo n.º 16
0
 public DiffValidatorTests()
 {
     this.fileSystem = MockFileSystemFactory.CreateFileSystemWithValidFiles();
     this.latestMainArmTemplateFile = MainArmTemplateFile.ReadFromFileSystem(this.fileSystem);
     this.sut = new DiffValidator(this.fileSystem, MockLoggerFactory.CreateLogger(), this.latestMainArmTemplateFile);
 }
Exemplo n.º 17
0
 public DescriptionsValidator(ILogger logger, MainArmTemplateFile latestMainArmTemplateFile)
 {
     this.logger = logger;
     this.latestMainArmTemplateFile = latestMainArmTemplateFile;
 }
Exemplo n.º 18
0
        public static ReadmeFile Generate(IFileSystem fileSystem, MetadataFile metadataFile, MainArmTemplateFile mainArmTemplateFile)
        {
            var examplesSection = @"## Examples
### Example 1
```bicep
```
### Example 2
```bicep
```".ReplaceLineEndings();

            try
            {
                var existingFile            = ReadFromFileSystem(fileSystem);
                var existingExamplesSection = TryReadSection(existingFile.Contents, 2, "Examples");

                if (existingExamplesSection is not null && !existingExamplesSection.Equals("## Examples", StringComparison.Ordinal))
                {
                    // The existing examples section is not empty.
                    examplesSection = existingExamplesSection;
                }
            }
            catch (FileNotFoundException)
            {
                // Do thing.
            }

            var builder = new StringBuilder();

            builder.AppendLine($"# {metadataFile.Name}");
            builder.AppendLine();

            builder.AppendLine(metadataFile.Description);
            builder.AppendLine();

            BuildParametersTable(builder, mainArmTemplateFile.Parameters);
            BuildOutputsTable(builder, mainArmTemplateFile.Outputs);

            builder.AppendLine(examplesSection);

            var contents           = builder.ToString();
            var normalizedContents = Markdown.Normalize(contents);

            return(new(fileSystem.Path.GetFullPath(FileName), normalizedContents));
        }