49 lines
2.4 KiB
Go
49 lines
2.4 KiB
Go
package domain
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"git.cin.su/m/Assistant/contracts/work"
|
|
)
|
|
|
|
var ErrLeaseRejected = errors.New("agent lease rejected")
|
|
|
|
var ErrCallbackRejected = errors.New("agent callback rejected")
|
|
|
|
func AcquireAgentLease(runID work.AgentRunID, workerID string, token work.AgentFencingToken, now time.Time, ttl time.Duration) (work.AgentLease, error) {
|
|
if runID == "" || workerID == "" || token == 0 || now.IsZero() || ttl <= 0 {
|
|
return work.AgentLease{}, ErrLeaseRejected
|
|
}
|
|
return work.AgentLease{ID: work.AgentLeaseID(string(runID) + ":" + workerID), RunID: runID, WorkerID: workerID, FencingToken: token, State: work.AgentLeaseActive, AcquiredAt: now, ExpiresAt: now.Add(ttl)}, nil
|
|
}
|
|
|
|
func RenewAgentLease(lease work.AgentLease, workerID string, token work.AgentFencingToken, now time.Time, ttl time.Duration) (work.AgentLease, error) {
|
|
if lease.State != work.AgentLeaseActive || lease.WorkerID != workerID || lease.FencingToken != token || now.IsZero() || !now.Before(lease.ExpiresAt) || ttl <= 0 {
|
|
return work.AgentLease{}, ErrLeaseRejected
|
|
}
|
|
lease.ExpiresAt = now.Add(ttl)
|
|
return lease, nil
|
|
}
|
|
|
|
func ValidateAgentCallback(callback work.AgentCallback, lease work.AgentLease, lastSequence uint64) error {
|
|
if lease.State != work.AgentLeaseActive || callback.RunID == "" || callback.RunID != lease.RunID || callback.WorkerID == "" || callback.WorkerID != lease.WorkerID || callback.FencingToken == 0 || callback.FencingToken != lease.FencingToken || callback.Sequence <= lastSequence || callback.Kind == "" || callback.ObservedAt.IsZero() || !callback.ObservedAt.Before(lease.ExpiresAt) {
|
|
return ErrCallbackRejected
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func ValidateIndependentVerification(value work.IndependentVerification) error {
|
|
if value.ProducerRunID == "" || value.VerifierRunID == "" || value.ProducerRunID == value.VerifierRunID || value.VerifierIdentity == "" || value.ArtifactID == "" || value.TestEvidenceRef == "" || value.Summary == "" {
|
|
return ErrCallbackRejected
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func ValidateDispatchIntent(value work.AgentDispatchIntent) error {
|
|
if value.DispatchID == "" || value.IdempotencyKey == "" || value.DelegationID == "" || value.RunID == "" || value.ImplementationID == "" || value.ImplementationRevision < 1 || value.SourceRevision == "" || value.WorktreeID == "" || value.VerificationPlanRef == "" || value.CreatedAtUnixMillis < 1 {
|
|
return ErrCallbackRejected
|
|
}
|
|
return nil
|
|
}
|