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  }