github.com/lalkh/containerd@v1.4.3/client_opts.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 containerd 18 19 import ( 20 "time" 21 22 "github.com/containerd/containerd/images" 23 "github.com/containerd/containerd/platforms" 24 "github.com/containerd/containerd/remotes" 25 "github.com/containerd/containerd/snapshots" 26 ocispec "github.com/opencontainers/image-spec/specs-go/v1" 27 28 "google.golang.org/grpc" 29 ) 30 31 type clientOpts struct { 32 defaultns string 33 defaultRuntime string 34 defaultPlatform platforms.MatchComparer 35 services *services 36 dialOptions []grpc.DialOption 37 timeout time.Duration 38 } 39 40 // ClientOpt allows callers to set options on the containerd client 41 type ClientOpt func(c *clientOpts) error 42 43 // WithDefaultNamespace sets the default namespace on the client 44 // 45 // Any operation that does not have a namespace set on the context will 46 // be provided the default namespace 47 func WithDefaultNamespace(ns string) ClientOpt { 48 return func(c *clientOpts) error { 49 c.defaultns = ns 50 return nil 51 } 52 } 53 54 // WithDefaultRuntime sets the default runtime on the client 55 func WithDefaultRuntime(rt string) ClientOpt { 56 return func(c *clientOpts) error { 57 c.defaultRuntime = rt 58 return nil 59 } 60 } 61 62 // WithDefaultPlatform sets the default platform matcher on the client 63 func WithDefaultPlatform(platform platforms.MatchComparer) ClientOpt { 64 return func(c *clientOpts) error { 65 c.defaultPlatform = platform 66 return nil 67 } 68 } 69 70 // WithDialOpts allows grpc.DialOptions to be set on the connection 71 func WithDialOpts(opts []grpc.DialOption) ClientOpt { 72 return func(c *clientOpts) error { 73 c.dialOptions = opts 74 return nil 75 } 76 } 77 78 // WithServices sets services used by the client. 79 func WithServices(opts ...ServicesOpt) ClientOpt { 80 return func(c *clientOpts) error { 81 c.services = &services{} 82 for _, o := range opts { 83 o(c.services) 84 } 85 return nil 86 } 87 } 88 89 // WithTimeout sets the connection timeout for the client 90 func WithTimeout(d time.Duration) ClientOpt { 91 return func(c *clientOpts) error { 92 c.timeout = d 93 return nil 94 } 95 } 96 97 // RemoteOpt allows the caller to set distribution options for a remote 98 type RemoteOpt func(*Client, *RemoteContext) error 99 100 // WithPlatform allows the caller to specify a platform to retrieve 101 // content for 102 func WithPlatform(platform string) RemoteOpt { 103 if platform == "" { 104 platform = platforms.DefaultString() 105 } 106 return func(_ *Client, c *RemoteContext) error { 107 for _, p := range c.Platforms { 108 if p == platform { 109 return nil 110 } 111 } 112 113 c.Platforms = append(c.Platforms, platform) 114 return nil 115 } 116 } 117 118 // WithPlatformMatcher specifies the matcher to use for 119 // determining which platforms to pull content for. 120 // This value supersedes anything set with `WithPlatform`. 121 func WithPlatformMatcher(m platforms.MatchComparer) RemoteOpt { 122 return func(_ *Client, c *RemoteContext) error { 123 c.PlatformMatcher = m 124 return nil 125 } 126 } 127 128 // WithPullUnpack is used to unpack an image after pull. This 129 // uses the snapshotter, content store, and diff service 130 // configured for the client. 131 func WithPullUnpack(_ *Client, c *RemoteContext) error { 132 c.Unpack = true 133 return nil 134 } 135 136 // WithUnpackOpts is used to add unpack options to the unpacker. 137 func WithUnpackOpts(opts []UnpackOpt) RemoteOpt { 138 return func(_ *Client, c *RemoteContext) error { 139 c.UnpackOpts = append(c.UnpackOpts, opts...) 140 return nil 141 } 142 } 143 144 // WithPullSnapshotter specifies snapshotter name used for unpacking. 145 func WithPullSnapshotter(snapshotterName string, opts ...snapshots.Opt) RemoteOpt { 146 return func(_ *Client, c *RemoteContext) error { 147 c.Snapshotter = snapshotterName 148 c.SnapshotterOpts = opts 149 return nil 150 } 151 } 152 153 // WithPullLabel sets a label to be associated with a pulled reference 154 func WithPullLabel(key, value string) RemoteOpt { 155 return func(_ *Client, rc *RemoteContext) error { 156 if rc.Labels == nil { 157 rc.Labels = make(map[string]string) 158 } 159 160 rc.Labels[key] = value 161 return nil 162 } 163 } 164 165 // WithPullLabels associates a set of labels to a pulled reference 166 func WithPullLabels(labels map[string]string) RemoteOpt { 167 return func(_ *Client, rc *RemoteContext) error { 168 if rc.Labels == nil { 169 rc.Labels = make(map[string]string) 170 } 171 172 for k, v := range labels { 173 rc.Labels[k] = v 174 } 175 return nil 176 } 177 } 178 179 // WithChildLabelMap sets the map function used to define the labels set 180 // on referenced child content in the content store. This can be used 181 // to overwrite the default GC labels or filter which labels get set 182 // for content. 183 // The default is `images.ChildGCLabels`. 184 func WithChildLabelMap(fn func(ocispec.Descriptor) []string) RemoteOpt { 185 return func(_ *Client, c *RemoteContext) error { 186 c.ChildLabelMap = fn 187 return nil 188 } 189 } 190 191 // WithSchema1Conversion is used to convert Docker registry schema 1 192 // manifests to oci manifests on pull. Without this option schema 1 193 // manifests will return a not supported error. 194 func WithSchema1Conversion(client *Client, c *RemoteContext) error { 195 c.ConvertSchema1 = true 196 return nil 197 } 198 199 // WithResolver specifies the resolver to use. 200 func WithResolver(resolver remotes.Resolver) RemoteOpt { 201 return func(client *Client, c *RemoteContext) error { 202 c.Resolver = resolver 203 return nil 204 } 205 } 206 207 // WithImageHandler adds a base handler to be called on dispatch. 208 func WithImageHandler(h images.Handler) RemoteOpt { 209 return func(client *Client, c *RemoteContext) error { 210 c.BaseHandlers = append(c.BaseHandlers, h) 211 return nil 212 } 213 } 214 215 // WithImageHandlerWrapper wraps the handlers to be called on dispatch. 216 func WithImageHandlerWrapper(w func(images.Handler) images.Handler) RemoteOpt { 217 return func(client *Client, c *RemoteContext) error { 218 c.HandlerWrapper = w 219 return nil 220 } 221 } 222 223 // WithMaxConcurrentDownloads sets max concurrent download limit. 224 func WithMaxConcurrentDownloads(max int) RemoteOpt { 225 return func(client *Client, c *RemoteContext) error { 226 c.MaxConcurrentDownloads = max 227 return nil 228 } 229 } 230 231 // WithAllMetadata downloads all manifests and known-configuration files 232 func WithAllMetadata() RemoteOpt { 233 return func(_ *Client, c *RemoteContext) error { 234 c.AllMetadata = true 235 return nil 236 } 237 }