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 }