diff options
Diffstat (limited to 'pkg/gcrane/options.go')
-rw-r--r-- | pkg/gcrane/options.go | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/pkg/gcrane/options.go b/pkg/gcrane/options.go new file mode 100644 index 0000000..9d34c7d --- /dev/null +++ b/pkg/gcrane/options.go @@ -0,0 +1,122 @@ +// Copyright 2019 Google LLC All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package gcrane + +import ( + "context" + "net/http" + "runtime" + + "github.com/google/go-containerregistry/pkg/authn" + "github.com/google/go-containerregistry/pkg/crane" + "github.com/google/go-containerregistry/pkg/v1/google" + "github.com/google/go-containerregistry/pkg/v1/remote" +) + +// Option is a functional option for gcrane operations. +type Option func(*options) + +type options struct { + jobs int + remote []remote.Option + google []google.Option + crane []crane.Option +} + +func makeOptions(opts ...Option) *options { + o := &options{ + jobs: runtime.GOMAXPROCS(0), + remote: []remote.Option{ + remote.WithAuthFromKeychain(Keychain), + }, + google: []google.Option{ + google.WithAuthFromKeychain(Keychain), + }, + crane: []crane.Option{ + crane.WithAuthFromKeychain(Keychain), + }, + } + + for _, option := range opts { + option(o) + } + + return o +} + +// WithJobs sets the number of concurrent jobs to run. +// +// The default number of jobs is GOMAXPROCS. +func WithJobs(jobs int) Option { + return func(o *options) { + o.jobs = jobs + } +} + +// WithTransport is a functional option for overriding the default transport +// for remote operations. +func WithTransport(t http.RoundTripper) Option { + return func(o *options) { + o.remote = append(o.remote, remote.WithTransport(t)) + o.google = append(o.google, google.WithTransport(t)) + o.crane = append(o.crane, crane.WithTransport(t)) + } +} + +// WithUserAgent adds the given string to the User-Agent header for any HTTP +// requests. +func WithUserAgent(ua string) Option { + return func(o *options) { + o.remote = append(o.remote, remote.WithUserAgent(ua)) + o.google = append(o.google, google.WithUserAgent(ua)) + o.crane = append(o.crane, crane.WithUserAgent(ua)) + } +} + +// WithContext is a functional option for setting the context. +func WithContext(ctx context.Context) Option { + return func(o *options) { + o.remote = append(o.remote, remote.WithContext(ctx)) + o.google = append(o.google, google.WithContext(ctx)) + o.crane = append(o.crane, crane.WithContext(ctx)) + } +} + +// WithKeychain is a functional option for overriding the default +// authenticator for remote operations, using an authn.Keychain to find +// credentials. +// +// By default, gcrane will use gcrane.Keychain. +func WithKeychain(keys authn.Keychain) Option { + return func(o *options) { + // Replace the default keychain at position 0. + o.remote[0] = remote.WithAuthFromKeychain(keys) + o.google[0] = google.WithAuthFromKeychain(keys) + o.crane[0] = crane.WithAuthFromKeychain(keys) + } +} + +// WithAuth is a functional option for overriding the default authenticator +// for remote operations. +// +// By default, gcrane will use gcrane.Keychain. +func WithAuth(auth authn.Authenticator) Option { + return func(o *options) { + // Replace the default keychain at position 0. + o.remote[0] = remote.WithAuth(auth) + o.google[0] = google.WithAuth(auth) + o.crane[0] = crane.WithAuth(auth) + } +} |