github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/api/containerserver/report.go (about) 1 package containerserver 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 func (s *Server) ReportWorkerContainers(w http.ResponseWriter, r *http.Request) { 14 workerName := r.URL.Query().Get("worker_name") 15 w.Header().Set("Content-Type", "application/json") 16 17 logger := s.logger.Session("report-containers-for-worker", lager.Data{"name": workerName}) 18 19 if workerName == "" { 20 logger.Info("missing-worker-name") 21 w.WriteHeader(http.StatusNotFound) 22 return 23 } 24 25 defer r.Body.Close() 26 27 data, err := ioutil.ReadAll(r.Body) 28 if err != nil { 29 logger.Error("failed-to-read-body", err) 30 w.WriteHeader(http.StatusInternalServerError) 31 return 32 } 33 34 var handles []string 35 err = json.Unmarshal(data, &handles) 36 if err != nil { 37 logger.Error("failed-to-unmarshal-body", err) 38 w.WriteHeader(http.StatusBadRequest) 39 return 40 } 41 42 logger.Debug("handles-info", lager.Data{ 43 "num-handles": len(handles), 44 }) 45 46 numUnknownContainers, err := s.containerRepository.DestroyUnknownContainers(workerName, handles) 47 if err != nil { 48 logger.Error("failed-to-destroy-unknown-containers", err) 49 w.WriteHeader(http.StatusInternalServerError) 50 return 51 } 52 if numUnknownContainers > 0 { 53 logger.Info("unknown-container-handles", lager.Data{ 54 "worker-name": workerName, 55 "handles-count": numUnknownContainers, 56 }) 57 } 58 59 metric.WorkerUnknownContainers{ 60 WorkerName: workerName, 61 Containers: numUnknownContainers, 62 }.Emit(logger) 63 64 err = s.containerRepository.UpdateContainersMissingSince(workerName, handles) 65 if err != nil { 66 logger.Error("failed-to-update-containers-missing-since", err) 67 w.WriteHeader(http.StatusInternalServerError) 68 return 69 } 70 71 err = s.destroyer.DestroyContainers(workerName, handles) 72 if err != nil { 73 logger.Error("failed-to-destroy-containers", err) 74 w.WriteHeader(http.StatusInternalServerError) 75 return 76 } 77 78 w.WriteHeader(http.StatusNoContent) 79 }