
Content commit is updated to take in a context, allowing content to be committed within the same context the writer was in. This is useful when commit may be able to use more context to complete the action rather than creating its own. An example of this being useful is for the metadata implementation of content, having a context allows tests to fully create content in one database transaction by making use of the context. Signed-off-by: Derek McGowan <derek@mcgstyle.net>
120 lines
3.2 KiB
Go
120 lines
3.2 KiB
Go
package content
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"time"
|
|
|
|
"github.com/opencontainers/go-digest"
|
|
)
|
|
|
|
type ReaderAt interface {
|
|
io.ReaderAt
|
|
io.Closer
|
|
Size() int64
|
|
}
|
|
|
|
type Provider interface {
|
|
ReaderAt(ctx context.Context, dgst digest.Digest) (ReaderAt, error)
|
|
}
|
|
|
|
type Ingester interface {
|
|
Writer(ctx context.Context, ref string, size int64, expected digest.Digest) (Writer, error)
|
|
}
|
|
|
|
// 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
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
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
|
|
|
|
func WithLabels(labels map[string]string) Opt {
|
|
return func(info *Info) error {
|
|
info.Labels = labels
|
|
return nil
|
|
}
|
|
}
|