github.com/chenbh/concourse/v6@v6.4.2/tsa/sweeper.go (about) 1 package tsa 2 3 import ( 4 "context" 5 "errors" 6 "io/ioutil" 7 "net/http" 8 "net/url" 9 10 "net/http/httputil" 11 12 "fmt" 13 14 "code.cloudfoundry.org/lager" 15 "code.cloudfoundry.org/lager/lagerctx" 16 "github.com/chenbh/concourse/v6/atc" 17 "github.com/tedsuo/rata" 18 ) 19 20 const ( 21 SweepContainers = "sweep-containers" 22 SweepVolumes = "sweep-volumes" 23 ) 24 25 type Sweeper struct { 26 ATCEndpoint *rata.RequestGenerator 27 HTTPClient *http.Client 28 } 29 30 func (l *Sweeper) Sweep(ctx context.Context, worker atc.Worker, resourceAction string) ([]byte, error) { 31 logger := lagerctx.FromContext(ctx) 32 33 logger.Debug("start") 34 defer logger.Debug("end") 35 36 var ( 37 containerBytes []byte 38 request *http.Request 39 err error 40 ) 41 switch resourceAction { 42 case SweepContainers: 43 request, err = l.ATCEndpoint.CreateRequest(atc.ListDestroyingContainers, nil, nil) 44 case SweepVolumes: 45 request, err = l.ATCEndpoint.CreateRequest(atc.ListDestroyingVolumes, nil, nil) 46 default: 47 return nil, errors.New(ResourceActionMissing) 48 } 49 50 if err != nil { 51 logger.Error("failed-to-construct-request", err) 52 return containerBytes, err 53 } 54 55 if worker.Name == "" { 56 logger.Info("empty-worker-name-in-req") 57 return containerBytes, fmt.Errorf("empty-worker-name") 58 } 59 60 request.URL.RawQuery = url.Values{ 61 "worker_name": []string{worker.Name}, 62 }.Encode() 63 64 response, err := l.HTTPClient.Do(request) 65 if err != nil { 66 logger.Error(fmt.Sprintf("failed-to-%s", resourceAction), err) 67 return containerBytes, err 68 } 69 70 logger.Debug("atc-response", lager.Data{"response-status": response.StatusCode}) 71 72 defer response.Body.Close() 73 74 if response.StatusCode != http.StatusOK { 75 logger.Error("bad-response", nil, lager.Data{ 76 "status-code": response.StatusCode, 77 }) 78 79 b, _ := httputil.DumpResponse(response, true) 80 return containerBytes, fmt.Errorf("bad-response (%d): %s", response.StatusCode, string(b)) 81 } 82 83 containerBytes, err = ioutil.ReadAll(response.Body) 84 if err != nil { 85 logger.Error("failed-to-read-response-body", err) 86 return containerBytes, fmt.Errorf("bad-repsonse-body (%d): %s", response.StatusCode, err.Error()) 87 } 88 89 logger.Info(fmt.Sprintf("successfully-%s", resourceAction)) 90 return containerBytes, nil 91 }