github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/pkg/sonar/taskService.go (about)

     1  package sonar
     2  
     3  import (
     4  	"net/http"
     5  	"time"
     6  
     7  	sonargo "github.com/magicsong/sonargo/sonar"
     8  
     9  	"github.com/SAP/jenkins-library/pkg/log"
    10  )
    11  
    12  // EndpointCeTask API endpoint for https://sonarcloud.io/web_api/api/ce/task
    13  const EndpointCeTask = "ce/task"
    14  
    15  const (
    16  	taskStatusSuccess    = "SUCCESS"
    17  	taskStatusFailed     = "FAILED"
    18  	taskStatusCanceled   = "CANCELED"
    19  	taskStatusPending    = "PENDING"
    20  	taskStatusProcessing = "IN_PROGRESS"
    21  )
    22  
    23  // TaskService ...
    24  type TaskService struct {
    25  	TaskID       string
    26  	PollInterval time.Duration
    27  	apiClient    *Requester
    28  }
    29  
    30  // GetTask ...
    31  func (service *TaskService) GetTask(options *sonargo.CeTaskOption) (*sonargo.CeTaskObject, *http.Response, error) {
    32  	request, err := service.apiClient.create("GET", EndpointCeTask, options)
    33  	if err != nil {
    34  		return nil, nil, err
    35  	}
    36  	// use custom HTTP client to send request
    37  	response, err := service.apiClient.send(request)
    38  	if response == nil && err != nil {
    39  		return nil, nil, err
    40  	}
    41  	// reuse response verrification from sonargo
    42  	err = sonargo.CheckResponse(response)
    43  	if err != nil {
    44  		return nil, response, err
    45  	}
    46  	// decode JSON response
    47  	result := new(sonargo.CeTaskObject)
    48  	err = service.apiClient.decode(response, result)
    49  	if err != nil {
    50  		return nil, response, err
    51  	}
    52  	return result, response, nil
    53  }
    54  
    55  // HasFinished ...
    56  func (service *TaskService) HasFinished() (bool, error) {
    57  	options := &sonargo.CeTaskOption{
    58  		Id: service.TaskID,
    59  		// AdditionalFields: "warnings",
    60  	}
    61  	result, _, err := service.GetTask(options)
    62  	if err != nil {
    63  		return false, err
    64  	}
    65  	if result.Task.Status == taskStatusPending || result.Task.Status == taskStatusProcessing {
    66  		return false, nil
    67  	}
    68  	// for _, warning := range result.Task.Warnings {
    69  	// 	log.Entry().Warnf("Warnings during analysis: %s", warning)
    70  	// }
    71  	return true, nil
    72  }
    73  
    74  // WaitForTask ..
    75  func (service *TaskService) WaitForTask() error {
    76  	log.Entry().Info("waiting for SonarQube task to complete..")
    77  	finished, err := service.HasFinished()
    78  	if err != nil {
    79  		return err
    80  	}
    81  	for !finished {
    82  		time.Sleep(service.PollInterval)
    83  		finished, err = service.HasFinished()
    84  		if err != nil {
    85  			return err
    86  		}
    87  	}
    88  	log.Entry().Info("finished.")
    89  	return nil
    90  }
    91  
    92  // NewTaskService returns a new instance of a service for the task API endpoint.
    93  func NewTaskService(host, token, task string, client Sender) *TaskService {
    94  	return &TaskService{
    95  		TaskID:       task,
    96  		PollInterval: 15 * time.Second,
    97  		apiClient:    NewAPIClient(host, token, client),
    98  	}
    99  }