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  }