Implement MongoDB-based storage for Pack Run approval, artifact, log, and state management
Some checks failed
Docs CI / lint-and-preview (push) Has been cancelled
Some checks failed
Docs CI / lint-and-preview (push) Has been cancelled
- Added MongoPackRunApprovalStore for managing approval states with MongoDB. - Introduced MongoPackRunArtifactUploader for uploading and storing artifacts. - Created MongoPackRunLogStore to handle logging of pack run events. - Developed MongoPackRunStateStore for persisting and retrieving pack run states. - Implemented unit tests for MongoDB stores to ensure correct functionality. - Added MongoTaskRunnerTestContext for setting up MongoDB test environment. - Enhanced PackRunStateFactory to correctly initialize state with gate reasons.
This commit is contained in:
@@ -17,6 +17,8 @@ public sealed class ConcelierOptions
|
||||
public MirrorOptions Mirror { get; set; } = new();
|
||||
|
||||
public FeaturesOptions Features { get; set; } = new();
|
||||
|
||||
public AdvisoryChunkOptions AdvisoryChunks { get; set; } = new();
|
||||
|
||||
public sealed class StorageOptions
|
||||
{
|
||||
@@ -81,6 +83,8 @@ public sealed class ConcelierOptions
|
||||
|
||||
public IList<string> RequiredScopes { get; set; } = new List<string>();
|
||||
|
||||
public IList<string> RequiredTenants { get; set; } = new List<string>();
|
||||
|
||||
public IList<string> BypassNetworks { get; set; } = new List<string>();
|
||||
|
||||
public string? ClientId { get; set; }
|
||||
@@ -146,4 +150,19 @@ public sealed class ConcelierOptions
|
||||
|
||||
public IList<string> MergeJobAllowlist { get; } = new List<string>();
|
||||
}
|
||||
|
||||
public sealed class AdvisoryChunkOptions
|
||||
{
|
||||
public int DefaultChunkLimit { get; set; } = 200;
|
||||
|
||||
public int MaxChunkLimit { get; set; } = 400;
|
||||
|
||||
public int DefaultObservationLimit { get; set; } = 24;
|
||||
|
||||
public int MaxObservationLimit { get; set; } = 48;
|
||||
|
||||
public int DefaultMinimumLength { get; set; } = 64;
|
||||
|
||||
public int MaxMinimumLength { get; set; } = 512;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,11 +30,14 @@ public static class ConcelierOptionsValidator
|
||||
|
||||
options.Authority ??= new ConcelierOptions.AuthorityOptions();
|
||||
options.Authority.Resilience ??= new ConcelierOptions.AuthorityOptions.ResilienceOptions();
|
||||
options.Authority.RequiredTenants ??= new List<string>();
|
||||
NormalizeList(options.Authority.Audiences, toLower: false);
|
||||
NormalizeList(options.Authority.RequiredScopes, toLower: true);
|
||||
NormalizeList(options.Authority.BypassNetworks, toLower: false);
|
||||
NormalizeList(options.Authority.ClientScopes, toLower: true);
|
||||
NormalizeList(options.Authority.RequiredTenants, toLower: true);
|
||||
ValidateResilience(options.Authority.Resilience);
|
||||
ValidateTenantAllowlist(options.Authority.RequiredTenants);
|
||||
|
||||
if (options.Authority.RequiredScopes.Count == 0)
|
||||
{
|
||||
@@ -133,6 +136,9 @@ public static class ConcelierOptionsValidator
|
||||
|
||||
options.Mirror ??= new ConcelierOptions.MirrorOptions();
|
||||
ValidateMirror(options.Mirror);
|
||||
|
||||
options.AdvisoryChunks ??= new ConcelierOptions.AdvisoryChunkOptions();
|
||||
ValidateAdvisoryChunks(options.AdvisoryChunks);
|
||||
}
|
||||
|
||||
private static void NormalizeList(IList<string> values, bool toLower)
|
||||
@@ -190,6 +196,32 @@ public static class ConcelierOptionsValidator
|
||||
}
|
||||
}
|
||||
|
||||
private static void ValidateTenantAllowlist(IList<string> tenants)
|
||||
{
|
||||
if (tenants is null || tenants.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var tenant in tenants)
|
||||
{
|
||||
if (string.IsNullOrEmpty(tenant) || tenant.Length > 64)
|
||||
{
|
||||
throw new InvalidOperationException("Authority requiredTenants entries must be between 1 and 64 characters.");
|
||||
}
|
||||
|
||||
foreach (var ch in tenant)
|
||||
{
|
||||
var isAlpha = ch is >= 'a' and <= 'z';
|
||||
var isDigit = ch is >= '0' and <= '9';
|
||||
if (!isAlpha && !isDigit && ch != '-')
|
||||
{
|
||||
throw new InvalidOperationException($"Authority requiredTenants entry '{tenant}' contains invalid character '{ch}'. Use lowercase letters, digits, or '-'.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void ValidateMirror(ConcelierOptions.MirrorOptions mirror)
|
||||
{
|
||||
if (mirror.MaxIndexRequestsPerHour < 0)
|
||||
@@ -242,4 +274,37 @@ public static class ConcelierOptionsValidator
|
||||
throw new InvalidOperationException("Mirror distribution requires at least one domain when enabled.");
|
||||
}
|
||||
}
|
||||
|
||||
private static void ValidateAdvisoryChunks(ConcelierOptions.AdvisoryChunkOptions chunks)
|
||||
{
|
||||
if (chunks.DefaultChunkLimit <= 0)
|
||||
{
|
||||
throw new InvalidOperationException("Advisory chunk defaultChunkLimit must be greater than zero.");
|
||||
}
|
||||
|
||||
if (chunks.MaxChunkLimit < chunks.DefaultChunkLimit)
|
||||
{
|
||||
throw new InvalidOperationException("Advisory chunk maxChunkLimit must be greater than or equal to defaultChunkLimit.");
|
||||
}
|
||||
|
||||
if (chunks.DefaultObservationLimit <= 0)
|
||||
{
|
||||
throw new InvalidOperationException("Advisory chunk defaultObservationLimit must be greater than zero.");
|
||||
}
|
||||
|
||||
if (chunks.MaxObservationLimit < chunks.DefaultObservationLimit)
|
||||
{
|
||||
throw new InvalidOperationException("Advisory chunk maxObservationLimit must be greater than or equal to defaultObservationLimit.");
|
||||
}
|
||||
|
||||
if (chunks.DefaultMinimumLength <= 0)
|
||||
{
|
||||
throw new InvalidOperationException("Advisory chunk defaultMinimumLength must be greater than zero.");
|
||||
}
|
||||
|
||||
if (chunks.MaxMinimumLength < chunks.DefaultMinimumLength)
|
||||
{
|
||||
throw new InvalidOperationException("Advisory chunk maxMinimumLength must be greater than or equal to defaultMinimumLength.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user