mirror of
https://github.com/kemko/nomad.git
synced 2026-01-04 09:25:46 +03:00
When debugging an evaluation, you almost always want to know about all the related evaluations and what allocations were placed by that evaluation (and where), not just failed placements. We can enrich the command by adding the `related` query parameter to the API, and having the command query for the evaluations allocations automatically. Emit this data as a pair of new tables and expose fields like quota limits, and previous/next/blocked eval without the `-verbose` flag. Update the docs to include the full output and remove references to long-removed behavior of the `-json` flag. Ref: https://hashicorp.atlassian.net/browse/NMD-818 Ref: https://go.hashi.co/rfc/nmd-212
184 lines
4.7 KiB
Go
184 lines
4.7 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package api
|
|
|
|
import (
|
|
"sort"
|
|
"time"
|
|
)
|
|
|
|
// Evaluations is used to query the evaluation endpoints.
|
|
type Evaluations struct {
|
|
client *Client
|
|
}
|
|
|
|
// Evaluations returns a new handle on the evaluations.
|
|
func (c *Client) Evaluations() *Evaluations {
|
|
return &Evaluations{client: c}
|
|
}
|
|
|
|
// List is used to dump all of the evaluations.
|
|
func (e *Evaluations) List(q *QueryOptions) ([]*Evaluation, *QueryMeta, error) {
|
|
var resp []*Evaluation
|
|
qm, err := e.client.query("/v1/evaluations", &resp, q)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
sort.Sort(EvalIndexSort(resp))
|
|
return resp, qm, nil
|
|
}
|
|
|
|
func (e *Evaluations) PrefixList(prefix string) ([]*Evaluation, *QueryMeta, error) {
|
|
return e.List(&QueryOptions{Prefix: prefix})
|
|
}
|
|
|
|
// Count is used to get a count of evaluations.
|
|
func (e *Evaluations) Count(q *QueryOptions) (*EvalCountResponse, *QueryMeta, error) {
|
|
var resp *EvalCountResponse
|
|
qm, err := e.client.query("/v1/evaluations/count", &resp, q)
|
|
if err != nil {
|
|
return resp, nil, err
|
|
}
|
|
return resp, qm, nil
|
|
}
|
|
|
|
// Info is used to query a single evaluation by its ID.
|
|
func (e *Evaluations) Info(evalID string, q *QueryOptions) (*Evaluation, *QueryMeta, error) {
|
|
var resp Evaluation
|
|
qm, err := e.client.query("/v1/evaluation/"+evalID+"?related=true", &resp, q)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
return &resp, qm, nil
|
|
}
|
|
|
|
// Delete is used to batch delete evaluations using their IDs.
|
|
func (e *Evaluations) Delete(evalIDs []string, w *WriteOptions) (*WriteMeta, error) {
|
|
req := EvalDeleteRequest{
|
|
EvalIDs: evalIDs,
|
|
}
|
|
wm, err := e.client.delete("/v1/evaluations", &req, nil, w)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return wm, nil
|
|
}
|
|
|
|
// DeleteOpts is used to batch delete evaluations using a filter.
|
|
func (e *Evaluations) DeleteOpts(req *EvalDeleteRequest, w *WriteOptions) (*EvalDeleteResponse, *WriteMeta, error) {
|
|
resp := &EvalDeleteResponse{}
|
|
wm, err := e.client.delete("/v1/evaluations", &req, resp, w)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
return resp, wm, nil
|
|
}
|
|
|
|
// Allocations is used to retrieve a set of allocations given
|
|
// an evaluation ID.
|
|
func (e *Evaluations) Allocations(evalID string, q *QueryOptions) ([]*AllocationListStub, *QueryMeta, error) {
|
|
var resp []*AllocationListStub
|
|
qm, err := e.client.query("/v1/evaluation/"+evalID+"/allocations", &resp, q)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
sort.Sort(AllocIndexSort(resp))
|
|
return resp, qm, nil
|
|
}
|
|
|
|
const (
|
|
EvalStatusBlocked = "blocked"
|
|
EvalStatusPending = "pending"
|
|
EvalStatusComplete = "complete"
|
|
EvalStatusFailed = "failed"
|
|
EvalStatusCancelled = "canceled"
|
|
)
|
|
|
|
// Evaluation is used to serialize an evaluation.
|
|
type Evaluation struct {
|
|
ID string
|
|
Priority int
|
|
Type string
|
|
TriggeredBy string
|
|
Namespace string
|
|
JobID string
|
|
JobModifyIndex uint64
|
|
NodeID string
|
|
NodeModifyIndex uint64
|
|
DeploymentID string
|
|
Status string
|
|
StatusDescription string
|
|
Wait time.Duration
|
|
WaitUntil time.Time
|
|
NextEval string
|
|
PreviousEval string
|
|
BlockedEval string
|
|
RelatedEvals []*EvaluationStub
|
|
FailedTGAllocs map[string]*AllocationMetric
|
|
ClassEligibility map[string]bool
|
|
EscapedComputedClass bool
|
|
QuotaLimitReached string
|
|
AnnotatePlan bool
|
|
QueuedAllocations map[string]int
|
|
SnapshotIndex uint64
|
|
CreateIndex uint64
|
|
ModifyIndex uint64
|
|
CreateTime int64
|
|
ModifyTime int64
|
|
}
|
|
|
|
// EvaluationStub is used to serialize parts of an evaluation returned in the
|
|
// RelatedEvals field of an Evaluation.
|
|
type EvaluationStub struct {
|
|
ID string
|
|
Priority int
|
|
Type string
|
|
TriggeredBy string
|
|
Namespace string
|
|
JobID string
|
|
NodeID string
|
|
DeploymentID string
|
|
Status string
|
|
StatusDescription string
|
|
WaitUntil time.Time
|
|
NextEval string
|
|
PreviousEval string
|
|
BlockedEval string
|
|
CreateIndex uint64
|
|
ModifyIndex uint64
|
|
CreateTime int64
|
|
ModifyTime int64
|
|
}
|
|
|
|
type EvalDeleteRequest struct {
|
|
EvalIDs []string
|
|
Filter string
|
|
WriteRequest
|
|
}
|
|
|
|
type EvalDeleteResponse struct {
|
|
Count int
|
|
}
|
|
|
|
type EvalCountResponse struct {
|
|
Count int
|
|
QueryMeta
|
|
}
|
|
|
|
// EvalIndexSort is a wrapper to sort evaluations by CreateIndex.
|
|
// We reverse the test so that we get the highest index first.
|
|
type EvalIndexSort []*Evaluation
|
|
|
|
func (e EvalIndexSort) Len() int {
|
|
return len(e)
|
|
}
|
|
|
|
func (e EvalIndexSort) Less(i, j int) bool {
|
|
return e[i].CreateIndex > e[j].CreateIndex
|
|
}
|
|
|
|
func (e EvalIndexSort) Swap(i, j int) {
|
|
e[i], e[j] = e[j], e[i]
|
|
}
|