Some checks failed
Docs CI / lint-and-preview (push) Has been cancelled
- Added ScannerSurfaceSecretConfigurator to configure ScannerWebServiceOptions using surface secrets. - Integrated ISurfaceSecretProvider to fetch and apply secrets for artifact store configuration. - Enhanced logging for secret retrieval and application processes. feat: Implement ScannerStorageSurfaceSecretConfigurator for worker options - Introduced ScannerStorageSurfaceSecretConfigurator to configure ScannerStorageOptions with surface secrets. - Utilized ISurfaceSecretProvider to retrieve and apply secrets for object store settings. - Improved logging for secret handling and configuration. feat: Create SurfaceManifestPublisher for publishing surface manifests - Developed SurfaceManifestPublisher to handle the creation and storage of surface manifests. - Implemented methods for serializing manifest documents and storing payloads in the object store. - Added dual write functionality for mirror storage of manifests. feat: Add SurfaceManifestStageExecutor for processing scan stages - Created SurfaceManifestStageExecutor to execute the manifest publishing stage in scan jobs. - Integrated with SurfaceManifestPublisher to publish manifests based on collected payloads. - Enhanced logging for job processing and manifest storage. feat: Define SurfaceManifest models for manifest structure - Established SurfaceManifestDocument, SurfaceManifestSource, SurfaceManifestArtifact, and SurfaceManifestStorage records. - Implemented serialization attributes for JSON handling of manifest models. feat: Implement CasAccessSecret and SurfaceSecretParser for secret handling - Created CasAccessSecret record to represent surface access secrets. - Developed SurfaceSecretParser to parse and validate surface secrets from JSON payloads. test: Add unit tests for CasAccessSecretParser - Implemented tests for parsing CasAccessSecret from JSON payloads and metadata fallbacks. - Verified expected values and behavior for secret parsing logic. test: Add unit tests for ScannerSurfaceSecretConfigurator - Created tests for ScannerSurfaceSecretConfigurator to ensure correct application of surface secrets to web service options. - Validated artifact store settings after configuration. test: Add unit tests for ScannerStorageSurfaceSecretConfigurator - Implemented tests for ScannerStorageSurfaceSecretConfigurator to verify correct application of surface secrets to storage options. - Ensured accurate configuration of object store settings.
119 lines
3.4 KiB
C#
119 lines
3.4 KiB
C#
using Microsoft.Extensions.Logging;
|
|
using Microsoft.Extensions.Options;
|
|
using StellaOps.Scanner.Storage;
|
|
|
|
namespace StellaOps.Scanner.WebService.Options;
|
|
|
|
internal sealed class ScannerStorageOptionsPostConfigurator : IPostConfigureOptions<ScannerStorageOptions>
|
|
{
|
|
private readonly IOptionsMonitor<ScannerWebServiceOptions> _webOptions;
|
|
private readonly ILogger<ScannerStorageOptionsPostConfigurator> _logger;
|
|
|
|
public ScannerStorageOptionsPostConfigurator(
|
|
IOptionsMonitor<ScannerWebServiceOptions> webOptions,
|
|
ILogger<ScannerStorageOptionsPostConfigurator> logger)
|
|
{
|
|
_webOptions = webOptions ?? throw new ArgumentNullException(nameof(webOptions));
|
|
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
|
|
}
|
|
|
|
public void PostConfigure(string? name, ScannerStorageOptions options)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(options);
|
|
|
|
var source = _webOptions.CurrentValue?.ArtifactStore;
|
|
if (source is null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var target = options.ObjectStore ??= new ObjectStoreOptions();
|
|
|
|
if (!string.IsNullOrWhiteSpace(source.Driver))
|
|
{
|
|
target.Driver = source.Driver;
|
|
}
|
|
|
|
if (!string.IsNullOrWhiteSpace(source.Region))
|
|
{
|
|
target.Region = source.Region!;
|
|
}
|
|
|
|
if (!string.IsNullOrWhiteSpace(source.Bucket))
|
|
{
|
|
target.BucketName = source.Bucket!;
|
|
}
|
|
|
|
if (!string.IsNullOrWhiteSpace(source.RootPrefix))
|
|
{
|
|
target.RootPrefix = source.RootPrefix;
|
|
}
|
|
|
|
if (!string.IsNullOrWhiteSpace(source.Endpoint))
|
|
{
|
|
if (target.IsRustFsDriver())
|
|
{
|
|
target.RustFs ??= new RustFsOptions();
|
|
target.RustFs.BaseUrl = source.Endpoint;
|
|
}
|
|
else
|
|
{
|
|
target.ServiceUrl = source.Endpoint;
|
|
}
|
|
}
|
|
|
|
if (target.IsRustFsDriver())
|
|
{
|
|
if (target.RustFs is null)
|
|
{
|
|
target.RustFs = new RustFsOptions();
|
|
}
|
|
|
|
target.RustFs.AllowInsecureTls = source.AllowInsecureTls;
|
|
|
|
if (!string.IsNullOrWhiteSpace(source.ApiKeyHeader))
|
|
{
|
|
target.RustFs.ApiKeyHeader = source.ApiKeyHeader!;
|
|
}
|
|
|
|
if (!string.IsNullOrWhiteSpace(source.ApiKey))
|
|
{
|
|
target.RustFs.ApiKey = source.ApiKey;
|
|
}
|
|
|
|
if (!string.IsNullOrWhiteSpace(source.Endpoint))
|
|
{
|
|
target.RustFs.BaseUrl = source.Endpoint!;
|
|
}
|
|
}
|
|
|
|
if (!string.IsNullOrWhiteSpace(source.AccessKey))
|
|
{
|
|
target.AccessKeyId = source.AccessKey;
|
|
}
|
|
|
|
if (!string.IsNullOrWhiteSpace(source.SecretKey))
|
|
{
|
|
target.SecretAccessKey = source.SecretKey;
|
|
}
|
|
|
|
if (source.Headers is { Count: > 0 })
|
|
{
|
|
foreach (var (key, value) in source.Headers)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(key) || string.IsNullOrWhiteSpace(value))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
target.Headers[key] = value;
|
|
}
|
|
}
|
|
|
|
_logger.LogDebug(
|
|
"Mirrored artifact store settings into scanner storage options (driver: {Driver}, bucket: {Bucket}).",
|
|
target.Driver,
|
|
target.BucketName);
|
|
}
|
|
}
|