diff --git a/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/get.go b/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/get.go index 0f7ce4398c24..275cde972e0d 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/get.go +++ b/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/get.go @@ -19,7 +19,6 @@ package cmd import ( "fmt" "io" - "os" "github.com/golang/glog" "github.com/spf13/cobra" @@ -121,7 +120,7 @@ func RunGet(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string allNamespaces := cmdutil.GetFlagBool(cmd, "all-namespaces") showKind := cmdutil.GetFlagBool(cmd, "show-kind") mapper, typer := f.Object(cmdutil.GetIncludeThirdPartyAPIs(cmd)) - filterFunc, filterOpts := f.DefaultResourceFilterFunc(f.DefaultResourceFilterOptions(cmd, allNamespaces)) + filterFunc, _ := f.DefaultResourceFilterFunc(f.DefaultResourceFilterOptions(cmd, allNamespaces)) cmdNamespace, enforceNamespace, err := f.DefaultNamespace() if err != nil { @@ -253,11 +252,6 @@ func RunGet(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string allErrs = append(allErrs, err) } - res := "" - if len(infos) > 0 { - res = infos[0].ResourceMapping().Resource - } - for ix := range infos { if isFiltered, err := filterFunc(infos[ix].Object); !isFiltered { if err != nil { @@ -272,7 +266,6 @@ func RunGet(f *cmdutil.Factory, out io.Writer, cmd *cobra.Command, args []string } } - filterOpts.PrintFilterCount(os.Stderr, res) return utilerrors.NewAggregate(allErrs) } diff --git a/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/util/factory.go b/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/util/factory.go index 6f66a5b25166..479c10fd0c8a 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/util/factory.go +++ b/vendor/k8s.io/kubernetes/pkg/kubectl/cmd/util/factory.go @@ -1190,7 +1190,7 @@ func (f *Factory) DefaultResourceFilterOptions(cmd *cobra.Command, withNamespace // DefaultResourceFilterFunc receives PrintOPpts // and returns a default kubectl.FilterFunc -func (f *Factory) DefaultResourceFilterFunc(opts *kubectl.PrintOptions) (kubectl.FilterFunc, kubectl.ResourceFilter) { +func (f *Factory) DefaultResourceFilterFunc(opts *kubectl.PrintOptions) (func(runtime.Object) (bool, error), kubectl.ResourceFilter) { resourceFilter := kubectl.NewResourceFilter(opts) return resourceFilter.Filter, resourceFilter } diff --git a/vendor/k8s.io/kubernetes/pkg/kubectl/resource_filter.go b/vendor/k8s.io/kubernetes/pkg/kubectl/resource_filter.go index bc408989e0ab..6a59cea5bd6a 100644 --- a/vendor/k8s.io/kubernetes/pkg/kubectl/resource_filter.go +++ b/vendor/k8s.io/kubernetes/pkg/kubectl/resource_filter.go @@ -5,29 +5,34 @@ import ( "io" "reflect" - "github.com/golang/glog" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/runtime" ) -type FilterFunc func(runtime.Object) (bool, error) +// FilterFunc is a function that knows how to filter a specific resource kind. +// It receives a generic runtime.Object which must be type-checked by the function. +// Returns a boolean value true if a resource is filtered, or false otherwise. +type FilterFunc func(runtime.Object, PrintOptions) bool +// ResourceFilter filters api resources type ResourceFilter interface { Filter(obj runtime.Object) (bool, error) - AddFilter(interface{}) error + AddFilter(reflect.Type, FilterFunc) error PrintFilterCount(io.Writer, string) error } -// filterOptions implements ResourceFilter +// filterOptions is an implementation of ResourceFilter which contains +// a map of FilterFuncs for given resource types, PrintOptions for a +// resource, and a hiddenObjNum to keep track of the number of filtered resources type filterOptions struct { - filterMap map[reflect.Type]reflect.Value + filterMap map[reflect.Type]FilterFunc options PrintOptions hiddenObjNum int } func NewResourceFilter(opts *PrintOptions) ResourceFilter { filterOpts := &filterOptions{ - filterMap: make(map[reflect.Type]reflect.Value), + filterMap: make(map[reflect.Type]FilterFunc), options: *opts, } @@ -36,66 +41,26 @@ func NewResourceFilter(opts *PrintOptions) ResourceFilter { } func (f *filterOptions) addDefaultHandlers() { - f.AddFilter(filterPods) + f.AddFilter(reflect.TypeOf(&api.Pod{}), filterPods) } -// AddFilter adds a filter handler to a filterOptions instance. -// See validateFilterFunc for required method signature. -// func (f *filterOptions) AddFilter(handlerFn interface{}) error { -// handlerFnValue := reflect.ValueOf(handlerFn) -// if err := f.validateFilterFunc(handlerFnValue); err != nil { -// glog.Errorf("Unable to add filter handler: %v", err) -// return err -// } -// objType := handlerFnValue.Type().In(0) -// f.filterMap[objType] = handlerFnValue - -// return nil -// } -func (f *filterOptions) AddFilter(handlerFn interface{}) error { - handlerFnValue := reflect.ValueOf(handlerFn) - if err := f.validateFilterFunc(handlerFnValue); err != nil { - glog.Errorf("Unable to add filter handler: %v", err) - return err - } - objType := handlerFnValue.Type().In(0) - f.filterMap[objType] = handlerFnValue - - return nil -} - -// validateFilterFunc validates the filter handler signature. -// filterFunc is the function that will be called to filter an object. -// It must be of the following type: -// func filterFunc(object ObjectType, options PrintOptions) error -// where ObjectType is the type of the object that will be filtered. -func (f *filterOptions) validateFilterFunc(filterFunc reflect.Value) error { - if filterFunc.Kind() != reflect.Func { - return fmt.Errorf("invalid filter handler. %#v is not a function", filterFunc) - } - funcType := filterFunc.Type() - if funcType.NumIn() != 2 || funcType.NumOut() != 1 { - return fmt.Errorf("invalid filter handler."+ - "Must accept 2 parameters and return 1 value,"+ - "but instead accepts %v parameter(s) and returns %v value(s)", - funcType.NumIn(), funcType.NumOut()) - } - if funcType.In(1) != reflect.TypeOf((*PrintOptions)(nil)).Elem() || - funcType.Out(0) != reflect.TypeOf((*bool)(nil)).Elem() { - return fmt.Errorf("invalid filter handler. The expected signature is: "+ - "func handler(obj %v, options PrintOptions) error", funcType.In(0)) - } +func (f *filterOptions) AddFilter(objType reflect.Type, handlerFn FilterFunc) error { + f.filterMap[objType] = handlerFn return nil } // filterPods returns true if a pod should be skipped. // defaults to true for terminated pods -func filterPods(pod *api.Pod, options PrintOptions) bool { - reason := string(pod.Status.Phase) - if pod.Status.Reason != "" { - reason = pod.Status.Reason +func filterPods(obj runtime.Object, options PrintOptions) bool { + if pod, ok := obj.(*api.Pod); ok { + reason := string(pod.Status.Phase) + if pod.Status.Reason != "" { + reason = pod.Status.Reason + } + return !options.ShowAll && (reason == string(api.PodSucceeded) || reason == string(api.PodFailed)) } - return !options.ShowAll && (reason == string(api.PodSucceeded) || reason == string(api.PodFailed)) + + return false } // PrintFilterCount prints an info message indicating the amount of resources @@ -116,7 +81,8 @@ func (f *filterOptions) Filter(obj runtime.Object) (bool, error) { t := reflect.TypeOf(obj) if filter, ok := f.filterMap[t]; ok { args := []reflect.Value{reflect.ValueOf(obj), reflect.ValueOf(f.options)} - resultValue := filter.Call(args)[0] + filterFunc := reflect.ValueOf(filter) + resultValue := filterFunc.Call(args)[0] isFiltered := resultValue.Interface().(bool) if isFiltered { f.hiddenObjNum++