diff --git a/cmd/config/Makefile b/cmd/config/Makefile index d3b450817..7b363093b 100644 --- a/cmd/config/Makefile +++ b/cmd/config/Makefile @@ -6,7 +6,7 @@ GOBIN := $(shell go env GOPATH)/bin build: - go build -v -o $(GOBIN)/config . + go build -v -o $(GOBIN)/kubectl-krm ./kubectl-krm all: generate build license fix vet fmt test lint tidy diff --git a/cmd/config/README.md b/cmd/config/README.md index 440eca8fd..658630ae5 100644 --- a/cmd/config/README.md +++ b/cmd/config/README.md @@ -6,7 +6,7 @@ of development of the kyaml package and as a reference implementation for using ## Docs All documentation is also built directly into the `config` command group using -`kustomize help config`. +`kustomize help cfg`. - [tutorials](docs/tutorials) - [commands](docs/commands) diff --git a/cmd/config/configcobra/cfg.go b/cmd/config/configcobra/cfg.go new file mode 100644 index 000000000..a979f3fa6 --- /dev/null +++ b/cmd/config/configcobra/cfg.go @@ -0,0 +1,32 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package configcobra + +import ( + "github.com/spf13/cobra" + "sigs.k8s.io/kustomize/cmd/config/internal/commands" +) + +func GetCfg(name string) *cobra.Command { + cmd := &cobra.Command{ + Use: "cfg", + Short: "Commands for reading and writing configuration.", + } + + cmd.AddCommand(commands.AnnotateCommand(name)) + cmd.AddCommand(commands.CatCommand(name)) + cmd.AddCommand(commands.CountCommand(name)) + cmd.AddCommand(commands.CreateSetterCommand(name)) + cmd.AddCommand(commands.CreateSubstitutionCommand(name)) + cmd.AddCommand(commands.FmtCommand(name)) + cmd.AddCommand(commands.GrepCommand(name)) + cmd.AddCommand(commands.InitCommand(name)) + cmd.AddCommand(commands.ListSettersCommand(name)) + cmd.AddCommand(commands.MergeCommand(name)) + cmd.AddCommand(commands.Merge3Command(name)) + cmd.AddCommand(commands.SetCommand(name)) + cmd.AddCommand(commands.TreeCommand(name)) + + return cmd +} diff --git a/cmd/config/configcobra/cmds.go b/cmd/config/configcobra/cmds.go index 2c32756e6..062b52952 100644 --- a/cmd/config/configcobra/cmds.go +++ b/cmd/config/configcobra/cmds.go @@ -6,43 +6,12 @@ package configcobra import ( - "strings" - "github.com/spf13/cobra" "sigs.k8s.io/kustomize/cmd/config/internal/commands" "sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/api" "sigs.k8s.io/kustomize/cmd/config/internal/generateddocs/tutorials" - "sigs.k8s.io/kustomize/kyaml/commandutil" ) -var root = &cobra.Command{ - Use: "config", - Short: "[Alpha] Utilities for working with Resource Configuration.", - Long: `[Alpha] Utilities for working with Resource Configuration. - -Tutorials: - - Run 'kustomize help config tutorial-TUTORIAL' - - $ kustomize help config tutorials-command-basics - -Command Documentation: - - Run 'kustomize help config CMD' - - $ kustomize help config tree - -Advanced Documentation Topics: - - Run 'kustomize help config docs-TOPIC' - - $ kustomize help config docs-merge - $ kustomize help config docs-merge3 - $ kustomize help config docs-fn - $ kustomize help config docs-io-annotations -`, -} - // Export commands publicly for composition var ( Annotate = commands.AnnotateCommand @@ -52,10 +21,11 @@ var ( CreateSubstitution = commands.CreateSubstitutionCommand Fmt = commands.FmtCommand Grep = commands.GrepCommand + Init = commands.InitCommand ListSetters = commands.ListSettersCommand Merge = commands.MergeCommand Merge3 = commands.Merge3Command - RunFn = commands.RunFnCommand + RunFn = commands.RunCommand Set = commands.SetCommand Sink = commands.SinkCommand Source = commands.SourceCommand @@ -67,51 +37,16 @@ var ( ExitOnError = &commands.ExitOnError ) -// NewConfigCommand returns a new *cobra.Command for the config command group. This may -// be embedded into other go binaries as a way of packaging the "config" command as part -// of another binary. -// -// name is substituted into the built-in documentation for each sub-command as the command -// invocation prefix -- e.g. if the result is embedded in kustomize, then name should be -// "kustomize" and the built-in docs will display "kustomize config" in the examples. -// -func NewConfigCommand(name string) *cobra.Command { - // config command is alpha - root.Version = "v0.0.0" - - // Only populate the command if Alpha commands are enabled. - if !commandutil.GetAlphaEnabled() { - // return the command because other subcommands are added to it - root.Short = "[Alpha] To enable set KUSTOMIZE_ENABLE_ALPHA_COMMANDS=true" - root.Long = "[Alpha] To enable set KUSTOMIZE_ENABLE_ALPHA_COMMANDS=true" - root.Example = "" - return root - } - - root.PersistentFlags().BoolVar(&commands.StackOnError, "stack-trace", false, - "print a stack-trace on failure") - - name = strings.TrimSpace(name + " config") +// AddCommands adds the cfg, fn and live commands to kustomize. +func AddCommands(root *cobra.Command, name string) *cobra.Command { commands.ExitOnError = true - root.AddCommand(commands.AnnotateCommand(name)) - root.AddCommand(commands.GrepCommand(name)) - root.AddCommand(commands.TreeCommand(name)) - root.AddCommand(commands.CatCommand(name)) - root.AddCommand(commands.FmtCommand(name)) - root.AddCommand(commands.MergeCommand(name)) - root.AddCommand(commands.Merge3Command(name)) - root.AddCommand(commands.CountCommand(name)) - root.AddCommand(commands.RunFnCommand(name)) - root.AddCommand(commands.XArgsCommand()) - root.AddCommand(commands.WrapCommand()) - root.AddCommand(commands.InitCommand(name)) - root.AddCommand(commands.SetCommand(name)) - root.AddCommand(commands.ListSettersCommand(name)) - root.AddCommand(commands.CreateSetterCommand(name)) - root.AddCommand(commands.CreateSubstitutionCommand(name)) - root.AddCommand(commands.SinkCommand(name)) - root.AddCommand(commands.SourceCommand(name)) + root.PersistentFlags().BoolVar(StackOnError, "stack-trace", false, + "print a stack-trace on error") + + root.AddCommand(GetCfg(name)) + root.AddCommand(GetFn(name)) + root.AddCommand(GetLive(name)) root.AddCommand(&cobra.Command{ Use: "docs-merge", diff --git a/cmd/config/configcobra/example_test.go b/cmd/config/configcobra/example_test.go index 302acc9f7..76a16dde8 100644 --- a/cmd/config/configcobra/example_test.go +++ b/cmd/config/configcobra/example_test.go @@ -11,15 +11,14 @@ import ( "sigs.k8s.io/kustomize/kyaml/commandutil" ) -// ExampleNewConfigCommand demonstrates how to embed the config command as a command inside +// ExampleAddCommands demonstrates how to embed the config command as a command inside // another group. -func ExampleNewConfigCommand() { +func ExampleAddCommands() { // enable the config commands os.Setenv(commandutil.EnableAlphaCommmandsEnvName, "true") - var root = &cobra.Command{ + _ = configcobra.AddCommands(&cobra.Command{ Use: "my-cmd", Short: "My command.", Long: `My command.`, - } - root.AddCommand(configcobra.NewConfigCommand("my-cmd")) + }, "my-cmd") } diff --git a/cmd/config/configcobra/fn.go b/cmd/config/configcobra/fn.go new file mode 100644 index 000000000..f6f7b68af --- /dev/null +++ b/cmd/config/configcobra/fn.go @@ -0,0 +1,24 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package configcobra + +import ( + "github.com/spf13/cobra" + "sigs.k8s.io/kustomize/cmd/config/internal/commands" +) + +func GetFn(name string) *cobra.Command { + cmd := &cobra.Command{ + Use: "fn", + Short: "Commands for running functions against configuration.", + } + + cmd.AddCommand(commands.RunCommand(name)) + cmd.AddCommand(commands.SinkCommand(name)) + cmd.AddCommand(commands.SourceCommand(name)) + cmd.AddCommand(commands.WrapCommand()) + cmd.AddCommand(commands.XArgsCommand()) + + return cmd +} diff --git a/cmd/config/configcobra/live.go b/cmd/config/configcobra/live.go new file mode 100644 index 000000000..3ba237d96 --- /dev/null +++ b/cmd/config/configcobra/live.go @@ -0,0 +1,89 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package configcobra + +import ( + "flag" + + "github.com/spf13/cobra" + "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/cli-runtime/pkg/genericclioptions" + "k8s.io/client-go/discovery" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" + "k8s.io/kubectl/pkg/cmd/util" + "sigs.k8s.io/cli-utils/cmd/apply" + "sigs.k8s.io/cli-utils/cmd/destroy" + "sigs.k8s.io/cli-utils/cmd/diff" + "sigs.k8s.io/cli-utils/cmd/initcmd" + "sigs.k8s.io/cli-utils/cmd/preview" + "sigs.k8s.io/cli-utils/pkg/util/factory" +) + +func GetLive(name string) *cobra.Command { + cmd := &cobra.Command{ + Use: "live", + Short: "Commands for reading and writing resources to a cluster.", + } + ioStreams := genericclioptions.IOStreams{ + In: cmd.InOrStdin(), + Out: cmd.OutOrStdout(), + ErrOut: cmd.ErrOrStderr(), + } + + flags := cmd.PersistentFlags() + kubeConfigFlags := genericclioptions.NewConfigFlags(true).WithDeprecatedPasswordFlag() + kubeConfigFlags.AddFlags(flags) + userAgentKubeConfigFlags := &UserAgentKubeConfigFlags{ + Delegate: kubeConfigFlags, + UserAgent: "kustomize", + } + matchVersionKubeConfigFlags := util.NewMatchVersionFlags( + &factory.CachingRESTClientGetter{ + Delegate: userAgentKubeConfigFlags, + }, + ) + matchVersionKubeConfigFlags.AddFlags(cmd.PersistentFlags()) + cmd.PersistentFlags().AddGoFlagSet(flag.CommandLine) + f := util.NewFactory(matchVersionKubeConfigFlags) + + applyCmd := apply.ApplyCommand(f, ioStreams) + _ = applyCmd.Flags().MarkHidden("no-prune") + + cmd.AddCommand( + applyCmd, + initcmd.NewCmdInit(ioStreams), + preview.NewCmdPreview(f, ioStreams), + diff.NewCmdDiff(f, ioStreams), + destroy.NewCmdDestroy(f, ioStreams)) + return cmd +} + +type UserAgentKubeConfigFlags struct { + Delegate genericclioptions.RESTClientGetter + UserAgent string +} + +func (u *UserAgentKubeConfigFlags) ToRESTConfig() (*rest.Config, error) { + clientConfig, err := u.Delegate.ToRESTConfig() + if err != nil { + return nil, err + } + if u.UserAgent != "" { + clientConfig.UserAgent = u.UserAgent + } + return clientConfig, nil +} + +func (u *UserAgentKubeConfigFlags) ToDiscoveryClient() (discovery.CachedDiscoveryInterface, error) { + return u.Delegate.ToDiscoveryClient() +} + +func (u *UserAgentKubeConfigFlags) ToRESTMapper() (meta.RESTMapper, error) { + return u.Delegate.ToRESTMapper() +} + +func (u *UserAgentKubeConfigFlags) ToRawKubeConfigLoader() clientcmd.ClientConfig { + return u.Delegate.ToRawKubeConfigLoader() +} diff --git a/cmd/config/doc.go b/cmd/config/doc.go new file mode 100644 index 000000000..2e7bf8504 --- /dev/null +++ b/cmd/config/doc.go @@ -0,0 +1,7 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +//go:generate $GOBIN/mdtogo docs/api-conventions internal/generateddocs/api --full=true --license=none +//go:generate $GOBIN/mdtogo docs/tutorials internal/generateddocs/tutorials --full=true --license=none +//go:generate $GOBIN/mdtogo docs/commands internal/generateddocs/commands --license=none +package config diff --git a/cmd/config/docs/commands/annotate.md b/cmd/config/docs/commands/annotate.md index 37299a933..eaf16fa1e 100644 --- a/cmd/config/docs/commands/annotate.md +++ b/cmd/config/docs/commands/annotate.md @@ -11,8 +11,8 @@ ### Examples - kustomize config annotate my-dir/ --kv foo=bar + kustomize cfg annotate my-dir/ --kv foo=bar - kustomize config annotate my-dir/ --kv foo=bar --kv a=b + kustomize cfg annotate my-dir/ --kv foo=bar --kv a=b - kustomize config annotate my-dir/ --kv foo=bar --kind Deployment --name foo + kustomize cfg annotate my-dir/ --kv foo=bar --kind Deployment --name foo diff --git a/cmd/config/docs/commands/cat.md b/cmd/config/docs/commands/cat.md index 7e572f044..65c613d01 100644 --- a/cmd/config/docs/commands/cat.md +++ b/cmd/config/docs/commands/cat.md @@ -12,10 +12,10 @@ ### Examples # print Resource config from a directory - kustomize config cat my-dir/ + kustomize cfg cat my-dir/ # wrap Resource config from a directory in an ResourceList - kustomize config cat my-dir/ --wrap-kind ResourceList --wrap-version config.kubernetes.io/v1alpha1 --function-config fn.yaml + kustomize cfg cat my-dir/ --wrap-kind ResourceList --wrap-version config.kubernetes.io/v1alpha1 --function-config fn.yaml # unwrap Resource config from a directory in an ResourceList - ... | kustomize config cat + ... | kustomize cfg cat diff --git a/cmd/config/docs/commands/count.md b/cmd/config/docs/commands/count.md index aa06bb7dd..52c0d2846 100644 --- a/cmd/config/docs/commands/count.md +++ b/cmd/config/docs/commands/count.md @@ -12,4 +12,4 @@ ### Examples # print Resource counts from a directory - kustomize config count my-dir/ \ No newline at end of file + kustomize cfg count my-dir/ \ No newline at end of file diff --git a/cmd/config/docs/commands/create-setter.md b/cmd/config/docs/commands/create-setter.md index ede4974af..caca7816d 100644 --- a/cmd/config/docs/commands/create-setter.md +++ b/cmd/config/docs/commands/create-setter.md @@ -38,7 +38,7 @@ Create a custom setter for a Resource field by inlining OpenAPI as comments. **Create a new setter:** # create a setter for ports - $ kustomize config set create DIR/ http-port 8080 --type "integer" --field "port" + $ kustomize cfg set create DIR/ http-port 8080 --type "integer" --field "port" Resources fields with a field name matching `--field` and field value matching `VALUE` will have a line comment added marking this field as settable. @@ -63,7 +63,7 @@ Create a custom setter for a Resource field by inlining OpenAPI as comments. Users may not set the field value using the `set` command: # change the http-port value to 8081 - $ kustomize config set DIR/ http-port 8081 + $ kustomize cfg set DIR/ http-port 8081 ### Using default values @@ -75,7 +75,7 @@ The default values for a setter may be: A setter may be for a substring of a full field: - $ kustomize config set create DIR/ image-tag v1.0.01 --type "string" --field "image" + $ kustomize cfg set create DIR/ image-tag v1.0.01 --type "string" --field "image" image: gcr.io/example/app:v1.0.1 # # {"type":"string","x-kustomize":{"partialFieldSetters":[{"name":"image-tag","value":"v1.0.1"}]}} @@ -84,10 +84,10 @@ A single field value may have multiple setters applied to it for different parts ### Examples # create a setter for port fields matching "8080" - kustomize config create-setter DIR/ port 8080 --type "integer" --field port \ + kustomize cfg create-setter DIR/ port 8080 --type "integer" --field port \ --description "default port used by the app" # create a setter for a substring of a field rather than the full field -- e.g. only the # image tag, not the full image - kustomize config create-setter DIR/ image-tag v1.0.1 --type "string" \ + kustomize cfg create-setter DIR/ image-tag v1.0.1 --type "string" \ --field image --description "current stable release" \ No newline at end of file diff --git a/cmd/config/docs/commands/fmt.md b/cmd/config/docs/commands/fmt.md index d898112cd..d3f18714d 100644 --- a/cmd/config/docs/commands/fmt.md +++ b/cmd/config/docs/commands/fmt.md @@ -32,13 +32,13 @@ field paths. ### Examples # format file1.yaml and file2.yml - kustomize config fmt file1.yaml file2.yml + kustomize cfg fmt file1.yaml file2.yml # format all *.yaml and *.yml recursively traversing directories - kustomize config fmt my-dir/ + kustomize cfg fmt my-dir/ # format kubectl output - kubectl get -o yaml deployments | kustomize config fmt + kubectl get -o yaml deployments | kustomize cfg fmt # format kustomize output - kustomize build | kustomize config fmt \ No newline at end of file + kustomize build | kustomize cfg fmt \ No newline at end of file diff --git a/cmd/config/docs/commands/grep.md b/cmd/config/docs/commands/grep.md index 7cc129ce8..a3781f760 100644 --- a/cmd/config/docs/commands/grep.md +++ b/cmd/config/docs/commands/grep.md @@ -19,13 +19,13 @@ ### Examples # find Deployment Resources - kustomize config grep "kind=Deployment" my-dir/ + kustomize cfg grep "kind=Deployment" my-dir/ # find Resources named nginx - kustomize config grep "metadata.name=nginx" my-dir/ + kustomize cfg grep "metadata.name=nginx" my-dir/ # use tree to display matching Resources - kustomize config grep "metadata.name=nginx" my-dir/ | kustomize config tree + kustomize cfg grep "metadata.name=nginx" my-dir/ | kustomize cfg tree # look for Resources matching a specific container image - kustomize config grep "spec.template.spec.containers[name=nginx].image=nginx:1\.7\.9" my-dir/ | kustomize config tree + kustomize cfg grep "spec.template.spec.containers[name=nginx].image=nginx:1\.7\.9" my-dir/ | kustomize cfg tree diff --git a/cmd/config/docs/commands/init.md b/cmd/config/docs/commands/init.md index cc5e6f066..44c55dc81 100644 --- a/cmd/config/docs/commands/init.md +++ b/cmd/config/docs/commands/init.md @@ -12,7 +12,7 @@ ### Examples # create a Krmfile in the local directory - kustomize config init + kustomize cfg init # create a Krmfile in my-dir/ - kustomize config init my-dir/ + kustomize cfg init my-dir/ diff --git a/cmd/config/docs/commands/list-setters.md b/cmd/config/docs/commands/list-setters.md index 734ae48ca..b25d17231 100644 --- a/cmd/config/docs/commands/list-setters.md +++ b/cmd/config/docs/commands/list-setters.md @@ -18,6 +18,6 @@ List setters for Resources. Show setters: - $ config list-setters DIR/ + $ kustomize cfg list-setters DIR/ NAME DESCRIPTION VALUE TYPE COUNT SETBY name-prefix '' PREFIX string 2 diff --git a/cmd/config/docs/commands/merge.md b/cmd/config/docs/commands/merge.md index 2677c1f4c..a0de01390 100644 --- a/cmd/config/docs/commands/merge.md +++ b/cmd/config/docs/commands/merge.md @@ -17,8 +17,8 @@ earlier are lower-precedence (the destination). For information on merge rules, run: - kustomize config docs merge + kustomize cfg docs merge ### Examples - cat resources_and_patches.yaml | kustomize config merge > merged_resources.yaml \ No newline at end of file + cat resources_and_patches.yaml | kustomize cfg merge > merged_resources.yaml \ No newline at end of file diff --git a/cmd/config/docs/commands/merge3.md b/cmd/config/docs/commands/merge3.md index 7774a17d0..cbe98318d 100644 --- a/cmd/config/docs/commands/merge3.md +++ b/cmd/config/docs/commands/merge3.md @@ -16,8 +16,8 @@ to the Resource in the DEST_DIR. For information on merge rules, run: - kustomize config docs-merge3 + kustomize cfg docs-merge3 ### Examples - kustomize config merge3 --ancestor a/ --from b/ --to c/ \ No newline at end of file + kustomize cfg merge3 --ancestor a/ --from b/ --to c/ \ No newline at end of file diff --git a/cmd/config/docs/commands/run-fns.md b/cmd/config/docs/commands/run-fns.md index 08b8f6020..9b424fee4 100644 --- a/cmd/config/docs/commands/run-fns.md +++ b/cmd/config/docs/commands/run-fns.md @@ -40,14 +40,14 @@ order they appear in the file). spec: configField: configValue - In the preceding example, 'kustomize config run example/' would identify the function by + In the preceding example, 'kustomize fn run example/' would identify the function by the metadata.annotations.[config.kubernetes.io/function] field. It would then write all Resources in the directory to a container stdin (running the gcr.io/example/examplefunction:v1.0.1 image). It would then write the container stdout back to example/, replacing the directory file contents. - See `kustomize help config docs-fn` for more details on writing functions. + See `kustomize help cfg docs-fn` for more details on writing functions. ### Examples -kustomize config run example/ +kustomize fn run example/ diff --git a/cmd/config/docs/commands/set.md b/cmd/config/docs/commands/set.md index 07aca03be..d221ef7bb 100644 --- a/cmd/config/docs/commands/set.md +++ b/cmd/config/docs/commands/set.md @@ -29,7 +29,7 @@ the configuration as comments. To print the possible setters for the Resources in a directory, run -`list-setters` on a directory -- e.g. `kustomize config list-setters DIR/`. +`list-setters` on a directory -- e.g. `kustomize cfg list-setters DIR/`. #### Tips @@ -39,7 +39,7 @@ To print the possible setters for the Resources in a directory, run The description and setBy fields are left unmodified unless specified with flags. -To create a custom setter for a field see: `kustomize help config create-setter` +To create a custom setter for a field see: `kustomize help cfg create-setter` ### Examples @@ -64,7 +64,7 @@ To create a custom setter for a field see: `kustomize help config create-setter` Perform set: set a new value, owner and description - $ kustomize config set DIR/ name-prefix "test" --description "test environment" --set-by "dev" + $ kustomize cfg set DIR/ name-prefix "test" --description "test environment" --set-by "dev" set 2 values List setters: Show the new values diff --git a/cmd/config/docs/commands/sink.md b/cmd/config/docs/commands/sink.md index 264fb66ac..003cac328 100644 --- a/cmd/config/docs/commands/sink.md +++ b/cmd/config/docs/commands/sink.md @@ -6,7 +6,7 @@ [Alpha] Implement a Sink by writing input to a local directory. - kustomize config sink [DIR] + kustomize fn sink [DIR] DIR: Path to local directory. If unspecified, sink will write to stdout as if it were a single file. @@ -15,4 +15,4 @@ ### Examples - kustomize config source DIR/ | your-function | kustomize config sink DIR/ + kustomize fn source DIR/ | your-function | kustomize fn sink DIR/ diff --git a/cmd/config/docs/commands/source.md b/cmd/config/docs/commands/source.md index 978277b38..ea527ea97 100644 --- a/cmd/config/docs/commands/source.md +++ b/cmd/config/docs/commands/source.md @@ -6,7 +6,7 @@ [Alpha] Implement a Source by reading a local directory. - kustomize config source DIR... + kustomize fn source DIR... DIR: One or more paths to local directories. Contents from directories will be concatenated. @@ -17,6 +17,6 @@ ### Examples # emity configuration directory as input source to a function - kustomize config source DIR/ + kustomize fn source DIR/ - kustomize config source DIR/ | your-function | kustomize config sink DIR/ + kustomize fn source DIR/ | your-function | kustomize fn sink DIR/ diff --git a/cmd/config/docs/commands/tree.md b/cmd/config/docs/commands/tree.md index 3b9742df0..5d6226973 100644 --- a/cmd/config/docs/commands/tree.md +++ b/cmd/config/docs/commands/tree.md @@ -6,7 +6,7 @@ [Alpha] Display Resource structure from a directory or stdin. -kustomize config tree may be used to print Resources in a directory or cluster, preserving structure +kustomize cfg tree may be used to print Resources in a directory or cluster, preserving structure Args: @@ -15,38 +15,38 @@ Args: Resource fields may be printed as part of the Resources by specifying the fields as flags. -kustomize config tree has build-in support for printing common fields, such as replicas, container images, +kustomize cfg tree has build-in support for printing common fields, such as replicas, container images, container names, etc. -kustomize config tree supports printing arbitrary fields using the '--field' flag. +kustomize cfg tree supports printing arbitrary fields using the '--field' flag. -By default, kustomize config tree uses Resource graph structure if any relationships between resources (ownerReferences) +By default, kustomize cfg tree uses Resource graph structure if any relationships between resources (ownerReferences) are detected, as is typically the case when printing from a cluster. Otherwise, directory graph structure is used. The graph structure can also be selected explicitly using the '--graph-structure' flag. ### Examples # print Resources using directory structure - kustomize config tree my-dir/ + kustomize cfg tree my-dir/ # print replicas, container name, and container image and fields for Resources - kustomize config tree my-dir --replicas --image --name + kustomize cfg tree my-dir --replicas --image --name # print all common Resource fields - kustomize config tree my-dir/ --all + kustomize cfg tree my-dir/ --all # print the "foo"" annotation - kustomize config tree my-dir/ --field "metadata.annotations.foo" + kustomize cfg tree my-dir/ --field "metadata.annotations.foo" # print the "foo"" annotation - kubectl get all -o yaml | kustomize config tree \ + kubectl get all -o yaml | kustomize cfg tree \ --field="status.conditions[type=Completed].status" # print live Resources from a cluster using owners for graph structure - kubectl get all -o yaml | kustomize config tree --replicas --name --image + kubectl get all -o yaml | kustomize cfg tree --replicas --name --image # print live Resources with status condition fields - kubectl get all -o yaml | kustomize config tree \ + kubectl get all -o yaml | kustomize cfg tree \ --name --image --replicas \ --field="status.conditions[type=Completed].status" \ --field="status.conditions[type=Complete].status" \ diff --git a/cmd/config/docs/tutorials/configuration-basics.md b/cmd/config/docs/tutorials/configuration-basics.md index 55e20fb14..a55966e4a 100644 --- a/cmd/config/docs/tutorials/configuration-basics.md +++ b/cmd/config/docs/tutorials/configuration-basics.md @@ -2,7 +2,7 @@ ### Synopsis -`kustomize config` provides tools for working with local configuration directories. +`kustomize cfg` provides tools for working with local configuration directories. First fetch a bundle of configuration to your local file system from the Kubernetes examples repository. @@ -14,7 +14,7 @@ `tree` can be used to summarize the collection of Resources in a directory: - $ kustomize config tree mysql-wordpress-pd/ + $ kustomize cfg tree mysql-wordpress-pd/ mysql-wordpress-pd ├── [gce-volumes.yaml] v1.PersistentVolume wordpress-pv-1 ├── [gce-volumes.yaml] v1.PersistentVolume wordpress-pv-2 @@ -31,7 +31,7 @@ supported fields, and may also print arbitrary values using the `--field` flag to specify a field path. - $ kustomize config tree mysql-wordpress-pd/ --name --image --replicas --ports + $ kustomize cfg tree mysql-wordpress-pd/ --name --image --replicas --ports mysql-wordpress-pd ├── [gce-volumes.yaml] PersistentVolume wordpress-pv-1 ├── [gce-volumes.yaml] PersistentVolume wordpress-pv-2 @@ -60,7 +60,7 @@ to build the tree structure. kubectl apply -R -f cockroachdb/ - kubectl get all -o yaml | kustomize config tree --graph-structure owners --name --image --replicas + kubectl get all -o yaml | kustomize cfg tree --graph-structure owners --name --image --replicas . ├── [Resource] Deployment wp/wordpress │   ├── spec.replicas: 1 @@ -84,7 +84,7 @@ ### `cat` -- view the full collection of Resources - $ kustomize config cat mysql-wordpress-pd/ + $ kustomize cfg cat mysql-wordpress-pd/ apiVersion: v1 kind: PersistentVolume metadata: @@ -111,7 +111,7 @@ `fmt` formats the Resource Configuration by applying a consistent style, including ordering of fields and indentation. - $ kustomize config fmt mysql-wordpress-pd/ + $ kustomize cfg fmt mysql-wordpress-pd/ Run `git diff` and see the changes that have been applied. @@ -120,7 +120,7 @@ `grep` prints Resources matching some field value. The Resources are annotated with their file source so they can be piped to other commands without losing this information. - $ kustomize config grep "metadata.name=wordpress" wordpress/ + $ kustomize cfg grep "metadata.name=wordpress" wordpress/ apiVersion: v1 kind: Service metadata: @@ -142,7 +142,7 @@ - list elements may be indexed by a field value using list[field=value] - '.' as part of a key or value may be escaped as '\.' - $ kustomize config grep "spec.status.spec.containers[name=nginx].image=mysql:5\.6" wordpress/ + $ kustomize cfg grep "spec.status.spec.containers[name=nginx].image=mysql:5\.6" wordpress/ apiVersion: apps/v1 # for k8s versions before 1.9.0 use apps/v1beta2 and before 1.8.0 use extensions/v1beta1 kind: Deployment metadata: @@ -163,7 +163,7 @@ `grep` may be used with kubectl to search for Resources in a cluster matching a value. - kubectl get all -o yaml | kustomize config grep "spec.replicas>0" | kustomize config tree --replicas + kubectl get all -o yaml | kustomize cfg grep "spec.replicas>0" | kustomize cfg tree --replicas . └── ├── [.] Deployment wp/wordpress @@ -179,7 +179,7 @@ If there is an error parsing the Resource configuration, kustomize will print an error with the file. - $ kustomize config grep "spec.template.spec.containers[name=\.*].resources.limits.cpu>1.0" ./staging/ | kustomize config tree --name --resources + $ kustomize cfg grep "spec.template.spec.containers[name=\.*].resources.limits.cpu>1.0" ./staging/ | kustomize cfg tree --name --resources Error: staging/persistent-volume-provisioning/quobyte/quobyte-admin-secret.yaml: [0]: yaml: unmarshal errors: line 13: mapping key "type" already defined at line 9 @@ -192,7 +192,7 @@ When developing -- to get a stack trace for where an error was encountered, use the `--stack-trace` flag: - $ kustomize config grep "spec.template.spec.containers[name=\.*].resources.limits.cpu>1.0" ./staging/ --stack-trace + $ kustomize cfg grep "spec.template.spec.containers[name=\.*].resources.limits.cpu>1.0" ./staging/ --stack-trace go/src/sigs.k8s.io/kustomize/kyaml/yaml/types.go:260 (0x4d35c86) (*RNode).GetMeta: return m, errors.Wrap(err) go/src/sigs.k8s.io/kustomize/kyaml/kio/byteio_reader.go:130 (0x4d3e099) @@ -206,7 +206,7 @@ Query for `replicas`: - $ kustomize config grep "spec.replicas>5" ./ | kustomize config tree --replicas + $ kustomize cfg grep "spec.replicas>5" ./ | kustomize cfg tree --replicas . ├── staging/sysdig-cloud │   └── [sysdig-rc.yaml] ReplicationController sysdig-agent @@ -217,7 +217,7 @@ Query for `resource.limits` - $ kustomize config grep "spec.template.spec.containers[name=\.*].resources.limits.memory>0" ./ | kustomize config tree --resources + $ kustomize cfg grep "spec.template.spec.containers[name=\.*].resources.limits.memory>0" ./ | kustomize cfg tree --resources . ├── cassandra │   └── [cassandra-statefulset.yaml] StatefulSet cassandra @@ -246,7 +246,7 @@ Find Resources that have an image specified, but the image doesn't have a tag: - $ kustomize config grep "spec.template.spec.containers[name=\.*].name=\.*" ./ | kustomize config grep "spec.template.spec.containers[name=\.*].image=\.*:\.*" -v | kustomize config tree --image --name + $ kustomize cfg grep "spec.template.spec.containers[name=\.*].name=\.*" ./ | kustomize cfg grep "spec.template.spec.containers[name=\.*].image=\.*:\.*" -v | kustomize cfg tree --image --name . ├── staging/newrelic │   ├── [newrelic-daemonset.yaml] DaemonSet newrelic-agent diff --git a/cmd/config/docs/tutorials/function-basics.md b/cmd/config/docs/tutorials/function-basics.md index 39cf67989..17a0679e1 100644 --- a/cmd/config/docs/tutorials/function-basics.md +++ b/cmd/config/docs/tutorials/function-basics.md @@ -25,13 +25,13 @@ cd template-heredoc-cockroachdb/ # view the Resources - kustomize config tree local-resource/ --name --image --replicas + kustomize cfg tree local-resource/ --name --image --replicas # run the function - kustomize config run local-resource/ + kustomize fn run local-resource/ # view the generated Resources - kustomize config tree local-resource/ --name --image --replicas + kustomize cfg tree local-resource/ --name --image --replicas `run` generated the directory ` local-resource/config` containing the generated Resources. @@ -45,7 +45,7 @@ but keep the fields that you manually added to the generated Resource configuration. # run the function - kustomize config run local-resource/ + kustomize fn run local-resource/ `run` facilitates a non-destructive *smart templating* approach that allows templating to be composed with manual modifications directly to the template output, as well as @@ -70,13 +70,13 @@ cd template-go-nginx/ # view the Resources - kustomize config tree local-resource/ --name --image --replicas + kustomize cfg tree local-resource/ --name --image --replicas # run the function - kustomize config run local-resource/ + kustomize fn run local-resource/ # view the generated Resources - kustomize config tree local-resource/ --name --image --replicas + kustomize cfg tree local-resource/ --name --image --replicas `run` generated the directory ` local-resource/config` containing the generated Resources. this time it put the configuration in a single file rather than multiple @@ -92,7 +92,7 @@ but keep the fields that you manually added to the generated Resource configuration. # run the function - kustomize config run local-resource/ + kustomize fn run local-resource/ Just like in the preceding section, the function is implemented using a non-destructive approach which merges the generated Resources into previously generated instances. @@ -112,7 +112,7 @@ directory, and invoke `run` on the `local-resource/` directory. # run the function - kustomize config run local-resource/ + kustomize fn run local-resource/ cpu-requests missing for a container in Deployment nginx (example-use.yaml [1]) Error: exit status 1 Usage: @@ -124,7 +124,7 @@ and print the name of the file + Resource index. Edit the file and uncomment the resources, then re-run the functions. - kustomize config run local-resource/ + kustomize fn run local-resource/ The validation now passes. @@ -139,7 +139,7 @@ directory, and invoke `run` on the `local-resource/` directory. # print the resources - kustomize config tree local-resource --resources --name + kustomize cfg tree local-resource --resources --name local-resource ├── [example-use.yaml] Validator └── [example-use.yaml] Deployment nginx @@ -148,10 +148,10 @@ └── name: nginx # run the functions - kustomize config run local-resource/ + kustomize fn run local-resource/ # print the new resources - kustomize config tree local-resource --resources --name + kustomize cfg tree local-resource --resources --name ├── [example-use.yaml] Validator └── [example-use.yaml] Deployment nginx └── spec.template.spec.containers @@ -163,8 +163,8 @@ Change the `tshirt-size` annotation from `medium` to `small` and re-run the functions. - kustomize config run local-resource/ - kustomize config tree local-resource/ + kustomize fn run local-resource/ + kustomize cfg tree local-resource/ local-resource ├── [example-use.yaml] Validator └── [example-use.yaml] Deployment nginx diff --git a/cmd/config/ext/ext.go b/cmd/config/ext/ext.go index 4ebbea5f9..72235269b 100644 --- a/cmd/config/ext/ext.go +++ b/cmd/config/ext/ext.go @@ -5,12 +5,10 @@ package ext import ( "path/filepath" - - "sigs.k8s.io/kustomize/kyaml/krmfile" ) // GetOpenAPIFile returns the path to the file containing supplementary OpenAPI definitions. // Maybe be overridden to configure which file to read OpenAPI definitions from. var GetOpenAPIFile = func(args []string) (string, error) { - return filepath.Join(args[0], krmfile.KrmfileName), nil + return filepath.Join(args[0], "Krmfile"), nil } diff --git a/cmd/config/fixgomod.sh b/cmd/config/fixgomod.sh index 62a930c88..632a837fa 100755 --- a/cmd/config/fixgomod.sh +++ b/cmd/config/fixgomod.sh @@ -9,4 +9,5 @@ set -e : "${kyaml_patch?Need to source VERSIONS}" go mod edit -dropreplace=sigs.k8s.io/kustomize/kyaml@v0.0.0 +go mod edit -dropreplace=sigs.k8s.io/kustomize/kyaml@v0.1.13 go mod edit -require=sigs.k8s.io/kustomize/kyaml@v$kyaml_major.$kyaml_minor.$kyaml_patch diff --git a/cmd/config/go.mod b/cmd/config/go.mod index 2e5366743..be2523f3c 100644 --- a/cmd/config/go.mod +++ b/cmd/config/go.mod @@ -10,11 +10,18 @@ require ( github.com/spf13/cobra v1.0.0 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.4.0 - k8s.io/apimachinery v0.17.0 - sigs.k8s.io/kustomize/kyaml v0.0.0 // Don't change this! + k8s.io/apimachinery v0.17.3 + k8s.io/cli-runtime v0.17.3 + k8s.io/client-go v0.17.3 + k8s.io/kubectl v0.0.0-20191219154910-1528d4eea6dd + sigs.k8s.io/cli-utils v0.12.0 + // TODO: Fix this -- this should depend on v0.0.0 and be replaced (below), + // however the cli-runtime dependency causes `go mod` to set this as the + // dependency. + sigs.k8s.io/kustomize/kyaml v0.1.13 // Don't change this! ) -// Don't change this! +// TODO: Fix this -- we sould only depend on v0.0.0 and replace that one. // // This line is managed by the release script -- releasing/releasemodule.sh // Pinning to a released version of kyaml will invalidate the e2e tests used to @@ -23,4 +30,7 @@ require ( // // releasing/releasemodule.sh will remove this line and set the require version // to the kyaml version specified in releasing/VERSIONS -replace sigs.k8s.io/kustomize/kyaml v0.0.0 => ../../kyaml +replace ( + sigs.k8s.io/kustomize/kyaml v0.0.0 => ../../kyaml + sigs.k8s.io/kustomize/kyaml v0.1.13 => ../../kyaml +) diff --git a/cmd/config/go.sum b/cmd/config/go.sum index 97738dad0..6e6ca3eea 100644 --- a/cmd/config/go.sum +++ b/cmd/config/go.sum @@ -1,6 +1,20 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= github.com/360EntSecGroup-Skylar/excelize v1.4.1/go.mod h1:vnax29X2usfl7HHkBrX5EvSCJcmH3dT9luvxzu8iGAE= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +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/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= 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/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU= +github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= 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/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg= @@ -22,32 +36,66 @@ github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= 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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 h1:7aWHqerlJ41y6FOsEUvknqgXnGmJyJSbjhAWq5pO4F8= +github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= 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/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= 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/etcd v3.3.15+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= 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/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0 h1:w3NnFcKR5241cfmQU5ZZAsf0xcpId6mWOupTvJlUX2U= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= 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 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustmop/soup v1.1.2-0.20190516214245-38228baa104e/go.mod h1:CgNC6SGbT+Xb8wGGvzilttZL1mc5sQ/5KkcxsZttMIk= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e h1:p1yVGRW3nmb85p1Sh1ZJSDm4A4iKLS5QNbvUHMgGu/M= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= +github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= +github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= +github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= @@ -56,7 +104,10 @@ github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/zapr v0.1.0 h1:h+WVe9j6HAA01niTJPA/kKH0i7e0rLZBCwauQFcRE54= +github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -110,6 +161,7 @@ github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tF github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= 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 h1:YFzsdWIDfVuLvIOF+ZmKjVg1MbPJ1QgY9PihMwei1ys= github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= @@ -120,12 +172,22 @@ github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09Vjb github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/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/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.0.0/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= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho= +github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8= +github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= @@ -133,30 +195,56 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= +github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +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/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.3.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= 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= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= @@ -165,6 +253,9 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -173,34 +264,54 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= 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= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= 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.4.0/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 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.3.0/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 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= 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= +github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -208,35 +319,53 @@ github.com/posener/complete/v2 v2.0.1-alpha.12 h1:0wvkuDfHb5vSZlNBYgpEH4XQHpF46M github.com/posener/complete/v2 v2.0.1-alpha.12/go.mod h1://JlL91cS2JV7rOl6LVHrRqBXoBUecJu3ILQPgbJiMQ= github.com/posener/script v1.0.4 h1:nSuXW5ZdmFnQIueLB2s0qvs4oNsUloM1Zydzh75v42w= github.com/posener/script v1.0.4/go.mod h1:Rg3ijooqulo05aGLyGsHoLmIOUzHUVK19WVgrYBPU/E= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= 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/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/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/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 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= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= 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.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -249,68 +378,120 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= +github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= 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= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.2 h1:jxcFYjlkl8xaERsgLo+RNquI0epW6zuy/ZRQs6jnrFA= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= 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= +go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +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-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180112015858-5ccada7d0a7b/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/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-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +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-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/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/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180117170059-2c42eef0765b/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= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c h1:Vco5b+cuG5NNfORVxZy6bYZQ7rsigisU1WQFkvQ0L5E= golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/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.20171227012246-e19ae1496984/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 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +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 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/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-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -318,37 +499,136 @@ golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/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-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +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/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 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= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.21.0/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= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= 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= 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/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.0.0/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2 h1:XZx7nhd5GMaZpmDaEHFVafUZC7ya0fuo7cSJ3UCKYmM= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200121175148-a6ecf24a6d71 h1:Xe2gvTZUJpsvOWUnvmL/tmhVBZUmHSvLbMjRj6NUUKo= +gopkg.in/yaml.v3 v3.0.0-20200121175148-a6ecf24a6d71/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/apimachinery v0.17.0 h1:xRBnuie9rXcPxUkDizUsGvPf1cnlZCFu210op7J7LJo= -k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +k8s.io/api v0.0.0-20190918155943-95b840bb6a1f/go.mod h1:uWuOHnjmNrtQomJrvEBg0c0HRNyQ+8KTEERVsK0PW48= +k8s.io/api v0.0.0-20191214185829-ca1d04f8b0d3/go.mod h1:itOjKREfmUTvcjantxOsyYU5mbFsU7qUnyUuRfF5+5M= +k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4= +k8s.io/api v0.17.3 h1:XAm3PZp3wnEdzekNkcmj/9Y1zdmQYJ1I4GKSBBZ8aG0= +k8s.io/api v0.17.3/go.mod h1:YZ0OTkuw7ipbe305fMpIdf3GLXZKRigjtZaV5gzC2J0= +k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783/go.mod h1:xvae1SZB3E17UpV59AWc271W/Ph25N+bjPyR63X6tPY= +k8s.io/apiextensions-apiserver v0.17.2 h1:cP579D2hSZNuO/rZj9XFRzwJNYb41DbNANJb6Kolpss= +k8s.io/apiextensions-apiserver v0.17.2/go.mod h1:4KdMpjkEjjDI2pPfBA15OscyNldHWdBCfsWMDWAmSTs= +k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655/go.mod h1:nL6pwRT8NgfF8TT68DBI8uEePRt89cSvoXUVqbkWHq4= +k8s.io/apimachinery v0.0.0-20191214185652-442f8fb2f03a/go.mod h1:Ng1IY8TS7sC44KJxT/WUR6qFRfWwahYYYpNXyYRKOCY= +k8s.io/apimachinery v0.0.0-20191216025728-0ee8b4573e3a/go.mod h1:Ng1IY8TS7sC44KJxT/WUR6qFRfWwahYYYpNXyYRKOCY= +k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= +k8s.io/apimachinery v0.17.3 h1:f+uZV6rm4/tHE7xXgLyToprg6xWairaClGVkm2t8omg= +k8s.io/apimachinery v0.17.3/go.mod h1:gxLnyZcGNdZTCLnq3fgzyg2A5BVCHTNDFrw8AmuJ+0g= +k8s.io/apiserver v0.0.0-20190918160949-bfa5e2e684ad/go.mod h1:XPCXEwhjaFN29a8NldXA901ElnKeKLrLtREO9ZhFyhg= +k8s.io/apiserver v0.17.2/go.mod h1:lBmw/TtQdtxvrTk0e2cgtOxHizXI+d0mmGQURIHQZlo= +k8s.io/cli-runtime v0.0.0-20191214191754-e6dc6d5c8724/go.mod h1:wzlq80lvjgHW9if6MlE4OIGC86MDKsy5jtl9nxz/IYY= +k8s.io/cli-runtime v0.17.2/go.mod h1:aa8t9ziyQdbkuizkNLAw3qe3srSyWh9zlSB7zTqRNPI= +k8s.io/cli-runtime v0.17.3 h1:0ZlDdJgJBKsu77trRUynNiWsRuAvAVPBNaQfnt/1qtc= +k8s.io/cli-runtime v0.17.3/go.mod h1:X7idckYphH4SZflgNpOOViSxetiMj6xI0viMAjM81TA= +k8s.io/client-go v0.0.0-20190918160344-1fbdaa4c8d90/go.mod h1:J69/JveO6XESwVgG53q3Uz5OSfgsv4uxpScmmyYOOlk= +k8s.io/client-go v0.0.0-20191214190045-a32a6f7a3052/go.mod h1:tAaoc/sYuIL0+njJefSAmE28CIcxyaFV4kbIujBlY2s= +k8s.io/client-go v0.0.0-20191219150334-0b8da7416048/go.mod h1:ZEe8ZASDUAuqVGJ+UN0ka0PfaR+b6a6E1PGsSNZRui8= +k8s.io/client-go v0.17.2/go.mod h1:QAzRgsa0C2xl4/eVpeVAZMvikCn8Nm81yqVx3Kk9XYI= +k8s.io/client-go v0.17.3 h1:deUna1Ksx05XeESH6XGCyONNFfiQmDdqeqUvicvP6nU= +k8s.io/client-go v0.17.3/go.mod h1:cLXlTMtWHkuK4tD360KpWz2gG2KtdWEr/OT02i3emRQ= +k8s.io/code-generator v0.0.0-20190912054826-cd179ad6a269/go.mod h1:V5BD6M4CyaN5m+VthcclXWsVcT1Hu+glwa1bi3MIsyE= +k8s.io/code-generator v0.0.0-20191214185510-0b9b3c99f9f2/go.mod h1:BjGKcoq1MRUmcssvHiSxodCco1T6nVIt4YeCT5CMSao= +k8s.io/code-generator v0.17.2/go.mod h1:DVmfPQgxQENqDIzVR2ddLXMH34qeszkKSdH/N+s+38s= +k8s.io/component-base v0.0.0-20190918160511-547f6c5d7090/go.mod h1:933PBGtQFJky3TEwYx4aEPZ4IxqhWh3R6DCmzqIn1hA= +k8s.io/component-base v0.0.0-20191214190519-d868452632e2/go.mod h1:wupxkh1T/oUDqyTtcIjiEfpbmIHGm8By/vqpSKC6z8c= +k8s.io/component-base v0.17.2 h1:0XHf+cerTvL9I5Xwn9v+0jmqzGAZI7zNydv4tL6Cw6A= +k8s.io/component-base v0.17.2/go.mod h1:zMPW3g5aH7cHJpKYQ/ZsGMcgbsA/VyhEugF3QT1awLs= 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/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/kubectl v0.0.0-20191219154910-1528d4eea6dd h1:nZX5+wEqTu/EBIYjrZlFOA63z4+Zcy96lDkCZPU9a9c= +k8s.io/kubectl v0.0.0-20191219154910-1528d4eea6dd/go.mod h1:9ehGcuUGjXVZh0qbYSB0vvofQw2JQe6c6cO0k4wu/Oo= +k8s.io/metrics v0.0.0-20191214191643-6b1944c9f765/go.mod h1:5V7rewilItwK0cz4nomU0b3XCcees2Ka5EBYWS1HBeM= +k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCuiMMNF8YUVLF3vJo= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +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= +sigs.k8s.io/cli-utils v0.12.0 h1:+CvYwQAEtKvcx/NaUVF9rDKvY91VwJj+i7D2lWBMYc0= +sigs.k8s.io/cli-utils v0.12.0/go.mod h1:H35YA5iJIM7EVNgqDTjX2dgt4wE23zmnXOTSTlyD+PE= +sigs.k8s.io/controller-runtime v0.4.0 h1:wATM6/m+3w8lj8FXNaO6Fs/rq/vqoOjO1Q116Z9NPsg= +sigs.k8s.io/controller-runtime v0.4.0/go.mod h1:ApC79lpY3PHW9xj/w9pj+lYkLgwAAUZwfXkME1Lajns= +sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0= +sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= +sigs.k8s.io/kustomize/kyaml v0.1.4 h1:cDG2u7v6CTAZmWKzCjk0hKG7AIN+2mCHx2ifwPbvKrs= +sigs.k8s.io/kustomize/kyaml v0.1.4/go.mod h1:461i94nj0h0ylJ6w83jLkR4SqqVhn1iY6fjD0JSTQeE= sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06 h1:zD2IemQ4LmOcAumeiyDWXKUI2SO0NYDe3H6QGvPOVgU= +sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06/go.mod h1:/ULNhyfzRopfcjskuui0cTITekDduZ7ycKN3oUT9R18= +sigs.k8s.io/testing_frameworks v0.1.2 h1:vK0+tvjF0BZ/RYFeZ1E6BYBwHJJXhjuZ3TdsEKH+UQM= +sigs.k8s.io/testing_frameworks v0.1.2/go.mod h1:ToQrwSC3s8Xf/lADdZp3Mktcql9CG0UAmdJG9th5i0w= +sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI= diff --git a/cmd/config/internal/commands/cmdset_test.go b/cmd/config/internal/commands/cmdset_test.go index 38f64df4a..eda1bd982 100644 --- a/cmd/config/internal/commands/cmdset_test.go +++ b/cmd/config/internal/commands/cmdset_test.go @@ -1010,4 +1010,4 @@ spec: } }) } -} \ No newline at end of file +} diff --git a/cmd/config/internal/commands/e2e/create_setter_test.go b/cmd/config/internal/commands/e2e/create_setter_test.go index 294022f1e..999ec0eeb 100644 --- a/cmd/config/internal/commands/e2e/create_setter_test.go +++ b/cmd/config/internal/commands/e2e/create_setter_test.go @@ -11,7 +11,7 @@ func TestCreateSetter(t *testing.T) { tests := []test{ { name: "create_setter", - args: []string{"create-setter", ".", "replicas", "3"}, + args: []string{"cfg", "create-setter", ".", "replicas", "3"}, files: map[string]string{ "deployment.yaml": ` apiVersion: apps/v1 diff --git a/cmd/config/internal/commands/e2e/e2e_test.go b/cmd/config/internal/commands/e2e/e2e_test.go index 6fa2ce32f..f62ea336c 100644 --- a/cmd/config/internal/commands/e2e/e2e_test.go +++ b/cmd/config/internal/commands/e2e/e2e_test.go @@ -678,7 +678,7 @@ metadata: testutil.AssertNoError(t, err) } - args := append([]string{"run", "."}, tt.args(binDir)...) + args := append([]string{"fn", "run", "."}, tt.args(binDir)...) cmd := exec.Command(filepath.Join(binDir, kyamlBin), args...) cmd.Dir = dir var stdErr, stdOut bytes.Buffer @@ -732,7 +732,7 @@ func build() string { } build = exec.Command("go", "build", "-o", filepath.Join(binDir, kyamlBin)) - build.Dir = filepath.Join("..", "..", "..") + build.Dir = filepath.Join("..", "..", "..", "kubectl-krm") build.Stdout = os.Stdout build.Stderr = os.Stderr err = build.Run() @@ -763,11 +763,11 @@ var ( ) func init() { - kyamlBin = "kyaml" + kyamlBin = "kubectl-krm" e2econtainerconfigBin = "e2econtainerconfig" if runtime.GOOS == "windows" { - kyamlBin = "kyaml.exe" + kyamlBin = "kubectl-krm.exe" e2econtainerconfigBin = "e2econtainerconfig.exe" } } diff --git a/cmd/config/internal/commands/e2e/init_test.go b/cmd/config/internal/commands/e2e/init_test.go index 7fd22187d..06e93b0b9 100644 --- a/cmd/config/internal/commands/e2e/init_test.go +++ b/cmd/config/internal/commands/e2e/init_test.go @@ -9,7 +9,7 @@ func TestInit(t *testing.T) { tests := []test{ { name: "init", - args: []string{"init"}, + args: []string{"cfg", "init"}, expectedFiles: map[string]string{ "Krmfile": ` apiVersion: config.k8s.io/v1alpha1 @@ -20,7 +20,7 @@ kind: Krmfile { name: "init", - args: []string{"init", "."}, + args: []string{"cfg", "init", "."}, expectedFiles: map[string]string{ "Krmfile": ` apiVersion: config.k8s.io/v1alpha1 diff --git a/cmd/config/internal/commands/e2e/list_setters_test.go b/cmd/config/internal/commands/e2e/list_setters_test.go index 1358eacd3..47ce68bbe 100644 --- a/cmd/config/internal/commands/e2e/list_setters_test.go +++ b/cmd/config/internal/commands/e2e/list_setters_test.go @@ -9,7 +9,7 @@ func TestListSetters(t *testing.T) { tests := []test{ { name: "set", - args: []string{"list-setters", "."}, + args: []string{"cfg", "list-setters", "."}, files: map[string]string{ "deployment.yaml": ` apiVersion: apps/v1 diff --git a/cmd/config/internal/commands/e2e/set_test.go b/cmd/config/internal/commands/e2e/set_test.go index 1d751ee07..320227a3a 100644 --- a/cmd/config/internal/commands/e2e/set_test.go +++ b/cmd/config/internal/commands/e2e/set_test.go @@ -9,7 +9,7 @@ func TestSet(t *testing.T) { tests := []test{ { name: "set", - args: []string{"set", ".", "replicas", "4"}, + args: []string{"cfg", "set", ".", "replicas", "4"}, files: map[string]string{ "deployment.yaml": ` apiVersion: apps/v1 diff --git a/cmd/config/internal/commands/run-fns.go b/cmd/config/internal/commands/run-fns.go index 7e3856b63..2ae82adae 100644 --- a/cmd/config/internal/commands/run-fns.go +++ b/cmd/config/internal/commands/run-fns.go @@ -68,7 +68,7 @@ func GetRunFnRunner(name string) *RunFnRunner { return r } -func RunFnCommand(name string) *cobra.Command { +func RunCommand(name string) *cobra.Command { return GetRunFnRunner(name).Command } diff --git a/cmd/config/internal/commands/tree_test.go b/cmd/config/internal/commands/tree_test.go index b326a489f..8d14f3f7d 100644 --- a/cmd/config/internal/commands/tree_test.go +++ b/cmd/config/internal/commands/tree_test.go @@ -187,7 +187,7 @@ spec: return } - if !assert.Equal(t, fmt.Sprintf(`. + if !assert.Equal(t, `. ├── [f1.yaml] Deployment default/foo ├── [f1.yaml] Service default/foo ├── [f1.yaml] Deployment default/foo3 @@ -196,7 +196,7 @@ spec: ├── [f1.yaml] Deployment default2/foo2 └── bar-package └── [f2.yaml] Deployment bar -`), b.String()) { +`, b.String()) { return } } diff --git a/cmd/config/internal/commands/util.go b/cmd/config/internal/commands/util.go index b201451ed..87b2ede87 100644 --- a/cmd/config/internal/commands/util.go +++ b/cmd/config/internal/commands/util.go @@ -45,7 +45,7 @@ func handleError(c *cobra.Command, err error) error { } if StackOnError { if err, ok := err.(*errors.Error); ok { - fmt.Fprint(os.Stderr, fmt.Sprintf("%s", err.Stack())) + fmt.Fprintf(os.Stderr, "%s", err.Stack()) } } diff --git a/cmd/config/internal/generateddocs/commands/docs.go b/cmd/config/internal/generateddocs/commands/docs.go index 05ce0a9d1..fb567dbff 100644 --- a/cmd/config/internal/generateddocs/commands/docs.go +++ b/cmd/config/internal/generateddocs/commands/docs.go @@ -12,11 +12,11 @@ var AnnotateLong = ` Path to local directory. ` var AnnotateExamples = ` - kustomize config annotate my-dir/ --kv foo=bar + kustomize cfg annotate my-dir/ --kv foo=bar - kustomize config annotate my-dir/ --kv foo=bar --kv a=b + kustomize cfg annotate my-dir/ --kv foo=bar --kv a=b - kustomize config annotate my-dir/ --kv foo=bar --kind Deployment --name foo` + kustomize cfg annotate my-dir/ --kv foo=bar --kind Deployment --name foo` var CatShort = `[Alpha] Print Resource Config from a local directory.` var CatLong = ` @@ -27,13 +27,13 @@ var CatLong = ` ` var CatExamples = ` # print Resource config from a directory - kustomize config cat my-dir/ + kustomize cfg cat my-dir/ # wrap Resource config from a directory in an ResourceList - kustomize config cat my-dir/ --wrap-kind ResourceList --wrap-version config.kubernetes.io/v1alpha1 --function-config fn.yaml + kustomize cfg cat my-dir/ --wrap-kind ResourceList --wrap-version config.kubernetes.io/v1alpha1 --function-config fn.yaml # unwrap Resource config from a directory in an ResourceList - ... | kustomize config cat` + ... | kustomize cfg cat` var CompletionShort = `Install shell completion.` var CompletionLong = ` @@ -61,7 +61,7 @@ var CountLong = ` ` var CountExamples = ` # print Resource counts from a directory - kustomize config count my-dir/` + kustomize cfg count my-dir/` var CreateSetterShort = `[Alpha] Create a custom setter for a Resource field` var CreateSetterLong = ` @@ -81,12 +81,12 @@ Create a custom setter for a Resource field by inlining OpenAPI as comments. ` var CreateSetterExamples = ` # create a setter for port fields matching "8080" - kustomize config create-setter DIR/ port 8080 --type "integer" --field port \ + kustomize cfg create-setter DIR/ port 8080 --type "integer" --field port \ --description "default port used by the app" # create a setter for a substring of a field rather than the full field -- e.g. only the # image tag, not the full image - kustomize config create-setter DIR/ image-tag v1.0.1 --type "string" \ + kustomize cfg create-setter DIR/ image-tag v1.0.1 --type "string" \ --field image --description "current stable release"` var FmtShort = `[Alpha] Format yaml configuration files.` @@ -118,16 +118,16 @@ field paths. ` var FmtExamples = ` # format file1.yaml and file2.yml - kustomize config fmt file1.yaml file2.yml + kustomize cfg fmt file1.yaml file2.yml # format all *.yaml and *.yml recursively traversing directories - kustomize config fmt my-dir/ + kustomize cfg fmt my-dir/ # format kubectl output - kubectl get -o yaml deployments | kustomize config fmt + kubectl get -o yaml deployments | kustomize cfg fmt # format kustomize output - kustomize build | kustomize config fmt` + kustomize build | kustomize cfg fmt` var GrepShort = `[Alpha] Search for matching Resources in a directory or from stdin` var GrepLong = ` @@ -145,16 +145,16 @@ var GrepLong = ` ` var GrepExamples = ` # find Deployment Resources - kustomize config grep "kind=Deployment" my-dir/ + kustomize cfg grep "kind=Deployment" my-dir/ # find Resources named nginx - kustomize config grep "metadata.name=nginx" my-dir/ + kustomize cfg grep "metadata.name=nginx" my-dir/ # use tree to display matching Resources - kustomize config grep "metadata.name=nginx" my-dir/ | kustomize config tree + kustomize cfg grep "metadata.name=nginx" my-dir/ | kustomize cfg tree # look for Resources matching a specific container image - kustomize config grep "spec.template.spec.containers[name=nginx].image=nginx:1\.7\.9" my-dir/ | kustomize config tree` + kustomize cfg grep "spec.template.spec.containers[name=nginx].image=nginx:1\.7\.9" my-dir/ | kustomize cfg tree` var InitShort = `[Alpha] Initialize a directory with a Krmfile.` var InitLong = ` @@ -165,10 +165,10 @@ var InitLong = ` ` var InitExamples = ` # create a Krmfile in the local directory - kustomize config init + kustomize cfg init # create a Krmfile in my-dir/ - kustomize config init my-dir/` + kustomize cfg init my-dir/` var ListSettersShort = `[Alpha] List setters for Resources.` var ListSettersLong = ` @@ -185,7 +185,7 @@ List setters for Resources. var ListSettersExamples = ` Show setters: - $ config list-setters DIR/ + $ kustomize cfg list-setters DIR/ NAME DESCRIPTION VALUE TYPE COUNT SETBY name-prefix '' PREFIX string 2` @@ -204,10 +204,10 @@ earlier are lower-precedence (the destination). For information on merge rules, run: - kustomize config docs merge + kustomize cfg docs merge ` var MergeExamples = ` - cat resources_and_patches.yaml | kustomize config merge > merged_resources.yaml` + cat resources_and_patches.yaml | kustomize cfg merge > merged_resources.yaml` var Merge3Short = `[Alpha] Merge diff of Resource configuration files into a destination (3-way)` var Merge3Long = ` @@ -223,10 +223,10 @@ to the Resource in the DEST_DIR. For information on merge rules, run: - kustomize config docs-merge3 + kustomize cfg docs-merge3 ` var Merge3Examples = ` - kustomize config merge3 --ancestor a/ --from b/ --to c/` + kustomize cfg merge3 --ancestor a/ --from b/ --to c/` var RunFnsShort = `[Alpha] Reoncile config functions to Resources.` var RunFnsLong = ` @@ -266,16 +266,16 @@ order they appear in the file). spec: configField: configValue - In the preceding example, 'kustomize config run example/' would identify the function by + In the preceding example, 'kustomize fn run example/' would identify the function by the metadata.annotations.[config.kubernetes.io/function] field. It would then write all Resources in the directory to a container stdin (running the gcr.io/example/examplefunction:v1.0.1 image). It would then write the container stdout back to example/, replacing the directory file contents. - See ` + "`" + `kustomize help config docs-fn` + "`" + ` for more details on writing functions. + See ` + "`" + `kustomize help cfg docs-fn` + "`" + ` for more details on writing functions. ` var RunFnsExamples = ` -kustomize config run example/` +kustomize fn run example/` var SetShort = `[Alpha] Set values on Resources fields values.` var SetLong = ` @@ -304,7 +304,7 @@ the configuration as comments. To print the possible setters for the Resources in a directory, run -` + "`" + `list-setters` + "`" + ` on a directory -- e.g. ` + "`" + `kustomize config list-setters DIR/` + "`" + `. +` + "`" + `list-setters` + "`" + ` on a directory -- e.g. ` + "`" + `kustomize cfg list-setters DIR/` + "`" + `. #### Tips @@ -314,7 +314,7 @@ To print the possible setters for the Resources in a directory, run The description and setBy fields are left unmodified unless specified with flags. -To create a custom setter for a field see: ` + "`" + `kustomize help config create-setter` + "`" + ` +To create a custom setter for a field see: ` + "`" + `kustomize help cfg create-setter` + "`" + ` ` var SetExamples = ` Resource YAML: Name Prefix Setter @@ -322,12 +322,12 @@ var SetExamples = ` # DIR/resources.yaml ... metadata: - name: PREFIX-app1 # {"type":"string","x-kustomize":{"partialFieldSetters":[{"name":"name-prefix","value":"PREFIX"}]}} + name: PREFIX-app1 # {"type":"string","x-kustomize":{"setter":[{"name":"name-prefix","value":"PREFIX"}]}} ... --- ... metadata: - name: PREFIX-app2 # {"type":"string","x-kustomize":{"partialFieldSetters":[{"name":"name-prefix","value":"PREFIX"}]}} + name: PREFIX-app2 # {"type":"string","x-kustomize":{"setter":[{"name":"name-prefix","value":"PREFIX"}]}} ... List setters: Show the possible setters @@ -338,7 +338,7 @@ var SetExamples = ` Perform set: set a new value, owner and description - $ kustomize config set DIR/ name-prefix "test" --description "test environment" --set-by "dev" + $ kustomize cfg set DIR/ name-prefix "test" --description "test environment" --set-by "dev" set 2 values List setters: Show the new values @@ -352,19 +352,19 @@ var SetExamples = ` # DIR/resources.yaml ... metadata: - name: test-app1 # {"description":"test environment","type":"string","x-kustomize":{"setBy":"dev","partialFieldSetters":[{"name":"name-prefix","value":"test"}]}} + name: test-app1 # {"description":"test environment","type":"string","x-kustomize":{"setBy":"dev","setter":[{"name":"name-prefix","value":"test"}]}} ... --- ... metadata: - name: test-app2 # {"description":"test environment","type":"string","x-kustomize":{"setBy":"dev","partialFieldSetters":[{"name":"name-prefix","value":"test"}]}} + name: test-app2 # {"description":"test environment","type":"string","x-kustomize":{"setBy":"dev","setter":[{"name":"name-prefix","value":"test"}]}} ...` var SinkShort = `[Alpha] Implement a Sink by writing input to a local directory.` var SinkLong = ` [Alpha] Implement a Sink by writing input to a local directory. - kustomize config sink [DIR] + kustomize fn sink [DIR] DIR: Path to local directory. If unspecified, sink will write to stdout as if it were a single file. @@ -372,13 +372,13 @@ var SinkLong = ` ` + "`" + `sink` + "`" + ` writes its input to a directory ` var SinkExamples = ` - kustomize config source DIR/ | your-function | kustomize config sink DIR/` + kustomize fn source DIR/ | your-function | kustomize fn sink DIR/` var SourceShort = `[Alpha] Implement a Source by reading a local directory.` var SourceLong = ` [Alpha] Implement a Source by reading a local directory. - kustomize config source DIR... + kustomize fn source DIR... DIR: One or more paths to local directories. Contents from directories will be concatenated. @@ -388,15 +388,15 @@ var SourceLong = ` ` var SourceExamples = ` # emity configuration directory as input source to a function - kustomize config source DIR/ + kustomize fn source DIR/ - kustomize config source DIR/ | your-function | kustomize config sink DIR/` + kustomize fn source DIR/ | your-function | kustomize fn sink DIR/` var TreeShort = `[Alpha] Display Resource structure from a directory or stdin.` var TreeLong = ` [Alpha] Display Resource structure from a directory or stdin. -kustomize config tree may be used to print Resources in a directory or cluster, preserving structure +kustomize cfg tree may be used to print Resources in a directory or cluster, preserving structure Args: @@ -405,37 +405,37 @@ Args: Resource fields may be printed as part of the Resources by specifying the fields as flags. -kustomize config tree has build-in support for printing common fields, such as replicas, container images, +kustomize cfg tree has build-in support for printing common fields, such as replicas, container images, container names, etc. -kustomize config tree supports printing arbitrary fields using the '--field' flag. +kustomize cfg tree supports printing arbitrary fields using the '--field' flag. -By default, kustomize config tree uses Resource graph structure if any relationships between resources (ownerReferences) +By default, kustomize cfg tree uses Resource graph structure if any relationships between resources (ownerReferences) are detected, as is typically the case when printing from a cluster. Otherwise, directory graph structure is used. The graph structure can also be selected explicitly using the '--graph-structure' flag. ` var TreeExamples = ` # print Resources using directory structure - kustomize config tree my-dir/ + kustomize cfg tree my-dir/ # print replicas, container name, and container image and fields for Resources - kustomize config tree my-dir --replicas --image --name + kustomize cfg tree my-dir --replicas --image --name # print all common Resource fields - kustomize config tree my-dir/ --all + kustomize cfg tree my-dir/ --all # print the "foo"" annotation - kustomize config tree my-dir/ --field "metadata.annotations.foo" + kustomize cfg tree my-dir/ --field "metadata.annotations.foo" # print the "foo"" annotation - kubectl get all -o yaml | kustomize config tree \ + kubectl get all -o yaml | kustomize cfg tree \ --field="status.conditions[type=Completed].status" # print live Resources from a cluster using owners for graph structure - kubectl get all -o yaml | kustomize config tree --replicas --name --image + kubectl get all -o yaml | kustomize cfg tree --replicas --name --image # print live Resources with status condition fields - kubectl get all -o yaml | kustomize config tree \ + kubectl get all -o yaml | kustomize cfg tree \ --name --image --replicas \ --field="status.conditions[type=Completed].status" \ --field="status.conditions[type=Complete].status" \ diff --git a/cmd/config/internal/generateddocs/tutorials/docs.go b/cmd/config/internal/generateddocs/tutorials/docs.go index 8ebbeb87e..96f088a73 100644 --- a/cmd/config/internal/generateddocs/tutorials/docs.go +++ b/cmd/config/internal/generateddocs/tutorials/docs.go @@ -6,7 +6,7 @@ package tutorials var ConfigurationBasicsShort = `### Synopsis` var ConfigurationBasicsLong = ` -` + "`" + `kustomize config` + "`" + ` provides tools for working with local configuration directories. +` + "`" + `kustomize cfg` + "`" + ` provides tools for working with local configuration directories. First fetch a bundle of configuration to your local file system from the Kubernetes examples repository. @@ -18,7 +18,7 @@ var ConfigurationBasicsLong = ` ` + "`" + `tree` + "`" + ` can be used to summarize the collection of Resources in a directory: - $ kustomize config tree mysql-wordpress-pd/ + $ kustomize cfg tree mysql-wordpress-pd/ mysql-wordpress-pd ├── [gce-volumes.yaml] v1.PersistentVolume wordpress-pv-1 ├── [gce-volumes.yaml] v1.PersistentVolume wordpress-pv-2 @@ -35,7 +35,7 @@ var ConfigurationBasicsLong = ` supported fields, and may also print arbitrary values using the ` + "`" + `--field` + "`" + ` flag to specify a field path. - $ kustomize config tree mysql-wordpress-pd/ --name --image --replicas --ports + $ kustomize cfg tree mysql-wordpress-pd/ --name --image --replicas --ports mysql-wordpress-pd ├── [gce-volumes.yaml] PersistentVolume wordpress-pv-1 ├── [gce-volumes.yaml] PersistentVolume wordpress-pv-2 @@ -64,7 +64,7 @@ var ConfigurationBasicsLong = ` to build the tree structure. kubectl apply -R -f cockroachdb/ - kubectl get all -o yaml | kustomize config tree --graph-structure owners --name --image --replicas + kubectl get all -o yaml | kustomize cfg tree --graph-structure owners --name --image --replicas . ├── [Resource] Deployment wp/wordpress │   ├── spec.replicas: 1 @@ -88,7 +88,7 @@ var ConfigurationBasicsLong = ` ### ` + "`" + `cat` + "`" + ` -- view the full collection of Resources - $ kustomize config cat mysql-wordpress-pd/ + $ kustomize cfg cat mysql-wordpress-pd/ apiVersion: v1 kind: PersistentVolume metadata: @@ -115,7 +115,7 @@ var ConfigurationBasicsLong = ` ` + "`" + `fmt` + "`" + ` formats the Resource Configuration by applying a consistent style, including ordering of fields and indentation. - $ kustomize config fmt mysql-wordpress-pd/ + $ kustomize cfg fmt mysql-wordpress-pd/ Run ` + "`" + `git diff` + "`" + ` and see the changes that have been applied. @@ -124,7 +124,7 @@ var ConfigurationBasicsLong = ` ` + "`" + `grep` + "`" + ` prints Resources matching some field value. The Resources are annotated with their file source so they can be piped to other commands without losing this information. - $ kustomize config grep "metadata.name=wordpress" wordpress/ + $ kustomize cfg grep "metadata.name=wordpress" wordpress/ apiVersion: v1 kind: Service metadata: @@ -146,7 +146,7 @@ var ConfigurationBasicsLong = ` - list elements may be indexed by a field value using list[field=value] - '.' as part of a key or value may be escaped as '\.' - $ kustomize config grep "spec.status.spec.containers[name=nginx].image=mysql:5\.6" wordpress/ + $ kustomize cfg grep "spec.status.spec.containers[name=nginx].image=mysql:5\.6" wordpress/ apiVersion: apps/v1 # for k8s versions before 1.9.0 use apps/v1beta2 and before 1.8.0 use extensions/v1beta1 kind: Deployment metadata: @@ -167,7 +167,7 @@ var ConfigurationBasicsLong = ` ` + "`" + `grep` + "`" + ` may be used with kubectl to search for Resources in a cluster matching a value. - kubectl get all -o yaml | kustomize config grep "spec.replicas>0" | kustomize config tree --replicas + kubectl get all -o yaml | kustomize cfg grep "spec.replicas>0" | kustomize cfg tree --replicas . └── ├── [.] Deployment wp/wordpress @@ -183,7 +183,7 @@ var ConfigurationBasicsLong = ` If there is an error parsing the Resource configuration, kustomize will print an error with the file. - $ kustomize config grep "spec.template.spec.containers[name=\.*].resources.limits.cpu>1.0" ./staging/ | kustomize config tree --name --resources + $ kustomize cfg grep "spec.template.spec.containers[name=\.*].resources.limits.cpu>1.0" ./staging/ | kustomize cfg tree --name --resources Error: staging/persistent-volume-provisioning/quobyte/quobyte-admin-secret.yaml: [0]: yaml: unmarshal errors: line 13: mapping key "type" already defined at line 9 @@ -196,7 +196,7 @@ var ConfigurationBasicsLong = ` When developing -- to get a stack trace for where an error was encountered, use the ` + "`" + `--stack-trace` + "`" + ` flag: - $ kustomize config grep "spec.template.spec.containers[name=\.*].resources.limits.cpu>1.0" ./staging/ --stack-trace + $ kustomize cfg grep "spec.template.spec.containers[name=\.*].resources.limits.cpu>1.0" ./staging/ --stack-trace go/src/sigs.k8s.io/kustomize/kyaml/yaml/types.go:260 (0x4d35c86) (*RNode).GetMeta: return m, errors.Wrap(err) go/src/sigs.k8s.io/kustomize/kyaml/kio/byteio_reader.go:130 (0x4d3e099) @@ -210,7 +210,7 @@ var ConfigurationBasicsLong = ` Query for ` + "`" + `replicas` + "`" + `: - $ kustomize config grep "spec.replicas>5" ./ | kustomize config tree --replicas + $ kustomize cfg grep "spec.replicas>5" ./ | kustomize cfg tree --replicas . ├── staging/sysdig-cloud │   └── [sysdig-rc.yaml] ReplicationController sysdig-agent @@ -221,7 +221,7 @@ var ConfigurationBasicsLong = ` Query for ` + "`" + `resource.limits` + "`" + ` - $ kustomize config grep "spec.template.spec.containers[name=\.*].resources.limits.memory>0" ./ | kustomize config tree --resources + $ kustomize cfg grep "spec.template.spec.containers[name=\.*].resources.limits.memory>0" ./ | kustomize cfg tree --resources . ├── cassandra │   └── [cassandra-statefulset.yaml] StatefulSet cassandra @@ -250,7 +250,7 @@ var ConfigurationBasicsLong = ` Find Resources that have an image specified, but the image doesn't have a tag: - $ kustomize config grep "spec.template.spec.containers[name=\.*].name=\.*" ./ | kustomize config grep "spec.template.spec.containers[name=\.*].image=\.*:\.*" -v | kustomize config tree --image --name + $ kustomize cfg grep "spec.template.spec.containers[name=\.*].name=\.*" ./ | kustomize cfg grep "spec.template.spec.containers[name=\.*].image=\.*:\.*" -v | kustomize cfg tree --image --name . ├── staging/newrelic │   ├── [newrelic-daemonset.yaml] DaemonSet newrelic-agent @@ -302,13 +302,13 @@ var FunctionBasicsLong = ` cd template-heredoc-cockroachdb/ # view the Resources - kustomize config tree local-resource/ --name --image --replicas + kustomize cfg tree local-resource/ --name --image --replicas # run the function - kustomize config run local-resource/ + kustomize fn run local-resource/ # view the generated Resources - kustomize config tree local-resource/ --name --image --replicas + kustomize cfg tree local-resource/ --name --image --replicas ` + "`" + `run` + "`" + ` generated the directory ` + "`" + ` local-resource/config` + "`" + ` containing the generated Resources. @@ -322,7 +322,7 @@ var FunctionBasicsLong = ` but keep the fields that you manually added to the generated Resource configuration. # run the function - kustomize config run local-resource/ + kustomize fn run local-resource/ ` + "`" + `run` + "`" + ` facilitates a non-destructive *smart templating* approach that allows templating to be composed with manual modifications directly to the template output, as well as @@ -347,13 +347,13 @@ var FunctionBasicsLong = ` cd template-go-nginx/ # view the Resources - kustomize config tree local-resource/ --name --image --replicas + kustomize cfg tree local-resource/ --name --image --replicas # run the function - kustomize config run local-resource/ + kustomize fn run local-resource/ # view the generated Resources - kustomize config tree local-resource/ --name --image --replicas + kustomize cfg tree local-resource/ --name --image --replicas ` + "`" + `run` + "`" + ` generated the directory ` + "`" + ` local-resource/config` + "`" + ` containing the generated Resources. this time it put the configuration in a single file rather than multiple @@ -369,7 +369,7 @@ var FunctionBasicsLong = ` but keep the fields that you manually added to the generated Resource configuration. # run the function - kustomize config run local-resource/ + kustomize fn run local-resource/ Just like in the preceding section, the function is implemented using a non-destructive approach which merges the generated Resources into previously generated instances. @@ -389,7 +389,7 @@ var FunctionBasicsLong = ` directory, and invoke ` + "`" + `run` + "`" + ` on the ` + "`" + `local-resource/` + "`" + ` directory. # run the function - kustomize config run local-resource/ + kustomize fn run local-resource/ cpu-requests missing for a container in Deployment nginx (example-use.yaml [1]) Error: exit status 1 Usage: @@ -401,7 +401,7 @@ var FunctionBasicsLong = ` and print the name of the file + Resource index. Edit the file and uncomment the resources, then re-run the functions. - kustomize config run local-resource/ + kustomize fn run local-resource/ The validation now passes. @@ -416,7 +416,7 @@ var FunctionBasicsLong = ` directory, and invoke ` + "`" + `run` + "`" + ` on the ` + "`" + `local-resource/` + "`" + ` directory. # print the resources - kustomize config tree local-resource --resources --name + kustomize cfg tree local-resource --resources --name local-resource ├── [example-use.yaml] Validator └── [example-use.yaml] Deployment nginx @@ -425,10 +425,10 @@ var FunctionBasicsLong = ` └── name: nginx # run the functions - kustomize config run local-resource/ + kustomize fn run local-resource/ # print the new resources - kustomize config tree local-resource --resources --name + kustomize cfg tree local-resource --resources --name ├── [example-use.yaml] Validator └── [example-use.yaml] Deployment nginx └── spec.template.spec.containers @@ -440,8 +440,8 @@ var FunctionBasicsLong = ` Change the ` + "`" + `tshirt-size` + "`" + ` annotation from ` + "`" + `medium` + "`" + ` to ` + "`" + `small` + "`" + ` and re-run the functions. - kustomize config run local-resource/ - kustomize config tree local-resource/ + kustomize fn run local-resource/ + kustomize cfg tree local-resource/ local-resource ├── [example-use.yaml] Validator └── [example-use.yaml] Deployment nginx diff --git a/cmd/config/kubectl-krm/main.go b/cmd/config/kubectl-krm/main.go new file mode 100644 index 000000000..f46c9ce62 --- /dev/null +++ b/cmd/config/kubectl-krm/main.go @@ -0,0 +1,28 @@ +// Copyright 2019 The Kubernetes Authors. +// SPDX-License-Identifier: Apache-2.0 + +package main + +import ( + "os" + + "github.com/spf13/cobra" + + "sigs.k8s.io/kustomize/cmd/config/configcobra" + "sigs.k8s.io/kustomize/kyaml/commandutil" +) + +func main() { + os.Setenv(commandutil.EnableAlphaCommmandsEnvName, "true") + cmd := configcobra.AddCommands(&cobra.Command{ + Use: "kubectl-krm", + Short: "Plugin for configuration based commands.", + Long: `Plugin for configuration based commands. + +Provides commands for working with Kubernetes resource configuration. +`, + }, "") + if err := cmd.Execute(); err != nil { + os.Exit(1) + } +} diff --git a/cmd/config/main.go b/cmd/config/main.go deleted file mode 100644 index ebc89adcf..000000000 --- a/cmd/config/main.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -//go:generate $GOBIN/mdtogo docs/api-conventions internal/generateddocs/api --full=true --license=none -//go:generate $GOBIN/mdtogo docs/tutorials internal/generateddocs/tutorials --full=true --license=none -//go:generate $GOBIN/mdtogo docs/commands internal/generateddocs/commands --license=none -package main - -import ( - "os" - - "sigs.k8s.io/kustomize/cmd/config/complete" - "sigs.k8s.io/kustomize/cmd/config/configcobra" - "sigs.k8s.io/kustomize/kyaml/commandutil" -) - -func main() { - // enable the config commands - os.Setenv(commandutil.EnableAlphaCommmandsEnvName, "true") - cmd := configcobra.NewConfigCommand("") - complete.Complete(cmd).Complete("config") - - if err := cmd.Execute(); err != nil { - os.Exit(1) - } -} diff --git a/cmd/kubectl/LICENSE_TEMPLATE b/cmd/kubectl/LICENSE_TEMPLATE deleted file mode 100644 index 0c2b3b655..000000000 --- a/cmd/kubectl/LICENSE_TEMPLATE +++ /dev/null @@ -1,2 +0,0 @@ -Copyright {{.Year}} {{.Holder}} -SPDX-License-Identifier: Apache-2.0 diff --git a/cmd/kubectl/Makefile b/cmd/kubectl/Makefile deleted file mode 100644 index b2f9dff29..000000000 --- a/cmd/kubectl/Makefile +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright 2019 The Kubernetes Authors. -# SPDX-License-Identifier: Apache-2.0 - -.PHONY: generate license fix vet fmt test tidy - -GOBIN := $(shell go env GOPATH)/bin - -all: generate license fix vet fmt test tidy - -fix: - go fix ./... - -fmt: - go fmt ./... - -generate: - (which $(GOBIN)/mdtogo || go get sigs.k8s.io/kustomize/cmd/mdtogo) - GOBIN=$(GOBIN) go generate ./... - -license: - (which $(GOBIN)/addlicense || go get github.com/google/addlicense) - $(GOBIN)/addlicense -y 2019 -c "The Kubernetes Authors." -f LICENSE_TEMPLATE . - -tidy: - go mod tidy - -lint: - (which $(GOBIN)/golangci-lint || go get github.com/golangci/golangci-lint/cmd/golangci-lint@v1.19.1) - $(GOBIN)/golangci-lint run ./... - -test: - go test -cover ./... - -vet: - go vet ./... diff --git a/cmd/kubectl/fixgomod.sh b/cmd/kubectl/fixgomod.sh deleted file mode 100755 index 62a930c88..000000000 --- a/cmd/kubectl/fixgomod.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -# Copyright 2019 The Kubernetes Authors. -# SPDX-License-Identifier: Apache-2.0 - -set -e - -: "${kyaml_major?Need to source VERSIONS}" -: "${kyaml_minor?Need to source VERSIONS}" -: "${kyaml_patch?Need to source VERSIONS}" - -go mod edit -dropreplace=sigs.k8s.io/kustomize/kyaml@v0.0.0 -go mod edit -require=sigs.k8s.io/kustomize/kyaml@v$kyaml_major.$kyaml_minor.$kyaml_patch diff --git a/cmd/kubectl/go.mod b/cmd/kubectl/go.mod deleted file mode 100644 index d501e9b09..000000000 --- a/cmd/kubectl/go.mod +++ /dev/null @@ -1,18 +0,0 @@ -module sigs.k8s.io/kustomize/cmd/kubectl - -go 1.13 - -require ( - github.com/go-errors/errors v1.0.1 - github.com/spf13/cobra v1.0.0 - github.com/stretchr/testify v1.4.0 - k8s.io/api v0.17.0 - k8s.io/apimachinery v0.17.0 - k8s.io/cli-runtime v0.17.0 - k8s.io/client-go v0.17.0 - k8s.io/component-base v0.17.0 // indirect - k8s.io/kubectl v0.0.0-20191219154910-1528d4eea6dd - sigs.k8s.io/controller-runtime v0.4.0 - sigs.k8s.io/kustomize/kstatus v0.0.2 - sigs.k8s.io/kustomize/kyaml v0.1.11 -) diff --git a/cmd/kubectl/go.sum b/cmd/kubectl/go.sum deleted file mode 100644 index e4119a9be..000000000 --- a/cmd/kubectl/go.sum +++ /dev/null @@ -1,612 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -github.com/360EntSecGroup-Skylar/excelize v1.4.1/go.mod h1:vnax29X2usfl7HHkBrX5EvSCJcmH3dT9luvxzu8iGAE= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest/autorest v0.9.0 h1:MRvx8gncNaXJqOoLmhNjUAKh33JJF8LyxPhomEtOsjs= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0 h1:q2gDruN08/guU9vAjuPWff0+QIrpH6ediguzdAzXAUU= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/date v0.1.0 h1:YGrhWfrgtFs84+h0o46rJrlmsZtyZRg470CqAXTZaGM= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0 h1:Ww5g4zThfD/6cLb4z6xxgeyDa7QDkizMkJKe0ysZXp0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -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/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/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU= -github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= -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/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -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/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/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 h1:7aWHqerlJ41y6FOsEUvknqgXnGmJyJSbjhAWq5pO4F8= -github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -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/coreos/bbolt v1.3.1-coreos.6/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -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/etcd v3.3.15+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -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/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0 h1:w3NnFcKR5241cfmQU5ZZAsf0xcpId6mWOupTvJlUX2U= -github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -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 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustmop/soup v1.1.2-0.20190516214245-38228baa104e/go.mod h1:CgNC6SGbT+Xb8wGGvzilttZL1mc5sQ/5KkcxsZttMIk= -github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e h1:p1yVGRW3nmb85p1Sh1ZJSDm4A4iKLS5QNbvUHMgGu/M= -github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I= -github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= -github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM= -github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= -github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/zapr v0.1.0 h1:h+WVe9j6HAA01niTJPA/kKH0i7e0rLZBCwauQFcRE54= -github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5 h1:Xm0Ao53uqnk9QE/LlYV5DEU09UAgpliA85QoT9LzqPw= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903 h1:LbsanbbD6LieFkXbj9YNNBupiGHJgFeLpO0j0Fza1h8= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7 h1:u4bArs140e9+AfE52mFHOXVFnOSBJBRlzTHrOPLOIhE= -github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/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/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.0.0/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 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho= -github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8= -github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c h1:964Od4U6p2jUkFxvCydnIczKteheJEzHRToSGK3Bnlw= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k= -github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= -github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= -github.com/gophercloud/gophercloud v0.1.0 h1:P/nh25+rzXouhytV2pUHBb65fnds26Ghl8/391+sT5o= -github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.3.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/imdario/mergo v0.3.5 h1:JboBksRwiiAJWvIYJVo46AfV+IAIKZpfrSzVKj42R4Q= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28= -github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= -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= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= -github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= -github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.4.0/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 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.3.0/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 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -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= -github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/qri-io/starlib v0.4.2-0.20200213133954-ff2e8cd5ef8d/go.mod h1:7DPO4domFU579Ga6E61sB9VFNaniPVwJP5C4bBCu3wA= -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/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/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -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.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -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/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8= -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= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.starlark.net v0.0.0-20190528202925-30ae18b8564f/go.mod h1:c1/X6cHgvdXj6pUlmWKMkuqRnW4K8x2vwt6JAaaircg= -go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= -go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 h1:7KByu05hhLed2MO29w7p1XfZvZ13m8mub3shuVftRs0= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7 h1:0hQKqeLdqlt5iIwVOBErRisrHJAN57yOiPRQItI20fU= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -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-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180112015858-5ccada7d0a7b/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/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-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/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/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180117170059-2c42eef0765b/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= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f h1:25KHgbfyiSm6vwQLbM3zZIe1v9p/3ea4Rz+nnM5K/i4= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456 h1:ng0gs1AKnRRuEMZoTLLlbOd+C17zUDepwGQBb/n+JVg= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190911201528-7ad0cfa0b7b5 h1:SW/0nsKCUaozCUtZTakri5laocGx/5bkDSSLrFUsa5s= -golang.org/x/sys v0.0.0-20190911201528-7ad0cfa0b7b5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c h1:Vco5b+cuG5NNfORVxZy6bYZQ7rsigisU1WQFkvQ0L5E= -golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/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.20171227012246-e19ae1496984/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 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= -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/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/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-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -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/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -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= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -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= -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/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.0.0/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.0.0-20190918155943-95b840bb6a1f/go.mod h1:uWuOHnjmNrtQomJrvEBg0c0HRNyQ+8KTEERVsK0PW48= -k8s.io/api v0.0.0-20191214185829-ca1d04f8b0d3/go.mod h1:itOjKREfmUTvcjantxOsyYU5mbFsU7qUnyUuRfF5+5M= -k8s.io/api v0.17.0 h1:H9d/lw+VkZKEVIUc8F3wgiQ+FUXTTr21M87jXLU7yqM= -k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI= -k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783 h1:V6ndwCPoao1yZ52agqOKaUAl7DYWVGiXjV7ePA2i610= -k8s.io/apiextensions-apiserver v0.0.0-20190918161926-8f644eb6e783/go.mod h1:xvae1SZB3E17UpV59AWc271W/Ph25N+bjPyR63X6tPY= -k8s.io/apimachinery v0.0.0-20190913080033-27d36303b655/go.mod h1:nL6pwRT8NgfF8TT68DBI8uEePRt89cSvoXUVqbkWHq4= -k8s.io/apimachinery v0.0.0-20191214185652-442f8fb2f03a/go.mod h1:Ng1IY8TS7sC44KJxT/WUR6qFRfWwahYYYpNXyYRKOCY= -k8s.io/apimachinery v0.0.0-20191216025728-0ee8b4573e3a/go.mod h1:Ng1IY8TS7sC44KJxT/WUR6qFRfWwahYYYpNXyYRKOCY= -k8s.io/apimachinery v0.17.0 h1:xRBnuie9rXcPxUkDizUsGvPf1cnlZCFu210op7J7LJo= -k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= -k8s.io/apiserver v0.0.0-20190918160949-bfa5e2e684ad/go.mod h1:XPCXEwhjaFN29a8NldXA901ElnKeKLrLtREO9ZhFyhg= -k8s.io/cli-runtime v0.0.0-20191214191754-e6dc6d5c8724/go.mod h1:wzlq80lvjgHW9if6MlE4OIGC86MDKsy5jtl9nxz/IYY= -k8s.io/cli-runtime v0.17.0 h1:XEuStbJBHCQlEKFyTQmceDKEWOSYHZkcYWKp3SsQ9Hk= -k8s.io/cli-runtime v0.17.0/go.mod h1:1E5iQpMODZq2lMWLUJELwRu2MLWIzwvMgDBpn3Y81Qo= -k8s.io/client-go v0.0.0-20190918160344-1fbdaa4c8d90/go.mod h1:J69/JveO6XESwVgG53q3Uz5OSfgsv4uxpScmmyYOOlk= -k8s.io/client-go v0.0.0-20191214190045-a32a6f7a3052/go.mod h1:tAaoc/sYuIL0+njJefSAmE28CIcxyaFV4kbIujBlY2s= -k8s.io/client-go v0.0.0-20191219150334-0b8da7416048/go.mod h1:ZEe8ZASDUAuqVGJ+UN0ka0PfaR+b6a6E1PGsSNZRui8= -k8s.io/client-go v0.17.0 h1:8QOGvUGdqDMFrm9sD6IUFl256BcffynGoe80sxgTEDg= -k8s.io/client-go v0.17.0/go.mod h1:TYgR6EUHs6k45hb6KWjVD6jFZvJV4gHDikv/It0xz+k= -k8s.io/code-generator v0.0.0-20190912054826-cd179ad6a269/go.mod h1:V5BD6M4CyaN5m+VthcclXWsVcT1Hu+glwa1bi3MIsyE= -k8s.io/code-generator v0.0.0-20191214185510-0b9b3c99f9f2/go.mod h1:BjGKcoq1MRUmcssvHiSxodCco1T6nVIt4YeCT5CMSao= -k8s.io/component-base v0.0.0-20190918160511-547f6c5d7090/go.mod h1:933PBGtQFJky3TEwYx4aEPZ4IxqhWh3R6DCmzqIn1hA= -k8s.io/component-base v0.0.0-20191214190519-d868452632e2/go.mod h1:wupxkh1T/oUDqyTtcIjiEfpbmIHGm8By/vqpSKC6z8c= -k8s.io/component-base v0.17.0 h1:BnDFcmBDq+RPpxXjmuYnZXb59XNN9CaFrX8ba9+3xrA= -k8s.io/component-base v0.17.0/go.mod h1:rKuRAokNMY2nn2A6LP/MiwpoaMRHpfRnrPaUJJj1Yoc= -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/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= -k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= -k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kubectl v0.0.0-20191219154910-1528d4eea6dd h1:nZX5+wEqTu/EBIYjrZlFOA63z4+Zcy96lDkCZPU9a9c= -k8s.io/kubectl v0.0.0-20191219154910-1528d4eea6dd/go.mod h1:9ehGcuUGjXVZh0qbYSB0vvofQw2JQe6c6cO0k4wu/Oo= -k8s.io/metrics v0.0.0-20191214191643-6b1944c9f765/go.mod h1:5V7rewilItwK0cz4nomU0b3XCcees2Ka5EBYWS1HBeM= -k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCuiMMNF8YUVLF3vJo= -k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -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= -sigs.k8s.io/controller-runtime v0.4.0 h1:wATM6/m+3w8lj8FXNaO6Fs/rq/vqoOjO1Q116Z9NPsg= -sigs.k8s.io/controller-runtime v0.4.0/go.mod h1:ApC79lpY3PHW9xj/w9pj+lYkLgwAAUZwfXkME1Lajns= -sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0= -sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= -sigs.k8s.io/kustomize/kstatus v0.0.2 h1:7GoHi/Vq7rIAS8AQONlfcdaCpVXY0HqzNhU5us7dToA= -sigs.k8s.io/kustomize/kstatus v0.0.2/go.mod h1:6qUKWLy4+yGExtjbs+fibz2tOBZG7413yx2NHyAzIU0= -sigs.k8s.io/kustomize/kyaml v0.1.11 h1:/VvWxVIgH5gG1K4A7trgbyLgO3tRBiAWNhLFVU1HEmo= -sigs.k8s.io/kustomize/kyaml v0.1.11/go.mod h1:72/rLkSi+L/pHM1oCjwrf3ClU+tH5kZQvvdLSqIHwWU= -sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= -sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= -sigs.k8s.io/testing_frameworks v0.1.2 h1:vK0+tvjF0BZ/RYFeZ1E6BYBwHJJXhjuZ3TdsEKH+UQM= -sigs.k8s.io/testing_frameworks v0.1.2/go.mod h1:ToQrwSC3s8Xf/lADdZp3Mktcql9CG0UAmdJG9th5i0w= -sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI= diff --git a/cmd/kubectl/kubectlcobra/applier.go b/cmd/kubectl/kubectlcobra/applier.go deleted file mode 100644 index b67258053..000000000 --- a/cmd/kubectl/kubectlcobra/applier.go +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package kubectlcobra - -import ( - "context" - "time" - - "github.com/go-errors/errors" - "github.com/spf13/cobra" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/cli-runtime/pkg/resource" - "k8s.io/kubectl/pkg/cmd/apply" - "k8s.io/kubectl/pkg/cmd/util" - "k8s.io/kubectl/pkg/scheme" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/kustomize/kstatus/wait" -) - -// newApplier returns a new Applier. It will set up the applyOptions and -// statusOptions which are responsible for capturing any command line flags. -// It currently requires IOStreams, but this is a legacy from when -// the ApplyOptions were responsible for printing progress. This is now -// handled by a separate printer with the KubectlPrinterAdapter bridging -// between the two. -func newApplier(factory util.Factory, ioStreams genericclioptions.IOStreams) *Applier { - return &Applier{ - applyOptions: apply.NewApplyOptions(ioStreams), - statusOptions: NewStatusOptions(), - factory: factory, - ioStreams: ioStreams, - } -} - -// resolver defines the interface the applier needs to observe status for resources. -type resolver interface { - WaitForStatusOfObjects(ctx context.Context, objects []wait.KubernetesObject) <-chan wait.Event -} - -// Applier performs the step of applying a set of resources into a cluster, -// conditionally waits for all of them to be fully reconciled and finally -// performs prune to clean up any resources that has been deleted. -type Applier struct { - factory util.Factory - ioStreams genericclioptions.IOStreams - - applyOptions *apply.ApplyOptions - statusOptions *StatusOptions - resolver resolver -} - -// Initialize sets up the Applier for actually doing an apply against -// a cluster. This involves validating command line inputs and configuring -// clients for communicating with the cluster. -func (a *Applier) Initialize(cmd *cobra.Command) error { - a.applyOptions.PreProcessorFn = PrependGroupingObject(a.applyOptions) - err := a.applyOptions.Complete(a.factory, cmd) - if err != nil { - return errors.WrapPrefix(err, "error setting up ApplyOptions", 1) - } - // Default PostProcessor is configured in "Complete" function, - // so the prune must happen after "Complete". - a.applyOptions.PostProcessorFn = prune(a.factory, a.applyOptions) - - resolver, err := a.newResolver(a.statusOptions.period) - if err != nil { - return errors.WrapPrefix(err, "error creating resolver", 1) - } - a.resolver = resolver - return nil -} - -// SetFlags configures the command line flags needed for apply and -// status. This is a temporary solution as we should separate the configuration -// of cobra flags from the Applier. -func (a *Applier) SetFlags(cmd *cobra.Command) { - a.applyOptions.DeleteFlags.AddFlags(cmd) - a.applyOptions.RecordFlags.AddFlags(cmd) - a.applyOptions.PrintFlags.AddFlags(cmd) - a.statusOptions.AddFlags(cmd) - a.applyOptions.Overwrite = true -} - -// newResolver sets up a new Resolver for computing status. The configuration -// needed for the resolver is taken from the Factory. -func (a *Applier) newResolver(pollInterval time.Duration) (*wait.Resolver, error) { - config, err := a.factory.ToRESTConfig() - if err != nil { - return nil, errors.WrapPrefix(err, "error getting RESTConfig", 1) - } - - mapper, err := a.factory.ToRESTMapper() - if err != nil { - return nil, errors.WrapPrefix(err, "error getting RESTMapper", 1) - } - - c, err := client.New(config, client.Options{Scheme: scheme.Scheme, Mapper: mapper}) - if err != nil { - return nil, errors.WrapPrefix(err, "error creating client", 1) - } - - return wait.NewResolver(c, mapper, pollInterval), nil -} - -// Run performs the Apply step. This happens asynchronously with updates -// on progress and any errors are reported back on the event channel. -// Cancelling the operation or setting timeout on how long to wait -// for it complete can be done with the passed in context. -// Note: There sn't currently any way to interrupt the operation -// before all the given resources have been applied to the cluster. Any -// cancellation or timeout will only affect how long we wait for the -// resources to become current. -func (a *Applier) Run(ctx context.Context) <-chan Event { - ch := make(chan Event) - - go func() { - defer close(ch) - adapter := &KubectlPrinterAdapter{ - ch: ch, - } - // The adapter is used to intercept what is meant to be printing - // in the ApplyOptions, and instead turn those into events. - a.applyOptions.ToPrinter = adapter.toPrinterFunc() - // This provides us with a slice of all the objects that will be - // applied to the cluster. - infos, _ := a.applyOptions.GetObjects() - err := a.applyOptions.Run() - if err != nil { - // If we see an error here we just report it on the channel and then - // give up. Eventually we might be able to determine which errors - // are fatal and which might allow us to continue. - ch <- Event{ - EventType: ErrorEventType, - ErrorEvent: ErrorEvent{ - Err: errors.WrapPrefix(err, "error applying resources", 1), - }, - } - return - } - - if a.statusOptions.wait { - statusChannel := a.resolver.WaitForStatusOfObjects(ctx, infosToObjects(infos)) - // As long as the statusChannel remains open, we take every statusEvent, - // wrap it in an Event and send it on the channel. - for statusEvent := range statusChannel { - ch <- Event{ - EventType: StatusEventType, - StatusEvent: statusEvent, - } - } - } - - }() - return ch -} - -func infosToObjects(infos []*resource.Info) []wait.KubernetesObject { - var objects []wait.KubernetesObject - for _, info := range infos { - u := info.Object.(*unstructured.Unstructured) - objects = append(objects, u) - } - return objects -} - -// EventType determines the type of events that are available. -type EventType string - -const ( - ErrorEventType EventType = "error" - ApplyEventType EventType = "apply" - StatusEventType EventType = "status" -) - -// Event is the type of the objects that will be returned through -// the channel that is returned from a call to Run. It contains -// information about progress and errors encountered during -// the process of doing apply, waiting for status and doing a prune. -type Event struct { - // EventType is the type of event. - EventType EventType - - // ErrorEvent contains information about any errors encountered. - ErrorEvent ErrorEvent - - // ApplyEvent contains information about progress pertaining to - // applying a resource to the cluster. - ApplyEvent ApplyEvent - - // StatusEvents contains information about the status of one of - // the applied resources. - StatusEvent wait.Event -} - -type ErrorEvent struct { - Err error -} - -type ApplyEvent struct { - Operation string - Object runtime.Object -} diff --git a/cmd/kubectl/kubectlcobra/applier_test.go b/cmd/kubectl/kubectlcobra/applier_test.go deleted file mode 100644 index 0e3dae046..000000000 --- a/cmd/kubectl/kubectlcobra/applier_test.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package kubectlcobra - -import ( - "context" - "github.com/stretchr/testify/assert" - "k8s.io/cli-runtime/pkg/genericclioptions" - cmdtesting "k8s.io/kubectl/pkg/cmd/testing" - "testing" -) - -// The applier is currently hard to test, as the dependencies on the ApplyOptions and -// the resolver are hard to stub out. As we work to better separate the different -// responsibilities of the apply functionality, we should also make it easier to test. -// This provides some basic tests for now. - -func TestApplierWithUnknownFile(t *testing.T) { - tf := cmdtesting.NewTestFactory() - defer tf.Cleanup() - iostreams, _, _, _ := genericclioptions.NewTestIOStreams() - cmd := NewCmdApply("base", tf, iostreams) - - applier := newApplier(tf, iostreams) - filenames := []string{"file.yaml"} - applier.applyOptions.DeleteFlags.FileNameFlags.Filenames = &filenames - - err := applier.Initialize(cmd) - assert.NoError(t, err) - - ch := applier.Run(context.TODO()) - - var events []Event - for msg := range ch { - events = append(events, msg) - } - - if !assert.Equal(t, 1, len(events)) { - return - } - - event := events[0] - if !assert.Equal(t, ErrorEventType, event.EventType) { - return - } - assert.Contains(t, event.ErrorEvent.Err.Error(), "does not exist") -} diff --git a/cmd/kubectl/kubectlcobra/basic_printer.go b/cmd/kubectl/kubectlcobra/basic_printer.go deleted file mode 100644 index 96db9755d..000000000 --- a/cmd/kubectl/kubectlcobra/basic_printer.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package kubectlcobra - -import ( - "fmt" - "k8s.io/apimachinery/pkg/runtime/schema" - "strings" - - "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/cli-runtime/pkg/genericclioptions" - cmdutil "k8s.io/kubectl/pkg/cmd/util" - "sigs.k8s.io/kustomize/kstatus/wait" -) - -// BasicPrinter is a simple implementation that just prints the events -// from the channel in the default format for kubectl. -// We need to support different printers for different output formats. -type BasicPrinter struct { - ioStreams genericclioptions.IOStreams -} - -// Print outputs the events from the provided channel in a simple -// format on StdOut. As we support other printer implementations -// this should probably be an interface. -// This function will block until the channel is closed. -func (b *BasicPrinter) Print(ch <-chan Event) { - for event := range ch { - switch event.EventType { - case ErrorEventType: - cmdutil.CheckErr(event.ErrorEvent.Err) - case ApplyEventType: - obj := event.ApplyEvent.Object - gvk := obj.GetObjectKind().GroupVersionKind() - name := "" - if acc, err := meta.Accessor(obj); err == nil { - if n := acc.GetName(); len(n) > 0 { - name = n - } - } - fmt.Fprintf(b.ioStreams.Out, "%s %s\n", resourceIdToString(gvk.GroupKind(), name), event.ApplyEvent.Operation) - case StatusEventType: - statusEvent := event.StatusEvent - switch statusEvent.Type { - case wait.ResourceUpdate: - id := statusEvent.EventResource.ResourceIdentifier - gk := id.GroupKind - fmt.Fprintf(b.ioStreams.Out, "%s is %s: %s\n", resourceIdToString(gk, id.Name), statusEvent.EventResource.Status.String(), statusEvent.EventResource.Message) - case wait.Completed: - fmt.Fprint(b.ioStreams.Out, "all resources has reached the Current status\n") - case wait.Aborted: - fmt.Fprintf(b.ioStreams.Out, "resources failed to the reached Current status\n") - } - } - } -} - -// resourceIdToString returns the string representation of a GroupKind and a resource name. -func resourceIdToString(gk schema.GroupKind, name string) string { - return fmt.Sprintf("%s/%s", strings.ToLower(gk.String()), name) -} diff --git a/cmd/kubectl/kubectlcobra/commands.go b/cmd/kubectl/kubectlcobra/commands.go deleted file mode 100644 index d4da23e1a..000000000 --- a/cmd/kubectl/kubectlcobra/commands.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -// package kubectlcobra contains cobra commands from kubectl -package kubectlcobra - -import ( - "context" - "flag" - "fmt" - "os" - "strings" - - "github.com/spf13/cobra" - "k8s.io/cli-runtime/pkg/genericclioptions" - "k8s.io/kubectl/pkg/cmd/apply" - "k8s.io/kubectl/pkg/cmd/diff" - "k8s.io/kubectl/pkg/cmd/util" - cmdutil "k8s.io/kubectl/pkg/cmd/util" - "k8s.io/kubectl/pkg/util/i18n" - "sigs.k8s.io/kustomize/kyaml/commandutil" -) - -// GetCommand returns a command from kubectl to install -func GetCommand(parent *cobra.Command) *cobra.Command { - if !commandutil.GetAlphaEnabled() { - return &cobra.Command{ - Use: "resources", - Short: "[Alpha] To enable set KUSTOMIZE_ENABLE_ALPHA_COMMANDS=true", - Long: "[Alpha] To enable set KUSTOMIZE_ENABLE_ALPHA_COMMANDS=true", - } - } - - r := &cobra.Command{ - Use: "resources", - Short: "[Alpha] Perform cluster operations using declarative configuration", - Long: "[Alpha] Perform cluster operations using declarative configuration", - } - - // configure kubectl dependencies and flags - flags := r.Flags() - kubeConfigFlags := genericclioptions.NewConfigFlags(true).WithDeprecatedPasswordFlag() - kubeConfigFlags.AddFlags(flags) - matchVersionKubeConfigFlags := util.NewMatchVersionFlags(kubeConfigFlags) - matchVersionKubeConfigFlags.AddFlags(r.PersistentFlags()) - r.PersistentFlags().AddGoFlagSet(flag.CommandLine) - f := util.NewFactory(matchVersionKubeConfigFlags) - - var ioStreams genericclioptions.IOStreams - - if parent != nil { - ioStreams.In = parent.InOrStdin() - ioStreams.Out = parent.OutOrStdout() - ioStreams.ErrOut = parent.ErrOrStderr() - } else { - ioStreams.In = os.Stdin - ioStreams.Out = os.Stdout - ioStreams.ErrOut = os.Stderr - } - - names := []string{"apply", "diff"} - applyCmd := NewCmdApply("kustomize", f, ioStreams) - updateHelp(names, applyCmd) - diffCmd := diff.NewCmdDiff(f, ioStreams) - updateHelp(names, diffCmd) - - r.AddCommand(applyCmd, diffCmd) - return r -} - -// updateHelp replaces `kubectl` help messaging with `kustomize` help messaging -func updateHelp(names []string, c *cobra.Command) { - for i := range names { - name := names[i] - c.Short = strings.ReplaceAll(c.Short, "kubectl "+name, "kustomize "+name) - c.Long = strings.ReplaceAll(c.Long, "kubectl "+name, "kustomize "+name) - c.Example = strings.ReplaceAll(c.Example, "kubectl "+name, "kustomize "+name) - } -} - -// NewCmdApply creates the `apply` command -func NewCmdApply(baseName string, f util.Factory, ioStreams genericclioptions.IOStreams) *cobra.Command { - applier := newApplier(f, ioStreams) - printer := &BasicPrinter{ - ioStreams: ioStreams, - } - - cmd := &cobra.Command{ - Use: "apply (-f FILENAME | -k DIRECTORY)", - DisableFlagsInUseLine: true, - Short: i18n.T("Apply a configuration to a resource by filename or stdin"), - //Long: applyLong, - //Example: applyExample, - Args: cobra.MaximumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - if len(args) > 0 { - // check is kustomize, if so update - applier.applyOptions.DeleteFlags.FileNameFlags.Kustomize = &args[0] - } - - cmdutil.CheckErr(applier.Initialize(cmd)) - - // Create a context with the provided timout from the cobra parameter. - ctx, cancel := context.WithTimeout(context.Background(), applier.statusOptions.timeout) - defer cancel() - // Run the applier. It will return a channel where we can receive updates - // to keep track of progress and any issues. - ch := applier.Run(ctx) - - // The printer will print updates from the channel. It will block - // until the channel is closed. - printer.Print(ch) - }, - } - - applier.SetFlags(cmd) - - cmdutil.AddValidateFlags(cmd) - cmd.Flags().BoolVar(&applier.applyOptions.ServerDryRun, "server-dry-run", applier.applyOptions.ServerDryRun, "If true, request will be sent to server with dry-run flag, which means the modifications won't be persisted. This is an alpha feature and flag.") - cmd.Flags().Bool("dry-run", false, "If true, only print the object that would be sent, without sending it. Warning: --dry-run cannot accurately output the result of merging the local manifest and the server-side data. Use --server-dry-run to get the merged result instead.") - cmdutil.AddServerSideApplyFlags(cmd) - - return cmd -} - -// PrependGroupingObject orders the objects to apply so the "grouping" -// object stores the inventory, and it is first to be applied. -func PrependGroupingObject(o *apply.ApplyOptions) func() error { - return func() error { - if o == nil { - return fmt.Errorf("ApplyOptions are nil") - } - infos, err := o.GetObjects() - if err != nil { - return err - } - _, exists := findGroupingObject(infos) - if exists { - if err := addInventoryToGroupingObj(infos); err != nil { - return err - } - if !sortGroupingObject(infos) { - return err - } - } - return nil - } -} - -// Prune deletes previously applied objects that have been -// omitted in the current apply. The previously applied objects -// are reached through ConfigMap grouping objects. -func prune(f util.Factory, o *apply.ApplyOptions) func() error { - return func() error { - po, err := NewPruneOptions(f, o) - if err != nil { - return err - } - return po.Prune() - } -} diff --git a/cmd/kubectl/kubectlcobra/commands_test.go b/cmd/kubectl/kubectlcobra/commands_test.go deleted file mode 100644 index 4d6b5ee5d..000000000 --- a/cmd/kubectl/kubectlcobra/commands_test.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -// package kubectlcobra contains cobra commands from kubectl -package kubectlcobra - -import ( - "testing" - - "k8s.io/cli-runtime/pkg/resource" - "k8s.io/kubectl/pkg/cmd/apply" -) - -func TestPrependGroupingObject(t *testing.T) { - tests := []struct { - infos []*resource.Info - }{ - { - infos: []*resource.Info{copyGroupingInfo()}, - }, - { - infos: []*resource.Info{pod1Info, pod3Info, copyGroupingInfo()}, - }, - { - infos: []*resource.Info{pod1Info, pod2Info, copyGroupingInfo(), pod3Info}, - }, - } - - for _, test := range tests { - applyOptions := createApplyOptions(test.infos) - f := PrependGroupingObject(applyOptions) - err := f() - if err != nil { - t.Errorf("Error running pre-processor callback: %s", err) - } - infos, _ := applyOptions.GetObjects() - if len(test.infos) != len(infos) { - t.Fatalf("Wrong number of objects after prepending grouping object") - } - groupingInfo := infos[0] - if !isGroupingObject(groupingInfo.Object) { - t.Fatalf("First object is not the grouping object") - } - inventory, _ := retrieveInventoryFromGroupingObj(infos) - if len(inventory) != (len(infos) - 1) { - t.Errorf("Wrong number of inventory items stored in grouping object") - } - } - -} - -// createApplyOptions is a helper function to assemble the ApplyOptions -// with the passed objects (infos). -func createApplyOptions(infos []*resource.Info) *apply.ApplyOptions { - applyOptions := &apply.ApplyOptions{} - applyOptions.SetObjects(infos) - return applyOptions -} diff --git a/cmd/kubectl/kubectlcobra/grouping.go b/cmd/kubectl/kubectlcobra/grouping.go deleted file mode 100644 index c9e9cd090..000000000 --- a/cmd/kubectl/kubectlcobra/grouping.go +++ /dev/null @@ -1,268 +0,0 @@ -// Copyright 2020 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -// package kubectlcobra contains cobra commands from kubectl -package kubectlcobra - -import ( - "fmt" - "hash/fnv" - "sort" - "strconv" - "strings" - - "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/cli-runtime/pkg/resource" -) - -const ( - GroupingLabel = "kustomize.config.k8s.io/inventory-id" - GroupingHash = "kustomize.config.k8s.io/inventory-hash" -) - -// retrieveGroupingLabel returns the string value of the GroupingLabel -// for the passed object. Returns error if the passed object is nil or -// is not a grouping object. -func retrieveGroupingLabel(obj runtime.Object) (string, error) { - var groupingLabel string - if obj == nil { - return "", fmt.Errorf("Grouping object is nil.\n") - } - accessor, err := meta.Accessor(obj) - if err != nil { - return "", err - } - labels := accessor.GetLabels() - groupingLabel, exists := labels[GroupingLabel] - if !exists { - return "", fmt.Errorf("Grouping label does not exist for grouping object: %s\n", GroupingLabel) - } - return strings.TrimSpace(groupingLabel), nil -} - -// isGroupingObject returns true if the passed object has the -// grouping label. -// TODO(seans3): Check type is ConfigMap. -func isGroupingObject(obj runtime.Object) bool { - if obj == nil { - return false - } - groupingLabel, err := retrieveGroupingLabel(obj) - if err == nil && len(groupingLabel) > 0 { - return true - } - return false -} - -// findGroupingObject returns the "Grouping" object (ConfigMap with -// grouping label) if it exists, and a boolean describing if it was found. -func findGroupingObject(infos []*resource.Info) (*resource.Info, bool) { - for _, info := range infos { - if info != nil && isGroupingObject(info.Object) { - return info, true - } - } - return nil, false -} - -// sortGroupingObject reorders the infos slice to place the grouping -// object in the first position. Returns true if grouping object found, -// false otherwise. -func sortGroupingObject(infos []*resource.Info) bool { - for i, info := range infos { - if info != nil && isGroupingObject(info.Object) { - // If the grouping object is not already in the first position, - // swap the grouping object with the first object. - if i > 0 { - infos[0], infos[i] = infos[i], infos[0] - } - return true - } - } - return false -} - -// Adds the inventory of all objects (passed as infos) to the -// grouping object. Returns an error if a grouping object does not -// exist, or we are unable to successfully add the inventory to -// the grouping object; nil otherwise. Each object is in -// unstructured.Unstructured format. -func addInventoryToGroupingObj(infos []*resource.Info) error { - - // Iterate through the objects (infos), creating an Inventory struct - // as metadata for each object, or if it's the grouping object, store it. - var groupingInfo *resource.Info - var groupingObj *unstructured.Unstructured - inventoryMap := map[string]string{} - for _, info := range infos { - obj := info.Object - if isGroupingObject(obj) { - // If we have more than one grouping object--error. - if groupingObj != nil { - return fmt.Errorf("Error--applying more than one grouping object.") - } - var ok bool - groupingObj, ok = obj.(*unstructured.Unstructured) - if !ok { - return fmt.Errorf("Grouping object is not an Unstructured: %#v", groupingObj) - } - groupingInfo = info - } else { - if obj == nil { - return fmt.Errorf("Creating inventory; object is nil") - } - gk := obj.GetObjectKind().GroupVersionKind().GroupKind() - inventory, err := createInventory(info.Namespace, info.Name, gk) - if err != nil { - return err - } - inventoryMap[inventory.String()] = "" - } - } - - // If we've found the grouping object, store the object metadata inventory - // in the grouping config map. - if groupingObj == nil { - return fmt.Errorf("Grouping object not found") - } - - if len(inventoryMap) > 0 { - // Adds the inventory map to the ConfigMap "data" section. - err := unstructured.SetNestedStringMap(groupingObj.UnstructuredContent(), - inventoryMap, "data") - if err != nil { - return err - } - // Adds the hash of the inventory strings as an annotation to the - // grouping object. Inventory strings must be sorted to make hash - // deterministic. - inventoryList := mapKeysToSlice(inventoryMap) - sort.Strings(inventoryList) - invHash, err := calcInventoryHash(inventoryList) - if err != nil { - return err - } - // Add the hash as a suffix to the grouping object's name. - invHashStr := strconv.FormatUint(uint64(invHash), 16) - if err := addSuffixToName(groupingInfo, invHashStr); err != nil { - return err - } - annotations := groupingObj.GetAnnotations() - if annotations == nil { - annotations = map[string]string{} - } - annotations[GroupingHash] = invHashStr - groupingObj.SetAnnotations(annotations) - } - return nil -} - -// retrieveInventoryFromGroupingObj returns a slice of pointers to the -// inventory metadata. This function finds the grouping object, then -// parses the stored resource metadata into Inventory structs. Returns -// an error if there is a problem parsing the data into Inventory -// structs, or if the grouping object is not in Unstructured format; nil -// otherwise. If a grouping object does not exist, or it does not have a -// "data" map, then returns an empty slice and no error. -func retrieveInventoryFromGroupingObj(infos []*resource.Info) ([]*Inventory, error) { - inventory := []*Inventory{} - groupingInfo, exists := findGroupingObject(infos) - if exists { - groupingObj, ok := groupingInfo.Object.(*unstructured.Unstructured) - if !ok { - err := fmt.Errorf("Grouping object is not an Unstructured: %#v", groupingObj) - return inventory, err - } - invMap, exists, err := unstructured.NestedStringMap(groupingObj.Object, "data") - if err != nil { - err := fmt.Errorf("Error retrieving inventory from grouping object.") - return inventory, err - } - if exists { - for invStr := range invMap { - inv, err := parseInventory(invStr) - if err != nil { - return inventory, err - } - inventory = append(inventory, inv) - } - } - } - return inventory, nil -} - -// calcInventoryHash returns an unsigned int32 representing the hash -// of the inventory strings. If there is an error writing bytes to -// the hash, then the error is returned; nil is returned otherwise. -// Used to quickly identify the set of resources in the grouping object. -func calcInventoryHash(inv []string) (uint32, error) { - h := fnv.New32a() - for _, is := range inv { - _, err := h.Write([]byte(is)) - if err != nil { - return uint32(0), err - } - } - return h.Sum32(), nil -} - -// retrieveInventoryHash takes a grouping object (encapsulated by -// a resource.Info), and returns the string representing the hash -// of the grouping inventory; returns empty string if the grouping -// object is not in Unstructured format, or if the hash annotation -// does not exist. -func retrieveInventoryHash(groupingInfo *resource.Info) string { - var invHash = "" - groupingObj, ok := groupingInfo.Object.(*unstructured.Unstructured) - if ok { - annotations := groupingObj.GetAnnotations() - if annotations != nil { - invHash = annotations[GroupingHash] - } - } - return invHash -} - -// mapKeysToSlice returns the map keys as a slice of strings. -func mapKeysToSlice(m map[string]string) []string { - s := make([]string, len(m)) - i := 0 - for k := range m { - s[i] = k - i++ - } - return s -} - -// addSuffixToName adds the passed suffix (usually a hash) as a suffix -// to the name of the passed object stored in the Info struct. Returns -// an error if the object is not "*unstructured.Unstructured" or if the -// name stored in the object differs from the name in the Info struct. -func addSuffixToName(info *resource.Info, suffix string) error { - - if info == nil { - return fmt.Errorf("Nil resource.Info") - } - suffix = strings.TrimSpace(suffix) - if len(suffix) == 0 { - return fmt.Errorf("Passed empty suffix") - } - - accessor, _ := meta.Accessor(info.Object) - name := accessor.GetName() - if name != info.Name { - return fmt.Errorf("Grouping object (%s) and resource.Info (%s) have different names\n", name, info.Name) - } - // Error if name alread has suffix. - suffix = "-" + suffix - if strings.HasSuffix(name, suffix) { - return fmt.Errorf("Name already has suffix: %s\n", name) - } - name += suffix - accessor.SetName(name) - info.Name = name - - return nil -} diff --git a/cmd/kubectl/kubectlcobra/grouping_test.go b/cmd/kubectl/kubectlcobra/grouping_test.go deleted file mode 100644 index 7b0786f23..000000000 --- a/cmd/kubectl/kubectlcobra/grouping_test.go +++ /dev/null @@ -1,600 +0,0 @@ -// Copyright 2020 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -// package kubectlcobra contains cobra commands from kubectl -package kubectlcobra - -import ( - "fmt" - "testing" - - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/cli-runtime/pkg/resource" -) - -var testNamespace = "test-grouping-namespace" -var groupingObjName = "test-grouping-obj" -var pod1Name = "pod-1" -var pod2Name = "pod-2" -var pod3Name = "pod-3" - -var testGroupingLabel = "test-app-label" - -var groupingObj = unstructured.Unstructured{ - Object: map[string]interface{}{ - "apiVersion": "v1", - "kind": "ConfigMap", - "metadata": map[string]interface{}{ - "name": groupingObjName, - "namespace": testNamespace, - "labels": map[string]interface{}{ - GroupingLabel: testGroupingLabel, - }, - }, - }, -} - -var pod1 = unstructured.Unstructured{ - Object: map[string]interface{}{ - "apiVersion": "v1", - "kind": "Pod", - "metadata": map[string]interface{}{ - "name": pod1Name, - "namespace": testNamespace, - }, - }, -} - -var pod1Info = &resource.Info{ - Namespace: testNamespace, - Name: pod1Name, - Object: &pod1, -} - -var pod2 = unstructured.Unstructured{ - Object: map[string]interface{}{ - "apiVersion": "v1", - "kind": "Pod", - "metadata": map[string]interface{}{ - "name": pod2Name, - "namespace": testNamespace, - }, - }, -} - -var pod2Info = &resource.Info{ - Namespace: testNamespace, - Name: pod2Name, - Object: &pod2, -} - -var pod3 = unstructured.Unstructured{ - Object: map[string]interface{}{ - "apiVersion": "v1", - "kind": "Pod", - "metadata": map[string]interface{}{ - "name": pod3Name, - "namespace": testNamespace, - }, - }, -} - -var pod3Info = &resource.Info{ - Namespace: testNamespace, - Name: pod3Name, - Object: &pod3, -} - -var nonUnstructuredGroupingObj = &corev1.ConfigMap{ - ObjectMeta: metav1.ObjectMeta{ - Namespace: testNamespace, - Name: groupingObjName, - Labels: map[string]string{ - GroupingLabel: "true", - }, - }, -} - -var nonUnstructuredGroupingInfo = &resource.Info{ - Namespace: testNamespace, - Name: groupingObjName, - Object: nonUnstructuredGroupingObj, -} - -var nilInfo = &resource.Info{ - Namespace: testNamespace, - Name: groupingObjName, - Object: nil, -} - -var groupingObjLabelWithSpace = unstructured.Unstructured{ - Object: map[string]interface{}{ - "apiVersion": "v1", - "kind": "ConfigMap", - "metadata": map[string]interface{}{ - "name": groupingObjName, - "namespace": testNamespace, - "labels": map[string]interface{}{ - GroupingLabel: "\tgrouping-label ", - }, - }, - }, -} - -func TestRetrieveGroupingLabel(t *testing.T) { - tests := []struct { - obj runtime.Object - groupingLabel string - isError bool - }{ - // Nil grouping object throws error. - { - obj: nil, - groupingLabel: "", - isError: true, - }, - // Pod is not a grouping object. - { - obj: &pod2, - groupingLabel: "", - isError: true, - }, - // Retrieves label without preceding/trailing whitespace. - { - obj: &groupingObjLabelWithSpace, - groupingLabel: "grouping-label", - isError: false, - }, - { - obj: &groupingObj, - groupingLabel: testGroupingLabel, - isError: false, - }, - } - - for _, test := range tests { - actual, err := retrieveGroupingLabel(test.obj) - if test.isError && err == nil { - t.Errorf("Did not receive expected error.\n") - } - if !test.isError { - if err != nil { - t.Fatalf("Received unexpected error: %s\n", err) - } - if test.groupingLabel != actual { - t.Errorf("Expected grouping label (%s), got (%s)\n", test.groupingLabel, actual) - } - } - } -} - -func TestIsGroupingObject(t *testing.T) { - tests := []struct { - obj runtime.Object - isGrouping bool - }{ - { - obj: nil, - isGrouping: false, - }, - { - obj: &groupingObj, - isGrouping: true, - }, - { - obj: &pod2, - isGrouping: false, - }, - } - - for _, test := range tests { - grouping := isGroupingObject(test.obj) - if test.isGrouping && !grouping { - t.Errorf("Grouping object not identified: %#v", test.obj) - } - if !test.isGrouping && grouping { - t.Errorf("Non-grouping object identifed as grouping obj: %#v", test.obj) - } - } -} - -func TestFindGroupingObject(t *testing.T) { - tests := []struct { - infos []*resource.Info - exists bool - name string - }{ - { - infos: []*resource.Info{}, - exists: false, - name: "", - }, - { - infos: []*resource.Info{nil}, - exists: false, - name: "", - }, - { - infos: []*resource.Info{copyGroupingInfo()}, - exists: true, - name: groupingObjName, - }, - { - infos: []*resource.Info{pod1Info}, - exists: false, - name: "", - }, - { - infos: []*resource.Info{pod1Info, pod2Info, pod3Info}, - exists: false, - name: "", - }, - { - infos: []*resource.Info{pod1Info, pod2Info, copyGroupingInfo(), pod3Info}, - exists: true, - name: groupingObjName, - }, - } - - for _, test := range tests { - groupingObj, found := findGroupingObject(test.infos) - if test.exists && !found { - t.Errorf("Should have found grouping object") - } - if !test.exists && found { - t.Errorf("Grouping object found, but it does not exist: %#v", groupingObj) - } - if test.exists && found && test.name != groupingObj.Name { - t.Errorf("Grouping object name does not match: %s/%s", test.name, groupingObj.Name) - } - } -} - -func TestSortGroupingObject(t *testing.T) { - tests := []struct { - infos []*resource.Info - sorted bool - }{ - { - infos: []*resource.Info{}, - sorted: false, - }, - { - infos: []*resource.Info{copyGroupingInfo()}, - sorted: true, - }, - { - infos: []*resource.Info{pod1Info}, - sorted: false, - }, - { - infos: []*resource.Info{pod1Info, pod2Info}, - sorted: false, - }, - { - infos: []*resource.Info{copyGroupingInfo(), pod1Info}, - sorted: true, - }, - { - infos: []*resource.Info{pod1Info, copyGroupingInfo()}, - sorted: true, - }, - { - infos: []*resource.Info{pod1Info, pod2Info, copyGroupingInfo(), pod3Info}, - sorted: true, - }, - { - infos: []*resource.Info{pod1Info, pod2Info, pod3Info, copyGroupingInfo()}, - sorted: true, - }, - { - infos: []*resource.Info{copyGroupingInfo(), pod1Info, pod2Info, pod3Info}, - sorted: true, - }, - } - - for _, test := range tests { - wasSorted := sortGroupingObject(test.infos) - if wasSorted && !test.sorted { - t.Errorf("Grouping object was sorted, but it shouldn't have been") - } - if !wasSorted && test.sorted { - t.Errorf("Grouping object was NOT sorted, but it should have been") - } - if wasSorted { - first := test.infos[0] - if !isGroupingObject(first.Object) { - t.Errorf("Grouping object was not sorted into first position") - } - } - } -} - -func TestAddRetrieveInventoryToFromGroupingObject(t *testing.T) { - tests := []struct { - infos []*resource.Info - expected []*Inventory - isError bool - }{ - // No grouping object is an error. - { - infos: []*resource.Info{}, - isError: true, - }, - // No grouping object is an error. - { - infos: []*resource.Info{pod1Info, pod2Info}, - isError: true, - }, - // Grouping object without other objects is OK. - { - infos: []*resource.Info{copyGroupingInfo(), nilInfo}, - isError: true, - }, - { - infos: []*resource.Info{nonUnstructuredGroupingInfo}, - isError: true, - }, - { - infos: []*resource.Info{copyGroupingInfo()}, - expected: []*Inventory{}, - isError: false, - }, - // More than one grouping object is an error. - { - infos: []*resource.Info{copyGroupingInfo(), copyGroupingInfo()}, - expected: []*Inventory{}, - isError: true, - }, - // More than one grouping object is an error. - { - infos: []*resource.Info{copyGroupingInfo(), pod1Info, copyGroupingInfo()}, - expected: []*Inventory{}, - isError: true, - }, - // Basic test case: one grouping object, one pod. - { - infos: []*resource.Info{copyGroupingInfo(), pod1Info}, - expected: []*Inventory{ - &Inventory{ - Namespace: testNamespace, - Name: pod1Name, - GroupKind: schema.GroupKind{ - Group: "", - Kind: "Pod", - }, - }, - }, - isError: false, - }, - { - infos: []*resource.Info{pod1Info, copyGroupingInfo()}, - expected: []*Inventory{ - &Inventory{ - Namespace: testNamespace, - Name: pod1Name, - GroupKind: schema.GroupKind{ - Group: "", - Kind: "Pod", - }, - }, - }, - isError: false, - }, - { - infos: []*resource.Info{pod1Info, pod2Info, copyGroupingInfo(), pod3Info}, - expected: []*Inventory{ - &Inventory{ - Namespace: testNamespace, - Name: pod1Name, - GroupKind: schema.GroupKind{ - Group: "", - Kind: "Pod", - }, - }, - &Inventory{ - Namespace: testNamespace, - Name: pod2Name, - GroupKind: schema.GroupKind{ - Group: "", - Kind: "Pod", - }, - }, - &Inventory{ - Namespace: testNamespace, - Name: pod3Name, - GroupKind: schema.GroupKind{ - Group: "", - Kind: "Pod", - }, - }, - }, - isError: false, - }, - { - infos: []*resource.Info{pod1Info, pod2Info, pod3Info, copyGroupingInfo()}, - expected: []*Inventory{ - &Inventory{ - Namespace: testNamespace, - Name: pod1Name, - GroupKind: schema.GroupKind{ - Group: "", - Kind: "Pod", - }, - }, - &Inventory{ - Namespace: testNamespace, - Name: pod2Name, - GroupKind: schema.GroupKind{ - Group: "", - Kind: "Pod", - }, - }, - &Inventory{ - Namespace: testNamespace, - Name: pod3Name, - GroupKind: schema.GroupKind{ - Group: "", - Kind: "Pod", - }, - }, - }, - isError: false, - }, - { - infos: []*resource.Info{copyGroupingInfo(), pod1Info, pod2Info, pod3Info}, - expected: []*Inventory{ - &Inventory{ - Namespace: testNamespace, - Name: pod1Name, - GroupKind: schema.GroupKind{ - Group: "", - Kind: "Pod", - }, - }, - &Inventory{ - Namespace: testNamespace, - Name: pod2Name, - GroupKind: schema.GroupKind{ - Group: "", - Kind: "Pod", - }, - }, - &Inventory{ - Namespace: testNamespace, - Name: pod3Name, - GroupKind: schema.GroupKind{ - Group: "", - Kind: "Pod", - }, - }, - }, - isError: false, - }, - } - - for _, test := range tests { - err := addInventoryToGroupingObj(test.infos) - if test.isError && err == nil { - t.Errorf("Should have produced an error, but returned none.") - } - if !test.isError { - if err != nil { - t.Fatalf("Received error when expecting none (%s)\n", err) - } - retrieved, err := retrieveInventoryFromGroupingObj(test.infos) - if err != nil { - t.Fatalf("Error retrieving inventory: %s\n", err) - } - if len(test.expected) != len(retrieved) { - t.Errorf("Expected inventory for %d resources, actual %d", - len(test.expected), len(retrieved)) - } - for _, expected := range test.expected { - found := false - for _, actual := range retrieved { - if expected.Equals(actual) { - found = true - continue - } - } - if !found { - t.Errorf("Expected inventory (%s) not found", expected) - } - } - // If the grouping object has an inventory, check the - // grouping object has an inventory hash. - groupingInfo, exists := findGroupingObject(test.infos) - if exists && len(test.expected) > 0 { - invHash := retrieveInventoryHash(groupingInfo) - if len(invHash) == 0 { - t.Errorf("Grouping object missing inventory hash") - } - } - } - } -} - -func TestAddSuffixToName(t *testing.T) { - tests := []struct { - info *resource.Info - suffix string - expected string - isError bool - }{ - // Nil info should return error. - { - info: nil, - suffix: "", - expected: "", - isError: true, - }, - // Empty suffix should return error. - { - info: copyGroupingInfo(), - suffix: "", - expected: "", - isError: true, - }, - // Empty suffix should return error. - { - info: copyGroupingInfo(), - suffix: " \t", - expected: "", - isError: true, - }, - { - info: copyGroupingInfo(), - suffix: "hashsuffix", - expected: groupingObjName + "-hashsuffix", - isError: false, - }, - } - - for _, test := range tests { - //t.Errorf("%#v [%s]", test.info, test.suffix) - err := addSuffixToName(test.info, test.suffix) - if test.isError { - if err == nil { - t.Errorf("Should have produced an error, but returned none.") - } - } - if !test.isError { - if err != nil { - t.Fatalf("Received error when expecting none (%s)\n", err) - } - actualName, err := getObjectName(test.info.Object) - if err != nil { - t.Fatalf("Error getting object name: %s", err) - } - if actualName != test.info.Name { - t.Errorf("Object name (%s) does not match info name (%s)\n", actualName, test.info.Name) - } - if test.expected != actualName { - t.Errorf("Expected name (%s), got (%s)\n", test.expected, actualName) - } - } - } -} - -func getObjectName(obj runtime.Object) (string, error) { - u, ok := obj.(*unstructured.Unstructured) - if !ok { - return "", fmt.Errorf("Grouping object is not Unstructured format") - } - return u.GetName(), nil -} - -func copyGroupingInfo() *resource.Info { - groupingObjCopy := groupingObj.DeepCopy() - var groupingInfo = &resource.Info{ - Namespace: testNamespace, - Name: groupingObjName, - Object: groupingObjCopy, - } - return groupingInfo -} diff --git a/cmd/kubectl/kubectlcobra/inventory.go b/cmd/kubectl/kubectlcobra/inventory.go deleted file mode 100644 index 9a50cb076..000000000 --- a/cmd/kubectl/kubectlcobra/inventory.go +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2020 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -// package kubectlcobra contains cobra commands from kubectl -package kubectlcobra - -import ( - "fmt" - "sort" - "strings" - - "k8s.io/apimachinery/pkg/runtime/schema" -) - -// Separates inventory fields. This string is allowable as a -// ConfigMap key, but it is not allowed as a character in -// resource name. -const fieldSeparator = "_" - -// Inventory organizes and stores the indentifying information -// for an object. This struct (as a string) is stored in a -// grouping object to keep track of sets of applied objects. -type Inventory struct { - Namespace string - Name string - GroupKind schema.GroupKind -} - -// createInventory returns a pointer to an Inventory struct filled -// with the passed values. This function validates the passed fields -// and returns an error for bad parameters. -func createInventory(namespace string, - name string, gk schema.GroupKind) (*Inventory, error) { - - // Namespace can be empty, but name cannot. - name = strings.TrimSpace(name) - if name == "" { - return nil, fmt.Errorf("Empty name for inventory object") - } - if gk.Empty() { - return nil, fmt.Errorf("Empty GroupKind for inventory object") - } - - return &Inventory{ - Namespace: strings.TrimSpace(namespace), - Name: name, - GroupKind: gk, - }, nil -} - -// parseInventory takes a string, splits it into its five fields, -// and returns a pointer to an Inventory struct storing the -// five fields. Example inventory string: -// -// test-namespace/test-name/apps/v1/ReplicaSet -// -// Returns an error if unable to parse and create the Inventory -// struct. -func parseInventory(inv string) (*Inventory, error) { - parts := strings.Split(inv, fieldSeparator) - if len(parts) == 4 { - gk := schema.GroupKind{ - Group: strings.TrimSpace(parts[2]), - Kind: strings.TrimSpace(parts[3]), - } - return createInventory(parts[0], parts[1], gk) - } - return nil, fmt.Errorf("Unable to decode inventory: %s\n", inv) -} - -// Equals returns true if the Inventory structs are identical; -// false otherwise. -func (i *Inventory) Equals(other *Inventory) bool { - if other == nil { - return false - } - return i.String() == other.String() -} - -// String create a string version of the Inventory struct. -func (i *Inventory) String() string { - return fmt.Sprintf("%s%s%s%s%s%s%s", - i.Namespace, fieldSeparator, - i.Name, fieldSeparator, - i.GroupKind.Group, fieldSeparator, - i.GroupKind.Kind) -} - -// InventorySet encapsulates a grouping of unique Inventory -// structs. Organizes the Inventory structs with a map, -// which ensures there are no duplicates. Allows set -// operations such as merging sets and subtracting sets. -type InventorySet struct { - set map[string]*Inventory -} - -// NewInventorySet returns a pointer to an InventorySet -// struct grouping the passed Inventory items. -func NewInventorySet(items []*Inventory) *InventorySet { - invSet := InventorySet{set: map[string]*Inventory{}} - invSet.AddItems(items) - return &invSet -} - -// GetItems returns the set of pointers to Inventory -// structs. -func (is *InventorySet) GetItems() []*Inventory { - items := []*Inventory{} - for _, item := range is.set { - items = append(items, item) - } - return items -} - -// AddItems adds Inventory structs to the set which -// are not already in the set. -func (is *InventorySet) AddItems(items []*Inventory) { - for _, item := range items { - if item != nil { - is.set[item.String()] = item - } - } -} - -// DeleteItem removes an Inventory struct from the -// set if it exists in the set. Returns true if the -// Inventory item was deleted, false if it did not exist -// in the set. -func (is *InventorySet) DeleteItem(item *Inventory) bool { - if item == nil { - return false - } - if _, ok := is.set[item.String()]; ok { - delete(is.set, item.String()) - return true - } - return false -} - -// Merge combines the unique set of Inventory items from the -// current set with the passed "other" set, returning a new -// set or error. Returns an error if the passed set to merge -// is nil. -func (is *InventorySet) Merge(other *InventorySet) (*InventorySet, error) { - if other == nil { - return nil, fmt.Errorf("InventorySet to merge is nil.") - } - // Copy the current InventorySet into result - result := NewInventorySet(is.GetItems()) - result.AddItems(other.GetItems()) - return result, nil -} - -// Subtract removes the Inventory items in the "other" set from the -// current set, returning a new set. This does not modify the current -// set. Returns an error if the passed set to subtract is nil. -func (is *InventorySet) Subtract(other *InventorySet) (*InventorySet, error) { - if other == nil { - return nil, fmt.Errorf("InventorySet to subtract is nil.") - } - // Copy the current InventorySet into result - result := NewInventorySet(is.GetItems()) - // Remove each item in "other" which exists in "result" - for _, item := range other.GetItems() { - result.DeleteItem(item) - } - return result, nil -} - -// Equals returns true if the "other" inventory set is the same -// as this current inventory set. Relies on the fact that the -// inventory items are sorted for the String() function. -func (is *InventorySet) Equals(other *InventorySet) bool { - if other == nil { - return false - } - return is.String() == other.String() -} - -// String returns a string describing set of Inventory structs. -func (is *InventorySet) String() string { - strs := []string{} - for _, item := range is.GetItems() { - strs = append(strs, item.String()) - } - sort.Strings(strs) - return strings.Join(strs, ", ") -} - -// Size returns the number of Inventory structs in the set. -func (is *InventorySet) Size() int { - return len(is.set) -} diff --git a/cmd/kubectl/kubectlcobra/inventory_test.go b/cmd/kubectl/kubectlcobra/inventory_test.go deleted file mode 100644 index d4725d680..000000000 --- a/cmd/kubectl/kubectlcobra/inventory_test.go +++ /dev/null @@ -1,558 +0,0 @@ -// Copyright 2020 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -// package kubectlcobra contains cobra commands from kubectl -package kubectlcobra - -import ( - "testing" - - "k8s.io/apimachinery/pkg/runtime/schema" -) - -func TestCreateInventory(t *testing.T) { - tests := []struct { - namespace string - name string - gk schema.GroupKind - expected string - isError bool - }{ - { - namespace: " \n", - name: " test-name\t", - gk: schema.GroupKind{ - Group: "apps", - Kind: "ReplicaSet", - }, - expected: "_test-name_apps_ReplicaSet", - isError: false, - }, - { - namespace: "test-namespace ", - name: " test-name\t", - gk: schema.GroupKind{ - Group: "apps", - Kind: "ReplicaSet", - }, - expected: "test-namespace_test-name_apps_ReplicaSet", - isError: false, - }, - // Error with empty name. - { - namespace: "test-namespace ", - name: " \t", - gk: schema.GroupKind{ - Group: "apps", - Kind: "ReplicaSet", - }, - expected: "", - isError: true, - }, - // Error with empty GroupKind. - { - namespace: "test-namespace", - name: "test-name", - gk: schema.GroupKind{}, - expected: "", - isError: true, - }, - } - - for _, test := range tests { - inv, err := createInventory(test.namespace, test.name, test.gk) - if !test.isError { - if err != nil { - t.Errorf("Error creating inventory when it should have worked.") - } else if test.expected != inv.String() { - t.Errorf("Expected inventory (%s) != created inventory(%s)\n", test.expected, inv.String()) - } - } - if test.isError && err == nil { - t.Errorf("Should have returned an error in createInventory()") - } - } -} - -func TestInventoryEqual(t *testing.T) { - tests := []struct { - inventory1 *Inventory - inventory2 *Inventory - isEqual bool - }{ - // "Other" inventory is nil, then not equal. - { - inventory1: &Inventory{ - Name: "test-inv", - GroupKind: schema.GroupKind{ - Group: "apps", - Kind: "Deployment", - }, - }, - inventory2: nil, - isEqual: false, - }, - // Two equal inventories without a namespace - { - inventory1: &Inventory{ - Name: "test-inv", - GroupKind: schema.GroupKind{ - Group: "apps", - Kind: "Deployment", - }, - }, - inventory2: &Inventory{ - Name: "test-inv", - GroupKind: schema.GroupKind{ - Group: "apps", - Kind: "Deployment", - }, - }, - isEqual: true, - }, - // Two equal inventories with a namespace - { - inventory1: &Inventory{ - Namespace: "test-namespace", - Name: "test-inv", - GroupKind: schema.GroupKind{ - Group: "apps", - Kind: "Deployment", - }, - }, - inventory2: &Inventory{ - Namespace: "test-namespace", - Name: "test-inv", - GroupKind: schema.GroupKind{ - Group: "apps", - Kind: "Deployment", - }, - }, - isEqual: true, - }, - // One inventory with a namespace, one without -- not equal. - { - inventory1: &Inventory{ - Name: "test-inv", - GroupKind: schema.GroupKind{ - Group: "apps", - Kind: "Deployment", - }, - }, - inventory2: &Inventory{ - Namespace: "test-namespace", - Name: "test-inv", - GroupKind: schema.GroupKind{ - Group: "apps", - Kind: "Deployment", - }, - }, - isEqual: false, - }, - // One inventory with a Deployment, one with a ReplicaSet -- not equal. - { - inventory1: &Inventory{ - Name: "test-inv", - GroupKind: schema.GroupKind{ - Group: "apps", - Kind: "Deployment", - }, - }, - inventory2: &Inventory{ - Name: "test-inv", - GroupKind: schema.GroupKind{ - Group: "apps", - Kind: "ReplicaSet", - }, - }, - isEqual: false, - }, - } - - for _, test := range tests { - actual := test.inventory1.Equals(test.inventory2) - if test.isEqual && !actual { - t.Errorf("Expected inventories equal, but actual is not: (%s)/(%s)\n", test.inventory1, test.inventory2) - } - } -} - -func TestParseInventory(t *testing.T) { - tests := []struct { - invStr string - inventory *Inventory - isError bool - }{ - { - invStr: "_test-name_apps_ReplicaSet\t", - inventory: &Inventory{ - Name: "test-name", - GroupKind: schema.GroupKind{ - Group: "apps", - Kind: "ReplicaSet", - }, - }, - isError: false, - }, - { - invStr: "test-namespace_test-name_apps_Deployment", - inventory: &Inventory{ - Namespace: "test-namespace", - Name: "test-name", - GroupKind: schema.GroupKind{ - Group: "apps", - Kind: "Deployment", - }, - }, - isError: false, - }, - // Not enough fields -- error - { - invStr: "_test-name_apps", - inventory: &Inventory{}, - isError: true, - }, - } - - for _, test := range tests { - actual, err := parseInventory(test.invStr) - if !test.isError { - if err != nil { - t.Errorf("Error parsing inventory when it should have worked.") - } else if !test.inventory.Equals(actual) { - t.Errorf("Expected inventory (%s) != parsed inventory (%s)\n", test.inventory, actual) - } - } - if test.isError && err == nil { - t.Errorf("Should have returned an error in parseInventory()") - } - } -} - -var inventory1 = Inventory{ - Namespace: "test-namespace", - Name: "test-inv-1", - GroupKind: schema.GroupKind{ - Group: "apps", - Kind: "Deployment", - }, -} - -var inventory2 = Inventory{ - Namespace: "test-namespace", - Name: "test-inv-2", - GroupKind: schema.GroupKind{ - Group: "", - Kind: "Pod", - }, -} - -var inventory3 = Inventory{ - Namespace: "test-namespace", - Name: "test-inv-3", - GroupKind: schema.GroupKind{ - Group: "", - Kind: "Service", - }, -} - -var inventory4 = Inventory{ - Namespace: "test-namespace", - Name: "test-inv-4", - GroupKind: schema.GroupKind{ - Group: "apps", - Kind: "DaemonSet", - }, -} - -func TestNewInventorySet(t *testing.T) { - tests := []struct { - items []*Inventory - expectedStr string - expectedSize int - }{ - { - items: []*Inventory{}, - expectedStr: "", - expectedSize: 0, - }, - { - items: []*Inventory{&inventory1}, - expectedStr: "test-namespace_test-inv-1_apps_Deployment", - expectedSize: 1, - }, - { - items: []*Inventory{&inventory1, &inventory2}, - expectedStr: "test-namespace_test-inv-1_apps_Deployment, test-namespace_test-inv-2__Pod", - expectedSize: 2, - }, - } - - for _, test := range tests { - invSet := NewInventorySet(test.items) - actualStr := invSet.String() - actualSize := invSet.Size() - if test.expectedStr != actualStr { - t.Errorf("Expected InventorySet (%s), got (%s)\n", test.expectedStr, actualStr) - } - if test.expectedSize != actualSize { - t.Errorf("Expected InventorySet size (%d), got (%d)\n", test.expectedSize, actualSize) - } - actualItems := invSet.GetItems() - if len(test.items) != len(actualItems) { - t.Errorf("Expected num inventory items (%d), got (%d)\n", len(test.items), len(actualItems)) - } - } -} - -func TestInventorySetAddItems(t *testing.T) { - tests := []struct { - initialItems []*Inventory - addItems []*Inventory - expectedItems []*Inventory - }{ - // Adding no items to empty inventory set. - { - initialItems: []*Inventory{}, - addItems: []*Inventory{}, - expectedItems: []*Inventory{}, - }, - // Adding item to empty inventory set. - { - initialItems: []*Inventory{}, - addItems: []*Inventory{&inventory1}, - expectedItems: []*Inventory{&inventory1}, - }, - // Adding no items does not change the inventory set - { - initialItems: []*Inventory{&inventory1}, - addItems: []*Inventory{}, - expectedItems: []*Inventory{&inventory1}, - }, - // Adding an item which alread exists does not increase size. - { - initialItems: []*Inventory{&inventory1, &inventory2}, - addItems: []*Inventory{&inventory1}, - expectedItems: []*Inventory{&inventory1, &inventory2}, - }, - { - initialItems: []*Inventory{&inventory1, &inventory2}, - addItems: []*Inventory{&inventory3, &inventory4}, - expectedItems: []*Inventory{&inventory1, &inventory2, &inventory3, &inventory4}, - }, - } - - for _, test := range tests { - invSet := NewInventorySet(test.initialItems) - invSet.AddItems(test.addItems) - if len(test.expectedItems) != invSet.Size() { - t.Errorf("Expected num inventory items (%d), got (%d)\n", len(test.expectedItems), invSet.Size()) - } - } -} - -func TestInventorySetDeleteItem(t *testing.T) { - tests := []struct { - initialItems []*Inventory - deleteItem *Inventory - expected bool - expectedItems []*Inventory - }{ - { - initialItems: []*Inventory{}, - deleteItem: nil, - expected: false, - expectedItems: []*Inventory{}, - }, - { - initialItems: []*Inventory{}, - deleteItem: &inventory1, - expected: false, - expectedItems: []*Inventory{}, - }, - { - initialItems: []*Inventory{&inventory2}, - deleteItem: &inventory1, - expected: false, - expectedItems: []*Inventory{&inventory2}, - }, - { - initialItems: []*Inventory{&inventory1}, - deleteItem: &inventory1, - expected: true, - expectedItems: []*Inventory{}, - }, - { - initialItems: []*Inventory{&inventory1, &inventory2}, - deleteItem: &inventory1, - expected: true, - expectedItems: []*Inventory{&inventory2}, - }, - } - - for _, test := range tests { - invSet := NewInventorySet(test.initialItems) - actual := invSet.DeleteItem(test.deleteItem) - if test.expected != actual { - t.Errorf("Expected return value (%t), got (%t)\n", test.expected, actual) - } - if len(test.expectedItems) != invSet.Size() { - t.Errorf("Expected num inventory items (%d), got (%d)\n", len(test.expectedItems), invSet.Size()) - } - } -} - -func TestInventorySetMerge(t *testing.T) { - tests := []struct { - set1 []*Inventory - set2 []*Inventory - merged []*Inventory - }{ - { - set1: []*Inventory{}, - set2: []*Inventory{}, - merged: []*Inventory{}, - }, - { - set1: []*Inventory{}, - set2: []*Inventory{&inventory1}, - merged: []*Inventory{&inventory1}, - }, - { - set1: []*Inventory{&inventory1}, - set2: []*Inventory{}, - merged: []*Inventory{&inventory1}, - }, - { - set1: []*Inventory{&inventory1, &inventory2}, - set2: []*Inventory{&inventory1}, - merged: []*Inventory{&inventory1, &inventory2}, - }, - { - set1: []*Inventory{&inventory1, &inventory2}, - set2: []*Inventory{&inventory1, &inventory2}, - merged: []*Inventory{&inventory1, &inventory2}, - }, - { - set1: []*Inventory{&inventory1, &inventory2}, - set2: []*Inventory{&inventory3, &inventory4}, - merged: []*Inventory{&inventory1, &inventory2, &inventory3, &inventory4}, - }, - } - - for _, test := range tests { - invSet1 := NewInventorySet(test.set1) - invSet2 := NewInventorySet(test.set2) - expected := NewInventorySet(test.merged) - merged, _ := invSet1.Merge(invSet2) - if expected.Size() != merged.Size() { - t.Errorf("Expected merged inventory set size (%d), got (%d)\n", expected.Size(), merged.Size()) - } - } -} - -func TestInventorySetSubtract(t *testing.T) { - tests := []struct { - initialItems []*Inventory - subtractItems []*Inventory - expected []*Inventory - }{ - { - initialItems: []*Inventory{}, - subtractItems: []*Inventory{}, - expected: []*Inventory{}, - }, - { - initialItems: []*Inventory{}, - subtractItems: []*Inventory{&inventory1}, - expected: []*Inventory{}, - }, - { - initialItems: []*Inventory{&inventory1}, - subtractItems: []*Inventory{}, - expected: []*Inventory{&inventory1}, - }, - { - initialItems: []*Inventory{&inventory1, &inventory2}, - subtractItems: []*Inventory{&inventory1}, - expected: []*Inventory{&inventory2}, - }, - { - initialItems: []*Inventory{&inventory1, &inventory2}, - subtractItems: []*Inventory{&inventory1, &inventory2}, - expected: []*Inventory{}, - }, - { - initialItems: []*Inventory{&inventory1, &inventory2}, - subtractItems: []*Inventory{&inventory3, &inventory4}, - expected: []*Inventory{&inventory1, &inventory2}, - }, - } - - for _, test := range tests { - invInitialItems := NewInventorySet(test.initialItems) - invSubtractItems := NewInventorySet(test.subtractItems) - expected := NewInventorySet(test.expected) - actual, _ := invInitialItems.Subtract(invSubtractItems) - if expected.Size() != actual.Size() { - t.Errorf("Expected subtracted inventory set size (%d), got (%d)\n", expected.Size(), actual.Size()) - } - } -} - -func TestInventorySetEquals(t *testing.T) { - tests := []struct { - set1 []*Inventory - set2 []*Inventory - isEqual bool - }{ - { - set1: []*Inventory{}, - set2: []*Inventory{&inventory1}, - isEqual: false, - }, - { - set1: []*Inventory{&inventory1}, - set2: []*Inventory{}, - isEqual: false, - }, - { - set1: []*Inventory{&inventory1, &inventory2}, - set2: []*Inventory{&inventory1}, - isEqual: false, - }, - { - set1: []*Inventory{&inventory1, &inventory2}, - set2: []*Inventory{&inventory3, &inventory4}, - isEqual: false, - }, - // Empty sets are equal. - { - set1: []*Inventory{}, - set2: []*Inventory{}, - isEqual: true, - }, - { - set1: []*Inventory{&inventory1}, - set2: []*Inventory{&inventory1}, - isEqual: true, - }, - // Ordering of the inventory items does not matter for equality. - { - set1: []*Inventory{&inventory1, &inventory2}, - set2: []*Inventory{&inventory2, &inventory1}, - isEqual: true, - }, - } - - for _, test := range tests { - invSet1 := NewInventorySet(test.set1) - invSet2 := NewInventorySet(test.set2) - if !invSet1.Equals(invSet2) && test.isEqual { - t.Errorf("Expected equal inventory sets; got unequal (%s)/(%s)\n", invSet1, invSet2) - } - if invSet1.Equals(invSet2) && !test.isEqual { - t.Errorf("Expected inequal inventory sets; got equal (%s)/(%s)\n", invSet1, invSet2) - } - } -} diff --git a/cmd/kubectl/kubectlcobra/printer_adapter.go b/cmd/kubectl/kubectlcobra/printer_adapter.go deleted file mode 100644 index 0836dad74..000000000 --- a/cmd/kubectl/kubectlcobra/printer_adapter.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package kubectlcobra - -import ( - "io" - - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/cli-runtime/pkg/printers" -) - -// KubectlPrinterAdapter is a workaround for capturing progress from -// ApplyOptions. ApplyOptions were originally meant to print progress -// directly using a configurable printer. The KubectlPrinterAdapter -// plugs into ApplyOptions as a ToPrinter function, but instead of -// printing the info, it emits it as an event on the provided channel. -type KubectlPrinterAdapter struct { - ch chan<- Event -} - -// resourcePrinterImpl implements the ResourcePrinter interface. But -// instead of printing, it emits information on the provided channel. -type resourcePrinterImpl struct { - operation string - ch chan<- Event -} - -// PrintObj takes the provided object and operation and emits -// it on the channel. -func (r *resourcePrinterImpl) PrintObj(obj runtime.Object, _ io.Writer) error { - r.ch <- Event{ - EventType: ApplyEventType, - ApplyEvent: ApplyEvent{ - Operation: r.operation, - Object: obj, - }, - } - return nil -} - -type toPrinterFunc func(string) (printers.ResourcePrinter, error) - -// toPrinterFunc returns a function of type toPrinterFunc. This -// is the type required by the ApplyOptions. -func (p *KubectlPrinterAdapter) toPrinterFunc() toPrinterFunc { - return func(operation string) (printers.ResourcePrinter, error) { - return &resourcePrinterImpl{ - ch: p.ch, - operation: operation, - }, nil - } -} diff --git a/cmd/kubectl/kubectlcobra/printer_adapter_test.go b/cmd/kubectl/kubectlcobra/printer_adapter_test.go deleted file mode 100644 index b7375b5a0..000000000 --- a/cmd/kubectl/kubectlcobra/printer_adapter_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package kubectlcobra - -import ( - "bytes" - "testing" - - "github.com/stretchr/testify/assert" - appsv1 "k8s.io/api/apps/v1" - v1 "k8s.io/apimachinery/pkg/apis/meta/v1" -) - -func TestKubectlPrinterAdapter(t *testing.T) { - ch := make(chan Event) - buffer := bytes.Buffer{} - operation := "operation" - - adapter := KubectlPrinterAdapter{ - ch: ch, - } - - toPrinterFunc := adapter.toPrinterFunc() - resourcePrinter, err := toPrinterFunc(operation) - assert.NoError(t, err) - - deployment := appsv1.Deployment{ - TypeMeta: v1.TypeMeta{ - APIVersion: "apps/v1", - Kind: "Deployment", - }, - ObjectMeta: v1.ObjectMeta{ - Name: "name", - Namespace: "namespace", - }, - } - - // Need to run this in a separate gorutine since go channels - // are blocking. - go func() { - err = resourcePrinter.PrintObj(&deployment, &buffer) - }() - msg := <-ch - - assert.NoError(t, err) - assert.Equal(t, operation, msg.ApplyEvent.Operation) - assert.Equal(t, &deployment, msg.ApplyEvent.Object) -} diff --git a/cmd/kubectl/kubectlcobra/prune.go b/cmd/kubectl/kubectlcobra/prune.go deleted file mode 100644 index c7d9ffbe2..000000000 --- a/cmd/kubectl/kubectlcobra/prune.go +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -// package kubectlcobra contains cobra commands from kubectl -package kubectlcobra - -import ( - "fmt" - "io" - "strings" - - "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/cli-runtime/pkg/printers" - "k8s.io/cli-runtime/pkg/resource" - "k8s.io/client-go/dynamic" - "k8s.io/kubectl/pkg/cmd/apply" - "k8s.io/kubectl/pkg/cmd/util" - "k8s.io/kubectl/pkg/validation" -) - -// PruneOptions encapsulates the necessary information to -// implement the prune functionality. -type PruneOptions struct { - client dynamic.Interface - builder *resource.Builder - mapper meta.RESTMapper - namespace string - // The currently applied objects (as Infos), including the - // current grouping object. These objects are used to - // calculate the prune set after retreiving the previous - // grouping objects. - currentGroupingObject *resource.Info - // The set of retrieved grouping objects (as Infos) selected - // by the grouping label. This set should also include the - // current grouping object. Stored here to make testing - // easier by manually setting the retrieved grouping infos. - pastGroupingObjects []*resource.Info - retrievedGroupingObjects bool - - toPrinter func(string) (printers.ResourcePrinter, error) - out io.Writer - - validator validation.Schema - - // TODO: DeleteOptions--cascade? -} - -// NewPruneOptions returns a struct (PruneOptions) encapsulating the necessary -// information to run the prune. Returns an error if an error occurs -// gathering this information. -// TODO: Add dry-run options. -func NewPruneOptions(f util.Factory, ao *apply.ApplyOptions) (*PruneOptions, error) { - - po := &PruneOptions{} - var err error - // Fields copied from ApplyOptions. - po.namespace = ao.Namespace - po.toPrinter = ao.ToPrinter - po.out = ao.Out - // Client/Builder fields from the Factory. - po.client, err = f.DynamicClient() - if err != nil { - return nil, err - } - po.builder = f.NewBuilder() - po.mapper, err = f.ToRESTMapper() - if err != nil { - return nil, err - } - po.validator, err = f.Validator(false) - if err != nil { - return nil, err - } - // Retrieve/store the grouping object for current apply. - currentObjects, err := ao.GetObjects() - if err != nil { - return nil, err - } - currentGroupingObject, found := findGroupingObject(currentObjects) - if !found { - return nil, fmt.Errorf("Current grouping object not found during prune.") - } - po.currentGroupingObject = currentGroupingObject - // Initialize past grouping objects as empty. - po.pastGroupingObjects = []*resource.Info{} - po.retrievedGroupingObjects = false - - return po, nil -} - -// getPreviousGroupingObjects returns the set of grouping objects -// that have the same label as the current grouping object. Removes -// the current grouping object from this set. Returns an error -// if there is a problem retrieving the grouping objects. -func (po *PruneOptions) getPreviousGroupingObjects() ([]*resource.Info, error) { - - // Ensures the "pastGroupingObjects" is set. - if !po.retrievedGroupingObjects { - if err := po.retrievePreviousGroupingObjects(); err != nil { - return nil, err - } - } - - // Remove the current grouping info from the previous grouping infos. - currentInventory, err := infoToInventory(po.currentGroupingObject) - if err != nil { - return nil, err - } - pastGroupInfos := []*resource.Info{} - for _, pastInfo := range po.pastGroupingObjects { - pastInventory, err := infoToInventory(pastInfo) - if err != nil { - return nil, err - } - if !currentInventory.Equals(pastInventory) { - pastGroupInfos = append(pastGroupInfos, pastInfo) - } - } - return pastGroupInfos, nil -} - -// retrievePreviousGroupingObjects requests the previous grouping objects -// using the grouping label from the current grouping object. Sets -// the field "pastGroupingObjects". Returns an error if the grouping -// label doesn't exist for the current currentGroupingObject does not -// exist or if the call to retrieve the past grouping objects fails. -func (po *PruneOptions) retrievePreviousGroupingObjects() error { - // Get the grouping label for this grouping object, and create - // a label selector from it. - if po.currentGroupingObject == nil || po.currentGroupingObject.Object == nil { - return fmt.Errorf("Missing current grouping object.\n") - } - groupingLabel, err := retrieveGroupingLabel(po.currentGroupingObject.Object) - if err != nil { - return err - } - labelSelector := fmt.Sprintf("%s=%s", GroupingLabel, groupingLabel) - retrievedGroupingInfos, err := po.builder. - Unstructured(). - // TODO: Check if this validator is necessary. - Schema(po.validator). - ContinueOnError(). - NamespaceParam(po.namespace).DefaultNamespace(). - ResourceTypes("configmap"). - LabelSelectorParam(labelSelector). - Flatten(). - Do(). - Infos() - if err != nil { - return err - } - po.pastGroupingObjects = retrievedGroupingInfos - po.retrievedGroupingObjects = true - return nil -} - -// infoToInventory transforms the object represented by the passed "info" -// into its Inventory representation. Returns error if the passed Info -// is nil, or the Object in the Info is empty. -func infoToInventory(info *resource.Info) (*Inventory, error) { - if info == nil || info.Object == nil { - return nil, fmt.Errorf("Empty resource.Info can not calculate as inventory.\n") - } - obj := info.Object - gk := obj.GetObjectKind().GroupVersionKind().GroupKind() - return createInventory(info.Namespace, info.Name, gk) -} - -// unionPastInventory takes a set of grouping objects (infos), returning the -// union of the objects referenced by these grouping objects as an -// InventorySet. Returns an error if any of the passed objects are not -// grouping objects, or if unable to retrieve the inventory from any -// grouping object. -func unionPastInventory(infos []*resource.Info) (*InventorySet, error) { - inventorySet := NewInventorySet([]*Inventory{}) - for _, info := range infos { - inv, err := retrieveInventoryFromGroupingObj([]*resource.Info{info}) - if err != nil { - return nil, err - } - inventorySet.AddItems(inv) - } - return inventorySet, nil -} - -// calcPruneSet returns the InventorySet representing the objects to -// delete (prune). pastGroupInfos are the set of past applied grouping -// objects, storing the inventory of the objects applied at the same time. -// Calculates the prune set as: -// -// prune set = (prev1 U prev2 U ... U prevN) - (curr1, curr2, ..., currN) -// -// Returns an error if we are unable to retrieve the set of previously -// applied objects, or if we are unable to get the currently applied objects -// from the current grouping object. -func (po *PruneOptions) calcPruneSet(pastGroupingInfos []*resource.Info) (*InventorySet, error) { - pastInventory, err := unionPastInventory(pastGroupingInfos) - if err != nil { - return nil, err - } - // Current grouping object as inventory set. - c := []*resource.Info{po.currentGroupingObject} - currentInv, err := retrieveInventoryFromGroupingObj(c) - if err != nil { - return nil, err - } - return pastInventory.Subtract(NewInventorySet(currentInv)) -} - -// Prune deletes the set of resources which were previously applied -// (retrieved from previous grouping objects) but omitted in -// the current apply. Prune also delete all previous grouping -// objects. Returns an error if there was a problem. -func (po *PruneOptions) Prune() error { - - // Retrieve previous grouping objects, and calculate the - // union of the previous applies as an inventory set. - pastGroupingInfos, err := po.getPreviousGroupingObjects() - if err != nil { - return err - } - pruneSet, err := po.calcPruneSet(pastGroupingInfos) - if err != nil { - return err - } - - // Delete the prune objects. - for _, inv := range pruneSet.GetItems() { - mapping, err := po.mapper.RESTMapping(inv.GroupKind) - if err != nil { - return err - } - err = po.client.Resource(mapping.Resource).Namespace(inv.Namespace).Delete(inv.Name, &metav1.DeleteOptions{}) - if err != nil { - return err - } - fmt.Fprintf(po.out, "%s/%s deleted\n", strings.ToLower(inv.GroupKind.Kind), inv.Name) - } - // Delete previous grouping objects. - for _, pastGroupInfo := range pastGroupingInfos { - err = po.client.Resource(pastGroupInfo.Mapping.Resource). - Namespace(pastGroupInfo.Namespace). - Delete(pastGroupInfo.Name, &metav1.DeleteOptions{}) - if err != nil { - return err - } - printer, err := po.toPrinter("deleted") - if err != nil { - return err - } - if err = printer.PrintObj(pastGroupInfo.Object, po.out); err != nil { - return err - } - } - - return nil -} diff --git a/cmd/kubectl/kubectlcobra/prune_test.go b/cmd/kubectl/kubectlcobra/prune_test.go deleted file mode 100644 index 20faa9936..000000000 --- a/cmd/kubectl/kubectlcobra/prune_test.go +++ /dev/null @@ -1,244 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -// package kubectlcobra contains cobra commands from kubectl -package kubectlcobra - -import ( - "testing" - - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/cli-runtime/pkg/resource" -) - -var pod1Inv = &Inventory{ - Namespace: testNamespace, - Name: pod1Name, - GroupKind: schema.GroupKind{ - Group: "", - Kind: "Pod", - }, -} - -var pod2Inv = &Inventory{ - Namespace: testNamespace, - Name: pod2Name, - GroupKind: schema.GroupKind{ - Group: "", - Kind: "Pod", - }, -} - -var pod3Inv = &Inventory{ - Namespace: testNamespace, - Name: pod3Name, - GroupKind: schema.GroupKind{ - Group: "", - Kind: "Pod", - }, -} - -var groupingInv = &Inventory{ - Namespace: testNamespace, - Name: groupingObjName, - GroupKind: schema.GroupKind{ - Group: "", - Kind: "ConfigMap", - }, -} - -func TestInfoToInventory(t *testing.T) { - tests := map[string]struct { - info *resource.Info - expected *Inventory - isError bool - }{ - "Nil info is an error": { - info: nil, - expected: nil, - isError: true, - }, - "Nil info object is an error": { - info: nilInfo, - expected: nil, - isError: true, - }, - "Pod 1 object becomes Pod 1 inventory": { - info: pod1Info, - expected: pod1Inv, - isError: false, - }, - "Grouping object becomes grouping inventory": { - info: copyGroupingInfo(), - expected: groupingInv, - isError: false, - }, - } - - for name, test := range tests { - t.Run(name, func(t *testing.T) { - actual, err := infoToInventory(test.info) - if test.isError && err == nil { - t.Errorf("Did not receive expected error.\n") - } - if !test.isError { - if err != nil { - t.Errorf("Receieved unexpected error: %s\n", err) - } - if !test.expected.Equals(actual) { - t.Errorf("Expected inventory (%s), got (%s)\n", test.expected, actual) - } - } - }) - } -} - -// Returns a grouping object with the inventory set from -// the passed "children". -func createGroupingInfo(name string, children ...(*resource.Info)) *resource.Info { - groupingObjCopy := groupingObj.DeepCopy() - var groupingInfo = &resource.Info{ - Namespace: testNamespace, - Name: groupingObjName, - Object: groupingObjCopy, - } - infos := []*resource.Info{groupingInfo} - infos = append(infos, children...) - _ = addInventoryToGroupingObj(infos) - return groupingInfo -} - -func TestUnionPastInventory(t *testing.T) { - tests := map[string]struct { - groupingInfos []*resource.Info - expected []*Inventory - }{ - "Empty grouping objects = empty inventory set": { - groupingInfos: []*resource.Info{}, - expected: []*Inventory{}, - }, - "No children in grouping object, equals no inventory": { - groupingInfos: []*resource.Info{createGroupingInfo("test-1")}, - expected: []*Inventory{}, - }, - "Grouping object with Pod1 returns inventory with Pod1": { - groupingInfos: []*resource.Info{createGroupingInfo("test-1", pod1Info)}, - expected: []*Inventory{pod1Inv}, - }, - "Grouping object with three pods returns inventory with three pods": { - groupingInfos: []*resource.Info{ - createGroupingInfo("test-1", pod1Info, pod2Info, pod3Info), - }, - expected: []*Inventory{pod1Inv, pod2Inv, pod3Inv}, - }, - "Two grouping objects with different pods returns inventory with both pods": { - groupingInfos: []*resource.Info{ - createGroupingInfo("test-1", pod1Info), - createGroupingInfo("test-2", pod2Info), - }, - expected: []*Inventory{pod1Inv, pod2Inv}, - }, - "Two grouping objects with overlapping pods returns set of pods": { - groupingInfos: []*resource.Info{ - createGroupingInfo("test-1", pod1Info, pod2Info), - createGroupingInfo("test-2", pod2Info, pod3Info), - }, - expected: []*Inventory{pod1Inv, pod2Inv, pod3Inv}, - }, - } - - for name, test := range tests { - t.Run(name, func(t *testing.T) { - actual, err := unionPastInventory(test.groupingInfos) - expected := NewInventorySet(test.expected) - if err != nil { - t.Errorf("Unexpected error received: %s\n", err) - } - if !expected.Equals(actual) { - t.Errorf("Expected inventory (%s), got (%s)\n", expected, actual) - } - }) - } -} - -func TestCalcPruneSet(t *testing.T) { - tests := map[string]struct { - past []*resource.Info - current *resource.Info - expected []*Inventory - isError bool - }{ - "Object not unstructured--error": { - past: []*resource.Info{nonUnstructuredGroupingInfo}, - current: &resource.Info{}, - expected: []*Inventory{}, - isError: true, - }, - "No past group objects--no prune set": { - - past: []*resource.Info{}, - current: createGroupingInfo("test-1"), - expected: []*Inventory{}, - isError: false, - }, - "Empty past grouping object--no prune set": { - past: []*resource.Info{createGroupingInfo("test-1")}, - current: createGroupingInfo("test-1"), - expected: []*Inventory{}, - isError: false, - }, - "Pod1 - Pod1 = empty set": { - past: []*resource.Info{ - createGroupingInfo("test-1", pod1Info), - }, - current: createGroupingInfo("test-1", pod1Info), - expected: []*Inventory{}, - isError: false, - }, - "(Pod1, Pod2) - Pod1 = Pod2": { - past: []*resource.Info{ - createGroupingInfo("test-1", pod1Info, pod2Info), - }, - current: createGroupingInfo("test-1", pod1Info), - expected: []*Inventory{pod2Inv}, - isError: false, - }, - "(Pod1, Pod2) - Pod2 = Pod1": { - past: []*resource.Info{ - createGroupingInfo("test-1", pod1Info, pod2Info), - }, - current: createGroupingInfo("test-1", pod2Info), - expected: []*Inventory{pod1Inv}, - isError: false, - }, - "(Pod1, Pod2, Pod3) - Pod2 = Pod1, Pod3": { - past: []*resource.Info{ - createGroupingInfo("test-1", pod1Info, pod2Info), - createGroupingInfo("test-1", pod2Info, pod3Info), - }, - current: createGroupingInfo("test-1", pod2Info), - expected: []*Inventory{pod1Inv, pod3Inv}, - isError: false, - }, - } - - for name, test := range tests { - t.Run(name, func(t *testing.T) { - po := &PruneOptions{} - po.currentGroupingObject = test.current - actual, err := po.calcPruneSet(test.past) - expected := NewInventorySet(test.expected) - if test.isError && err == nil { - t.Errorf("Did not receive expected error.\n") - } - if !test.isError { - if err != nil { - t.Errorf("Unexpected error received: %s\n", err) - } - if !expected.Equals(actual) { - t.Errorf("Expected prune set (%s), got (%s)\n", expected, actual) - } - } - }) - } -} diff --git a/cmd/kubectl/kubectlcobra/status.go b/cmd/kubectl/kubectlcobra/status.go deleted file mode 100644 index d69393fd9..000000000 --- a/cmd/kubectl/kubectlcobra/status.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package kubectlcobra - -import ( - "time" - - "github.com/spf13/cobra" -) - -func NewStatusOptions() *StatusOptions { - return &StatusOptions{ - wait: false, - period: 2 * time.Second, - timeout: time.Minute, - } -} - -type StatusOptions struct { - wait bool - period time.Duration - timeout time.Duration -} - -func (s *StatusOptions) AddFlags(c *cobra.Command) { - c.Flags().BoolVar(&s.wait, "status", s.wait, "Wait for all applied resources to reach the Current status.") - c.Flags().DurationVar(&s.period, "status-period", s.period, "Polling period for resource statuses.") - c.Flags().DurationVar(&s.timeout, "status-timeout", s.timeout, "Timeout threshold for waiting for all resources to reach the Current status.") -} diff --git a/cmd/kubectl/main.go b/cmd/kubectl/main.go deleted file mode 100644 index 6c70bb6f6..000000000 --- a/cmd/kubectl/main.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2019 The Kubernetes Authors. -// SPDX-License-Identifier: Apache-2.0 - -package main - -import ( - "os" - - "sigs.k8s.io/kustomize/cmd/kubectl/kubectlcobra" - "sigs.k8s.io/kustomize/kyaml/commandutil" - - // This is here rather than in the libraries because of - // https://github.com/kubernetes-sigs/kustomize/issues/2060 - _ "k8s.io/client-go/plugin/pkg/client/auth" -) - -func main() { - // enable the config commands - os.Setenv(commandutil.EnableAlphaCommmandsEnvName, "true") - if err := kubectlcobra.GetCommand(nil).Execute(); err != nil { - os.Exit(1) - } -} diff --git a/cmd/resource/.golangci.yml b/cmd/resource/.golangci.yml deleted file mode 100644 index 822522f88..000000000 --- a/cmd/resource/.golangci.yml +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright 2019 The Kubernetes Authors. -# SPDX-License-Identifier: Apache-2.0 - -run: - deadline: 5m - -linters: - # please, do not use `enable-all`: it's deprecated and will be removed soon. - # inverted configuration with `enable-all` and `disable` is not scalable during updates of golangci-lint - disable-all: true - enable: - - bodyclose - - deadcode - - depguard - - dogsled - - dupl - - errcheck - # - funlen - # - gochecknoinits - - goconst - - gocritic - - gocyclo - - gofmt - - goimports - - golint - - gosec - - gosimple - - govet - - ineffassign - - interfacer - - lll - - misspell - - nakedret - - scopelint - - staticcheck - - structcheck - - stylecheck - - typecheck - - unconvert - - unparam - - unused - - varcheck - - whitespace - - -linters-settings: - dupl: - threshold: 400 - lll: - line-length: 170 - gocyclo: - min-complexity: 30 - golint: - min-confidence: 0.85 diff --git a/kustomize/go.mod b/kustomize/go.mod index b5c2253b0..c4faff69e 100644 --- a/kustomize/go.mod +++ b/kustomize/go.mod @@ -15,7 +15,6 @@ require ( sigs.k8s.io/controller-runtime v0.4.0 sigs.k8s.io/kustomize/api v0.4.1 sigs.k8s.io/kustomize/cmd/config v0.1.11 - sigs.k8s.io/kustomize/cmd/kubectl v0.1.0 sigs.k8s.io/kustomize/kstatus v0.0.2 sigs.k8s.io/kustomize/kyaml v0.1.11 sigs.k8s.io/yaml v1.2.0 diff --git a/kustomize/internal/commands/commands.go b/kustomize/internal/commands/commands.go index ffe3bb5c7..44a36faf6 100644 --- a/kustomize/internal/commands/commands.go +++ b/kustomize/internal/commands/commands.go @@ -14,9 +14,7 @@ import ( "sigs.k8s.io/kustomize/api/k8sdeps/validator" "sigs.k8s.io/kustomize/api/konfig" shell_complete "sigs.k8s.io/kustomize/cmd/config/complete" - "sigs.k8s.io/kustomize/cmd/kubectl/kubectlcobra" "sigs.k8s.io/kustomize/kustomize/v3/internal/commands/build" - "sigs.k8s.io/kustomize/kustomize/v3/internal/commands/config" "sigs.k8s.io/kustomize/kustomize/v3/internal/commands/create" "sigs.k8s.io/kustomize/kustomize/v3/internal/commands/edit" "sigs.k8s.io/kustomize/kustomize/v3/internal/commands/status" @@ -46,12 +44,6 @@ See https://sigs.k8s.io/kustomize version.NewCmdVersion(stdOut), status.NewCmdStatus(), ) - if cc := config.NewCmdConfig(fSys); cc != nil { - c.AddCommand(cc) - } - if kc := kubectlcobra.GetCommand(c); kc != nil { - c.AddCommand(kc) - } c.PersistentFlags().AddGoFlagSet(flag.CommandLine) diff --git a/kyaml/kio/byteio_writer_test.go b/kyaml/kio/byteio_writer_test.go index ed331fbfd..d038f529e 100644 --- a/kyaml/kio/byteio_writer_test.go +++ b/kyaml/kio/byteio_writer_test.go @@ -9,7 +9,6 @@ import ( "testing" "github.com/stretchr/testify/assert" - "sigs.k8s.io/kustomize/kyaml/kio" . "sigs.k8s.io/kustomize/kyaml/kio" "sigs.k8s.io/kustomize/kyaml/yaml" ) @@ -22,7 +21,7 @@ func TestByteWriter(t *testing.T) { functionConfig string results string expectedOutput string - instance kio.ByteWriter + instance ByteWriter } testCases := []testCase{ diff --git a/kyaml/yaml/example_test.go b/kyaml/yaml/example_test.go index d2a1999e9..baa8e8ed9 100644 --- a/kyaml/yaml/example_test.go +++ b/kyaml/yaml/example_test.go @@ -857,7 +857,7 @@ func ExampleRNode_Elements() { log.Fatal(err) } for i, e := range elements { - fmt.Println(fmt.Sprintf("Element: %d", i)) + fmt.Printf("Element: %d\n", i) fmt.Println(e.MustString()) } // Output: diff --git a/travis/kyaml-pre-commit.sh b/travis/kyaml-pre-commit.sh index 8d9c00403..30cab4d3d 100755 --- a/travis/kyaml-pre-commit.sh +++ b/travis/kyaml-pre-commit.sh @@ -9,7 +9,6 @@ set -e targets=" kyaml cmd/config -cmd/kubectl functions/examples/injection-tshirt-sizes functions/examples/template-go-nginx functions/examples/template-heredoc-cockroachdb