github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/api/volumeserver/report.go (about) 1 package volumeserver 2 3 import ( 4 "encoding/json" 5 "io/ioutil" 6 "net/http" 7 8 "github.com/pf-qiu/concourse/v6/atc/metric" 9 10 "code.cloudfoundry.org/lager" 11 ) 12 13 // ReportWorkerVolumes provides an API endpoint for workers to report their current volumes 14 func (s *Server) ReportWorkerVolumes(w http.ResponseWriter, r *http.Request) { 15 workerName := r.URL.Query().Get("worker_name") 16 w.Header().Set("Content-Type", "application/json") 17 18 logger := s.logger.Session("report-volumes-for-worker", lager.Data{"name": workerName}) 19 20 if workerName == "" { 21 logger.Info("missing-worker-name") 22 w.WriteHeader(http.StatusNotFound) 23 return 24 } 25 26 defer r.Body.Close() 27 28 data, err := ioutil.ReadAll(r.Body) 29 if err != nil { 30 logger.Error("failed-to-read-body", err) 31 w.WriteHeader(http.StatusInternalServerError) 32 return 33 } 34 35 var handles []string 36 err = json.Unmarshal(data, &handles) 37 if err != nil { 38 logger.Error("failed-to-unmarshal-body", err) 39 w.WriteHeader(http.StatusBadRequest) 40 return 41 } 42 43 logger.Debug("handles-info", lager.Data{ 44 "handles-count": len(handles), 45 }) 46 47 numUnknownVolumes, err := s.repository.DestroyUnknownVolumes(workerName, handles) 48 if err != nil { 49 logger.Error("failed-to-destroy-unknown-volumes", err) 50 w.WriteHeader(http.StatusInternalServerError) 51 return 52 } 53 if numUnknownVolumes > 0 { 54 logger.Info("unknown-volume-handles", lager.Data{ 55 "worker-name": workerName, 56 "handles-count": numUnknownVolumes, 57 }) 58 } 59 60 metric.WorkerUnknownVolumes{ 61 WorkerName: workerName, 62 Volumes: numUnknownVolumes, 63 }.Emit(logger) 64 65 err = s.repository.UpdateVolumesMissingSince(workerName, handles) 66 if err != nil { 67 logger.Error("failed-to-update-volumes-missing-since", err) 68 w.WriteHeader(http.StatusInternalServerError) 69 return 70 } 71 72 err = s.destroyer.DestroyVolumes(workerName, handles) 73 if err != nil { 74 logger.Error("failed-to-destroy-volumes", err) 75 w.WriteHeader(http.StatusInternalServerError) 76 return 77 } 78 79 w.WriteHeader(http.StatusNoContent) 80 }