jobs.go raw

   1  package apiutils
   2  
   3  import (
   4  	"context"
   5  	"fmt"
   6  	"net/url"
   7  	"os"
   8  	"os/signal"
   9  	"path"
  10  	"strconv"
  11  	"time"
  12  
  13  	"github.com/mimuret/golang-iij-dpf/pkg/api"
  14  	"github.com/mimuret/golang-iij-dpf/pkg/apis/dpf/v1/core"
  15  )
  16  
  17  func WaitJob(ctx context.Context, c api.ClientInterface, jobID string, interval time.Duration) (*core.Job, error) {
  18  	job := &core.Job{
  19  		RequestID: jobID,
  20  	}
  21  	if _, err := c.Read(ctx, job); err != nil {
  22  		return nil, fmt.Errorf("failed to read Job: %w", err)
  23  	}
  24  	ctx, stop := signal.NotifyContext(ctx, os.Interrupt)
  25  	defer stop()
  26  	for job.Status == core.JobStatusRunning {
  27  		job.RequestID = jobID
  28  		if err := c.WatchRead(ctx, interval, job); err != nil {
  29  			return nil, err
  30  		}
  31  	}
  32  	if job.Status == core.JobStatusFailed {
  33  		return job, fmt.Errorf("JobID %s job failed: type: %s msg: %s", jobID, job.ErrorType, job.ErrorMessage)
  34  	}
  35  	return job, nil
  36  }
  37  
  38  func ParseeResourceSystemID(job *core.Job) (string, error) {
  39  	u, err := url.Parse(job.ResourceUrl)
  40  	if err != nil {
  41  		return "", fmt.Errorf("failed to parse resource-url: %s , %w", job.ResourceUrl, err)
  42  	}
  43  	_, id := path.Split(u.Path)
  44  	return id, nil
  45  }
  46  
  47  func ParseeResourceID(job *core.Job) (int64, error) {
  48  	idStr, err := ParseeResourceSystemID(job)
  49  	if err != nil {
  50  		return 0, err
  51  	}
  52  	id, err := strconv.ParseInt(idStr, 10, 64)
  53  	if err != nil {
  54  		return 0, fmt.Errorf("failed to convert to int64 resource-url: %s id: %s, %w", job.ResourceUrl, idStr, err)
  55  	}
  56  	return id, nil
  57  }
  58