package content import ( "context" "io" "time" "github.com/opencontainers/go-digest" ) // ReaderAt extends the standard io.ReaderAt interface with reporting of Size and io.Closer type ReaderAt interface { io.ReaderAt io.Closer Size() int64 } // Provider provides a reader interface for specific content type Provider interface { ReaderAt(ctx context.Context, dgst digest.Digest) (ReaderAt, error) } // Ingester writes content type Ingester interface { Writer(ctx context.Context, ref string, size int64, expected digest.Digest) (Writer, error) } // Info holds content specific information // // TODO(stevvooe): Consider a very different name for this struct. Info is way // to general. It also reads very weird in certain context, like pluralization. type Info struct { Digest digest.Digest Size int64 CreatedAt time.Time UpdatedAt time.Time Labels map[string]string } // Status of a content operation type Status struct { Ref string Offset int64 Total int64 Expected digest.Digest StartedAt time.Time UpdatedAt time.Time } // WalkFunc defines the callback for a blob walk. type WalkFunc func(Info) error // Manager provides methods for inspecting, listing and removing content. type Manager interface { // Info will return metadata about content available in the content store. // // If the content is not present, ErrNotFound will be returned. Info(ctx context.Context, dgst digest.Digest) (Info, error) // Update updates mutable information related to content. // If one or more fieldpaths are provided, only those // fields will be updated. // Mutable fields: // labels.* Update(ctx context.Context, info Info, fieldpaths ...string) (Info, error) // Walk will call fn for each item in the content store which // match the provided filters. If no filters are given all // items will be walked. Walk(ctx context.Context, fn WalkFunc, filters ...string) error // Delete removes the content from the store. Delete(ctx context.Context, dgst digest.Digest) error } // IngestManager provides methods for managing ingests. type IngestManager interface { // Status returns the status of the provided ref. Status(ctx context.Context, ref string) (Status, error) // ListStatuses returns the status of any active ingestions whose ref match the // provided regular expression. If empty, all active ingestions will be // returned. ListStatuses(ctx context.Context, filters ...string) ([]Status, error) // Abort completely cancels the ingest operation targeted by ref. Abort(ctx context.Context, ref string) error } // Writer handles the write of content into a content store type Writer interface { // Close is expected to be called after Commit() when commission is needed. io.WriteCloser // Digest may return empty digest or panics until committed. Digest() digest.Digest // Commit commits the blob (but no roll-back is guaranteed on an error). // size and expected can be zero-value when unknown. Commit(ctx context.Context, size int64, expected digest.Digest, opts ...Opt) error // Status returns the current state of write Status() (Status, error) // Truncate updates the size of the target blob Truncate(size int64) error } // Store combines the methods of content-oriented interfaces into a set that // are commonly provided by complete implementations. type Store interface { Manager Provider IngestManager Ingester } // Opt is used to alter the mutable properties of content type Opt func(*Info) error // WithLabels allows labels to be set on content func WithLabels(labels map[string]string) Opt { return func(info *Info) error { info.Labels = labels return nil } }