-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathGovernanceExecutionScenario.cs
More file actions
94 lines (83 loc) · 4.21 KB
/
Copy pathGovernanceExecutionScenario.cs
File metadata and controls
94 lines (83 loc) · 4.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
using Microsoft.Extensions.DependencyInjection;
using ModularityKit.Mutator.Abstractions;
using ModularityKit.Mutator.Abstractions.Changes;
using ModularityKit.Mutator.Abstractions.Context;
using ModularityKit.Mutator.Abstractions.Engine;
using ModularityKit.Mutator.Abstractions.Intent;
using ModularityKit.Mutator.Abstractions.Results;
using ModularityKit.Mutator.Governance.Abstractions.Execution.Contracts;
using ModularityKit.Mutator.Governance.Abstractions.Requests.Factory;
using ModularityKit.Mutator.Governance.Abstractions.Requests.Model;
using ModularityKit.Mutator.Governance.Abstractions.Resolution.Strategies;
using ModularityKit.Mutator.Governance.Runtime.Execution.Orchestration;
using ModularityKit.Mutator.Governance.Runtime.Resolution.Execution;
using ModularityKit.Mutator.Governance.Runtime.Storage;
using ModularityKit.Mutator.Runtime;
namespace GovernedExecution.Scenarios;
internal static class GovernanceExecutionScenario
{
public static async Task Run()
{
var services = new ServiceCollection();
services.AddMutators(MutationEngineOptions.Strict);
await using var provider = services.BuildServiceProvider();
var engine = provider.GetRequiredService<IMutationEngine>();
var store = new InMemoryMutationRequestStore();
var resolutionManager = new MutationRequestVersionResolutionManager(store, new MutationRequestVersionResolver());
var executionManager = new GovernanceExecutionManager(store, resolutionManager, engine);
var request = await store.Create(MutationRequestFactory.Approved<FeatureFlagState, EnableFeatureMutation>(
stateId: "tenant-42:feature-flags",
intent: new MutationIntent
{
OperationName = "EnableFeature",
Category = "Configuration",
Description = "Enable a rollout after governance approval"
},
context: MutationContext.User("requester-1", "Requester One", "Enable guarded rollout"),
expectedStateVersion: "v10"));
var currentState = new FeatureFlagState(
request.Scope.StateId,
IsEnabled: false,
Version: "v10");
var execution = await executionManager.ExecuteApproved(
request.RequestId,
new EnableFeatureMutation(MutationContext.Service("release-orchestrator", "Execute approved rollout"), "v11"),
currentState,
governanceContext: MutationContext.Service("governance-runtime", "Execute approved governance request"),
strategy: VersionedRequestResolutionStrategy.RejectStale);
Console.WriteLine("=== Governed Execution ===");
Console.WriteLine($"Executed: {execution.WasExecuted}");
Console.WriteLine($"Resolution: {execution.Resolution.Outcome}");
Console.WriteLine($"Request status: {execution.Request.Lifecycle.Status}");
Console.WriteLine($"Resulting version: {execution.ResultingStateVersion ?? "-"}");
Console.WriteLine($"Last decision: {execution.Request.Decisions[^1].Type}");
Console.WriteLine($"Reason: {execution.Request.Decisions[^1].Reason}");
}
private sealed record FeatureFlagState(string StateId, bool IsEnabled, string Version) : IVersionedState;
private sealed class EnableFeatureMutation(MutationContext context, string nextVersion)
: MutationBase<FeatureFlagState>(
CreateIntent(
operationName: "EnableFeature",
category: "Configuration",
description: "Enable a feature after governance approval"),
context)
{
public override MutationResult<FeatureFlagState> Apply(FeatureFlagState state)
{
var newState = state with
{
IsEnabled = true,
Version = nextVersion
};
return Success(
newState,
StateChange.Modified("IsEnabled", state.IsEnabled, newState.IsEnabled));
}
public override ValidationResult Validate(FeatureFlagState state)
{
return state.IsEnabled
? ValidationResult.WithError("IsEnabled", "Feature is already enabled.")
: ValidationResult.Success();
}
}
}