dotcloud/docker

View on GitHub
plugin/progress.go

Summary

Maintainability
A
0 mins
Test Coverage
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
}