summaryrefslogtreecommitdiffstats
path: root/pkg/gcrane/options.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/gcrane/options.go')
-rw-r--r--pkg/gcrane/options.go122
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)
+ }
+}