github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/api/workerserver/heartbeat.go (about) 1 package workerserver 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "net/http" 7 "time" 8 9 "github.com/pf-qiu/concourse/v6/atc" 10 "github.com/pf-qiu/concourse/v6/atc/api/present" 11 "github.com/pf-qiu/concourse/v6/atc/db" 12 "github.com/pf-qiu/concourse/v6/atc/metric" 13 ) 14 15 func (s *Server) HeartbeatWorker(w http.ResponseWriter, r *http.Request) { 16 var ( 17 registration atc.Worker 18 ttl time.Duration 19 err error 20 ) 21 22 logger := s.logger.Session("heartbeat-worker") 23 workerName := r.FormValue(":worker_name") 24 25 ttlStr := r.URL.Query().Get("ttl") 26 if len(ttlStr) > 0 { 27 ttl, err = time.ParseDuration(ttlStr) 28 if err != nil { 29 logger.Error("failed-to-parse-ttl", err) 30 w.WriteHeader(http.StatusBadRequest) 31 fmt.Fprint(w, "malformed ttl") 32 return 33 } 34 } 35 36 err = json.NewDecoder(r.Body).Decode(®istration) 37 if err != nil { 38 w.WriteHeader(http.StatusBadRequest) 39 return 40 } 41 42 registration.Name = workerName 43 44 metric.WorkerContainers{ 45 WorkerName: registration.Name, 46 Containers: registration.ActiveContainers, 47 Platform: registration.Platform, 48 TeamName: registration.Team, 49 Tags: registration.Tags, 50 }.Emit(s.logger) 51 52 metric.WorkerVolumes{ 53 WorkerName: registration.Name, 54 Volumes: registration.ActiveVolumes, 55 Platform: registration.Platform, 56 TeamName: registration.Team, 57 Tags: registration.Tags, 58 }.Emit(s.logger) 59 60 savedWorker, err := s.dbWorkerFactory.HeartbeatWorker(registration, ttl) 61 if err == db.ErrWorkerNotPresent { 62 logger.Error("failed-to-find-worker", err) 63 w.WriteHeader(http.StatusNotFound) 64 return 65 } 66 67 if err != nil { 68 logger.Error("failed-to-heartbeat-worker", err) 69 w.WriteHeader(http.StatusInternalServerError) 70 return 71 } 72 73 activeTasks, err := savedWorker.ActiveTasks() 74 75 if err != nil { 76 logger.Info("failed-to-get-worker-active-tasks") 77 } 78 79 metric.WorkerTasks{ 80 WorkerName: registration.Name, 81 Tasks: activeTasks, 82 Platform: registration.Platform, 83 }.Emit(s.logger) 84 85 w.Header().Set("Content-Type", "application/json") 86 w.WriteHeader(http.StatusOK) 87 err = json.NewEncoder(w).Encode(present.Worker(savedWorker)) 88 if err != nil { 89 logger.Error("failed-to-encode-worker", err) 90 w.WriteHeader(http.StatusInternalServerError) 91 } 92 }