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 }