Add reconciliation state foundation

This commit is contained in:
2026-06-08 18:24:12 +00:00
parent c04432e40b
commit b7db3993fb
13 changed files with 557 additions and 66 deletions

View File

@@ -6,6 +6,7 @@ import (
"fmt"
"time"
"gitea.maximumdirect.net/eric/distributor/internal/config"
"gitea.maximumdirect.net/eric/distributor/internal/state"
"gitea.maximumdirect.net/eric/distributor/internal/storage"
)
@@ -69,14 +70,25 @@ func Execute(ctx context.Context, req Request, plan Plan) error {
writtenOutputs = append(writtenOutputs, output)
}
now := time.Now().UTC()
createdAt := now
existingOutputs := []state.OutputFile(nil)
if plan.ExistingState != nil {
createdAt = plan.ExistingState.CreatedAt
existingOutputs = plan.ExistingState.Outputs
}
destinationState := state.DistributorState{
SchemaVersion: state.SchemaVersion,
DistributorVersion: req.DistributorVersion,
PipelineID: req.PipelineID,
DestinationID: req.DestinationID,
PublishedAt: time.Now().UTC(),
PublishedAt: now,
CreatedAt: createdAt,
UpdatedAt: now,
State: state.StatePolicy{Mode: state.StateModeSingleOwner},
Reconciliation: state.ReconciliationPolicy{Mode: config.ReconciliationModeReplace},
Source: state.SourceState{Manifest: req.SourceBundle.Manifest},
Outputs: StateOutputFiles(plan.Outputs),
Outputs: state.ProjectOutputs(StateOutputProjections(plan.Outputs), existingOutputs, now),
}
if plan.PrimaryURL != "" {
destinationState.Links = &state.LinkState{PrimaryURL: plan.PrimaryURL}

View File

@@ -109,6 +109,18 @@ func (o Output) StateOutputFile() state.OutputFile {
}
}
func (o Output) StateOutputProjection() state.OutputProjection {
return state.OutputProjection{
Path: o.DestinationPath,
Kind: o.Kind,
SourcePath: o.SourcePath,
Transform: o.Transform,
URL: o.URL,
SHA256: o.SHA256,
Size: o.Size,
}
}
func (o Output) ManagedPath() string {
return o.DestinationPath
}
@@ -121,6 +133,14 @@ func StateOutputFiles(outputs []Output) []state.OutputFile {
return files
}
func StateOutputProjections(outputs []Output) []state.OutputProjection {
projections := make([]state.OutputProjection, 0, len(outputs))
for _, output := range outputs {
projections = append(projections, output.StateOutputProjection())
}
return projections
}
func ManagedOutputPaths(outputs []Output) []string {
paths := make([]string, 0, len(outputs))
for _, output := range outputs {