| 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 | |
| } |