github.com/hernad/nomad@v1.6.112/nomad/system_endpoint.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 package nomad 5 6 import ( 7 "fmt" 8 9 "github.com/hashicorp/go-hclog" 10 11 "github.com/hernad/nomad/nomad/structs" 12 ) 13 14 // System endpoint is used to call invoke system tasks. 15 type System struct { 16 srv *Server 17 ctx *RPCContext 18 logger hclog.Logger 19 } 20 21 func NewSystemEndpoint(srv *Server, ctx *RPCContext) *System { 22 return &System{srv: srv, ctx: ctx, logger: srv.logger.Named("system")} 23 } 24 25 // GarbageCollect is used to trigger the system to immediately garbage collect nodes, evals 26 // and jobs. 27 func (s *System) GarbageCollect(args *structs.GenericRequest, reply *structs.GenericResponse) error { 28 29 authErr := s.srv.Authenticate(s.ctx, args) 30 if done, err := s.srv.forward("System.GarbageCollect", args, args, reply); done { 31 return err 32 } 33 s.srv.MeasureRPCRate("system", structs.RateMetricWrite, args) 34 if authErr != nil { 35 return structs.ErrPermissionDenied 36 } 37 38 // Check management level permissions 39 if acl, err := s.srv.ResolveACL(args); err != nil { 40 return err 41 } else if acl != nil && !acl.IsManagement() { 42 return structs.ErrPermissionDenied 43 } 44 45 // Get the states current index 46 snapshotIndex, err := s.srv.fsm.State().LatestIndex() 47 if err != nil { 48 return fmt.Errorf("failed to determine state store's index: %v", err) 49 } 50 51 s.srv.evalBroker.Enqueue(s.srv.coreJobEval(structs.CoreJobForceGC, snapshotIndex)) 52 return nil 53 } 54 55 // ReconcileJobSummaries reconciles the summaries of all the jobs in the state 56 // store 57 func (s *System) ReconcileJobSummaries(args *structs.GenericRequest, reply *structs.GenericResponse) error { 58 59 authErr := s.srv.Authenticate(s.ctx, args) 60 if done, err := s.srv.forward("System.ReconcileJobSummaries", args, args, reply); done { 61 return err 62 } 63 s.srv.MeasureRPCRate("system", structs.RateMetricWrite, args) 64 if authErr != nil { 65 return structs.ErrPermissionDenied 66 } 67 68 // Check management level permissions 69 if acl, err := s.srv.ResolveACL(args); err != nil { 70 return err 71 } else if acl != nil && !acl.IsManagement() { 72 return structs.ErrPermissionDenied 73 } 74 75 _, index, err := s.srv.raftApply(structs.ReconcileJobSummariesRequestType, args) 76 if err != nil { 77 return fmt.Errorf("reconciliation of job summaries failed: %v", err) 78 } 79 reply.Index = index 80 return nil 81 }