github.com/chnsz/golangsdk@v0.0.0-20240506093406-85a3fbfa605b/openstack/taurusdb/v3/instances/results_job.go (about)

     1  package instances
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"github.com/chnsz/golangsdk"
     8  )
     9  
    10  type JobResponse struct {
    11  	JobID   string `json:"job_id"`
    12  	OrderID string `json:"order_id"`
    13  }
    14  
    15  type JobStatus struct {
    16  	Job Job `json:"job"`
    17  }
    18  
    19  type Job struct {
    20  	Status     string `json:"status"`
    21  	JobID      string `json:"id"`
    22  	FailReason string `json:"fail_reason"`
    23  }
    24  
    25  type JobResult struct {
    26  	golangsdk.Result
    27  }
    28  
    29  func (r JobResult) ExtractJobResponse() (*JobResponse, error) {
    30  	job := new(JobResponse)
    31  	err := r.ExtractInto(job)
    32  	return job, err
    33  }
    34  
    35  func (r JobResult) ExtractJobStatus() (*JobStatus, error) {
    36  	job := new(JobStatus)
    37  	err := r.ExtractInto(job)
    38  	return job, err
    39  }
    40  
    41  func WaitForJobSuccess(client *golangsdk.ServiceClient, secs int, jobID string) error {
    42  	return golangsdk.WaitFor(secs, func() (bool, error) {
    43  		job_status := new(JobStatus)
    44  		url := jobURL(client)
    45  		url += fmt.Sprintf("?id=%s", jobID)
    46  		_, err := client.Get(url, &job_status, &golangsdk.RequestOpts{
    47  			MoreHeaders: requestOpts.MoreHeaders,
    48  		})
    49  		time.Sleep(15 * time.Second)
    50  		if err != nil {
    51  			return false, err
    52  		}
    53  		job := job_status.Job
    54  
    55  		if job.Status == "Completed" {
    56  			return true, nil
    57  		}
    58  		if job.Status == "Failed" {
    59  			err = fmt.Errorf("Job failed: %s.", job.FailReason)
    60  			return false, err
    61  		}
    62  
    63  		return false, nil
    64  	})
    65  }