Make Run runtime state authoritative

This commit is contained in:
npc0-hue
2026-08-06 10:07:01 +08:00
parent d8d07914da
commit 0875a1b17e
10 changed files with 324 additions and 12 deletions
@@ -50,7 +50,7 @@ func (svc *CoreService) projectLifecycleJobResult(job domain.Job, stamp time.Tim
}
return svc.recordAuditEvent("run:"+job.RunEndpointID, "config.write.result", "server-instance", instance.ID, domain.AuditResultSuccess, job.ExecutionResult.AuditSummary)
}
nextState, ok := lifecycleProjectedState(job.Capability, job.State)
nextState, ok := lifecycleProjectedState(job.Capability, job.State, job.ExecutionResult)
if !ok || job.ServerInstanceID == "" {
return nil
}
@@ -100,10 +100,16 @@ func (svc *CoreService) projectServerDeploymentProgress(job domain.Job, stamp ti
return svc.store.ServerInstances().Update(instance)
}
func lifecycleProjectedState(capability string, jobState domain.JobState) (domain.ServerInstanceState, bool) {
if capability != domain.LifecycleCapabilityInstall && capability != domain.LifecycleCapabilityStart && capability != domain.LifecycleCapabilityStop {
func lifecycleProjectedState(capability string, jobState domain.JobState, result domain.JobExecutionResult) (domain.ServerInstanceState, bool) {
if capability != domain.LifecycleCapabilityInstall && capability != domain.LifecycleCapabilityStart && capability != domain.LifecycleCapabilityStop && capability != domain.LifecycleCapabilityStatus {
return "", false
}
if capability == domain.LifecycleCapabilityStatus {
if jobState != domain.JobStateSucceeded {
return "", false
}
return lifecycleStateFromProcessResult(result)
}
if jobState == domain.JobStateFailed || jobState == domain.JobStateCancelled {
return domain.ServerInstanceStateFailed, true
}
@@ -114,10 +120,31 @@ func lifecycleProjectedState(capability string, jobState domain.JobState) (domai
case domain.LifecycleCapabilityInstall:
return domain.ServerInstanceStateReady, true
case domain.LifecycleCapabilityStart:
return domain.ServerInstanceStateRunning, true
return lifecycleStateFromProcessResult(result)
case domain.LifecycleCapabilityStop:
if state, ok := lifecycleStateFromProcessResult(result); ok {
return state, true
}
return domain.ServerInstanceStateStopped, true
default:
return "", false
}
}
func lifecycleStateFromProcessResult(result domain.JobExecutionResult) (domain.ServerInstanceState, bool) {
switch strings.TrimSpace(result.ProcessState) {
case "running":
return domain.ServerInstanceStateRunning, true
case "stopped", "not-started":
return domain.ServerInstanceStateStopped, true
case "exited":
switch strings.TrimSpace(result.ExitClassification) {
case "requested-stop", "forced-stop", "already-stopped":
return domain.ServerInstanceStateStopped, true
default:
return domain.ServerInstanceStateFailed, true
}
default:
return "", false
}
}