feat: Implement Scheduler Worker Options and Planner Loop
- Added `SchedulerWorkerOptions` class to encapsulate configuration for the scheduler worker. - Introduced `PlannerBackgroundService` to manage the planner loop, fetching and processing planning runs. - Created `PlannerExecutionService` to handle the execution logic for planning runs, including impact targeting and run persistence. - Developed `PlannerExecutionResult` and `PlannerExecutionStatus` to standardize execution outcomes. - Implemented validation logic within `SchedulerWorkerOptions` to ensure proper configuration. - Added documentation for the planner loop and impact targeting features. - Established health check endpoints and authentication mechanisms for the Signals service. - Created unit tests for the Signals API to ensure proper functionality and response handling. - Configured options for authority integration and fallback authentication methods.
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using StellaOps.Plugin.Hosting;
|
||||
using StellaOps.Scheduler.WebService.Hosting;
|
||||
using StellaOps.Scheduler.WebService.Options;
|
||||
using Xunit;
|
||||
|
||||
namespace StellaOps.Scheduler.WebService.Tests;
|
||||
|
||||
public class SchedulerPluginHostFactoryTests
|
||||
{
|
||||
[Fact]
|
||||
public void Build_usesDefaults_whenOptionsEmpty()
|
||||
{
|
||||
var options = new SchedulerOptions.PluginOptions();
|
||||
var contentRoot = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N"));
|
||||
Directory.CreateDirectory(contentRoot);
|
||||
|
||||
try
|
||||
{
|
||||
var hostOptions = SchedulerPluginHostFactory.Build(options, contentRoot);
|
||||
|
||||
var expectedBase = Path.GetFullPath(Path.Combine(contentRoot, ".."));
|
||||
var expectedPlugins = Path.Combine(expectedBase, "plugins", "scheduler");
|
||||
|
||||
Assert.Equal(expectedBase, hostOptions.BaseDirectory);
|
||||
Assert.Equal(expectedPlugins, hostOptions.PluginsDirectory);
|
||||
Assert.Single(hostOptions.SearchPatterns, "StellaOps.Scheduler.Plugin.*.dll");
|
||||
Assert.True(hostOptions.EnsureDirectoryExists);
|
||||
Assert.False(hostOptions.RecursiveSearch);
|
||||
Assert.Empty(hostOptions.PluginOrder);
|
||||
}
|
||||
finally
|
||||
{
|
||||
Directory.Delete(contentRoot, recursive: true);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Build_respectsConfiguredValues()
|
||||
{
|
||||
var options = new SchedulerOptions.PluginOptions
|
||||
{
|
||||
BaseDirectory = Path.Combine(Path.GetTempPath(), "scheduler-options", Guid.NewGuid().ToString("N")),
|
||||
Directory = Path.Combine("custom", "plugins"),
|
||||
RecursiveSearch = true,
|
||||
EnsureDirectoryExists = false
|
||||
};
|
||||
|
||||
options.SearchPatterns.Add("Custom.Plugin.*.dll");
|
||||
options.OrderedPlugins.Add("StellaOps.Scheduler.Plugin.Alpha");
|
||||
|
||||
Directory.CreateDirectory(options.BaseDirectory!);
|
||||
|
||||
try
|
||||
{
|
||||
var hostOptions = SchedulerPluginHostFactory.Build(options, contentRootPath: Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N")));
|
||||
|
||||
var expectedPlugins = Path.GetFullPath(Path.Combine(options.BaseDirectory!, options.Directory!));
|
||||
|
||||
Assert.Equal(options.BaseDirectory, hostOptions.BaseDirectory);
|
||||
Assert.Equal(expectedPlugins, hostOptions.PluginsDirectory);
|
||||
Assert.Single(hostOptions.SearchPatterns, "Custom.Plugin.*.dll");
|
||||
Assert.Single(hostOptions.PluginOrder, "StellaOps.Scheduler.Plugin.Alpha");
|
||||
Assert.True(hostOptions.RecursiveSearch);
|
||||
Assert.False(hostOptions.EnsureDirectoryExists);
|
||||
}
|
||||
finally
|
||||
{
|
||||
Directory.Delete(options.BaseDirectory!, recursive: true);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user