| package plugin |
| |
| import ( |
| "sync" |
| "time" |
| |
| "github.com/containerd/containerd/remotes/docker" |
| ) |
| |
| func newPushJobs(tracker docker.StatusTracker) *pushJobs { |
| return &pushJobs{ |
| names: make(map[string]string), |
| t: tracker, |
| } |
| } |
| |
| type pushJobs struct { |
| t docker.StatusTracker |
| |
| mu sync.Mutex |
| jobs []string |
| // maps job ref to a name |
| names map[string]string |
| } |
| |
| func (p *pushJobs) add(id, name string) { |
| p.mu.Lock() |
| defer p.mu.Unlock() |
| |
| if _, ok := p.names[id]; ok { |
| return |
| } |
| p.jobs = append(p.jobs, id) |
| p.names[id] = name |
| } |
| |
| func (p *pushJobs) status() []contentStatus { |
| statuses := make([]contentStatus, 0, len(p.jobs)) |
| |
| p.mu.Lock() |
| defer p.mu.Unlock() |
| |
| for _, j := range p.jobs { |
| var s contentStatus |
| s.Ref = p.names[j] |
| |
| status, err := p.t.GetStatus(j) |
| if err != nil { |
| s.Status = "Waiting" |
| } else { |
| s.Total = status.Total |
| s.Offset = status.Offset |
| s.StartedAt = status.StartedAt |
| s.UpdatedAt = status.UpdatedAt |
| if status.UploadUUID == "" { |
| s.Status = "Upload complete" |
| } else { |
| s.Status = "Uploading" |
| } |
| } |
| statuses = append(statuses, s) |
| } |
| |
| return statuses |
| } |
| |
| type contentStatus struct { |
| Status string |
| Total int64 |
| Offset int64 |
| StartedAt time.Time |
| UpdatedAt time.Time |
| Ref string |
| } |