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