github.com/containerd/containerd@v22.0.0-20200918172823-438c87b8e050+incompatible/content/content.go (about) 1 /* 2 Copyright The containerd Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package content 18 19 import ( 20 "context" 21 "io" 22 "time" 23 24 "github.com/opencontainers/go-digest" 25 ocispec "github.com/opencontainers/image-spec/specs-go/v1" 26 ) 27 28 // ReaderAt extends the standard io.ReaderAt interface with reporting of Size and io.Closer 29 type ReaderAt interface { 30 io.ReaderAt 31 io.Closer 32 Size() int64 33 } 34 35 // Provider provides a reader interface for specific content 36 type Provider interface { 37 // ReaderAt only requires desc.Digest to be set. 38 // Other fields in the descriptor may be used internally for resolving 39 // the location of the actual data. 40 ReaderAt(ctx context.Context, dec ocispec.Descriptor) (ReaderAt, error) 41 } 42 43 // Ingester writes content 44 type Ingester interface { 45 // Some implementations require WithRef to be included in opts. 46 Writer(ctx context.Context, opts ...WriterOpt) (Writer, error) 47 } 48 49 // Info holds content specific information 50 // 51 // TODO(stevvooe): Consider a very different name for this struct. Info is way 52 // to general. It also reads very weird in certain context, like pluralization. 53 type Info struct { 54 Digest digest.Digest 55 Size int64 56 CreatedAt time.Time 57 UpdatedAt time.Time 58 Labels map[string]string 59 } 60 61 // Status of a content operation 62 type Status struct { 63 Ref string 64 Offset int64 65 Total int64 66 Expected digest.Digest 67 StartedAt time.Time 68 UpdatedAt time.Time 69 } 70 71 // WalkFunc defines the callback for a blob walk. 72 type WalkFunc func(Info) error 73 74 // Manager provides methods for inspecting, listing and removing content. 75 type Manager interface { 76 // Info will return metadata about content available in the content store. 77 // 78 // If the content is not present, ErrNotFound will be returned. 79 Info(ctx context.Context, dgst digest.Digest) (Info, error) 80 81 // Update updates mutable information related to content. 82 // If one or more fieldpaths are provided, only those 83 // fields will be updated. 84 // Mutable fields: 85 // labels.* 86 Update(ctx context.Context, info Info, fieldpaths ...string) (Info, error) 87 88 // Walk will call fn for each item in the content store which 89 // match the provided filters. If no filters are given all 90 // items will be walked. 91 Walk(ctx context.Context, fn WalkFunc, filters ...string) error 92 93 // Delete removes the content from the store. 94 Delete(ctx context.Context, dgst digest.Digest) error 95 } 96 97 // IngestManager provides methods for managing ingests. 98 type IngestManager interface { 99 // Status returns the status of the provided ref. 100 Status(ctx context.Context, ref string) (Status, error) 101 102 // ListStatuses returns the status of any active ingestions whose ref match the 103 // provided regular expression. If empty, all active ingestions will be 104 // returned. 105 ListStatuses(ctx context.Context, filters ...string) ([]Status, error) 106 107 // Abort completely cancels the ingest operation targeted by ref. 108 Abort(ctx context.Context, ref string) error 109 } 110 111 // Writer handles the write of content into a content store 112 type Writer interface { 113 // Close closes the writer, if the writer has not been 114 // committed this allows resuming or aborting. 115 // Calling Close on a closed writer will not error. 116 io.WriteCloser 117 118 // Digest may return empty digest or panics until committed. 119 Digest() digest.Digest 120 121 // Commit commits the blob (but no roll-back is guaranteed on an error). 122 // size and expected can be zero-value when unknown. 123 // Commit always closes the writer, even on error. 124 // ErrAlreadyExists aborts the writer. 125 Commit(ctx context.Context, size int64, expected digest.Digest, opts ...Opt) error 126 127 // Status returns the current state of write 128 Status() (Status, error) 129 130 // Truncate updates the size of the target blob 131 Truncate(size int64) error 132 } 133 134 // Store combines the methods of content-oriented interfaces into a set that 135 // are commonly provided by complete implementations. 136 type Store interface { 137 Manager 138 Provider 139 IngestManager 140 Ingester 141 } 142 143 // Opt is used to alter the mutable properties of content 144 type Opt func(*Info) error 145 146 // WithLabels allows labels to be set on content 147 func WithLabels(labels map[string]string) Opt { 148 return func(info *Info) error { 149 info.Labels = labels 150 return nil 151 } 152 } 153 154 // WriterOpts is internally used by WriterOpt. 155 type WriterOpts struct { 156 Ref string 157 Desc ocispec.Descriptor 158 } 159 160 // WriterOpt is used for passing options to Ingester.Writer. 161 type WriterOpt func(*WriterOpts) error 162 163 // WithDescriptor specifies an OCI descriptor. 164 // Writer may optionally use the descriptor internally for resolving 165 // the location of the actual data. 166 // Write does not require any field of desc to be set. 167 // If the data size is unknown, desc.Size should be set to 0. 168 // Some implementations may also accept negative values as "unknown". 169 func WithDescriptor(desc ocispec.Descriptor) WriterOpt { 170 return func(opts *WriterOpts) error { 171 opts.Desc = desc 172 return nil 173 } 174 } 175 176 // WithRef specifies a ref string. 177 func WithRef(ref string) WriterOpt { 178 return func(opts *WriterOpts) error { 179 opts.Ref = ref 180 return nil 181 } 182 }