From be1e0a82593c8c63f9d735871927d1a8b5793f06 Mon Sep 17 00:00:00 2001 From: Navid Shaikh Date: Wed, 27 Nov 2019 14:26:45 +0530 Subject: [PATCH] feat: kn source list-types (builtin types) - Only lists the builtin source types - Uses client-go dynamic client for listing CRDs - Adds DyanmicClient interface to KnParams - Adds printing options --- docs/cmd/kn.md | 1 + docs/cmd/kn_source.md | 31 +++++++ docs/cmd/kn_source_list-types.md | 35 ++++++++ go.mod | 2 + pkg/dynamic/client.go | 86 +++++++++++++++++++ pkg/eventing/sources/v1alpha1/client.go | 2 +- .../commands/source/human_readable_flags.go | 80 +++++++++++++++++ pkg/kn/commands/source/list_types.go | 68 +++++++++++++++ pkg/kn/commands/source/list_types_flags.go | 71 +++++++++++++++ pkg/kn/commands/source/source.go | 30 +++++++ pkg/kn/commands/types.go | 59 ++++++++----- pkg/kn/commands/types_test.go | 10 +-- pkg/kn/core/root.go | 2 + vendor/modules.txt | 64 +++++++------- 14 files changed, 480 insertions(+), 61 deletions(-) create mode 100644 docs/cmd/kn_source.md create mode 100644 docs/cmd/kn_source_list-types.md create mode 100644 pkg/dynamic/client.go create mode 100644 pkg/kn/commands/source/human_readable_flags.go create mode 100644 pkg/kn/commands/source/list_types.go create mode 100644 pkg/kn/commands/source/list_types_flags.go create mode 100644 pkg/kn/commands/source/source.go diff --git a/docs/cmd/kn.md b/docs/cmd/kn.md index 4053f7caed..47ff5bd7d2 100644 --- a/docs/cmd/kn.md +++ b/docs/cmd/kn.md @@ -27,5 +27,6 @@ Manage your Knative building blocks: * [kn revision](kn_revision.md) - Revision command group * [kn route](kn_route.md) - Route command group * [kn service](kn_service.md) - Service command group +* [kn source](kn_source.md) - Event Source command group * [kn version](kn_version.md) - Prints the client version diff --git a/docs/cmd/kn_source.md b/docs/cmd/kn_source.md new file mode 100644 index 0000000000..9a81ce036a --- /dev/null +++ b/docs/cmd/kn_source.md @@ -0,0 +1,31 @@ +## kn source + +Event Source command group + +### Synopsis + +Event Source command group + +``` +kn source [flags] +``` + +### Options + +``` + -h, --help help for source +``` + +### Options inherited from parent commands + +``` + --config string kn config file (default is $HOME/.kn/config.yaml) + --kubeconfig string kubectl config file (default is $HOME/.kube/config) + --log-http log http traffic +``` + +### SEE ALSO + +* [kn](kn.md) - Knative client +* [kn source list-types](kn_source_list-types.md) - List available source types + diff --git a/docs/cmd/kn_source_list-types.md b/docs/cmd/kn_source_list-types.md new file mode 100644 index 0000000000..5053b3dc02 --- /dev/null +++ b/docs/cmd/kn_source_list-types.md @@ -0,0 +1,35 @@ +## kn source list-types + +List available source types + +### Synopsis + +List available source types + +``` +kn source list-types [flags] +``` + +### Options + +``` + --allow-missing-template-keys If true, ignore any errors in templates when a field or map key is missing in the template. Only applies to golang and jsonpath output formats. (default true) + -h, --help help for list-types + -n, --namespace string Specify the namespace to operate in. + --no-headers When using the default output format, don't print headers (default: print headers). + -o, --output string Output format. One of: json|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-file. + --template string Template string or path to template file to use when -o=go-template, -o=go-template-file. The template format is golang templates [http://golang.org/pkg/text/template/#pkg-overview]. +``` + +### Options inherited from parent commands + +``` + --config string kn config file (default is $HOME/.kn/config.yaml) + --kubeconfig string kubectl config file (default is $HOME/.kube/config) + --log-http log http traffic +``` + +### SEE ALSO + +* [kn source](kn_source.md) - Event Source command group + diff --git a/go.mod b/go.mod index 32f3ecdbe0..dbec2ed7c7 100644 --- a/go.mod +++ b/go.mod @@ -31,3 +31,5 @@ require ( // Fix for `[` in help messages and shell completion code // See https://github.com/spf13/cobra/pull/899 replace github.com/spf13/cobra => github.com/chmouel/cobra v0.0.0-20191021105835-a78788917390 + +go 1.13 diff --git a/pkg/dynamic/client.go b/pkg/dynamic/client.go new file mode 100644 index 0000000000..5af5d63786 --- /dev/null +++ b/pkg/dynamic/client.go @@ -0,0 +1,86 @@ +// Copyright © 2019 The Knative Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package rest + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/dynamic" +) + +// KnRESTClient to client-go REST client. All methods are relative to the +// namespace specified during construction +type KnDynamicClient interface { + // Namespace in which this client is operating for + Namespace() string + + // ListCRDs returns list of CRDs with their type and name + ListCRDs(options metav1.ListOptions) (*unstructured.UnstructuredList, error) + + // ListSourceCRDs returns list of eventing sources CRDs + ListSourcesTypes() (*unstructured.UnstructuredList, error) +} + +// KnRESTClient is a combination of client-go REST client interface and namespace +type knDynamicClient struct { + client dynamic.Interface + namespace string +} + +// CRDKindName holds Kind and Name of a CRD +type CRDKindName struct { + Kind, Name string +} + +// NewKnRESTClient is to invoke Eventing Sources Client API to create object +func NewDynamicClient(client dynamic.Interface, namespace string) KnDynamicClient { + return &knDynamicClient{ + client: client, + namespace: namespace, + } +} + +// Return the client's namespace +func (c *knDynamicClient) Namespace() string { + return c.namespace +} + +// TODO(navidshaikh): Use ListConfigs here instead of ListOptions +// ListCRDs returns list of installed CRDs in the cluster and filters based on the given options +func (c *knDynamicClient) ListCRDs(options metav1.ListOptions) (*unstructured.UnstructuredList, error) { + // TODO (navidshaikh): We should populate this in a better way + gvr := schema.GroupVersionResource{ + "apiextensions.k8s.io", + "v1beta1", + "customresourcedefinitions", + } + + uList, err := c.client.Resource(gvr).List(options) + if err != nil { + return nil, err + } + + return uList, nil +} + +// ListSourcesTypes returns installed knative eventing sources CRDs +func (c *knDynamicClient) ListSourcesTypes() (*unstructured.UnstructuredList, error) { + options := metav1.ListOptions{} + sourcesLabels := labels.Set{"duck.knative.dev/source": "true"} + options.LabelSelector = sourcesLabels.String() + return c.ListCRDs(options) +} diff --git a/pkg/eventing/sources/v1alpha1/client.go b/pkg/eventing/sources/v1alpha1/client.go index 3d1b0dfcf4..a9f4c3bd82 100644 --- a/pkg/eventing/sources/v1alpha1/client.go +++ b/pkg/eventing/sources/v1alpha1/client.go @@ -36,8 +36,8 @@ type knSourcesClient struct { // NewKnSourcesClient is to invoke Eventing Sources Client API to create object func NewKnSourcesClient(client client_v1alpha1.SourcesV1alpha1Interface, namespace string) KnSourcesClient { return &knSourcesClient{ - namespace: namespace, client: client, + namespace: namespace, } } diff --git a/pkg/kn/commands/source/human_readable_flags.go b/pkg/kn/commands/source/human_readable_flags.go new file mode 100644 index 0000000000..db0702b3f9 --- /dev/null +++ b/pkg/kn/commands/source/human_readable_flags.go @@ -0,0 +1,80 @@ +// Copyright © 2019 The Knative Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package source + +import ( + "fmt" + + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + metav1beta1 "k8s.io/apimachinery/pkg/apis/meta/v1beta1" + "k8s.io/apimachinery/pkg/runtime" + hprinters "knative.dev/client/pkg/printers" +) + +var sourceTypeDescription = map[string]string{ + "ApiServerSource": "Kubernetes API Server events source", + "ContainerSource": "Container events source", + "CronJobSource": "CronJob events source", +} + +func getSourceTypeDescription(kind string) string { + return sourceTypeDescription[kind] +} + +func SourceListTypesHandlers(h hprinters.PrintHandler) { + sourceTypesColumnDefinitions := []metav1beta1.TableColumnDefinition{ + {Name: "Type", Type: "string", Description: "Kind / Type of the source type", Priority: 1}, + {Name: "Name", Type: "string", Description: "Name of the source type", Priority: 1}, + {Name: "Description", Type: "string", Description: "Description of the source type", Priority: 1}, + } + h.TableHandler(sourceTypesColumnDefinitions, printSourceTypes) + h.TableHandler(sourceTypesColumnDefinitions, printSourceTypesList) +} + +// printSourceTypes populates a single row of source types list table +func printSourceTypes(sourceType unstructured.Unstructured, options hprinters.PrintOptions) ([]metav1beta1.TableRow, error) { + name := sourceType.GetName() + content := sourceType.UnstructuredContent() + kind, found, err := unstructured.NestedString(content, "spec", "names", "kind") + if err != nil { + return nil, err + } + + if !found { + return nil, fmt.Errorf("can't find kind of CRD for %s", name) + } + + row := metav1beta1.TableRow{ + Object: runtime.RawExtension{Object: &sourceType}, + } + + row.Cells = append(row.Cells, kind, name, getSourceTypeDescription(kind)) + return []metav1beta1.TableRow{row}, nil +} + +// printSourceTypesList populates the source types list table rows +func printSourceTypesList(sourceTypesList *unstructured.UnstructuredList, options hprinters.PrintOptions) ([]metav1beta1.TableRow, error) { + rows := make([]metav1beta1.TableRow, 0, len(sourceTypesList.Items)) + + for _, item := range sourceTypesList.Items { + row, err := printSourceTypes(item, options) + if err != nil { + return nil, err + } + + rows = append(rows, row...) + } + return rows, nil +} diff --git a/pkg/kn/commands/source/list_types.go b/pkg/kn/commands/source/list_types.go new file mode 100644 index 0000000000..26ad126a6a --- /dev/null +++ b/pkg/kn/commands/source/list_types.go @@ -0,0 +1,68 @@ +// Copyright © 2019 The Knative Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package source + +import ( + "fmt" + + "github.com/spf13/cobra" + + "knative.dev/client/pkg/kn/commands" +) + +func NewListTypesCommand(p *commands.KnParams) *cobra.Command { + sourceListTypesFlags := NewSourceListTypesFlags() + listTypesCommand := &cobra.Command{ + Use: "list-types", + Short: "List available source types", + RunE: func(cmd *cobra.Command, args []string) error { + namespace, err := p.GetNamespace(cmd) + if err != nil { + return err + } + + dynamicClient, err := p.NewDynamicClient(namespace) + if err != nil { + return err + } + + sourceListTypes, err := dynamicClient.ListSourcesTypes() + if err != nil { + return err + } + + if len(sourceListTypes.Items) == 0 { + fmt.Fprintf(cmd.OutOrStdout(), "No sources found.\n") + return nil + } + + printer, err := sourceListTypesFlags.ToPrinter() + if err != nil { + return nil + } + //TODO(navidshaikh): Sort the list + + err = printer.PrintObj(sourceListTypes, cmd.OutOrStdout()) + if err != nil { + return err + } + + return nil + }, + } + commands.AddNamespaceFlags(listTypesCommand.Flags(), false) + sourceListTypesFlags.AddFlags(listTypesCommand) + return listTypesCommand +} diff --git a/pkg/kn/commands/source/list_types_flags.go b/pkg/kn/commands/source/list_types_flags.go new file mode 100644 index 0000000000..cb55a6ded3 --- /dev/null +++ b/pkg/kn/commands/source/list_types_flags.go @@ -0,0 +1,71 @@ +// Copyright © 2019 The Knative Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or im +// See the License for the specific language governing permissions and +// limitations under the License. + +package source + +import ( + "github.com/spf13/cobra" + "k8s.io/cli-runtime/pkg/genericclioptions" + "knative.dev/client/pkg/kn/commands" + hprinters "knative.dev/client/pkg/printers" +) + +// SourceListTypesFlags composes common printer flag structs +// used in the 'kn source list-types' command. +type SourceListTypesFlags struct { + GenericPrintFlags *genericclioptions.PrintFlags + HumanReadableFlags *commands.HumanPrintFlags +} + +// AllowedFormats is the list of formats in which data can be displayed +func (f *SourceListTypesFlags) AllowedFormats() []string { + formats := f.GenericPrintFlags.AllowedFormats() + formats = append(formats, f.HumanReadableFlags.AllowedFormats()...) + return formats +} + +// ToPrinter attempts to find a composed set of SourceListTypesFlags suitable for +// returning a printer based on current flag values. +func (f *SourceListTypesFlags) ToPrinter() (hprinters.ResourcePrinter, error) { + // if there are flags specified for generic printing + if f.GenericPrintFlags.OutputFlagSpecified() { + p, err := f.GenericPrintFlags.ToPrinter() + if err != nil { + return nil, err + } + return p, nil + } + + p, err := f.HumanReadableFlags.ToPrinter(SourceListTypesHandlers) + if err != nil { + return nil, err + } + return p, nil +} + +// AddFlags receives a *cobra.Command reference and binds +// flags related to humanreadable and template printing. +func (f *SourceListTypesFlags) AddFlags(cmd *cobra.Command) { + f.GenericPrintFlags.AddFlags(cmd) + f.HumanReadableFlags.AddFlags(cmd) +} + +// NewSourceListTypesFlags returns flags associated with humanreadable, +// template, and "name" printing, with default values set. +func NewSourceListTypesFlags() *SourceListTypesFlags { + return &SourceListTypesFlags{ + GenericPrintFlags: genericclioptions.NewPrintFlags(""), + HumanReadableFlags: commands.NewHumanPrintFlags(), + } +} diff --git a/pkg/kn/commands/source/source.go b/pkg/kn/commands/source/source.go new file mode 100644 index 0000000000..aecf2935d8 --- /dev/null +++ b/pkg/kn/commands/source/source.go @@ -0,0 +1,30 @@ +// Copyright © 2019 The Knative Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package source + +import ( + "github.com/spf13/cobra" + + "knative.dev/client/pkg/kn/commands" +) + +func NewSourceCommand(p *commands.KnParams) *cobra.Command { + sourceCmd := &cobra.Command{ + Use: "source", + Short: "Event Source command group", + } + sourceCmd.AddCommand(NewListTypesCommand(p)) + return sourceCmd +} diff --git a/pkg/kn/commands/types.go b/pkg/kn/commands/types.go index f0b290cbf9..0e486f9b9f 100644 --- a/pkg/kn/commands/types.go +++ b/pkg/kn/commands/types.go @@ -20,12 +20,16 @@ import ( "os" "path/filepath" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" - sources_kn_v1alpha1 "knative.dev/client/pkg/eventing/sources/v1alpha1" - serving_kn_v1alpha1 "knative.dev/client/pkg/serving/v1alpha1" "knative.dev/client/pkg/util" eventing_sources "knative.dev/eventing/pkg/client/clientset/versioned/typed/sources/v1alpha1" serving_v1alpha1_client "knative.dev/serving/pkg/client/clientset/versioned/typed/serving/v1alpha1" + + dynamic_kn "knative.dev/client/pkg/dynamic" + sources_kn_v1alpha1 "knative.dev/client/pkg/eventing/sources/v1alpha1" + serving_kn_v1alpha1 "knative.dev/client/pkg/serving/v1alpha1" ) // CfgFile is Kn's config file is the path for the Kubernetes config @@ -40,13 +44,14 @@ type Config struct { LookupPlugins bool } -// Parameters for creating commands. Useful for inserting mocks for testing. +// KnParams for creating commands. Useful for inserting mocks for testing. type KnParams struct { Output io.Writer KubeCfgPath string ClientConfig clientcmd.ClientConfig NewClient func(namespace string) (serving_kn_v1alpha1.KnServingClient, error) NewSourcesClient func(namespace string) (sources_kn_v1alpha1.KnSourcesClient, error) + NewDynamicClient func(namespace string) (dynamic_kn.KnDynamicClient, error) // General global options LogHTTP bool @@ -57,46 +62,54 @@ type KnParams struct { func (params *KnParams) Initialize() { if params.NewClient == nil { - params.NewClient = params.newClient + params.NewClient = params.newServingClient } + if params.NewSourcesClient == nil { params.NewSourcesClient = params.newSourcesClient } + + if params.NewDynamicClient == nil { + params.NewDynamicClient = params.newDynamicClient + } } -func (params *KnParams) newClient(namespace string) (serving_kn_v1alpha1.KnServingClient, error) { - client, err := params.GetConfig() +func (params *KnParams) newServingClient(namespace string) (serving_kn_v1alpha1.KnServingClient, error) { + restConfig, err := params.prepareRestConfig() if err != nil { return nil, err } + + client, _ := serving_v1alpha1_client.NewForConfig(restConfig) return serving_kn_v1alpha1.NewKnServingClient(client, namespace), nil } func (params *KnParams) newSourcesClient(namespace string) (sources_kn_v1alpha1.KnSourcesClient, error) { - var err error - - if params.ClientConfig == nil { - params.ClientConfig, err = params.GetClientConfig() - if err != nil { - return nil, err - } + restConfig, err := params.prepareRestConfig() + if err != nil { + return nil, err } - clientConfig, err := params.ClientConfig.ClientConfig() + client, _ := eventing_sources.NewForConfig(restConfig) + return sources_kn_v1alpha1.NewKnSourcesClient(client, namespace), nil +} + +func (params *KnParams) newDynamicClient(namespace string) (dynamic_kn.KnDynamicClient, error) { + restConfig, err := params.prepareRestConfig() if err != nil { return nil, err } - if params.LogHTTP { - // TODO: When we update to the newer version of client-go, replace with - // config.Wrap() for future compat. - clientConfig.WrapTransport = util.NewLoggingTransport + + client, err := dynamic.NewForConfig(restConfig) + if err != nil { + return nil, err } - client, _ := eventing_sources.NewForConfig(clientConfig) - return sources_kn_v1alpha1.NewKnSourcesClient(client, namespace), nil + + return dynamic_kn.NewDynamicClient(client, namespace), nil } -// GetConfig returns Serving Client -func (params *KnParams) GetConfig() (serving_v1alpha1_client.ServingV1alpha1Interface, error) { +// prepareRestConfig returns REST config, which can be to use to create specific clientset +func (params *KnParams) prepareRestConfig() (*rest.Config, error) { var err error if params.ClientConfig == nil { @@ -116,7 +129,7 @@ func (params *KnParams) GetConfig() (serving_v1alpha1_client.ServingV1alpha1Inte config.WrapTransport = util.NewLoggingTransport } - return serving_v1alpha1_client.NewForConfig(config) + return config, nil } // GetClientConfig gets ClientConfig from KubeCfgPath diff --git a/pkg/kn/commands/types_test.go b/pkg/kn/commands/types_test.go index 5714cbf511..8bbe3cbf6f 100644 --- a/pkg/kn/commands/types_test.go +++ b/pkg/kn/commands/types_test.go @@ -26,7 +26,7 @@ import ( "knative.dev/client/pkg/util" ) -type getConfigTestCase struct { +type configTestCase struct { clientConfig clientcmd.ClientConfig expectedErrString string logHttp bool @@ -53,12 +53,12 @@ contexts: current-context: a ` -func TestGetConfig(t *testing.T) { +func TestPrepareConfig(t *testing.T) { basic, err := clientcmd.NewClientConfigFromBytes([]byte(BASIC_KUBECONFIG)) if err != nil { t.Error(err) } - for i, tc := range []getConfigTestCase{ + for i, tc := range []configTestCase{ { clientcmd.NewDefaultClientConfig(clientcmdapi.Config{}, &clientcmd.ConfigOverrides{}), "no configuration has been provided", @@ -80,7 +80,7 @@ func TestGetConfig(t *testing.T) { LogHTTP: tc.logHttp, } - _, err := p.GetConfig() + _, err := p.prepareRestConfig() switch len(tc.expectedErrString) { case 0: @@ -148,7 +148,7 @@ func TestNewSourcesClient(t *testing.T) { if err != nil { t.Error(err) } - for i, tc := range []getConfigTestCase{ + for i, tc := range []configTestCase{ { clientcmd.NewDefaultClientConfig(clientcmdapi.Config{}, &clientcmd.ConfigOverrides{}), "no configuration has been provided", diff --git a/pkg/kn/core/root.go b/pkg/kn/core/root.go index 7f4bfeaf65..6f1d040e44 100644 --- a/pkg/kn/core/root.go +++ b/pkg/kn/core/root.go @@ -35,6 +35,7 @@ import ( "knative.dev/client/pkg/kn/commands/revision" "knative.dev/client/pkg/kn/commands/route" "knative.dev/client/pkg/kn/commands/service" + "knative.dev/client/pkg/kn/commands/source" "knative.dev/client/pkg/kn/commands/version" "knative.dev/client/pkg/kn/flags" ) @@ -142,6 +143,7 @@ func NewKnCommand(params ...commands.KnParams) *cobra.Command { rootCmd.AddCommand(route.NewRouteCommand(p)) rootCmd.AddCommand(completion.NewCompletionCommand(p)) rootCmd.AddCommand(version.NewVersionCommand(p)) + rootCmd.AddCommand(source.NewSourceCommand(p)) // Deal with empty and unknown sub command groups EmptyAndUnknownSubCommands(rootCmd) diff --git a/vendor/modules.txt b/vendor/modules.txt index 89bbaba2da..ef4c60f6df 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -255,13 +255,13 @@ golang.org/x/sys/windows golang.org/x/text/transform golang.org/x/text/unicode/norm golang.org/x/text/encoding/unicode +golang.org/x/text/secure/bidirule +golang.org/x/text/unicode/bidi golang.org/x/text/encoding golang.org/x/text/encoding/internal golang.org/x/text/encoding/internal/identifier golang.org/x/text/internal/utf8internal golang.org/x/text/runes -golang.org/x/text/secure/bidirule -golang.org/x/text/unicode/bidi golang.org/x/text/width # golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 golang.org/x/time/rate @@ -394,8 +394,11 @@ k8s.io/api/storage/v1alpha1 k8s.io/api/storage/v1beta1 k8s.io/api/admission/v1beta1 # k8s.io/apimachinery v0.0.0-20191004115701-31ade1b30762 -k8s.io/apimachinery/pkg/api/errors k8s.io/apimachinery/pkg/apis/meta/v1 +k8s.io/apimachinery/pkg/apis/meta/v1/unstructured +k8s.io/apimachinery/pkg/labels +k8s.io/apimachinery/pkg/runtime/schema +k8s.io/apimachinery/pkg/api/errors k8s.io/apimachinery/pkg/util/duration k8s.io/apimachinery/pkg/api/resource k8s.io/apimachinery/pkg/apis/meta/v1beta1 @@ -404,39 +407,36 @@ k8s.io/apimachinery/pkg/util/sets k8s.io/apimachinery/pkg/api/meta k8s.io/apimachinery/pkg/util/runtime k8s.io/apimachinery/pkg/fields -k8s.io/apimachinery/pkg/labels k8s.io/apimachinery/pkg/watch -k8s.io/apimachinery/pkg/runtime/schema -k8s.io/apimachinery/pkg/util/validation/field k8s.io/apimachinery/pkg/conversion k8s.io/apimachinery/pkg/selection k8s.io/apimachinery/pkg/types k8s.io/apimachinery/pkg/util/intstr k8s.io/apimachinery/pkg/util/json +k8s.io/apimachinery/pkg/util/validation +k8s.io/apimachinery/pkg/runtime/serializer +k8s.io/apimachinery/pkg/runtime/serializer/json +k8s.io/apimachinery/pkg/runtime/serializer/streaming +k8s.io/apimachinery/pkg/runtime/serializer/versioning +k8s.io/apimachinery/pkg/util/validation/field +k8s.io/apimachinery/pkg/util/net k8s.io/apimachinery/pkg/util/strategicpatch k8s.io/apimachinery/pkg/util/errors -k8s.io/apimachinery/pkg/util/validation k8s.io/apimachinery/pkg/api/equality k8s.io/apimachinery/pkg/api/validation k8s.io/apimachinery/pkg/conversion/queryparams k8s.io/apimachinery/pkg/util/naming -k8s.io/apimachinery/pkg/util/net k8s.io/apimachinery/pkg/util/yaml -k8s.io/apimachinery/pkg/runtime/serializer -k8s.io/apimachinery/pkg/runtime/serializer/streaming k8s.io/apimachinery/third_party/forked/golang/reflect -k8s.io/apimachinery/pkg/apis/meta/v1/unstructured +k8s.io/apimachinery/pkg/runtime/serializer/protobuf +k8s.io/apimachinery/pkg/runtime/serializer/recognizer +k8s.io/apimachinery/pkg/util/framer +k8s.io/apimachinery/pkg/version +k8s.io/apimachinery/pkg/util/clock k8s.io/apimachinery/pkg/util/mergepatch k8s.io/apimachinery/third_party/forked/golang/json -k8s.io/apimachinery/pkg/runtime/serializer/json -k8s.io/apimachinery/pkg/runtime/serializer/versioning k8s.io/apimachinery/pkg/apis/meta/v1/validation k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme -k8s.io/apimachinery/pkg/version -k8s.io/apimachinery/pkg/runtime/serializer/protobuf -k8s.io/apimachinery/pkg/runtime/serializer/recognizer -k8s.io/apimachinery/pkg/util/clock -k8s.io/apimachinery/pkg/util/framer k8s.io/apimachinery/pkg/util/cache k8s.io/apimachinery/pkg/util/diff k8s.io/apimachinery/pkg/util/wait @@ -455,36 +455,36 @@ k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/hash k8s.io/cli-runtime/pkg/kustomize/k8sdeps/transformer/patch k8s.io/cli-runtime/pkg/kustomize/k8sdeps/kv # k8s.io/client-go v0.0.0-20191016110837-54936ba21026 +k8s.io/client-go/dynamic +k8s.io/client-go/rest k8s.io/client-go/testing k8s.io/client-go/tools/clientcmd k8s.io/client-go/plugin/pkg/client/auth/gcp k8s.io/client-go/plugin/pkg/client/auth/oidc -k8s.io/client-go/rest -k8s.io/client-go/tools/auth -k8s.io/client-go/tools/clientcmd/api -k8s.io/client-go/tools/clientcmd/api/latest -k8s.io/client-go/util/homedir -k8s.io/client-go/discovery -k8s.io/client-go/discovery/cached/disk -k8s.io/client-go/restmapper -k8s.io/client-go/util/jsonpath k8s.io/client-go/pkg/version k8s.io/client-go/plugin/pkg/client/auth/exec k8s.io/client-go/rest/watch +k8s.io/client-go/tools/clientcmd/api k8s.io/client-go/tools/metrics k8s.io/client-go/transport k8s.io/client-go/util/cert k8s.io/client-go/util/flowcontrol -k8s.io/client-go/tools/clientcmd/api/v1 -k8s.io/client-go/dynamic -k8s.io/client-go/tools/cache -k8s.io/client-go/kubernetes/scheme -k8s.io/client-go/third_party/forked/golang/template +k8s.io/client-go/tools/auth +k8s.io/client-go/tools/clientcmd/api/latest +k8s.io/client-go/util/homedir +k8s.io/client-go/discovery +k8s.io/client-go/discovery/cached/disk +k8s.io/client-go/restmapper +k8s.io/client-go/util/jsonpath k8s.io/client-go/pkg/apis/clientauthentication k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1 k8s.io/client-go/pkg/apis/clientauthentication/v1beta1 k8s.io/client-go/util/connrotation k8s.io/client-go/util/keyutil +k8s.io/client-go/tools/clientcmd/api/v1 +k8s.io/client-go/tools/cache +k8s.io/client-go/kubernetes/scheme +k8s.io/client-go/third_party/forked/golang/template k8s.io/client-go/tools/pager k8s.io/client-go/util/retry k8s.io/client-go/informers