up
This commit is contained in:
@@ -7,9 +7,13 @@ namespace StellaOps.Concelier.WebService.Options;
|
||||
|
||||
public sealed class ConcelierOptions
|
||||
{
|
||||
[Obsolete("Mongo storage has been removed; use PostgresStorage.")]
|
||||
public StorageOptions Storage { get; set; } = new();
|
||||
|
||||
public PostgresStorageOptions? PostgresStorage { get; set; }
|
||||
public PostgresStorageOptions? PostgresStorage { get; set; } = new PostgresStorageOptions
|
||||
{
|
||||
Enabled = true
|
||||
};
|
||||
|
||||
public PluginOptions Plugins { get; set; } = new();
|
||||
|
||||
@@ -33,6 +37,7 @@ public sealed class ConcelierOptions
|
||||
/// </summary>
|
||||
public AirGapOptions AirGap { get; set; } = new();
|
||||
|
||||
[Obsolete("Mongo storage has been removed; use PostgresStorage.")]
|
||||
public sealed class StorageOptions
|
||||
{
|
||||
public string Driver { get; set; } = "mongo";
|
||||
|
||||
@@ -2,30 +2,17 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using StellaOps.Auth.Abstractions;
|
||||
|
||||
namespace StellaOps.Concelier.WebService.Options;
|
||||
|
||||
public static class ConcelierOptionsValidator
|
||||
{
|
||||
public static void Validate(ConcelierOptions options)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(options);
|
||||
|
||||
if (!string.Equals(options.Storage.Driver, "mongo", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
throw new InvalidOperationException("Only Mongo storage driver is supported (storage.driver == 'mongo').");
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(options.Storage.Dsn))
|
||||
{
|
||||
throw new InvalidOperationException("Storage DSN must be configured.");
|
||||
}
|
||||
|
||||
if (options.Storage.CommandTimeoutSeconds <= 0)
|
||||
{
|
||||
throw new InvalidOperationException("Command timeout must be greater than zero seconds.");
|
||||
}
|
||||
|
||||
|
||||
namespace StellaOps.Concelier.WebService.Options;
|
||||
|
||||
public static class ConcelierOptionsValidator
|
||||
{
|
||||
public static void Validate(ConcelierOptions options)
|
||||
{
|
||||
ArgumentNullException.ThrowIfNull(options);
|
||||
|
||||
ValidatePostgres(options);
|
||||
|
||||
options.Telemetry ??= new ConcelierOptions.TelemetryOptions();
|
||||
|
||||
options.Authority ??= new ConcelierOptions.AuthorityOptions();
|
||||
@@ -107,25 +94,25 @@ public static class ConcelierOptionsValidator
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!Enum.TryParse(options.Telemetry.MinimumLogLevel, ignoreCase: true, out LogLevel _))
|
||||
{
|
||||
throw new InvalidOperationException($"Telemetry minimum log level '{options.Telemetry.MinimumLogLevel}' is invalid.");
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(options.Telemetry.OtlpEndpoint) && !Uri.TryCreate(options.Telemetry.OtlpEndpoint, UriKind.Absolute, out _))
|
||||
{
|
||||
throw new InvalidOperationException("Telemetry OTLP endpoint must be an absolute URI.");
|
||||
}
|
||||
|
||||
foreach (var attribute in options.Telemetry.ResourceAttributes)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(attribute.Key))
|
||||
{
|
||||
throw new InvalidOperationException("Telemetry resource attribute keys must be non-empty.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!Enum.TryParse(options.Telemetry.MinimumLogLevel, ignoreCase: true, out LogLevel _))
|
||||
{
|
||||
throw new InvalidOperationException($"Telemetry minimum log level '{options.Telemetry.MinimumLogLevel}' is invalid.");
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(options.Telemetry.OtlpEndpoint) && !Uri.TryCreate(options.Telemetry.OtlpEndpoint, UriKind.Absolute, out _))
|
||||
{
|
||||
throw new InvalidOperationException("Telemetry OTLP endpoint must be an absolute URI.");
|
||||
}
|
||||
|
||||
foreach (var attribute in options.Telemetry.ResourceAttributes)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(attribute.Key))
|
||||
{
|
||||
throw new InvalidOperationException("Telemetry resource attribute keys must be non-empty.");
|
||||
}
|
||||
}
|
||||
|
||||
foreach (var header in options.Telemetry.OtlpHeaders)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(header.Key))
|
||||
@@ -333,4 +320,50 @@ public static class ConcelierOptionsValidator
|
||||
throw new InvalidOperationException("Evidence bundle pipelineVersion must be provided.");
|
||||
}
|
||||
}
|
||||
|
||||
private static void ValidatePostgres(ConcelierOptions options)
|
||||
{
|
||||
var postgres = options.PostgresStorage ?? new ConcelierOptions.PostgresStorageOptions();
|
||||
options.PostgresStorage = postgres;
|
||||
|
||||
if (!postgres.Enabled)
|
||||
{
|
||||
throw new InvalidOperationException("PostgreSQL storage must be enabled (postgresStorage.enabled).");
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(postgres.ConnectionString))
|
||||
{
|
||||
throw new InvalidOperationException("PostgreSQL connectionString must be configured (postgresStorage.connectionString).");
|
||||
}
|
||||
|
||||
if (postgres.CommandTimeoutSeconds <= 0)
|
||||
{
|
||||
throw new InvalidOperationException("PostgreSQL commandTimeoutSeconds must be greater than zero.");
|
||||
}
|
||||
|
||||
if (postgres.MaxPoolSize < 1)
|
||||
{
|
||||
throw new InvalidOperationException("PostgreSQL maxPoolSize must be greater than zero.");
|
||||
}
|
||||
|
||||
if (postgres.MinPoolSize < 0 || postgres.MinPoolSize > postgres.MaxPoolSize)
|
||||
{
|
||||
throw new InvalidOperationException("PostgreSQL minPoolSize must be between 0 and maxPoolSize.");
|
||||
}
|
||||
|
||||
if (postgres.ConnectionIdleLifetimeSeconds < 0)
|
||||
{
|
||||
throw new InvalidOperationException("PostgreSQL connectionIdleLifetimeSeconds must be zero or greater.");
|
||||
}
|
||||
|
||||
if (postgres.AutoMigrate && string.IsNullOrWhiteSpace(postgres.MigrationsPath))
|
||||
{
|
||||
throw new InvalidOperationException("PostgreSQL migrationsPath must be configured when autoMigrate is enabled.");
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(postgres.SchemaName))
|
||||
{
|
||||
postgres.SchemaName = "vuln";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user