Files
nezha_domains/integration/agentcompat/internal/scenario/held_readiness.go
T
2026-07-20 04:51:20 +00:00

81 lines
3.0 KiB
Go

//go:build linux
package scenario
import (
"errors"
"fmt"
"github.com/nezhahq/nezha/integration/agentcompat/internal/agent"
)
var (
ErrInvalidHeldReadiness = errors.New("held readiness is invalid")
ErrHeldReadinessServerID = errors.New("held readiness server ID is missing")
ErrHeldReadinessUUID = errors.New("held readiness UUID is missing")
ErrHeldReadinessAgentMismatch = errors.New("held readiness does not match Agent")
ErrHeldReadinessVersion = errors.New("held readiness version is missing")
ErrHeldReadinessOnline = errors.New("held readiness is offline")
ErrHeldReadinessVersionObserved = errors.New("held readiness version was not observed")
ErrHeldReadinessRequestTaskEstablished = errors.New("held readiness RequestTask was not established")
ErrHeldReadinessStateReceiptObserved = errors.New("held readiness state receipt was not observed")
)
type HeldReadinessValidationError struct {
Field string
cause error
}
func (validationError *HeldReadinessValidationError) Error() string {
return fmt.Sprintf("held readiness field %q: %s", validationError.Field, validationError.cause)
}
func (validationError *HeldReadinessValidationError) Is(target error) bool {
return target == ErrInvalidHeldReadiness || target == validationError.cause
}
func validateHeldReadiness(agentInstance *agent.Agent, readiness agent.Readiness) error {
if agentInstance == nil {
return ErrInvalidHeldReadiness
}
if readiness.ServerID == 0 {
return newHeldReadinessValidationError("server_id", ErrHeldReadinessServerID)
}
if readiness.UUID == "" {
return newHeldReadinessValidationError("uuid", ErrHeldReadinessUUID)
}
return validateHeldReadinessFacts(heldSessionAgentFacts{PID: agentInstance.PID(), UUID: agentInstance.UUID()}, readiness)
}
func validateHeldReadinessFacts(agentFacts heldSessionAgentFacts, readiness agent.Readiness) error {
if readiness.ServerID == 0 {
return newHeldReadinessValidationError("server_id", ErrHeldReadinessServerID)
}
if readiness.UUID == "" {
return newHeldReadinessValidationError("uuid", ErrHeldReadinessUUID)
}
if readiness.UUID != agentFacts.UUID {
return newHeldReadinessValidationError("uuid", ErrHeldReadinessAgentMismatch)
}
if readiness.Version == "" {
return newHeldReadinessValidationError("version", ErrHeldReadinessVersion)
}
if !readiness.Online {
return newHeldReadinessValidationError("online", ErrHeldReadinessOnline)
}
if !readiness.VersionObserved {
return newHeldReadinessValidationError("version_observed", ErrHeldReadinessVersionObserved)
}
if !readiness.RequestTaskEstablished {
return newHeldReadinessValidationError("request_task_established", ErrHeldReadinessRequestTaskEstablished)
}
if !readiness.StateReceiptObserved {
return newHeldReadinessValidationError("state_receipt_observed", ErrHeldReadinessStateReceiptObserved)
}
return nil
}
func newHeldReadinessValidationError(field string, cause error) error {
return &HeldReadinessValidationError{Field: field, cause: cause}
}