69 lines
2.7 KiB
Go
69 lines
2.7 KiB
Go
package capability
|
|
|
|
type AdmissionComplexity string
|
|
type AdmissionDecisionState string
|
|
type AdmissionReason string
|
|
|
|
const (
|
|
AdmissionSimple AdmissionComplexity = "SIMPLE"
|
|
AdmissionNormal AdmissionComplexity = "NORMAL"
|
|
AdmissionHeavy AdmissionComplexity = "HEAVY"
|
|
AdmissionAdmitted AdmissionDecisionState = "ADMITTED"
|
|
AdmissionRejected AdmissionDecisionState = "REJECTED"
|
|
AdmissionReasonNone AdmissionReason = "NONE"
|
|
AdmissionReasonConcurrency AdmissionReason = "CONCURRENCY_LIMIT"
|
|
AdmissionReasonAcceptedHour AdmissionReason = "ACCEPTED_PER_HOUR_LIMIT"
|
|
AdmissionReasonDeadline AdmissionReason = "DEADLINE"
|
|
AdmissionReasonInputBudget AdmissionReason = "INPUT_BUDGET"
|
|
AdmissionReasonOutputBudget AdmissionReason = "OUTPUT_BUDGET"
|
|
)
|
|
|
|
type AdmissionPolicy struct {
|
|
ID string
|
|
MaxConcurrent int
|
|
MaxAcceptedPerHour int
|
|
MaxInputBytes int
|
|
MaxOutputBytes int
|
|
}
|
|
|
|
type AdmissionRequest struct {
|
|
Complexity AdmissionComplexity
|
|
InputBytes int
|
|
MaxOutputBytes int
|
|
DeadlineMillis int64
|
|
}
|
|
|
|
type AdmissionCounters struct {
|
|
Concurrent int
|
|
AcceptedLastHour int
|
|
}
|
|
|
|
type AdmissionDecision struct {
|
|
State AdmissionDecisionState
|
|
Reason AdmissionReason
|
|
PolicyID string
|
|
}
|
|
|
|
func Admit(request AdmissionRequest, policy AdmissionPolicy, counters AdmissionCounters, nowMillis int64) AdmissionDecision {
|
|
decision := AdmissionDecision{State: AdmissionAdmitted, Reason: AdmissionReasonNone, PolicyID: policy.ID}
|
|
if policy.ID == "" || policy.MaxConcurrent < 1 || policy.MaxAcceptedPerHour < 1 || policy.MaxInputBytes < 1 || policy.MaxOutputBytes < 1 {
|
|
return AdmissionDecision{State: AdmissionRejected, Reason: AdmissionReasonInputBudget, PolicyID: policy.ID}
|
|
}
|
|
if counters.Concurrent >= policy.MaxConcurrent {
|
|
return AdmissionDecision{State: AdmissionRejected, Reason: AdmissionReasonConcurrency, PolicyID: policy.ID}
|
|
}
|
|
if counters.AcceptedLastHour >= policy.MaxAcceptedPerHour {
|
|
return AdmissionDecision{State: AdmissionRejected, Reason: AdmissionReasonAcceptedHour, PolicyID: policy.ID}
|
|
}
|
|
if request.InputBytes < 0 || request.InputBytes > policy.MaxInputBytes {
|
|
return AdmissionDecision{State: AdmissionRejected, Reason: AdmissionReasonInputBudget, PolicyID: policy.ID}
|
|
}
|
|
if request.MaxOutputBytes < 1 || request.MaxOutputBytes > policy.MaxOutputBytes {
|
|
return AdmissionDecision{State: AdmissionRejected, Reason: AdmissionReasonOutputBudget, PolicyID: policy.ID}
|
|
}
|
|
if request.DeadlineMillis > 0 && request.DeadlineMillis <= nowMillis {
|
|
return AdmissionDecision{State: AdmissionRejected, Reason: AdmissionReasonDeadline, PolicyID: policy.ID}
|
|
}
|
|
return decision
|
|
}
|