Implement InMemory Transport Layer for StellaOps Router
- Added InMemoryTransportOptions class for configuration settings including timeouts and latency. - Developed InMemoryTransportServer class to handle connections, frame processing, and event management. - Created ServiceCollectionExtensions for easy registration of InMemory transport services. - Established project structure and dependencies for InMemory transport library. - Implemented comprehensive unit tests for endpoint discovery, connection management, request/response flow, and streaming capabilities. - Ensured proper handling of cancellation, heartbeat, and hello frames within the transport layer.
This commit is contained in:
@@ -73,6 +73,7 @@ internal static class CommandFactory
|
||||
root.Add(BuildReachabilityCommand(services, verboseOption, cancellationToken));
|
||||
root.Add(BuildApiCommand(services, verboseOption, cancellationToken));
|
||||
root.Add(BuildSdkCommand(services, verboseOption, cancellationToken));
|
||||
root.Add(BuildMirrorCommand(services, verboseOption, cancellationToken));
|
||||
|
||||
var pluginLogger = loggerFactory.CreateLogger<CliCommandModuleLoader>();
|
||||
var pluginLoader = new CliCommandModuleLoader(services, options, pluginLogger);
|
||||
@@ -9728,4 +9729,110 @@ internal static class CommandFactory
|
||||
|
||||
return sdk;
|
||||
}
|
||||
|
||||
private static Command BuildMirrorCommand(IServiceProvider services, Option<bool> verboseOption, CancellationToken cancellationToken)
|
||||
{
|
||||
var mirror = new Command("mirror", "Manage air-gap mirror bundles for offline distribution.");
|
||||
|
||||
// mirror create
|
||||
var create = new Command("create", "Create an air-gap mirror bundle.");
|
||||
|
||||
var domainOption = new Option<string>("--domain", new[] { "-d" })
|
||||
{
|
||||
Description = "Domain identifier (e.g., vex-advisories, vulnerability-feeds, policy-packs).",
|
||||
Required = true
|
||||
};
|
||||
|
||||
var outputOption = new Option<string>("--output", new[] { "-o" })
|
||||
{
|
||||
Description = "Output directory for the bundle files.",
|
||||
Required = true
|
||||
};
|
||||
|
||||
var formatOption = new Option<string?>("--format", new[] { "-f" })
|
||||
{
|
||||
Description = "Export format filter (openvex, csaf, cyclonedx, spdx, ndjson, json)."
|
||||
};
|
||||
|
||||
var tenantOption = new Option<string?>("--tenant")
|
||||
{
|
||||
Description = "Tenant scope for the exports."
|
||||
};
|
||||
|
||||
var displayNameOption = new Option<string?>("--display-name")
|
||||
{
|
||||
Description = "Human-readable display name for the bundle."
|
||||
};
|
||||
|
||||
var targetRepoOption = new Option<string?>("--target-repository")
|
||||
{
|
||||
Description = "Target OCI repository URI for this bundle."
|
||||
};
|
||||
|
||||
var providersOption = new Option<string[]?>("--provider", new[] { "-p" })
|
||||
{
|
||||
Description = "Provider filter for VEX exports (can be specified multiple times).",
|
||||
AllowMultipleArgumentsPerToken = true
|
||||
};
|
||||
|
||||
var signOption = new Option<bool>("--sign")
|
||||
{
|
||||
Description = "Include DSSE signatures in the bundle."
|
||||
};
|
||||
|
||||
var attestOption = new Option<bool>("--attest")
|
||||
{
|
||||
Description = "Include attestation metadata in the bundle."
|
||||
};
|
||||
|
||||
var jsonOption = new Option<bool>("--json")
|
||||
{
|
||||
Description = "Output result in JSON format."
|
||||
};
|
||||
|
||||
create.Add(domainOption);
|
||||
create.Add(outputOption);
|
||||
create.Add(formatOption);
|
||||
create.Add(tenantOption);
|
||||
create.Add(displayNameOption);
|
||||
create.Add(targetRepoOption);
|
||||
create.Add(providersOption);
|
||||
create.Add(signOption);
|
||||
create.Add(attestOption);
|
||||
create.Add(jsonOption);
|
||||
|
||||
create.SetAction((parseResult, _) =>
|
||||
{
|
||||
var domain = parseResult.GetValue(domainOption) ?? string.Empty;
|
||||
var output = parseResult.GetValue(outputOption) ?? string.Empty;
|
||||
var format = parseResult.GetValue(formatOption);
|
||||
var tenant = parseResult.GetValue(tenantOption);
|
||||
var displayName = parseResult.GetValue(displayNameOption);
|
||||
var targetRepo = parseResult.GetValue(targetRepoOption);
|
||||
var providers = parseResult.GetValue(providersOption);
|
||||
var sign = parseResult.GetValue(signOption);
|
||||
var attest = parseResult.GetValue(attestOption);
|
||||
var json = parseResult.GetValue(jsonOption);
|
||||
var verbose = parseResult.GetValue(verboseOption);
|
||||
|
||||
return CommandHandlers.HandleMirrorCreateAsync(
|
||||
services,
|
||||
domain,
|
||||
output,
|
||||
format,
|
||||
tenant,
|
||||
displayName,
|
||||
targetRepo,
|
||||
providers?.ToList(),
|
||||
sign,
|
||||
attest,
|
||||
json,
|
||||
verbose,
|
||||
cancellationToken);
|
||||
});
|
||||
|
||||
mirror.Add(create);
|
||||
|
||||
return mirror;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user