github.com/jcarley/cli@v0.0.0-20180201210820-966d90434c30/lib/jobs/poll.go (about)

     1  package jobs
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"github.com/Sirupsen/logrus"
     8  	"github.com/daticahealth/cli/config"
     9  	"github.com/daticahealth/cli/models"
    10  )
    11  
    12  func contains(v string, a []string) bool {
    13  	for _, i := range a {
    14  		if i == v {
    15  			return true
    16  		}
    17  	}
    18  	return false
    19  }
    20  
    21  func (j *SJobs) PollTillFinished(jobID, svcID string) (string, error) {
    22  	return j.PollForStatus([]string{"finished"}, jobID, svcID)
    23  }
    24  
    25  func (j *SJobs) WaitToAppear(jobID, svcID string) error {
    26  	for {
    27  		headers := j.Settings.HTTPManager.GetHeaders(j.Settings.SessionToken, j.Settings.Version, j.Settings.Pod, j.Settings.UsersID)
    28  		_, statusCode, err := j.Settings.HTTPManager.Get(nil, fmt.Sprintf("%s%s/environments/%s/services/%s/jobs/%s", j.Settings.PaasHost, j.Settings.PaasHostVersion, j.Settings.EnvironmentID, svcID, jobID), headers)
    29  		if err != nil {
    30  			return err
    31  		}
    32  		if statusCode >= 200 && statusCode < 300 {
    33  			return nil
    34  		}
    35  		time.Sleep(time.Second * 2)
    36  	}
    37  }
    38  
    39  func (j *SJobs) PollForStatus(statuses []string, jobID, svcID string) (string, error) {
    40  	var job models.Job
    41  	failedAttempts := 0
    42  poll:
    43  	for {
    44  		failed := false
    45  		headers := j.Settings.HTTPManager.GetHeaders(j.Settings.SessionToken, j.Settings.Version, j.Settings.Pod, j.Settings.UsersID)
    46  		resp, statusCode, err := j.Settings.HTTPManager.Get(nil, fmt.Sprintf("%s%s/environments/%s/services/%s/jobs/%s", j.Settings.PaasHost, j.Settings.PaasHostVersion, j.Settings.EnvironmentID, svcID, jobID), headers)
    47  		if err != nil {
    48  			failed = true
    49  		}
    50  		err = j.Settings.HTTPManager.ConvertResp(resp, statusCode, &job)
    51  		if err != nil {
    52  			failed = true
    53  		}
    54  		if failed {
    55  			failedAttempts++
    56  		}
    57  		s := job.Status
    58  		switch {
    59  		case contains(s, statuses):
    60  			break poll
    61  		case contains(s, []string{"scheduled", "queued", "started", "running", "stopped", "waiting"}):
    62  			if failedAttempts >= 3 {
    63  				return "", fmt.Errorf("Error - ended in status '%s'.", job.Status)
    64  			}
    65  			// all because logrus treats print, println, and printf the same
    66  			logrus.StandardLogger().Out.Write([]byte("."))
    67  			time.Sleep(config.JobPollTime * time.Second)
    68  		default:
    69  			return "", fmt.Errorf("Error - ended in status '%s'.", job.Status)
    70  		}
    71  	}
    72  	if !contains(job.Status, statuses) {
    73  		return "", fmt.Errorf("Error - ended in status '%s'.", job.Status)
    74  	}
    75  	return job.Status, nil
    76  }