diff --git a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/SecretDeserializer.cs b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/SecretDeserializer.cs index af57bc0a4..260d9328d 100644 --- a/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/SecretDeserializer.cs +++ b/src/Promitor.Core.Scraping/Configuration/Serialization/v1/Core/SecretDeserializer.cs @@ -6,27 +6,24 @@ namespace Promitor.Core.Scraping.Configuration.Serialization.v1.Core { public class SecretDeserializer : Deserializer { - private const string RawValueTag = "rawValue"; - private const string EnvironmentVariableTag = "environmentVariable"; - public SecretDeserializer(ILogger logger) : base(logger) { + MapOptional(secret => secret.RawValue); + MapOptional(secret => secret.EnvironmentVariable); } public override SecretV1 Deserialize(YamlMappingNode node, IErrorReporter errorReporter) { - var rawValue = node.GetString(RawValueTag); - var environmentVariable = node.GetString(EnvironmentVariableTag); + var secret = base.Deserialize(node, errorReporter); - var secret = new SecretV1 + if (string.IsNullOrEmpty(secret.EnvironmentVariable) && string.IsNullOrEmpty(secret.RawValue)) { - RawValue = rawValue, - EnvironmentVariable = environmentVariable - }; + errorReporter.ReportError(node, "Either 'environmentVariable' or 'rawValue' must be supplied for a secret."); + } if (!string.IsNullOrEmpty(secret.RawValue) && !string.IsNullOrEmpty(secret.EnvironmentVariable)) { - Logger.LogWarning("Secret with environment variable '{EnvironmentVariable}' also has a rawValue provided.", secret.EnvironmentVariable); + errorReporter.ReportWarning(node, $"Secret with environment variable '{secret.EnvironmentVariable}' also has a rawValue provided."); } return secret; diff --git a/src/Promitor.Scraper.Tests.Unit/Serialization/v1/Core/SecretDeserializerTests.cs b/src/Promitor.Scraper.Tests.Unit/Serialization/v1/Core/SecretDeserializerTests.cs index 01cb36495..af8696238 100644 --- a/src/Promitor.Scraper.Tests.Unit/Serialization/v1/Core/SecretDeserializerTests.cs +++ b/src/Promitor.Scraper.Tests.Unit/Serialization/v1/Core/SecretDeserializerTests.cs @@ -1,5 +1,7 @@ using System.ComponentModel; using Microsoft.Extensions.Logging.Abstractions; +using Moq; +using Promitor.Core.Scraping.Configuration.Serialization; using Promitor.Core.Scraping.Configuration.Serialization.v1.Core; using Xunit; @@ -52,5 +54,35 @@ public void Deserialize_EnvironmentVariableNotSupplied_Null() "rawValue: abc123", s => s.EnvironmentVariable); } + + [Fact] + public void Deserialize_EnvironmentVariableAndRawValueNotSupplied_ReportsError() + { + // Arrange + var node = YamlUtils.CreateYamlNode("name: 123"); + var errorReporter = new Mock(); + + // Act + _deserializer.Deserialize(node, errorReporter.Object); + + // Assert + errorReporter.Verify(r => r.ReportError(node, "Either 'environmentVariable' or 'rawValue' must be supplied for a secret.")); + } + + [Fact] + public void Deserialize_EnvironmentVariableAndRawValueBothSupplied_ReportsWarning() + { + // Arrange + var node = YamlUtils.CreateYamlNode( +@"rawValue: 123 +environmentVariable: PROMITOR_SECRET"); + var errorReporter = new Mock(); + + // Act + _deserializer.Deserialize(node, errorReporter.Object); + + // Assert + errorReporter.Verify(r => r.ReportWarning(node, "Secret with environment variable 'PROMITOR_SECRET' also has a rawValue provided.")); + } } }