Some checks failed
		
		
	
	Docs CI / lint-and-preview (push) Has been cancelled
				
			- Created SignerEndpointsTests to validate the SignDsse and VerifyReferrers endpoints. - Implemented StubBearerAuthenticationDefaults and StubBearerAuthenticationHandler for token-based authentication. - Developed ConcelierExporterClient for managing Trivy DB settings and export operations. - Added TrivyDbSettingsPageComponent for UI interactions with Trivy DB settings, including form handling and export triggering. - Implemented styles and HTML structure for Trivy DB settings page. - Created NotifySmokeCheck tool for validating Redis event streams and Notify deliveries.
		
			
				
	
	
		
			105 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System.Text.Json;
 | |
| using System.Text.Json.Serialization;
 | |
| 
 | |
| namespace StellaOps.Bench.ScannerAnalyzers;
 | |
| 
 | |
| internal sealed record BenchmarkConfig
 | |
| {
 | |
|     [JsonPropertyName("iterations")]
 | |
|     public int? Iterations { get; init; }
 | |
| 
 | |
|     [JsonPropertyName("thresholdMs")]
 | |
|     public double? ThresholdMs { get; init; }
 | |
| 
 | |
|     [JsonPropertyName("scenarios")]
 | |
|     public List<BenchmarkScenarioConfig> Scenarios { get; init; } = new();
 | |
| 
 | |
|     public static async Task<BenchmarkConfig> LoadAsync(string path)
 | |
|     {
 | |
|         if (string.IsNullOrWhiteSpace(path))
 | |
|         {
 | |
|             throw new ArgumentException("Config path is required.", nameof(path));
 | |
|         }
 | |
| 
 | |
|         await using var stream = File.OpenRead(path);
 | |
|         var config = await JsonSerializer.DeserializeAsync<BenchmarkConfig>(stream, SerializerOptions).ConfigureAwait(false);
 | |
|         if (config is null)
 | |
|         {
 | |
|             throw new InvalidOperationException($"Failed to parse benchmark config '{path}'.");
 | |
|         }
 | |
| 
 | |
|         if (config.Scenarios.Count == 0)
 | |
|         {
 | |
|             throw new InvalidOperationException("config.scenarios must declare at least one scenario.");
 | |
|         }
 | |
| 
 | |
|         foreach (var scenario in config.Scenarios)
 | |
|         {
 | |
|             scenario.Validate();
 | |
|         }
 | |
| 
 | |
|         return config;
 | |
|     }
 | |
| 
 | |
|     private static JsonSerializerOptions SerializerOptions => new()
 | |
|     {
 | |
|         PropertyNameCaseInsensitive = true,
 | |
|         ReadCommentHandling = JsonCommentHandling.Skip,
 | |
|         AllowTrailingCommas = true,
 | |
|     };
 | |
| }
 | |
| 
 | |
| internal sealed record BenchmarkScenarioConfig
 | |
| {
 | |
|     [JsonPropertyName("id")]
 | |
|     public string? Id { get; init; }
 | |
| 
 | |
|     [JsonPropertyName("label")]
 | |
|     public string? Label { get; init; }
 | |
| 
 | |
|     [JsonPropertyName("root")]
 | |
|     public string? Root { get; init; }
 | |
| 
 | |
|     [JsonPropertyName("analyzers")]
 | |
|     public List<string>? Analyzers { get; init; }
 | |
| 
 | |
|     [JsonPropertyName("matcher")]
 | |
|     public string? Matcher { get; init; }
 | |
| 
 | |
|     [JsonPropertyName("parser")]
 | |
|     public string? Parser { get; init; }
 | |
| 
 | |
|     [JsonPropertyName("thresholdMs")]
 | |
|     public double? ThresholdMs { get; init; }
 | |
| 
 | |
|     public bool HasAnalyzers => Analyzers is { Count: > 0 };
 | |
| 
 | |
|     public void Validate()
 | |
|     {
 | |
|         if (string.IsNullOrWhiteSpace(Id))
 | |
|         {
 | |
|             throw new InvalidOperationException("scenario.id is required.");
 | |
|         }
 | |
| 
 | |
|         if (string.IsNullOrWhiteSpace(Root))
 | |
|         {
 | |
|             throw new InvalidOperationException($"Scenario '{Id}' must specify a root path.");
 | |
|         }
 | |
| 
 | |
|         if (HasAnalyzers)
 | |
|         {
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         if (string.IsNullOrWhiteSpace(Parser))
 | |
|         {
 | |
|             throw new InvalidOperationException($"Scenario '{Id}' must specify parser or analyzers.");
 | |
|         }
 | |
| 
 | |
|         if (string.IsNullOrWhiteSpace(Matcher))
 | |
|         {
 | |
|             throw new InvalidOperationException($"Scenario '{Id}' must specify matcher when parser is used.");
 | |
|         }
 | |
|     }
 | |
| }
 |