diff --git a/cmd/flux/create.go b/cmd/flux/create.go index 1d1507d540..10ef64c2ef 100644 --- a/cmd/flux/create.go +++ b/cmd/flux/create.go @@ -17,13 +17,19 @@ limitations under the License. package main import ( + "context" "fmt" "strings" "time" + "github.com/spf13/cobra" + "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/validation" + "k8s.io/apimachinery/pkg/util/wait" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "github.com/spf13/cobra" + "github.com/fluxcd/flux2/internal/utils" ) var createCmd = &cobra.Command{ @@ -46,6 +52,78 @@ func init() { rootCmd.AddCommand(createCmd) } +// upsertable is an interface for values that can be used in `upsert`. +type upsertable interface { + adapter + named +} + +// upsert updates or inserts an object. Instead of providing the +// object itself, you provide a named (as in Name and Namespace) +// template value, and a mutate function which sets the values you +// want to update. The mutate function is nullary -- you mutate a +// value in the closure, e.g., by doing this: +// +// var existing Value +// existing.Name = name +// existing.Namespace = ns +// upsert(ctx, client, valueAdapter{&value}, func() error { +// value.Spec = onePreparedEarlier +// }) +func (names apiType) upsert(ctx context.Context, kubeClient client.Client, object upsertable, mutate func() error) (types.NamespacedName, error) { + nsname := types.NamespacedName{ + Namespace: object.GetNamespace(), + Name: object.GetName(), + } + + op, err := controllerutil.CreateOrUpdate(ctx, kubeClient, object.asRuntimeObject(), mutate) + if err != nil { + return nsname, err + } + + switch op { + case controllerutil.OperationResultCreated: + logger.Successf("%s created", names.kind) + case controllerutil.OperationResultUpdated: + logger.Successf("%s updated", names.kind) + } + return nsname, nil +} + +type upsertWaitable interface { + upsertable + statusable +} + +// upsertAndWait encodes the pattern of creating or updating a +// resource, then waiting for it to reconcile. See the note on +// `upsert` for how to work with the `mutate` argument. +func (names apiType) upsertAndWait(object upsertWaitable, mutate func() error) error { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) // NB globals + if err != nil { + return err + } + + logger.Generatef("generating %s", names.kind) + logger.Actionf("applying %s", names.kind) + + namespacedName, err := imageRepositoryType.upsert(ctx, kubeClient, object, mutate) + if err != nil { + return err + } + + logger.Waitingf("waiting for %s reconciliation", names.kind) + if err := wait.PollImmediate(pollInterval, timeout, + isReady(ctx, kubeClient, namespacedName, object)); err != nil { + return err + } + logger.Successf("%s reconciliation completed", names.kind) + return nil +} + func parseLabels() (map[string]string, error) { result := make(map[string]string) for _, label := range labels { diff --git a/cmd/flux/create_image.go b/cmd/flux/create_image.go new file mode 100644 index 0000000000..5d98b7c08f --- /dev/null +++ b/cmd/flux/create_image.go @@ -0,0 +1,38 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "strings" + + "github.com/spf13/cobra" +) + +const createImageLong = ` +The create image sub-commands work with image automation objects; that is, +object controlling updates to git based on e.g., new container images +being available.` + +var createImageCmd = &cobra.Command{ + Use: "image", + Short: "Create or update resources dealing with image automation", + Long: strings.TrimSpace(createImageLong), +} + +func init() { + createCmd.AddCommand(createImageCmd) +} diff --git a/cmd/flux/create_image_policy.go b/cmd/flux/create_image_policy.go new file mode 100644 index 0000000000..1c77113ca6 --- /dev/null +++ b/cmd/flux/create_image_policy.go @@ -0,0 +1,110 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "fmt" + + "github.com/spf13/cobra" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + imagev1 "github.com/fluxcd/image-reflector-controller/api/v1alpha1" +) + +var createImagePolicyCmd = &cobra.Command{ + Use: "policy ", + Short: "Create or update an ImagePolicy object", + Long: `The create image policy command generates an ImagePolicy resource. +An ImagePolicy object calculates a "latest image" given an image +repository and a policy, e.g., semver. + +The image that sorts highest according to the policy is recorded in +the status of the object.`, + RunE: createImagePolicyRun} + +type imagePolicyFlags struct { + imageRef string + semver string +} + +var imagePolicyArgs = imagePolicyFlags{} + +func init() { + flags := createImagePolicyCmd.Flags() + flags.StringVar(&imagePolicyArgs.imageRef, "image-ref", "", "the name of an image repository object") + flags.StringVar(&imagePolicyArgs.semver, "semver", "", "a semver range to apply to tags; e.g., '1.x'") + + createImageCmd.AddCommand(createImagePolicyCmd) +} + +// getObservedGeneration is implemented here, since it's not +// (presently) needed elsewhere. +func (obj imagePolicyAdapter) getObservedGeneration() int64 { + return obj.ImagePolicy.Status.ObservedGeneration +} + +func createImagePolicyRun(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("ImagePolicy name is required") + } + objectName := args[0] + + if imagePolicyArgs.imageRef == "" { + return fmt.Errorf("the name of an ImageRepository in the namespace is required (--image-ref)") + } + + labels, err := parseLabels() + if err != nil { + return err + } + + var policy = imagev1.ImagePolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: objectName, + Namespace: namespace, + Labels: labels, + }, + Spec: imagev1.ImagePolicySpec{ + ImageRepositoryRef: corev1.LocalObjectReference{ + Name: imagePolicyArgs.imageRef, + }, + }, + } + + switch { + case imagePolicyArgs.semver != "": + policy.Spec.Policy.SemVer = &imagev1.SemVerPolicy{ + Range: imagePolicyArgs.semver, + } + default: + return fmt.Errorf("a policy must be provided with --semver") + } + + if export { + return printExport(exportImagePolicy(&policy)) + } + + var existing imagev1.ImagePolicy + copyName(&existing, &policy) + err = imagePolicyType.upsertAndWait(imagePolicyAdapter{&existing}, func() error { + existing.Spec = policy.Spec + existing.SetLabels(policy.Labels) + return nil + }) + return err +} diff --git a/cmd/flux/create_image_repository.go b/cmd/flux/create_image_repository.go new file mode 100644 index 0000000000..03daf0ec10 --- /dev/null +++ b/cmd/flux/create_image_repository.go @@ -0,0 +1,110 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "fmt" + "time" + + "github.com/google/go-containerregistry/pkg/name" + "github.com/spf13/cobra" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + imagev1 "github.com/fluxcd/image-reflector-controller/api/v1alpha1" +) + +var createImageRepositoryCmd = &cobra.Command{ + Use: "repository ", + Short: "Create or update an ImageRepository object", + Long: `The create image repository command generates an ImageRepository resource. +An ImageRepository object specifies an image repository to scan.`, + RunE: createImageRepositoryRun, +} + +type imageRepoFlags struct { + image string + secretRef string + timeout time.Duration +} + +var imageRepoArgs = imageRepoFlags{} + +func init() { + flags := createImageRepositoryCmd.Flags() + flags.StringVar(&imageRepoArgs.image, "image", "", "the image repository to scan; e.g., library/alpine") + flags.StringVar(&imageRepoArgs.secretRef, "secret-ref", "", "the name of a docker-registry secret to use for credentials") + // NB there is already a --timeout in the global flags, for + // controlling timeout on operations while e.g., creating objects. + flags.DurationVar(&imageRepoArgs.timeout, "scan-timeout", 0, "a timeout for scanning; this defaults to the interval if not set") + + createImageCmd.AddCommand(createImageRepositoryCmd) +} + +func createImageRepositoryRun(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("ImageRepository name is required") + } + objectName := args[0] + + if imageRepoArgs.image == "" { + return fmt.Errorf("an image repository (--image) is required") + } + + if _, err := name.NewRepository(imageRepoArgs.image); err != nil { + return fmt.Errorf("unable to parse image value: %w", err) + } + + labels, err := parseLabels() + if err != nil { + return err + } + + var repo = imagev1.ImageRepository{ + ObjectMeta: metav1.ObjectMeta{ + Name: objectName, + Namespace: namespace, + Labels: labels, + }, + Spec: imagev1.ImageRepositorySpec{ + Image: imageRepoArgs.image, + Interval: metav1.Duration{Duration: interval}, + }, + } + if imageRepoArgs.timeout != 0 { + repo.Spec.Timeout = &metav1.Duration{Duration: imageRepoArgs.timeout} + } + if imageRepoArgs.secretRef != "" { + repo.Spec.SecretRef = &corev1.LocalObjectReference{ + Name: imageRepoArgs.secretRef, + } + } + + if export { + return printExport(exportImageRepository(&repo)) + } + + // a temp value for use with the rest + var existing imagev1.ImageRepository + copyName(&existing, &repo) + err = imageRepositoryType.upsertAndWait(imageRepositoryAdapter{&existing}, func() error { + existing.Spec = repo.Spec + existing.Labels = repo.Labels + return nil + }) + return err +} diff --git a/cmd/flux/create_image_updateauto.go b/cmd/flux/create_image_updateauto.go new file mode 100644 index 0000000000..0f1935f383 --- /dev/null +++ b/cmd/flux/create_image_updateauto.go @@ -0,0 +1,113 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "fmt" + + "github.com/spf13/cobra" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + autov1 "github.com/fluxcd/image-automation-controller/api/v1alpha1" +) + +var createImageUpdateCmd = &cobra.Command{ + Use: "update ", + Short: "Create or update an ImageUpdateAutomation object", + Long: `The create image update command generates an ImageUpdateAutomation resource. +An ImageUpdateAutomation object specifies an automated update to images +mentioned in YAMLs in a git repository.`, + RunE: createImageUpdateRun, +} + +type imageUpdateFlags struct { + // git checkout spec + gitRepoRef string + branch string + // commit spec + commitTemplate string + authorName string + authorEmail string +} + +var imageUpdateArgs = imageUpdateFlags{} + +func init() { + flags := createImageUpdateCmd.Flags() + flags.StringVar(&imageUpdateArgs.gitRepoRef, "git-repo-ref", "", "the name of a GitRepository resource with details of the upstream git repository") + flags.StringVar(&imageUpdateArgs.branch, "branch", "", "the branch to push commits to") + flags.StringVar(&imageUpdateArgs.commitTemplate, "commit-template", "", "a template for commit messages") + flags.StringVar(&imageUpdateArgs.authorName, "author-name", "", "the name to use for commit author") + flags.StringVar(&imageUpdateArgs.authorEmail, "author-email", "", "the email to use for commit author") + + createImageCmd.AddCommand(createImageUpdateCmd) +} + +func createImageUpdateRun(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("ImageUpdateAutomation name is required") + } + objectName := args[0] + + if imageUpdateArgs.gitRepoRef == "" { + return fmt.Errorf("a reference to a GitRepository is required (--git-repo-ref)") + } + + labels, err := parseLabels() + if err != nil { + return err + } + + var update = autov1.ImageUpdateAutomation{ + ObjectMeta: metav1.ObjectMeta{ + Name: objectName, + Namespace: namespace, + Labels: labels, + }, + Spec: autov1.ImageUpdateAutomationSpec{ + Checkout: autov1.GitCheckoutSpec{ + GitRepositoryRef: corev1.LocalObjectReference{ + Name: imageUpdateArgs.gitRepoRef, + }, + Branch: imageUpdateArgs.branch, + }, + Interval: metav1.Duration{Duration: interval}, + Update: autov1.UpdateStrategy{ + Setters: &autov1.SettersStrategy{}, + }, + Commit: autov1.CommitSpec{ + AuthorName: imageUpdateArgs.authorName, + AuthorEmail: imageUpdateArgs.authorEmail, + MessageTemplate: imageUpdateArgs.commitTemplate, + }, + }, + } + + if export { + return printExport(exportImageUpdate(&update)) + } + + var existing autov1.ImageUpdateAutomation + copyName(&existing, &update) + err = imageUpdateAutomationType.upsertAndWait(imageUpdateAutomationAdapter{&existing}, func() error { + existing.Spec = update.Spec + existing.Labels = update.Labels + return nil + }) + return err +} diff --git a/cmd/flux/delete.go b/cmd/flux/delete.go index a276c0d840..ae6e3d313b 100644 --- a/cmd/flux/delete.go +++ b/cmd/flux/delete.go @@ -17,7 +17,14 @@ limitations under the License. package main import ( + "context" + "fmt" + + "github.com/manifoldco/promptui" "github.com/spf13/cobra" + "k8s.io/apimachinery/pkg/types" + + "github.com/fluxcd/flux2/internal/utils" ) var deleteCmd = &cobra.Command{ @@ -36,3 +43,52 @@ func init() { rootCmd.AddCommand(deleteCmd) } + +type deleteCommand struct { + apiType + object adapter // for getting the value, and later deleting it +} + +func (del deleteCommand) run(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("%s name is required", del.humanKind) + } + name := args[0] + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + namespacedName := types.NamespacedName{ + Namespace: namespace, + Name: name, + } + + err = kubeClient.Get(ctx, namespacedName, del.object.asRuntimeObject()) + if err != nil { + return err + } + + if !deleteSilent { + prompt := promptui.Prompt{ + Label: "Are you sure you want to delete this " + del.humanKind, + IsConfirm: true, + } + if _, err := prompt.Run(); err != nil { + return fmt.Errorf("aborting") + } + } + + logger.Actionf("deleting %s %s in %s namespace", del.humanKind, name, namespace) + err = kubeClient.Delete(ctx, del.object.asRuntimeObject()) + if err != nil { + return err + } + logger.Successf("%s deleted", del.humanKind) + + return nil +} diff --git a/cmd/flux/delete_image.go b/cmd/flux/delete_image.go new file mode 100644 index 0000000000..f5d125d215 --- /dev/null +++ b/cmd/flux/delete_image.go @@ -0,0 +1,31 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "github.com/spf13/cobra" +) + +var deleteAutoCmd = &cobra.Command{ + Use: "auto", + Short: "Delete automation objects", + Long: "The delete auto sub-commands delete automation objects.", +} + +func init() { + deleteCmd.AddCommand(deleteAutoCmd) +} diff --git a/cmd/flux/delete_image_policy.go b/cmd/flux/delete_image_policy.go new file mode 100644 index 0000000000..2daf9f0c95 --- /dev/null +++ b/cmd/flux/delete_image_policy.go @@ -0,0 +1,40 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "github.com/spf13/cobra" + + imagev1 "github.com/fluxcd/image-reflector-controller/api/v1alpha1" +) + +var deleteImagePolicyCmd = &cobra.Command{ + Use: "image-policy [name]", + Short: "Delete an ImagePolicy object", + Long: "The delete auto image-policy command deletes the given ImagePolicy from the cluster.", + Example: ` # Delete an image policy + flux delete auto image-policy alpine3.x +`, + RunE: deleteCommand{ + apiType: imagePolicyType, + object: universalAdapter{&imagev1.ImagePolicy{}}, + }.run, +} + +func init() { + deleteAutoCmd.AddCommand(deleteImagePolicyCmd) +} diff --git a/cmd/flux/delete_image_repository.go b/cmd/flux/delete_image_repository.go new file mode 100644 index 0000000000..46669eb72a --- /dev/null +++ b/cmd/flux/delete_image_repository.go @@ -0,0 +1,40 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "github.com/spf13/cobra" + + imagev1 "github.com/fluxcd/image-reflector-controller/api/v1alpha1" +) + +var deleteImageRepositoryCmd = &cobra.Command{ + Use: "image-repository [name]", + Short: "Delete an ImageRepository object", + Long: "The delete auto image-repository command deletes the given ImageRepository from the cluster.", + Example: ` # Delete an image repository + flux delete auto image-repository alpine +`, + RunE: deleteCommand{ + apiType: imageRepositoryType, + object: universalAdapter{&imagev1.ImageRepository{}}, + }.run, +} + +func init() { + deleteAutoCmd.AddCommand(deleteImageRepositoryCmd) +} diff --git a/cmd/flux/delete_image_updateauto.go b/cmd/flux/delete_image_updateauto.go new file mode 100644 index 0000000000..0eb76a33e8 --- /dev/null +++ b/cmd/flux/delete_image_updateauto.go @@ -0,0 +1,40 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "github.com/spf13/cobra" + + autov1 "github.com/fluxcd/image-automation-controller/api/v1alpha1" +) + +var deleteImageUpdateCmd = &cobra.Command{ + Use: "image-update [name]", + Short: "Delete an ImageUpdateAutomation object", + Long: "The delete auto image-update command deletes the given ImageUpdateAutomation from the cluster.", + Example: ` # Delete an image update automation + flux delete auto image-update latest-images +`, + RunE: deleteCommand{ + apiType: imageUpdateAutomationType, + object: universalAdapter{&autov1.ImageUpdateAutomation{}}, + }.run, +} + +func init() { + deleteAutoCmd.AddCommand(deleteImageUpdateCmd) +} diff --git a/cmd/flux/export.go b/cmd/flux/export.go index a94ad483c2..4a546369b6 100644 --- a/cmd/flux/export.go +++ b/cmd/flux/export.go @@ -18,8 +18,15 @@ package main import ( "bytes" + "context" + "fmt" "github.com/spf13/cobra" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/yaml" + + "github.com/fluxcd/flux2/internal/utils" ) var exportCmd = &cobra.Command{ @@ -38,6 +45,80 @@ func init() { rootCmd.AddCommand(exportCmd) } +// exportable represents a type that you can fetch from the Kubernetes +// API, then tidy up for serialising. +type exportable interface { + adapter + export() interface{} +} + +// exportableList represents a type that has a list of values, each of +// which is exportable. +type exportableList interface { + adapter + len() int + exportItem(i int) interface{} +} + +type exportCommand struct { + object exportable + list exportableList +} + +func (export exportCommand) run(cmd *cobra.Command, args []string) error { + if !exportAll && len(args) < 1 { + return fmt.Errorf("name is required") + } + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + if exportAll { + err = kubeClient.List(ctx, export.list.asRuntimeObject(), client.InNamespace(namespace)) + if err != nil { + return err + } + + if export.list.len() == 0 { + logger.Failuref("no objects found in %s namespace", namespace) + return nil + } + + for i := 0; i < export.list.len(); i++ { + if err = printExport(export.list.exportItem(i)); err != nil { + return err + } + } + } else { + name := args[0] + namespacedName := types.NamespacedName{ + Namespace: namespace, + Name: name, + } + err = kubeClient.Get(ctx, namespacedName, export.object.asRuntimeObject()) + if err != nil { + return err + } + return printExport(export.object.export()) + } + return nil +} + +func printExport(export interface{}) error { + data, err := yaml.Marshal(export) + if err != nil { + return err + } + fmt.Println("---") + fmt.Println(resourceToString(data)) + return nil +} + func resourceToString(data []byte) string { data = bytes.Replace(data, []byte(" creationTimestamp: null\n"), []byte(""), 1) data = bytes.Replace(data, []byte("status: {}\n"), []byte(""), 1) diff --git a/cmd/flux/export_image.go b/cmd/flux/export_image.go new file mode 100644 index 0000000000..24410c9797 --- /dev/null +++ b/cmd/flux/export_image.go @@ -0,0 +1,31 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "github.com/spf13/cobra" +) + +var exportImageCmd = &cobra.Command{ + Use: "image", + Short: "Export image automation objects", + Long: "The export image sub-commands export image automation objects in YAML format.", +} + +func init() { + exportCmd.AddCommand(exportImageCmd) +} diff --git a/cmd/flux/export_image_policy.go b/cmd/flux/export_image_policy.go new file mode 100644 index 0000000000..3ee55f2e27 --- /dev/null +++ b/cmd/flux/export_image_policy.go @@ -0,0 +1,72 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "github.com/spf13/cobra" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + imagev1 "github.com/fluxcd/image-reflector-controller/api/v1alpha1" +) + +var exportImagePolicyCmd = &cobra.Command{ + Use: "policy [name]", + Short: "Export ImagePolicy resources in YAML format", + Long: "The export image policy command exports one or all ImagePolicy resources in YAML format.", + Example: ` # Export all ImagePolicy resources + flux export image policy --all > image-policies.yaml + + # Export a specific policy + flux export image policy alpine1x > alpine1x.yaml +`, + RunE: exportCommand{ + object: imagePolicyAdapter{&imagev1.ImagePolicy{}}, + list: imagePolicyListAdapter{&imagev1.ImagePolicyList{}}, + }.run, +} + +func init() { + exportImageCmd.AddCommand(exportImagePolicyCmd) +} + +// Export returns a ImagePolicy value which has extraneous information +// stripped out. +func exportImagePolicy(item *imagev1.ImagePolicy) interface{} { + gvk := imagev1.GroupVersion.WithKind(imagev1.ImagePolicyKind) + export := imagev1.ImagePolicy{ + TypeMeta: metav1.TypeMeta{ + Kind: gvk.Kind, + APIVersion: gvk.GroupVersion().String(), + }, + ObjectMeta: metav1.ObjectMeta{ + Name: item.Name, + Namespace: item.Namespace, + Labels: item.Labels, + Annotations: item.Annotations, + }, + Spec: item.Spec, + } + return export +} + +func (ex imagePolicyAdapter) export() interface{} { + return exportImagePolicy(ex.ImagePolicy) +} + +func (ex imagePolicyListAdapter) exportItem(i int) interface{} { + return exportImagePolicy(&ex.ImagePolicyList.Items[i]) +} diff --git a/cmd/flux/export_image_repository.go b/cmd/flux/export_image_repository.go new file mode 100644 index 0000000000..25c6e96c15 --- /dev/null +++ b/cmd/flux/export_image_repository.go @@ -0,0 +1,70 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "github.com/spf13/cobra" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + imagev1 "github.com/fluxcd/image-reflector-controller/api/v1alpha1" +) + +var exportImageRepositoryCmd = &cobra.Command{ + Use: "repository [name]", + Short: "Export ImageRepository resources in YAML format", + Long: "The export image repository command exports one or all ImageRepository resources in YAML format.", + Example: ` # Export all ImageRepository resources + flux export image repository --all > image-repositories.yaml + + # Export a specific ImageRepository resource + flux export image repository alpine > alpine.yaml +`, + RunE: exportCommand{ + object: imageRepositoryAdapter{&imagev1.ImageRepository{}}, + list: imageRepositoryListAdapter{&imagev1.ImageRepositoryList{}}, + }.run, +} + +func init() { + exportImageCmd.AddCommand(exportImageRepositoryCmd) +} + +func exportImageRepository(repo *imagev1.ImageRepository) interface{} { + gvk := imagev1.GroupVersion.WithKind(imagev1.ImageRepositoryKind) + export := imagev1.ImageRepository{ + TypeMeta: metav1.TypeMeta{ + Kind: gvk.Kind, + APIVersion: gvk.GroupVersion().String(), + }, + ObjectMeta: metav1.ObjectMeta{ + Name: repo.Name, + Namespace: repo.Namespace, + Labels: repo.Labels, + Annotations: repo.Annotations, + }, + Spec: repo.Spec, + } + return export +} + +func (ex imageRepositoryAdapter) export() interface{} { + return exportImageRepository(ex.ImageRepository) +} + +func (ex imageRepositoryListAdapter) exportItem(i int) interface{} { + return exportImageRepository(&ex.ImageRepositoryList.Items[i]) +} diff --git a/cmd/flux/export_image_updateauto.go b/cmd/flux/export_image_updateauto.go new file mode 100644 index 0000000000..21f89d360f --- /dev/null +++ b/cmd/flux/export_image_updateauto.go @@ -0,0 +1,72 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "github.com/spf13/cobra" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + autov1 "github.com/fluxcd/image-automation-controller/api/v1alpha1" +) + +var exportImageUpdateCmd = &cobra.Command{ + Use: "update [name]", + Short: "Export ImageUpdateAutomation resources in YAML format", + Long: "The export image update command exports one or all ImageUpdateAutomation resources in YAML format.", + Example: ` # Export all ImageUpdateAutomation resources + flux export image update --all > updates.yaml + + # Export a specific automation + flux export image update latest-images > latest.yaml +`, + RunE: exportCommand{ + object: imageUpdateAutomationAdapter{&autov1.ImageUpdateAutomation{}}, + list: imageUpdateAutomationListAdapter{&autov1.ImageUpdateAutomationList{}}, + }.run, +} + +func init() { + exportImageCmd.AddCommand(exportImageUpdateCmd) +} + +// exportImageUpdate returns a value which has extraneous information +// stripped out. +func exportImageUpdate(item *autov1.ImageUpdateAutomation) interface{} { + gvk := autov1.GroupVersion.WithKind(autov1.ImageUpdateAutomationKind) + export := autov1.ImageUpdateAutomation{ + TypeMeta: metav1.TypeMeta{ + Kind: gvk.Kind, + APIVersion: gvk.GroupVersion().String(), + }, + ObjectMeta: metav1.ObjectMeta{ + Name: item.Name, + Namespace: item.Namespace, + Labels: item.Labels, + Annotations: item.Annotations, + }, + Spec: item.Spec, + } + return export +} + +func (ex imageUpdateAutomationAdapter) export() interface{} { + return exportImageUpdate(ex.ImageUpdateAutomation) +} + +func (ex imageUpdateAutomationListAdapter) exportItem(i int) interface{} { + return exportImageUpdate(&ex.ImageUpdateAutomationList.Items[i]) +} diff --git a/cmd/flux/get.go b/cmd/flux/get.go index 059a32e7b4..f989e689fc 100644 --- a/cmd/flux/get.go +++ b/cmd/flux/get.go @@ -17,7 +17,17 @@ limitations under the License. package main import ( + "context" + "os" + "github.com/spf13/cobra" + apimeta "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/fluxcd/pkg/apis/meta" + + "github.com/fluxcd/flux2/internal/utils" ) var getCmd = &cobra.Command{ @@ -33,3 +43,66 @@ func init() { "list the requested object(s) across all namespaces") rootCmd.AddCommand(getCmd) } + +type summarisable interface { + adapter + len() int + summariseItem(i int, includeNamespace bool) []string + headers(includeNamespace bool) []string +} + +// --- these help with implementations of summarisable + +func statusAndMessage(conditions []metav1.Condition) (string, string) { + if c := apimeta.FindStatusCondition(conditions, meta.ReadyCondition); c != nil { + return string(c.Status), c.Message + } + return string(metav1.ConditionFalse), "waiting to be reconciled" +} + +func nameColumns(item named, includeNamespace bool) []string { + if includeNamespace { + return []string{item.GetNamespace(), item.GetName()} + } + return []string{item.GetName()} +} + +var namespaceHeader = []string{"Namespace"} + +type getCommand struct { + apiType + list summarisable +} + +func (get getCommand) run(cmd *cobra.Command, args []string) error { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + var listOpts []client.ListOption + if !allNamespaces { + listOpts = append(listOpts, client.InNamespace(namespace)) + } + err = kubeClient.List(ctx, get.list.asRuntimeObject(), listOpts...) + if err != nil { + return err + } + + if get.list.len() == 0 { + logger.Failuref("no %s objects found in %s namespace", get.kind, namespace) + return nil + } + + header := get.list.headers(allNamespaces) + var rows [][]string + for i := 0; i < get.list.len(); i++ { + row := get.list.summariseItem(i, allNamespaces) + rows = append(rows, row) + } + utils.PrintTable(os.Stdout, header, rows) + return nil +} diff --git a/cmd/flux/get_image.go b/cmd/flux/get_image.go new file mode 100644 index 0000000000..44e3988073 --- /dev/null +++ b/cmd/flux/get_image.go @@ -0,0 +1,31 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "github.com/spf13/cobra" +) + +var getImageCmd = &cobra.Command{ + Use: "image", + Short: "Get image automation object status", + Long: "The get image sub-commands print the status of image automation objects.", +} + +func init() { + getCmd.AddCommand(getImageCmd) +} diff --git a/cmd/flux/get_image_policy.go b/cmd/flux/get_image_policy.go new file mode 100644 index 0000000000..5846894313 --- /dev/null +++ b/cmd/flux/get_image_policy.go @@ -0,0 +1,57 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "github.com/spf13/cobra" + + imagev1 "github.com/fluxcd/image-reflector-controller/api/v1alpha1" +) + +var getImagePolicyCmd = &cobra.Command{ + Use: "policy", + Short: "Get ImagePolicy status", + Long: "The get image policy command prints the status of ImagePolicy objects.", + Example: ` # List all image policies and their status + flux get image policy + + # List image policies from all namespaces + flux get image policy --all-namespaces +`, + RunE: getCommand{ + apiType: imagePolicyType, + list: &imagePolicyListAdapter{&imagev1.ImagePolicyList{}}, + }.run, +} + +func init() { + getImageCmd.AddCommand(getImagePolicyCmd) +} + +func (s imagePolicyListAdapter) summariseItem(i int, includeNamespace bool) []string { + item := s.Items[i] + status, msg := statusAndMessage(item.Status.Conditions) + return append(nameColumns(&item, includeNamespace), status, msg, item.Status.LatestImage) +} + +func (s imagePolicyListAdapter) headers(includeNamespace bool) []string { + headers := []string{"Name", "Ready", "Message", "Latest image"} + if includeNamespace { + return append(namespaceHeader, headers...) + } + return headers +} diff --git a/cmd/flux/get_image_repository.go b/cmd/flux/get_image_repository.go new file mode 100644 index 0000000000..c8a8583db4 --- /dev/null +++ b/cmd/flux/get_image_repository.go @@ -0,0 +1,66 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "strconv" + "strings" + "time" + + "github.com/spf13/cobra" + + imagev1 "github.com/fluxcd/image-reflector-controller/api/v1alpha1" +) + +var getImageRepositoryCmd = &cobra.Command{ + Use: "repository", + Short: "Get ImageRepository status", + Long: "The get image repository command prints the status of ImageRepository objects.", + Example: ` # List all image repositories and their status + flux get image repository + + # List image repositories from all namespaces + flux get image repository --all-namespaces +`, + RunE: getCommand{ + apiType: imageRepositoryType, + list: imageRepositoryListAdapter{&imagev1.ImageRepositoryList{}}, + }.run, +} + +func init() { + getImageCmd.AddCommand(getImageRepositoryCmd) +} + +func (s imageRepositoryListAdapter) summariseItem(i int, includeNamespace bool) []string { + item := s.Items[i] + status, msg := statusAndMessage(item.Status.Conditions) + var lastScan string + if item.Status.LastScanResult != nil { + lastScan = item.Status.LastScanResult.ScanTime.Time.Format(time.RFC3339) + } + return append(nameColumns(&item, includeNamespace), + status, msg, lastScan, strings.Title(strconv.FormatBool(item.Spec.Suspend))) +} + +func (s imageRepositoryListAdapter) headers(includeNamespace bool) []string { + headers := []string{"Name", "Ready", "Message", "Last scan", "Suspended"} + if includeNamespace { + return append(namespaceHeader, headers...) + } + return headers +} diff --git a/cmd/flux/get_image_updateauto.go b/cmd/flux/get_image_updateauto.go new file mode 100644 index 0000000000..b56bea18b8 --- /dev/null +++ b/cmd/flux/get_image_updateauto.go @@ -0,0 +1,65 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "strconv" + "strings" + "time" + + "github.com/spf13/cobra" + + autov1 "github.com/fluxcd/image-automation-controller/api/v1alpha1" +) + +var getImageUpdateCmd = &cobra.Command{ + Use: "update", + Short: "Get ImageUpdateAutomation status", + Long: "The get image update command prints the status of ImageUpdateAutomation objects.", + Example: ` # List all image update automation object and their status + flux get image update + + # List image update automations from all namespaces + flux get image update --all-namespaces +`, + RunE: getCommand{ + apiType: imageUpdateAutomationType, + list: &imageUpdateAutomationListAdapter{&autov1.ImageUpdateAutomationList{}}, + }.run, +} + +func init() { + getImageCmd.AddCommand(getImageUpdateCmd) +} + +func (s imageUpdateAutomationListAdapter) summariseItem(i int, includeNamespace bool) []string { + item := s.Items[i] + status, msg := statusAndMessage(item.Status.Conditions) + var lastRun string + if item.Status.LastAutomationRunTime != nil { + lastRun = item.Status.LastAutomationRunTime.Time.Format(time.RFC3339) + } + return append(nameColumns(&item, includeNamespace), status, msg, lastRun, strings.Title(strconv.FormatBool(item.Spec.Suspend))) +} + +func (s imageUpdateAutomationListAdapter) headers(includeNamespace bool) []string { + headers := []string{"Name", "Ready", "Message", "Last run", "Suspended"} + if includeNamespace { + return append(namespaceHeader, headers...) + } + return headers +} diff --git a/cmd/flux/image.go b/cmd/flux/image.go new file mode 100644 index 0000000000..ed307ae20d --- /dev/null +++ b/cmd/flux/image.go @@ -0,0 +1,115 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "k8s.io/apimachinery/pkg/runtime" + + autov1 "github.com/fluxcd/image-automation-controller/api/v1alpha1" + imagev1 "github.com/fluxcd/image-reflector-controller/api/v1alpha1" +) + +// These are general-purpose adapters for attaching methods to, for +// the various commands. The *List adapters implement len(), since +// it's used in at least a couple of commands. + +// imagev1.ImageRepository + +var imageRepositoryType = apiType{ + kind: imagev1.ImageRepositoryKind, + humanKind: "image repository", +} + +type imageRepositoryAdapter struct { + *imagev1.ImageRepository +} + +func (a imageRepositoryAdapter) asRuntimeObject() runtime.Object { + return a.ImageRepository +} + +// imagev1.ImageRepositoryList + +type imageRepositoryListAdapter struct { + *imagev1.ImageRepositoryList +} + +func (a imageRepositoryListAdapter) asRuntimeObject() runtime.Object { + return a.ImageRepositoryList +} + +func (a imageRepositoryListAdapter) len() int { + return len(a.ImageRepositoryList.Items) +} + +// imagev1.ImagePolicy + +var imagePolicyType = apiType{ + kind: imagev1.ImagePolicyKind, + humanKind: "image policy", +} + +type imagePolicyAdapter struct { + *imagev1.ImagePolicy +} + +func (a imagePolicyAdapter) asRuntimeObject() runtime.Object { + return a.ImagePolicy +} + +// imagev1.ImagePolicyList + +type imagePolicyListAdapter struct { + *imagev1.ImagePolicyList +} + +func (a imagePolicyListAdapter) asRuntimeObject() runtime.Object { + return a.ImagePolicyList +} + +func (a imagePolicyListAdapter) len() int { + return len(a.ImagePolicyList.Items) +} + +// autov1.ImageUpdateAutomation + +var imageUpdateAutomationType = apiType{ + kind: autov1.ImageUpdateAutomationKind, + humanKind: "image update automation", +} + +type imageUpdateAutomationAdapter struct { + *autov1.ImageUpdateAutomation +} + +func (a imageUpdateAutomationAdapter) asRuntimeObject() runtime.Object { + return a.ImageUpdateAutomation +} + +// autov1.ImageUpdateAutomationList + +type imageUpdateAutomationListAdapter struct { + *autov1.ImageUpdateAutomationList +} + +func (a imageUpdateAutomationListAdapter) asRuntimeObject() runtime.Object { + return a.ImageUpdateAutomationList +} + +func (a imageUpdateAutomationListAdapter) len() int { + return len(a.ImageUpdateAutomationList.Items) +} diff --git a/cmd/flux/object.go b/cmd/flux/object.go new file mode 100644 index 0000000000..4b884e35bc --- /dev/null +++ b/cmd/flux/object.go @@ -0,0 +1,64 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "k8s.io/apimachinery/pkg/runtime" +) + +// Most commands need one or both of the kind (e.g., +// `"ImageRepository"`) and a human-palatable name for the kind (e.g., +// `"image repository"`), to be interpolated into output. It's +// convenient to package these up ahead of time, then the command +// implementation can pick whichever it wants to use. +type apiType struct { + kind, humanKind string +} + +// adapter is an interface for a wrapper or alias from which we can +// get a controller-runtime deserialisable value. This is used so that +// you can wrap an API type to give it other useful methods, but still +// use values of the wrapper with `client.Client`, which only deals +// with types that have been added to the schema. +type adapter interface { + asRuntimeObject() runtime.Object +} + +// universalAdapter is an adapter for any runtime.Object. Use this if +// there are no other methods needed. +type universalAdapter struct { + obj runtime.Object +} + +func (c universalAdapter) asRuntimeObject() runtime.Object { + return c.obj +} + +// named is for adapters that have Name and Namespace fields, which +// are sometimes handy to get hold of. ObjectMeta implements these, so +// they shouldn't need any extra work. +type named interface { + GetName() string + GetNamespace() string + SetName(string) + SetNamespace(string) +} + +func copyName(target, source named) { + target.SetName(source.GetName()) + target.SetNamespace(source.GetNamespace()) +} diff --git a/cmd/flux/reconcile.go b/cmd/flux/reconcile.go index e718c8a21b..3418e78924 100644 --- a/cmd/flux/reconcile.go +++ b/cmd/flux/reconcile.go @@ -17,7 +17,20 @@ limitations under the License. package main import ( + "context" + "fmt" + "time" + + "github.com/fluxcd/pkg/apis/meta" "github.com/spf13/cobra" + apimeta "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/client-go/util/retry" + "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/fluxcd/flux2/internal/utils" ) var reconcileCmd = &cobra.Command{ @@ -29,3 +42,101 @@ var reconcileCmd = &cobra.Command{ func init() { rootCmd.AddCommand(reconcileCmd) } + +type reconcileCommand struct { + apiType + object reconcilable +} + +type reconcilable interface { + adapter // to be able to load from the cluster + suspendable // to tell if it's suspended + + // these are implemented by anything embedding metav1.ObjectMeta + GetAnnotations() map[string]string + SetAnnotations(map[string]string) + + // this is usually implemented by GOTK types, since it's used for meta.SetResourceCondition + GetStatusConditions() *[]metav1.Condition + + lastHandledReconcileRequest() string // what was the last handled reconcile request? + successMessage() string // what do you want to tell people when successfully reconciled? +} + +func (reconcile reconcileCommand) run(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("%s name is required", reconcile.kind) + } + name := args[0] + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + namespacedName := types.NamespacedName{ + Namespace: namespace, + Name: name, + } + + err = kubeClient.Get(ctx, namespacedName, reconcile.object.asRuntimeObject()) + if err != nil { + return err + } + + if reconcile.object.isSuspended() { + return fmt.Errorf("resource is suspended") + } + + logger.Actionf("annotating %s %s in %s namespace", reconcile.kind, name, namespace) + if err := requestReconciliation(ctx, kubeClient, namespacedName, reconcile.object); err != nil { + return err + } + logger.Successf("%s annotated", reconcile.kind) + + lastHandledReconcileAt := reconcile.object.lastHandledReconcileRequest() + logger.Waitingf("waiting for %s reconciliation", reconcile.kind) + if err := wait.PollImmediate(pollInterval, timeout, + reconciliationHandled(ctx, kubeClient, namespacedName, reconcile.object, lastHandledReconcileAt)); err != nil { + return err + } + logger.Successf("%s reconciliation completed", reconcile.kind) + + if apimeta.IsStatusConditionFalse(*reconcile.object.GetStatusConditions(), meta.ReadyCondition) { + return fmt.Errorf("%s reconciliation failed", reconcile.kind) + } + logger.Successf(reconcile.object.successMessage()) + return nil +} + +func reconciliationHandled(ctx context.Context, kubeClient client.Client, + namespacedName types.NamespacedName, obj reconcilable, lastHandledReconcileAt string) wait.ConditionFunc { + return func() (bool, error) { + err := kubeClient.Get(ctx, namespacedName, obj.asRuntimeObject()) + if err != nil { + return false, err + } + return obj.lastHandledReconcileRequest() != lastHandledReconcileAt, nil + } +} + +func requestReconciliation(ctx context.Context, kubeClient client.Client, + namespacedName types.NamespacedName, obj reconcilable) error { + return retry.RetryOnConflict(retry.DefaultBackoff, func() (err error) { + if err := kubeClient.Get(ctx, namespacedName, obj.asRuntimeObject()); err != nil { + return err + } + if ann := obj.GetAnnotations(); ann == nil { + obj.SetAnnotations(map[string]string{ + meta.ReconcileAtAnnotation: time.Now().Format(time.RFC3339Nano), + }) + } else { + ann[meta.ReconcileAtAnnotation] = time.Now().Format(time.RFC3339Nano) + obj.SetAnnotations(ann) + } + return kubeClient.Update(ctx, obj.asRuntimeObject()) + }) +} diff --git a/cmd/flux/reconcile_image.go b/cmd/flux/reconcile_image.go new file mode 100644 index 0000000000..8d1d432e0d --- /dev/null +++ b/cmd/flux/reconcile_image.go @@ -0,0 +1,31 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "github.com/spf13/cobra" +) + +var reconcileImageCmd = &cobra.Command{ + Use: "image", + Short: "Reconcile image automation objects", + Long: "The reconcile sub-commands trigger a reconciliation of image automation objects.", +} + +func init() { + reconcileCmd.AddCommand(reconcileImageCmd) +} diff --git a/cmd/flux/reconcile_image_repository.go b/cmd/flux/reconcile_image_repository.go new file mode 100644 index 0000000000..e7a2d88880 --- /dev/null +++ b/cmd/flux/reconcile_image_repository.go @@ -0,0 +1,50 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "fmt" + + "github.com/spf13/cobra" + + imagev1 "github.com/fluxcd/image-reflector-controller/api/v1alpha1" +) + +var reconcileImageRepositoryCmd = &cobra.Command{ + Use: "repository [name]", + Short: "Reconcile an ImageRepository", + Long: `The reconcile image repository command triggers a reconciliation of an ImageRepository resource and waits for it to finish.`, + Example: ` # Trigger an scan for an existing image repository + flux reconcile image repository alpine +`, + RunE: reconcileCommand{ + apiType: imageRepositoryType, + object: imageRepositoryAdapter{&imagev1.ImageRepository{}}, + }.run, +} + +func init() { + reconcileImageCmd.AddCommand(reconcileImageRepositoryCmd) +} + +func (obj imageRepositoryAdapter) lastHandledReconcileRequest() string { + return obj.Status.GetLastHandledReconcileRequest() +} + +func (obj imageRepositoryAdapter) successMessage() string { + return fmt.Sprintf("scan fetched %d tags", obj.Status.LastScanResult.TagCount) +} diff --git a/cmd/flux/reconcile_image_updateauto.go b/cmd/flux/reconcile_image_updateauto.go new file mode 100644 index 0000000000..9aed9ebec7 --- /dev/null +++ b/cmd/flux/reconcile_image_updateauto.go @@ -0,0 +1,62 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "time" + + "github.com/spf13/cobra" + apimeta "k8s.io/apimachinery/pkg/api/meta" + + autov1 "github.com/fluxcd/image-automation-controller/api/v1alpha1" + meta "github.com/fluxcd/pkg/apis/meta" +) + +var reconcileImageUpdateCmd = &cobra.Command{ + Use: "update [name]", + Short: "Reconcile an ImageUpdateAutomation", + Long: `The reconcile image update command triggers a reconciliation of an ImageUpdateAutomation resource and waits for it to finish.`, + Example: ` # Trigger an automation run for an existing image update automation + flux reconcile image update latest-images +`, + RunE: reconcileCommand{ + apiType: imageUpdateAutomationType, + object: imageUpdateAutomationAdapter{&autov1.ImageUpdateAutomation{}}, + }.run, +} + +func init() { + reconcileImageCmd.AddCommand(reconcileImageUpdateCmd) +} + +func (obj imageUpdateAutomationAdapter) suspended() bool { + return obj.ImageUpdateAutomation.Spec.Suspend +} + +func (obj imageUpdateAutomationAdapter) lastHandledReconcileRequest() string { + return obj.Status.GetLastHandledReconcileRequest() +} + +func (obj imageUpdateAutomationAdapter) successMessage() string { + if rc := apimeta.FindStatusCondition(obj.Status.Conditions, meta.ReadyCondition); rc != nil { + return rc.Message + } + if obj.Status.LastAutomationRunTime != nil { + return "last run " + obj.Status.LastAutomationRunTime.Time.Format(time.RFC3339) + } + return "automation not yet run" +} diff --git a/cmd/flux/resume.go b/cmd/flux/resume.go index 9d9c84213d..f1688a7a49 100644 --- a/cmd/flux/resume.go +++ b/cmd/flux/resume.go @@ -17,7 +17,14 @@ limitations under the License. package main import ( + "context" + "fmt" + "github.com/spf13/cobra" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" + + "github.com/fluxcd/flux2/internal/utils" ) var resumeCmd = &cobra.Command{ @@ -29,3 +36,56 @@ var resumeCmd = &cobra.Command{ func init() { rootCmd.AddCommand(resumeCmd) } + +type resumable interface { + adapter + statusable + setUnsuspended() + successMessage() string +} + +type resumeCommand struct { + apiType + object resumable +} + +func (resume resumeCommand) run(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("%s name is required", resume.humanKind) + } + name := args[0] + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + namespacedName := types.NamespacedName{ + Namespace: namespace, + Name: name, + } + + err = kubeClient.Get(ctx, namespacedName, resume.object.asRuntimeObject()) + if err != nil { + return err + } + + logger.Actionf("resuming %s %s in %s namespace", resume.humanKind, name, namespace) + resume.object.setUnsuspended() + if err := kubeClient.Update(ctx, resume.object.asRuntimeObject()); err != nil { + return err + } + logger.Successf("%s resumed", resume.humanKind) + + logger.Waitingf("waiting for %s reconciliation", resume.kind) + if err := wait.PollImmediate(pollInterval, timeout, + isReady(ctx, kubeClient, namespacedName, resume.object)); err != nil { + return err + } + logger.Successf("%s reconciliation completed", resume.kind) + logger.Successf(resume.object.successMessage()) + return nil +} diff --git a/cmd/flux/resume_image.go b/cmd/flux/resume_image.go new file mode 100644 index 0000000000..ef6cf54bba --- /dev/null +++ b/cmd/flux/resume_image.go @@ -0,0 +1,31 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "github.com/spf13/cobra" +) + +var resumeImageCmd = &cobra.Command{ + Use: "image", + Short: "Resume image automation objects", + Long: "The resume image sub-commands resume suspended image automation objects.", +} + +func init() { + resumeCmd.AddCommand(resumeImageCmd) +} diff --git a/cmd/flux/resume_image_repository.go b/cmd/flux/resume_image_repository.go new file mode 100644 index 0000000000..662d2aec99 --- /dev/null +++ b/cmd/flux/resume_image_repository.go @@ -0,0 +1,48 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "github.com/spf13/cobra" + + imagev1 "github.com/fluxcd/image-reflector-controller/api/v1alpha1" +) + +var resumeImageRepositoryCmd = &cobra.Command{ + Use: "repository [name]", + Short: "Resume a suspended ImageRepository", + Long: `The resume command marks a previously suspended ImageRepository resource for reconciliation and waits for it to finish.`, + Example: ` # Resume reconciliation for an existing ImageRepository + flux resume image repository alpine +`, + RunE: resumeCommand{ + apiType: imageRepositoryType, + object: imageRepositoryAdapter{&imagev1.ImageRepository{}}, + }.run, +} + +func init() { + resumeImageCmd.AddCommand(resumeImageRepositoryCmd) +} + +func (obj imageRepositoryAdapter) getObservedGeneration() int64 { + return obj.ImageRepository.Status.ObservedGeneration +} + +func (obj imageRepositoryAdapter) setUnsuspended() { + obj.ImageRepository.Spec.Suspend = false +} diff --git a/cmd/flux/resume_image_updateauto.go b/cmd/flux/resume_image_updateauto.go new file mode 100644 index 0000000000..adc92121a0 --- /dev/null +++ b/cmd/flux/resume_image_updateauto.go @@ -0,0 +1,48 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "github.com/spf13/cobra" + + autov1 "github.com/fluxcd/image-automation-controller/api/v1alpha1" +) + +var resumeImageUpdateCmd = &cobra.Command{ + Use: "update [name]", + Short: "Resume a suspended ImageUpdateAutomation", + Long: `The resume command marks a previously suspended ImageUpdateAutomation resource for reconciliation and waits for it to finish.`, + Example: ` # Resume reconciliation for an existing ImageUpdateAutomation + flux resume image update latest-images +`, + RunE: resumeCommand{ + apiType: imageUpdateAutomationType, + object: imageUpdateAutomationAdapter{&autov1.ImageUpdateAutomation{}}, + }.run, +} + +func init() { + resumeImageCmd.AddCommand(resumeImageUpdateCmd) +} + +func (obj imageUpdateAutomationAdapter) setUnsuspended() { + obj.ImageUpdateAutomation.Spec.Suspend = false +} + +func (obj imageUpdateAutomationAdapter) getObservedGeneration() int64 { + return obj.ImageUpdateAutomation.Status.ObservedGeneration +} diff --git a/cmd/flux/status.go b/cmd/flux/status.go new file mode 100644 index 0000000000..f9dc7615a3 --- /dev/null +++ b/cmd/flux/status.go @@ -0,0 +1,65 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "context" + "fmt" + + apimeta "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" + "sigs.k8s.io/controller-runtime/pkg/client" + + "github.com/fluxcd/pkg/apis/meta" +) + +// statusable is used to see if a resource is considered ready in the usual way +type statusable interface { + adapter + // this is implemented by ObjectMeta + GetGeneration() int64 + getObservedGeneration() int64 + // this is usually implemented by GOTK API objects because it's used by pkg/apis/meta + GetStatusConditions() *[]metav1.Condition +} + +func isReady(ctx context.Context, kubeClient client.Client, + namespacedName types.NamespacedName, object statusable) wait.ConditionFunc { + return func() (bool, error) { + err := kubeClient.Get(ctx, namespacedName, object.asRuntimeObject()) + if err != nil { + return false, err + } + + // Confirm the state we are observing is for the current generation + if object.GetGeneration() != object.getObservedGeneration() { + return false, nil + } + + if c := apimeta.FindStatusCondition(*object.GetStatusConditions(), meta.ReadyCondition); c != nil { + switch c.Status { + case metav1.ConditionTrue: + return true, nil + case metav1.ConditionFalse: + return false, fmt.Errorf(c.Message) + } + } + return false, nil + } +} diff --git a/cmd/flux/suspend.go b/cmd/flux/suspend.go index 389bfcdbb8..5e6a9f3463 100644 --- a/cmd/flux/suspend.go +++ b/cmd/flux/suspend.go @@ -17,7 +17,13 @@ limitations under the License. package main import ( + "context" + "fmt" + "github.com/spf13/cobra" + "k8s.io/apimachinery/pkg/types" + + "github.com/fluxcd/flux2/internal/utils" ) var suspendCmd = &cobra.Command{ @@ -29,3 +35,47 @@ var suspendCmd = &cobra.Command{ func init() { rootCmd.AddCommand(suspendCmd) } + +type suspendable interface { + adapter + isSuspended() bool + setSuspended() +} + +type suspendCommand struct { + apiType + object suspendable +} + +func (suspend suspendCommand) run(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return fmt.Errorf("%s name is required", suspend.humanKind) + } + name := args[0] + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + kubeClient, err := utils.KubeClient(kubeconfig, kubecontext) + if err != nil { + return err + } + + namespacedName := types.NamespacedName{ + Namespace: namespace, + Name: name, + } + err = kubeClient.Get(ctx, namespacedName, suspend.object.asRuntimeObject()) + if err != nil { + return err + } + + logger.Actionf("suspending %s %s in %s namespace", suspend.humanKind, name, namespace) + suspend.object.setSuspended() + if err := kubeClient.Update(ctx, suspend.object.asRuntimeObject()); err != nil { + return err + } + logger.Successf("%s suspended", suspend.humanKind) + + return nil +} diff --git a/cmd/flux/suspend_image.go b/cmd/flux/suspend_image.go new file mode 100644 index 0000000000..468c8c3f0b --- /dev/null +++ b/cmd/flux/suspend_image.go @@ -0,0 +1,31 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "github.com/spf13/cobra" +) + +var suspendImageCmd = &cobra.Command{ + Use: "image", + Short: "Suspend image automation objects", + Long: "The suspend image sub-commands suspend the reconciliation of an image automation object.", +} + +func init() { + suspendCmd.AddCommand(suspendImageCmd) +} diff --git a/cmd/flux/suspend_image_repository.go b/cmd/flux/suspend_image_repository.go new file mode 100644 index 0000000000..77540a252d --- /dev/null +++ b/cmd/flux/suspend_image_repository.go @@ -0,0 +1,48 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "github.com/spf13/cobra" + + imagev1 "github.com/fluxcd/image-reflector-controller/api/v1alpha1" +) + +var suspendImageRepositoryCmd = &cobra.Command{ + Use: "repository [name]", + Short: "Suspend reconciliation of an ImageRepository", + Long: "The suspend image repository command disables the reconciliation of a ImageRepository resource.", + Example: ` # Suspend reconciliation for an existing ImageRepository + flux suspend image repository alpine +`, + RunE: suspendCommand{ + apiType: imageRepositoryType, + object: imageRepositoryAdapter{&imagev1.ImageRepository{}}, + }.run, +} + +func init() { + suspendImageCmd.AddCommand(suspendImageRepositoryCmd) +} + +func (obj imageRepositoryAdapter) isSuspended() bool { + return obj.ImageRepository.Spec.Suspend +} + +func (obj imageRepositoryAdapter) setSuspended() { + obj.ImageRepository.Spec.Suspend = true +} diff --git a/cmd/flux/suspend_image_updateauto.go b/cmd/flux/suspend_image_updateauto.go new file mode 100644 index 0000000000..8cb747af7d --- /dev/null +++ b/cmd/flux/suspend_image_updateauto.go @@ -0,0 +1,48 @@ +/* +Copyright 2020 The Flux authors + +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 main + +import ( + "github.com/spf13/cobra" + + autov1 "github.com/fluxcd/image-automation-controller/api/v1alpha1" +) + +var suspendImageUpdateCmd = &cobra.Command{ + Use: "update [name]", + Short: "Suspend reconciliation of an ImageUpdateAutomation", + Long: "The suspend image update command disables the reconciliation of a ImageUpdateAutomation resource.", + Example: ` # Suspend reconciliation for an existing ImageUpdateAutomation + flux suspend image update latest-images +`, + RunE: suspendCommand{ + apiType: imageUpdateAutomationType, + object: imageUpdateAutomationAdapter{&autov1.ImageUpdateAutomation{}}, + }.run, +} + +func init() { + suspendImageCmd.AddCommand(suspendImageUpdateCmd) +} + +func (update imageUpdateAutomationAdapter) isSuspended() bool { + return update.ImageUpdateAutomation.Spec.Suspend +} + +func (update imageUpdateAutomationAdapter) setSuspended() { + update.ImageUpdateAutomation.Spec.Suspend = true +} diff --git a/docs/cmd/flux_create.md b/docs/cmd/flux_create.md index f708304bb9..a98057ba55 100644 --- a/docs/cmd/flux_create.md +++ b/docs/cmd/flux_create.md @@ -31,6 +31,7 @@ The create sub-commands generate sources and resources. * [flux create alert](flux_create_alert.md) - Create or update a Alert resource * [flux create alert-provider](flux_create_alert-provider.md) - Create or update a Provider resource * [flux create helmrelease](flux_create_helmrelease.md) - Create or update a HelmRelease resource +* [flux create image](flux_create_image.md) - Create or update resources dealing with image automation * [flux create kustomization](flux_create_kustomization.md) - Create or update a Kustomization resource * [flux create receiver](flux_create_receiver.md) - Create or update a Receiver resource * [flux create secret](flux_create_secret.md) - Create or update Kubernetes secrets diff --git a/docs/cmd/flux_create_image.md b/docs/cmd/flux_create_image.md new file mode 100644 index 0000000000..a0b57c02cc --- /dev/null +++ b/docs/cmd/flux_create_image.md @@ -0,0 +1,36 @@ +## flux create image + +Create or update resources dealing with image automation + +### Synopsis + +The create image sub-commands work with image automation objects; that is, +object controlling updates to git based on e.g., new container images +being available. + +### Options + +``` + -h, --help help for image +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --export export in YAML format to stdout + --interval duration source sync interval (default 1m0s) + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + --label strings set labels on the resource (can specify multiple labels with commas: label1=value1,label2=value2) + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux create](flux_create.md) - Create or update sources and resources +* [flux create image policy](flux_create_image_policy.md) - Create or update an ImagePolicy object +* [flux create image repository](flux_create_image_repository.md) - Create or update an ImageRepository object +* [flux create image update](flux_create_image_update.md) - Create or update an ImageUpdateAutomation object + diff --git a/docs/cmd/flux_create_image_policy.md b/docs/cmd/flux_create_image_policy.md new file mode 100644 index 0000000000..c311ed162b --- /dev/null +++ b/docs/cmd/flux_create_image_policy.md @@ -0,0 +1,42 @@ +## flux create image policy + +Create or update an ImagePolicy object + +### Synopsis + +The create image policy command generates an ImagePolicy resource. +An ImagePolicy object calculates a "latest image" given an image +repository and a policy, e.g., semver. + +The image that sorts highest according to the policy is recorded in +the status of the object. + +``` +flux create image policy [flags] +``` + +### Options + +``` + -h, --help help for policy + --image-ref string the name of an image repository object + --semver string a semver range to apply to tags; e.g., '1.x' +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --export export in YAML format to stdout + --interval duration source sync interval (default 1m0s) + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + --label strings set labels on the resource (can specify multiple labels with commas: label1=value1,label2=value2) + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux create image](flux_create_image.md) - Create or update resources dealing with image automation + diff --git a/docs/cmd/flux_create_image_repository.md b/docs/cmd/flux_create_image_repository.md new file mode 100644 index 0000000000..d3ea760478 --- /dev/null +++ b/docs/cmd/flux_create_image_repository.md @@ -0,0 +1,39 @@ +## flux create image repository + +Create or update an ImageRepository object + +### Synopsis + +The create image repository command generates an ImageRepository resource. +An ImageRepository object specifies an image repository to scan. + +``` +flux create image repository [flags] +``` + +### Options + +``` + -h, --help help for repository + --image string the image repository to scan; e.g., library/alpine + --scan-timeout duration a timeout for scanning; this defaults to the interval if not set + --secret-ref string the name of a docker-registry secret to use for credentials +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --export export in YAML format to stdout + --interval duration source sync interval (default 1m0s) + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + --label strings set labels on the resource (can specify multiple labels with commas: label1=value1,label2=value2) + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux create image](flux_create_image.md) - Create or update resources dealing with image automation + diff --git a/docs/cmd/flux_create_image_update.md b/docs/cmd/flux_create_image_update.md new file mode 100644 index 0000000000..7d96fa748f --- /dev/null +++ b/docs/cmd/flux_create_image_update.md @@ -0,0 +1,42 @@ +## flux create image update + +Create or update an ImageUpdateAutomation object + +### Synopsis + +The create image update command generates an ImageUpdateAutomation resource. +An ImageUpdateAutomation object specifies an automated update to images +mentioned in YAMLs in a git repository. + +``` +flux create image update [flags] +``` + +### Options + +``` + --author-email string the email to use for commit author + --author-name string the name to use for commit author + --branch string the branch to push commits to + --commit-template string a template for commit messages + --git-repo-ref string the name of a GitRepository resource with details of the upstream git repository + -h, --help help for update +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --export export in YAML format to stdout + --interval duration source sync interval (default 1m0s) + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + --label strings set labels on the resource (can specify multiple labels with commas: label1=value1,label2=value2) + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux create image](flux_create_image.md) - Create or update resources dealing with image automation + diff --git a/docs/cmd/flux_delete.md b/docs/cmd/flux_delete.md index 2628ab8fa7..360153c45e 100644 --- a/docs/cmd/flux_delete.md +++ b/docs/cmd/flux_delete.md @@ -28,6 +28,7 @@ The delete sub-commands delete sources and resources. * [flux](flux.md) - Command line utility for assembling Kubernetes CD pipelines * [flux delete alert](flux_delete_alert.md) - Delete a Alert resource * [flux delete alert-provider](flux_delete_alert-provider.md) - Delete a Provider resource +* [flux delete auto](flux_delete_auto.md) - Delete automation objects * [flux delete helmrelease](flux_delete_helmrelease.md) - Delete a HelmRelease resource * [flux delete kustomization](flux_delete_kustomization.md) - Delete a Kustomization resource * [flux delete receiver](flux_delete_receiver.md) - Delete a Receiver resource diff --git a/docs/cmd/flux_delete_auto.md b/docs/cmd/flux_delete_auto.md new file mode 100644 index 0000000000..5e79d85811 --- /dev/null +++ b/docs/cmd/flux_delete_auto.md @@ -0,0 +1,32 @@ +## flux delete auto + +Delete automation objects + +### Synopsis + +The delete auto sub-commands delete automation objects. + +### Options + +``` + -h, --help help for auto +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + -s, --silent delete resource without asking for confirmation + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux delete](flux_delete.md) - Delete sources and resources +* [flux delete auto image-policy](flux_delete_auto_image-policy.md) - Delete an ImagePolicy object +* [flux delete auto image-repository](flux_delete_auto_image-repository.md) - Delete an ImageRepository object +* [flux delete auto image-update](flux_delete_auto_image-update.md) - Delete an ImageUpdateAutomation object + diff --git a/docs/cmd/flux_delete_auto_image-policy.md b/docs/cmd/flux_delete_auto_image-policy.md new file mode 100644 index 0000000000..64152e003e --- /dev/null +++ b/docs/cmd/flux_delete_auto_image-policy.md @@ -0,0 +1,41 @@ +## flux delete auto image-policy + +Delete an ImagePolicy object + +### Synopsis + +The delete auto image-policy command deletes the given ImagePolicy from the cluster. + +``` +flux delete auto image-policy [name] [flags] +``` + +### Examples + +``` + # Delete an image policy + flux delete auto image-policy alpine3.x + +``` + +### Options + +``` + -h, --help help for image-policy +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + -s, --silent delete resource without asking for confirmation + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux delete auto](flux_delete_auto.md) - Delete automation objects + diff --git a/docs/cmd/flux_delete_auto_image-repository.md b/docs/cmd/flux_delete_auto_image-repository.md new file mode 100644 index 0000000000..e0b6bb14c1 --- /dev/null +++ b/docs/cmd/flux_delete_auto_image-repository.md @@ -0,0 +1,41 @@ +## flux delete auto image-repository + +Delete an ImageRepository object + +### Synopsis + +The delete auto image-repository command deletes the given ImageRepository from the cluster. + +``` +flux delete auto image-repository [name] [flags] +``` + +### Examples + +``` + # Delete an image repository + flux delete auto image-repository alpine + +``` + +### Options + +``` + -h, --help help for image-repository +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + -s, --silent delete resource without asking for confirmation + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux delete auto](flux_delete_auto.md) - Delete automation objects + diff --git a/docs/cmd/flux_delete_auto_image-update.md b/docs/cmd/flux_delete_auto_image-update.md new file mode 100644 index 0000000000..983a6f272c --- /dev/null +++ b/docs/cmd/flux_delete_auto_image-update.md @@ -0,0 +1,41 @@ +## flux delete auto image-update + +Delete an ImageUpdateAutomation object + +### Synopsis + +The delete auto image-update command deletes the given ImageUpdateAutomation from the cluster. + +``` +flux delete auto image-update [name] [flags] +``` + +### Examples + +``` + # Delete an image update automation + flux delete auto image-update latest-images + +``` + +### Options + +``` + -h, --help help for image-update +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + -s, --silent delete resource without asking for confirmation + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux delete auto](flux_delete_auto.md) - Delete automation objects + diff --git a/docs/cmd/flux_export.md b/docs/cmd/flux_export.md index 434810a854..b2ce4f5fbc 100644 --- a/docs/cmd/flux_export.md +++ b/docs/cmd/flux_export.md @@ -29,6 +29,7 @@ The export sub-commands export resources in YAML format. * [flux export alert](flux_export_alert.md) - Export Alert resources in YAML format * [flux export alert-provider](flux_export_alert-provider.md) - Export Provider resources in YAML format * [flux export helmrelease](flux_export_helmrelease.md) - Export HelmRelease resources in YAML format +* [flux export image](flux_export_image.md) - Export image automation objects * [flux export kustomization](flux_export_kustomization.md) - Export Kustomization resources in YAML format * [flux export receiver](flux_export_receiver.md) - Export Receiver resources in YAML format * [flux export source](flux_export_source.md) - Export sources diff --git a/docs/cmd/flux_export_image.md b/docs/cmd/flux_export_image.md new file mode 100644 index 0000000000..ab978f2dab --- /dev/null +++ b/docs/cmd/flux_export_image.md @@ -0,0 +1,32 @@ +## flux export image + +Export image automation objects + +### Synopsis + +The export image sub-commands export image automation objects in YAML format. + +### Options + +``` + -h, --help help for image +``` + +### Options inherited from parent commands + +``` + --all select all resources + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux export](flux_export.md) - Export resources in YAML format +* [flux export image policy](flux_export_image_policy.md) - Export ImagePolicy resources in YAML format +* [flux export image repository](flux_export_image_repository.md) - Export ImageRepository resources in YAML format +* [flux export image update](flux_export_image_update.md) - Export ImageUpdateAutomation resources in YAML format + diff --git a/docs/cmd/flux_export_image_policy.md b/docs/cmd/flux_export_image_policy.md new file mode 100644 index 0000000000..7476e7f8ac --- /dev/null +++ b/docs/cmd/flux_export_image_policy.md @@ -0,0 +1,44 @@ +## flux export image policy + +Export ImagePolicy resources in YAML format + +### Synopsis + +The export image policy command exports one or all ImagePolicy resources in YAML format. + +``` +flux export image policy [name] [flags] +``` + +### Examples + +``` + # Export all ImagePolicy resources + flux export image policy --all > image-policies.yaml + + # Export a specific policy + flux export image policy alpine1x > alpine1x.yaml + +``` + +### Options + +``` + -h, --help help for policy +``` + +### Options inherited from parent commands + +``` + --all select all resources + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux export image](flux_export_image.md) - Export image automation objects + diff --git a/docs/cmd/flux_export_image_repository.md b/docs/cmd/flux_export_image_repository.md new file mode 100644 index 0000000000..40406add5e --- /dev/null +++ b/docs/cmd/flux_export_image_repository.md @@ -0,0 +1,44 @@ +## flux export image repository + +Export ImageRepository resources in YAML format + +### Synopsis + +The export image repository command exports one or all ImageRepository resources in YAML format. + +``` +flux export image repository [name] [flags] +``` + +### Examples + +``` + # Export all ImageRepository resources + flux export image repository --all > image-repositories.yaml + + # Export a specific ImageRepository resource + flux export image repository alpine > alpine.yaml + +``` + +### Options + +``` + -h, --help help for repository +``` + +### Options inherited from parent commands + +``` + --all select all resources + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux export image](flux_export_image.md) - Export image automation objects + diff --git a/docs/cmd/flux_export_image_update.md b/docs/cmd/flux_export_image_update.md new file mode 100644 index 0000000000..25d6cb7732 --- /dev/null +++ b/docs/cmd/flux_export_image_update.md @@ -0,0 +1,44 @@ +## flux export image update + +Export ImageUpdateAutomation resources in YAML format + +### Synopsis + +The export image update command exports one or all ImageUpdateAutomation resources in YAML format. + +``` +flux export image update [name] [flags] +``` + +### Examples + +``` + # Export all ImageUpdateAutomation resources + flux export image update --all > updates.yaml + + # Export a specific automation + flux export image update latest-images > latest.yaml + +``` + +### Options + +``` + -h, --help help for update +``` + +### Options inherited from parent commands + +``` + --all select all resources + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux export image](flux_export_image.md) - Export image automation objects + diff --git a/docs/cmd/flux_get.md b/docs/cmd/flux_get.md index 9da674486d..629b1b5387 100644 --- a/docs/cmd/flux_get.md +++ b/docs/cmd/flux_get.md @@ -29,6 +29,7 @@ The get sub-commands print the statuses of sources and resources. * [flux get alert-providers](flux_get_alert-providers.md) - Get Provider statuses * [flux get alerts](flux_get_alerts.md) - Get Alert statuses * [flux get helmreleases](flux_get_helmreleases.md) - Get HelmRelease statuses +* [flux get image](flux_get_image.md) - Get image automation object status * [flux get kustomizations](flux_get_kustomizations.md) - Get Kustomization statuses * [flux get receivers](flux_get_receivers.md) - Get Receiver statuses * [flux get sources](flux_get_sources.md) - Get source statuses diff --git a/docs/cmd/flux_get_image.md b/docs/cmd/flux_get_image.md new file mode 100644 index 0000000000..13a7644120 --- /dev/null +++ b/docs/cmd/flux_get_image.md @@ -0,0 +1,32 @@ +## flux get image + +Get image automation object status + +### Synopsis + +The get image sub-commands print the status of image automation objects. + +### Options + +``` + -h, --help help for image +``` + +### Options inherited from parent commands + +``` + -A, --all-namespaces list the requested object(s) across all namespaces + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux get](flux_get.md) - Get sources and resources +* [flux get image policy](flux_get_image_policy.md) - Get ImagePolicy status +* [flux get image repository](flux_get_image_repository.md) - Get ImageRepository status +* [flux get image update](flux_get_image_update.md) - Get ImageUpdateAutomation status + diff --git a/docs/cmd/flux_get_image_policy.md b/docs/cmd/flux_get_image_policy.md new file mode 100644 index 0000000000..6380117bc6 --- /dev/null +++ b/docs/cmd/flux_get_image_policy.md @@ -0,0 +1,44 @@ +## flux get image policy + +Get ImagePolicy status + +### Synopsis + +The get image policy command prints the status of ImagePolicy objects. + +``` +flux get image policy [flags] +``` + +### Examples + +``` + # List all image policies and their status + flux get image policy + + # List image policies from all namespaces + flux get image policy --all-namespaces + +``` + +### Options + +``` + -h, --help help for policy +``` + +### Options inherited from parent commands + +``` + -A, --all-namespaces list the requested object(s) across all namespaces + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux get image](flux_get_image.md) - Get image automation object status + diff --git a/docs/cmd/flux_get_image_repository.md b/docs/cmd/flux_get_image_repository.md new file mode 100644 index 0000000000..b50d45663c --- /dev/null +++ b/docs/cmd/flux_get_image_repository.md @@ -0,0 +1,44 @@ +## flux get image repository + +Get ImageRepository status + +### Synopsis + +The get image repository command prints the status of ImageRepository objects. + +``` +flux get image repository [flags] +``` + +### Examples + +``` + # List all image repositories and their status + flux get image repository + + # List image repositories from all namespaces + flux get image repository --all-namespaces + +``` + +### Options + +``` + -h, --help help for repository +``` + +### Options inherited from parent commands + +``` + -A, --all-namespaces list the requested object(s) across all namespaces + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux get image](flux_get_image.md) - Get image automation object status + diff --git a/docs/cmd/flux_get_image_update.md b/docs/cmd/flux_get_image_update.md new file mode 100644 index 0000000000..b4075302cb --- /dev/null +++ b/docs/cmd/flux_get_image_update.md @@ -0,0 +1,44 @@ +## flux get image update + +Get ImageUpdateAutomation status + +### Synopsis + +The get image update command prints the status of ImageUpdateAutomation objects. + +``` +flux get image update [flags] +``` + +### Examples + +``` + # List all image update automation object and their status + flux get image update + + # List image update automations from all namespaces + flux get image update --all-namespaces + +``` + +### Options + +``` + -h, --help help for update +``` + +### Options inherited from parent commands + +``` + -A, --all-namespaces list the requested object(s) across all namespaces + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux get image](flux_get_image.md) - Get image automation object status + diff --git a/docs/cmd/flux_reconcile.md b/docs/cmd/flux_reconcile.md index 82434e5f85..57aed7ce1d 100644 --- a/docs/cmd/flux_reconcile.md +++ b/docs/cmd/flux_reconcile.md @@ -28,6 +28,7 @@ The reconcile sub-commands trigger a reconciliation of sources and resources. * [flux reconcile alert](flux_reconcile_alert.md) - Reconcile an Alert * [flux reconcile alert-provider](flux_reconcile_alert-provider.md) - Reconcile a Provider * [flux reconcile helmrelease](flux_reconcile_helmrelease.md) - Reconcile a HelmRelease resource +* [flux reconcile image](flux_reconcile_image.md) - Reconcile image automation objects * [flux reconcile kustomization](flux_reconcile_kustomization.md) - Reconcile a Kustomization resource * [flux reconcile receiver](flux_reconcile_receiver.md) - Reconcile a Receiver * [flux reconcile source](flux_reconcile_source.md) - Reconcile sources diff --git a/docs/cmd/flux_reconcile_image.md b/docs/cmd/flux_reconcile_image.md new file mode 100644 index 0000000000..6b22189371 --- /dev/null +++ b/docs/cmd/flux_reconcile_image.md @@ -0,0 +1,30 @@ +## flux reconcile image + +Reconcile image automation objects + +### Synopsis + +The reconcile sub-commands trigger a reconciliation of image automation objects. + +### Options + +``` + -h, --help help for image +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux reconcile](flux_reconcile.md) - Reconcile sources and resources +* [flux reconcile image repository](flux_reconcile_image_repository.md) - Reconcile an ImageRepository +* [flux reconcile image update](flux_reconcile_image_update.md) - Reconcile an ImageUpdateAutomation + diff --git a/docs/cmd/flux_reconcile_image_repository.md b/docs/cmd/flux_reconcile_image_repository.md new file mode 100644 index 0000000000..0826cc9337 --- /dev/null +++ b/docs/cmd/flux_reconcile_image_repository.md @@ -0,0 +1,40 @@ +## flux reconcile image repository + +Reconcile an ImageRepository + +### Synopsis + +The reconcile image repository command triggers a reconciliation of an ImageRepository resource and waits for it to finish. + +``` +flux reconcile image repository [name] [flags] +``` + +### Examples + +``` + # Trigger an scan for an existing image repository + flux reconcile image repository alpine + +``` + +### Options + +``` + -h, --help help for repository +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux reconcile image](flux_reconcile_image.md) - Reconcile image automation objects + diff --git a/docs/cmd/flux_reconcile_image_update.md b/docs/cmd/flux_reconcile_image_update.md new file mode 100644 index 0000000000..8466a6c905 --- /dev/null +++ b/docs/cmd/flux_reconcile_image_update.md @@ -0,0 +1,40 @@ +## flux reconcile image update + +Reconcile an ImageUpdateAutomation + +### Synopsis + +The reconcile image update command triggers a reconciliation of an ImageUpdateAutomation resource and waits for it to finish. + +``` +flux reconcile image update [name] [flags] +``` + +### Examples + +``` + # Trigger an automation run for an existing image update automation + flux reconcile image update latest-images + +``` + +### Options + +``` + -h, --help help for update +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux reconcile image](flux_reconcile_image.md) - Reconcile image automation objects + diff --git a/docs/cmd/flux_resume.md b/docs/cmd/flux_resume.md index 71bb21fd52..ec2e4ad5bb 100644 --- a/docs/cmd/flux_resume.md +++ b/docs/cmd/flux_resume.md @@ -27,6 +27,7 @@ The resume sub-commands resume a suspended resource. * [flux](flux.md) - Command line utility for assembling Kubernetes CD pipelines * [flux resume alert](flux_resume_alert.md) - Resume a suspended Alert * [flux resume helmrelease](flux_resume_helmrelease.md) - Resume a suspended HelmRelease +* [flux resume image](flux_resume_image.md) - Resume image automation objects * [flux resume kustomization](flux_resume_kustomization.md) - Resume a suspended Kustomization * [flux resume receiver](flux_resume_receiver.md) - Resume a suspended Receiver * [flux resume source](flux_resume_source.md) - Resume sources diff --git a/docs/cmd/flux_resume_image.md b/docs/cmd/flux_resume_image.md new file mode 100644 index 0000000000..d0293b5136 --- /dev/null +++ b/docs/cmd/flux_resume_image.md @@ -0,0 +1,30 @@ +## flux resume image + +Resume image automation objects + +### Synopsis + +The resume image sub-commands resume suspended image automation objects. + +### Options + +``` + -h, --help help for image +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux resume](flux_resume.md) - Resume suspended resources +* [flux resume image repository](flux_resume_image_repository.md) - Resume a suspended ImageRepository +* [flux resume image update](flux_resume_image_update.md) - Resume a suspended ImageUpdateAutomation + diff --git a/docs/cmd/flux_resume_image_repository.md b/docs/cmd/flux_resume_image_repository.md new file mode 100644 index 0000000000..3d89245f56 --- /dev/null +++ b/docs/cmd/flux_resume_image_repository.md @@ -0,0 +1,40 @@ +## flux resume image repository + +Resume a suspended ImageRepository + +### Synopsis + +The resume command marks a previously suspended ImageRepository resource for reconciliation and waits for it to finish. + +``` +flux resume image repository [name] [flags] +``` + +### Examples + +``` + # Resume reconciliation for an existing ImageRepository + flux resume image repository alpine + +``` + +### Options + +``` + -h, --help help for repository +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux resume image](flux_resume_image.md) - Resume image automation objects + diff --git a/docs/cmd/flux_resume_image_update.md b/docs/cmd/flux_resume_image_update.md new file mode 100644 index 0000000000..ca1dce7548 --- /dev/null +++ b/docs/cmd/flux_resume_image_update.md @@ -0,0 +1,40 @@ +## flux resume image update + +Resume a suspended ImageUpdateAutomation + +### Synopsis + +The resume command marks a previously suspended ImageUpdateAutomation resource for reconciliation and waits for it to finish. + +``` +flux resume image update [name] [flags] +``` + +### Examples + +``` + # Resume reconciliation for an existing ImageUpdateAutomation + flux resume image update latest-images + +``` + +### Options + +``` + -h, --help help for update +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux resume image](flux_resume_image.md) - Resume image automation objects + diff --git a/docs/cmd/flux_suspend.md b/docs/cmd/flux_suspend.md index b5e2f9340a..7df683bd87 100644 --- a/docs/cmd/flux_suspend.md +++ b/docs/cmd/flux_suspend.md @@ -27,6 +27,7 @@ The suspend sub-commands suspend the reconciliation of a resource. * [flux](flux.md) - Command line utility for assembling Kubernetes CD pipelines * [flux suspend alert](flux_suspend_alert.md) - Suspend reconciliation of Alert * [flux suspend helmrelease](flux_suspend_helmrelease.md) - Suspend reconciliation of HelmRelease +* [flux suspend image](flux_suspend_image.md) - Suspend image automation objects * [flux suspend kustomization](flux_suspend_kustomization.md) - Suspend reconciliation of Kustomization * [flux suspend receiver](flux_suspend_receiver.md) - Suspend reconciliation of Receiver * [flux suspend source](flux_suspend_source.md) - Suspend sources diff --git a/docs/cmd/flux_suspend_image.md b/docs/cmd/flux_suspend_image.md new file mode 100644 index 0000000000..d703950720 --- /dev/null +++ b/docs/cmd/flux_suspend_image.md @@ -0,0 +1,30 @@ +## flux suspend image + +Suspend image automation objects + +### Synopsis + +The suspend image sub-commands suspend the reconciliation of an image automation object. + +### Options + +``` + -h, --help help for image +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux suspend](flux_suspend.md) - Suspend resources +* [flux suspend image repository](flux_suspend_image_repository.md) - Suspend reconciliation of an ImageRepository +* [flux suspend image update](flux_suspend_image_update.md) - Suspend reconciliation of an ImageUpdateAutomation + diff --git a/docs/cmd/flux_suspend_image_repository.md b/docs/cmd/flux_suspend_image_repository.md new file mode 100644 index 0000000000..9c731f74f1 --- /dev/null +++ b/docs/cmd/flux_suspend_image_repository.md @@ -0,0 +1,40 @@ +## flux suspend image repository + +Suspend reconciliation of an ImageRepository + +### Synopsis + +The suspend image repository command disables the reconciliation of a ImageRepository resource. + +``` +flux suspend image repository [name] [flags] +``` + +### Examples + +``` + # Suspend reconciliation for an existing ImageRepository + flux suspend image repository alpine + +``` + +### Options + +``` + -h, --help help for repository +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux suspend image](flux_suspend_image.md) - Suspend image automation objects + diff --git a/docs/cmd/flux_suspend_image_update.md b/docs/cmd/flux_suspend_image_update.md new file mode 100644 index 0000000000..34f0e489f7 --- /dev/null +++ b/docs/cmd/flux_suspend_image_update.md @@ -0,0 +1,40 @@ +## flux suspend image update + +Suspend reconciliation of an ImageUpdateAutomation + +### Synopsis + +The suspend image update command disables the reconciliation of a ImageUpdateAutomation resource. + +``` +flux suspend image update [name] [flags] +``` + +### Examples + +``` + # Suspend reconciliation for an existing ImageUpdateAutomation + flux suspend image update latest-images + +``` + +### Options + +``` + -h, --help help for update +``` + +### Options inherited from parent commands + +``` + --context string kubernetes context to use + --kubeconfig string path to the kubeconfig file (default "~/.kube/config") + -n, --namespace string the namespace scope for this operation (default "flux-system") + --timeout duration timeout for this operation (default 5m0s) + --verbose print generated objects +``` + +### SEE ALSO + +* [flux suspend image](flux_suspend_image.md) - Suspend image automation objects + diff --git a/go.mod b/go.mod index a1ece652d7..66be9fdf10 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,8 @@ go 1.15 require ( github.com/blang/semver/v4 v4.0.0 github.com/fluxcd/helm-controller/api v0.4.3 + github.com/fluxcd/image-automation-controller/api v0.1.0 + github.com/fluxcd/image-reflector-controller/api v0.1.0 github.com/fluxcd/kustomize-controller/api v0.5.0 github.com/fluxcd/notification-controller/api v0.5.0 github.com/fluxcd/pkg/apis/meta v0.5.0 @@ -13,6 +15,7 @@ require ( github.com/fluxcd/pkg/ssh v0.0.5 github.com/fluxcd/pkg/untar v0.0.5 github.com/fluxcd/source-controller/api v0.5.3 + github.com/google/go-containerregistry v0.2.0 github.com/manifoldco/promptui v0.7.0 github.com/olekukonko/tablewriter v0.0.4 github.com/spf13/cobra v1.0.0 diff --git a/go.sum b/go.sum index 9ca04829dd..cacfd50679 100644 --- a/go.sum +++ b/go.sum @@ -5,34 +5,69 @@ cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6A cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.51.0 h1:PvKAVQWCtlGUSlZkGW3QLelKaWq7KYv/MW1EboG8bfM= cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.57.0 h1:EpMNVUorLiZIELdMZbCYX/ByTFCdoYopYAGxaGVz9ms= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/360EntSecGroup-Skylar/excelize v1.4.1/go.mod h1:vnax29X2usfl7HHkBrX5EvSCJcmH3dT9luvxzu8iGAE= +github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v38.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v42.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0= github.com/Azure/go-autorest/autorest v0.9.6 h1:5YWtOnckcudzIw8lPPBcWOnmIFWMtHci1ZWAZulMSx0= github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= +github.com/Azure/go-autorest/autorest v0.10.2 h1:NuSF3gXetiHyUbVdneJMEVyPUYAe5wh+aN08JYAf1tI= +github.com/Azure/go-autorest/autorest v0.10.2/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630= github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= github.com/Azure/go-autorest/autorest/adal v0.8.2 h1:O1X4oexUxnZCaEUGsvMnr8ZGj8HI37tNezwY4npRqA0= github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q= +github.com/Azure/go-autorest/autorest/adal v0.9.5 h1:Y3bBUV4rTuxenJJs41HU3qmqsb+auo+a3Lz+PlJPpL0= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= +github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= +github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= +github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI= github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= @@ -61,6 +96,8 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPd github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/aws/aws-sdk-go v1.28.2/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.31.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -85,7 +122,9 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= @@ -110,7 +149,13 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= @@ -125,8 +170,11 @@ github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= @@ -134,6 +182,10 @@ github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLi github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fluxcd/helm-controller/api v0.4.3 h1:uT4M8Zq/zSajfT9Z0m5yrhKJW9AObzOy5jHTGQFXi50= github.com/fluxcd/helm-controller/api v0.4.3/go.mod h1:H3fHkKJWcxPz38L1kxBX/MGm5v9XKzeoKZWNM7+dW2o= +github.com/fluxcd/image-automation-controller/api v0.1.0 h1:XN/BbhCRoISEb828rfMt2fNe+3s4Zwc+BwhRi3K1SHA= +github.com/fluxcd/image-automation-controller/api v0.1.0/go.mod h1:DHjFNvA+kJlSm7cbTaG+Z5smVjMjLw7xzlJc9brP0zY= +github.com/fluxcd/image-reflector-controller/api v0.1.0 h1:wlqwCy4sZMbbdrgSY9Fd0mfy55kk7dS4Z+icrDlkmmg= +github.com/fluxcd/image-reflector-controller/api v0.1.0/go.mod h1:u7vnULekPHXAZgJ35lqCjV2MaJVN0xbD+qt9X9TVCMs= github.com/fluxcd/kustomize-controller/api v0.5.0 h1:HUyB17yxr0wxABOCQTXD9FAc3p4REjiDxvpdEr5X/sg= github.com/fluxcd/kustomize-controller/api v0.5.0/go.mod h1:8Z52j63kRf+NjtVmiJFvI8xLje3ncFTs/uMxcrEJPIA= github.com/fluxcd/notification-controller/api v0.5.0 h1:xKKFnPVsYl2+GEjgKz5a5Mq6vmy+H2q9d2lJ2jmWJZs= @@ -152,6 +204,8 @@ github.com/fluxcd/source-controller/api v0.5.3 h1:xTfUrZ+zqldoDLw+1xSQeHszACCFfQ github.com/fluxcd/source-controller/api v0.5.3/go.mod h1:/mpW0EM2dUnRey6rffqsSmgNkSAYm+zq9i0GfmTO7I0= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -172,7 +226,9 @@ github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk= github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM= @@ -236,6 +292,7 @@ github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+ github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= @@ -262,11 +319,14 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -300,8 +360,11 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1 h1:/exdXoGamhu5ONeUJH0deniYLWYvQwW66yvlfiiKTu0= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-containerregistry v0.2.0 h1:cWFYx+kOkKdyOET0pcp7GMCmxj7da40StvluSuSXWCg= +github.com/google/go-containerregistry v0.2.0/go.mod h1:Ts3Wioz1r5ayWx8sS6vLcWltWcM1aqFjd/eVrkFhrWM= github.com/google/go-github/v32 v32.1.0 h1:GWkQOdXqviCPx7Q7Fj+KyPoGm4SwHRh8rheoPhd27II= github.com/google/go-github/v32 v32.1.0/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= @@ -314,6 +377,8 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -324,10 +389,12 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.2.2/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= @@ -355,6 +422,7 @@ github.com/hashicorp/go-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PF github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= @@ -368,6 +436,9 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -429,6 +500,7 @@ github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpe github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -447,6 +519,7 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= @@ -463,15 +536,21 @@ github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/paulmach/orb v0.1.3/go.mod h1:VFlX/8C+IQ1p6FTRRKzKoOPJnvEtA5G0Veuqwbu//Vk= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -509,12 +588,16 @@ github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40T github.com/qri-io/starlib v0.4.2-0.20200213133954-ff2e8cd5ef8d h1:K6eOUihrFLdZjZnA4XlRp864fmWXv9YTIk7VPLhRacA= github.com/qri-io/starlib v0.4.2-0.20200213133954-ff2e8cd5ef8d/go.mod h1:7DPO4domFU579Ga6E61sB9VFNaniPVwJP5C4bBCu3wA= github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= +github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/securego/gosec v0.0.0-20191002120514-e680875ea14d/go.mod h1:w5+eXa0mYznDkHaMCXA4XYffjlH+cy1oyKbfzJXa2Do= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= @@ -526,6 +609,7 @@ github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOms github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -554,8 +638,9 @@ github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRci github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.3-0.20181224173747-660f15d67dbb/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -572,7 +657,9 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s= github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/vdemeester/k8s-pkg-credentialprovider v1.18.1-0.20201019120933-f1d16962a4db/go.mod h1:grWy0bkr1XO6hqbaaCKaPXqkBVlMGHYG6PGykktwbJc= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/vmware/govmomi v0.20.3/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU= github.com/xanzy/go-gitlab v0.32.1 h1:eKGfAP2FWbqStD7DtGoRBb18IYwjuCxdtEVea2rNge4= github.com/xanzy/go-gitlab v0.32.1/go.mod h1:sPLojNBn68fMUWSxIJtdVVIP8uSBYqesTfDUseX11Ug= github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= @@ -582,6 +669,7 @@ github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mB github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yujunz/go-getter v1.5.1-lite.0.20201201013212-6d9c071adddf h1:gvEmqF83GB8R5XtrMseJb6A6R0OCtNAS8f4TmZg2dGc= github.com/yujunz/go-getter v1.5.1-lite.0.20201201013212-6d9c071adddf/go.mod h1:bL0Pr07HEdsMZ1WBqZIxXj96r5LnFsY4LgPaPEGkw1k= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -595,6 +683,7 @@ go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qL go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.starlark.net v0.0.0-20190528202925-30ae18b8564f/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc= go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= @@ -622,13 +711,21 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -637,12 +734,16 @@ golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -666,29 +767,39 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -710,9 +821,12 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -720,13 +834,20 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8= golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -735,8 +856,9 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 h1:NusfzzA6yGQ+ua51ck7E3omNUX/JuqbFSaRGqU8CcLI= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -746,6 +868,7 @@ golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -762,6 +885,7 @@ golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -770,28 +894,52 @@ golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190930201159-7c411dea38b0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0= gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= +gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.6.1-0.20190607001116-5213b8090861/go.mod h1:btoxGiFvQNVUZQ8W08zLtrVS08CNpINPEfxXxgJL1Q4= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -800,16 +948,29 @@ google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRn google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -829,6 +990,7 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= @@ -836,6 +998,7 @@ gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= @@ -856,8 +1019,11 @@ honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI= k8s.io/api v0.18.6/go.mod h1:eeyxr+cwCjMdLAmr2W3RyDI0VvTawSg/3RFFBEnmZGI= +k8s.io/api v0.18.8/go.mod h1:d/CXqwWv+Z2XEG1LgceeDmHQwpUJhROPx16SlxJgERY= +k8s.io/api v0.19.3/go.mod h1:VF+5FT1B74Pw3KxMdKyinLo+zynBaMBiAfGMuldcNDs= k8s.io/api v0.19.4 h1:I+1I4cgJYuCDgiLNjKx7SLmIbwgj9w7N7Zr5vSIdwpo= k8s.io/api v0.19.4/go.mod h1:SbtJ2aHCItirzdJ36YslycFNzWADYH3tgOhvBEFtZAk= k8s.io/apiextensions-apiserver v0.18.6/go.mod h1:lv89S7fUysXjLZO7ke783xOwVTm6lKizADfvUM/SS/M= @@ -865,19 +1031,28 @@ k8s.io/apiextensions-apiserver v0.19.4 h1:D9ak9T012tb3vcGFWYmbQuj9SCC8YM4zhA4XZq k8s.io/apiextensions-apiserver v0.19.4/go.mod h1:B9rpH/nu4JBCtuUp3zTTk8DEjZUupZTBEec7/2zNRYw= k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= k8s.io/apimachinery v0.18.6/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= +k8s.io/apimachinery v0.18.8/go.mod h1:6sQd+iHEqmOtALqOFjSWp2KZ9F0wlU/nWm0ZgsYWMig= +k8s.io/apimachinery v0.19.3/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= k8s.io/apimachinery v0.19.4 h1:+ZoddM7nbzrDCp0T3SWnyxqf8cbWPT2fkZImoyvHUG0= k8s.io/apimachinery v0.19.4/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA= k8s.io/apiserver v0.18.6/go.mod h1:Zt2XvTHuaZjBz6EFYzpp+X4hTmgWGy8AthNVnTdm3Wg= +k8s.io/apiserver v0.18.8/go.mod h1:12u5FuGql8Cc497ORNj79rhPdiXQC4bf53X/skR/1YM= k8s.io/apiserver v0.19.4/go.mod h1:X8WRHCR1UGZDd7HpV0QDc1h/6VbbpAeAGyxSh8yzZXw= k8s.io/client-go v0.17.0/go.mod h1:TYgR6EUHs6k45hb6KWjVD6jFZvJV4gHDikv/It0xz+k= k8s.io/client-go v0.18.6/go.mod h1:/fwtGLjYMS1MaM5oi+eXhKwG+1UHidUEXRh6cNsdO0Q= +k8s.io/client-go v0.18.8/go.mod h1:HqFqMllQ5NnQJNwjro9k5zMyfhZlOwpuTLVrxjkYSxU= k8s.io/client-go v0.19.4 h1:85D3mDNoLF+xqpyE9Dh/OtrJDyJrSRKkHmDXIbEzer8= k8s.io/client-go v0.19.4/go.mod h1:ZrEy7+wj9PjH5VMBCuu/BDlvtUAku0oVFk4MmnW9mWA= +k8s.io/cloud-provider v0.18.8/go.mod h1:cn9AlzMPVIXA4HHLVbgGUigaQlZyHSZ7WAwDEFNrQSs= +k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= k8s.io/code-generator v0.18.6/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= k8s.io/code-generator v0.19.4/go.mod h1:moqLn7w0t9cMs4+5CQyxnfA/HV8MF6aAVENF+WZZhgk= k8s.io/component-base v0.18.6/go.mod h1:knSVsibPR5K6EW2XOjEHik6sdU5nCvKMrzMt2D4In14= +k8s.io/component-base v0.18.8/go.mod h1:00frPRDas29rx58pPCxNkhUfPbwajlyyvu8ruNgSErU= k8s.io/component-base v0.19.4/go.mod h1:ZzuSLlsWhajIDEkKF73j64Gz/5o0AgON08FgRbEPI70= +k8s.io/csi-translation-lib v0.18.8/go.mod h1:6cA6Btlzxy9s3QrS4BCZzQqclIWnTLr6Jx3H2ctAzY4= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= @@ -892,17 +1067,26 @@ k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKf k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6 h1:+WnxoVtG8TMiudHBSEtrVL1egv36TkkJm+bA8AxicmQ= k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= +k8s.io/legacy-cloud-providers v0.18.8/go.mod h1:tgp4xYf6lvjrWnjQwTOPvWQE9IVqSBGPF4on0IyICQE= k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20200729134348-d5654de09c73 h1:uJmqzgNWG7XyClnU/mLPBWwfKKF1K8Hf8whTseBgJcg= k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= +modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= +modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= +modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= +modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= +sigs.k8s.io/controller-runtime v0.6.3/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY= sigs.k8s.io/controller-runtime v0.6.4 h1:4013CKsBs5bEqo+LevzDett+LLxag/FjQWG94nVZ/9g= sigs.k8s.io/controller-runtime v0.6.4/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY= sigs.k8s.io/kustomize/api v0.7.0 h1:djxH9k1izeU1BvdP1i23qqKwhmWu2BuKNEKr/Da7Dpw= diff --git a/internal/utils/utils.go b/internal/utils/utils.go index eb372612a4..ae8577b710 100644 --- a/internal/utils/utils.go +++ b/internal/utils/utils.go @@ -30,6 +30,7 @@ import ( "strings" "text/template" + "github.com/olekukonko/tablewriter" corev1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" apiruntime "k8s.io/apimachinery/pkg/runtime" @@ -42,11 +43,12 @@ import ( "sigs.k8s.io/yaml" helmv2 "github.com/fluxcd/helm-controller/api/v2beta1" + imageautov1 "github.com/fluxcd/image-automation-controller/api/v1alpha1" + imagereflectv1 "github.com/fluxcd/image-reflector-controller/api/v1alpha1" kustomizev1 "github.com/fluxcd/kustomize-controller/api/v1beta1" notificationv1 "github.com/fluxcd/notification-controller/api/v1beta1" "github.com/fluxcd/pkg/runtime/dependency" sourcev1 "github.com/fluxcd/source-controller/api/v1beta1" - "github.com/olekukonko/tablewriter" ) type Utils struct { @@ -156,6 +158,8 @@ func KubeClient(kubeConfigPath string, kubeContext string) (client.Client, error _ = kustomizev1.AddToScheme(scheme) _ = helmv2.AddToScheme(scheme) _ = notificationv1.AddToScheme(scheme) + _ = imagereflectv1.AddToScheme(scheme) + _ = imageautov1.AddToScheme(scheme) kubeClient, err := client.New(cfg, client.Options{ Scheme: scheme,