@@ -23,6 +23,7 @@ import (
2323 "github.com/renstrom/dedent"
2424 "github.com/spf13/cobra"
2525
26+ "github.com/golang/glog"
2627 "k8s.io/kubernetes/pkg/api/meta"
2728 "k8s.io/kubernetes/pkg/kubectl"
2829 cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
@@ -156,6 +157,8 @@ func RunGet(f *cmdutil.Factory, out io.Writer, errOut io.Writer, cmd *cobra.Comm
156157 showKind := cmdutil .GetFlagBool (cmd , "show-kind" )
157158 mapper , typer := f .Object ()
158159 printAll := false
160+ filterFuncs := f .DefaultResourceFilterFunc ()
161+ filterOpts := f .DefaultResourceFilterOptions (cmd , allNamespaces )
159162
160163 cmdNamespace , enforceNamespace , err := f .DefaultNamespace ()
161164 if err != nil {
@@ -239,11 +242,13 @@ func RunGet(f *cmdutil.Factory, out io.Writer, errOut io.Writer, cmd *cobra.Comm
239242 }
240243
241244 // print the current object
245+ filteredResourceCount := 0
242246 if ! isWatchOnly {
243247 if err := printer .PrintObj (obj , out ); err != nil {
244248 return fmt .Errorf ("unable to output the provided object: %v" , err )
245249 }
246- printer .AfterPrint (errOut , mapping .Resource )
250+ filteredResourceCount ++
251+ cmdutil .PrintFilterCount (filteredResourceCount , mapping .Resource , errOut , filterOpts )
247252 }
248253
249254 // print watched changes
@@ -253,6 +258,7 @@ func RunGet(f *cmdutil.Factory, out io.Writer, errOut io.Writer, cmd *cobra.Comm
253258 }
254259
255260 first := true
261+ filteredResourceCount = 0
256262 kubectl .WatchLoop (w , func (e watch.Event ) error {
257263 if ! isList && first {
258264 // drop the initial watch event in the single resource case
@@ -261,7 +267,8 @@ func RunGet(f *cmdutil.Factory, out io.Writer, errOut io.Writer, cmd *cobra.Comm
261267 }
262268 err := printer .PrintObj (e .Object , out )
263269 if err == nil {
264- printer .AfterPrint (errOut , mapping .Resource )
270+ filteredResourceCount ++
271+ cmdutil .PrintFilterCount (filteredResourceCount , mapping .Resource , errOut , filterOpts )
265272 }
266273 return err
267274 })
@@ -320,10 +327,36 @@ func RunGet(f *cmdutil.Factory, out io.Writer, errOut io.Writer, cmd *cobra.Comm
320327 return err
321328 }
322329
323- if err := printer .PrintObj (obj , out ); err != nil {
324- allErrs = append (allErrs , err )
330+ isList := meta .IsListType (obj )
331+ if isList {
332+ filteredResourceCount , items , errs := cmdutil .FilterResourceList (obj , filterFuncs , filterOpts )
333+ if errs != nil {
334+ return errs
335+ }
336+ filteredObj , err := cmdutil .ObjectListToVersionedObject (items , version )
337+ if err != nil {
338+ return err
339+ }
340+ if err := printer .PrintObj (filteredObj , out ); err != nil {
341+ allErrs = append (allErrs , err )
342+ }
343+
344+ cmdutil .PrintFilterCount (filteredResourceCount , res , errOut , filterOpts )
345+ return utilerrors .NewAggregate (allErrs )
325346 }
326- printer .AfterPrint (errOut , res )
347+
348+ filteredResourceCount := 0
349+ if isFiltered , err := filterFuncs .Filter (obj , filterOpts ); ! isFiltered {
350+ if err != nil {
351+ glog .V (2 ).Infof ("Unable to filter resource: %v" , err )
352+ } else if err := printer .PrintObj (obj , out ); err != nil {
353+ allErrs = append (allErrs , err )
354+ }
355+ } else if isFiltered {
356+ filteredResourceCount ++
357+ }
358+
359+ cmdutil .PrintFilterCount (filteredResourceCount , res , errOut , filterOpts )
327360 return utilerrors .NewAggregate (allErrs )
328361 }
329362
@@ -372,8 +405,9 @@ func RunGet(f *cmdutil.Factory, out io.Writer, errOut io.Writer, cmd *cobra.Comm
372405 printer = nil
373406 var lastMapping * meta.RESTMapping
374407 w := kubectl .GetNewTabWriter (out )
408+ filteredResourceCount := 0
375409
376- if mustPrintWithKinds (objs , infos , sorter , printAll ) {
410+ if cmdutil . MustPrintWithKinds (objs , infos , sorter , printAll ) {
377411 showKind = true
378412 }
379413
@@ -390,7 +424,7 @@ func RunGet(f *cmdutil.Factory, out io.Writer, errOut io.Writer, cmd *cobra.Comm
390424 if printer == nil || lastMapping == nil || mapping == nil || mapping .Resource != lastMapping .Resource {
391425 if printer != nil {
392426 w .Flush ()
393- printer . AfterPrint ( errOut , lastMapping .Resource )
427+ cmdutil . PrintFilterCount ( filteredResourceCount , lastMapping .Resource , errOut , filterOpts )
394428 }
395429 printer , err = f .PrinterForMapping (cmd , mapping , allNamespaces )
396430 if err != nil {
@@ -399,6 +433,16 @@ func RunGet(f *cmdutil.Factory, out io.Writer, errOut io.Writer, cmd *cobra.Comm
399433 }
400434 lastMapping = mapping
401435 }
436+
437+ // filter objects if filter has been defined for current object
438+ if isFiltered , err := filterFuncs .Filter (original , filterOpts ); isFiltered {
439+ if err == nil {
440+ filteredResourceCount ++
441+ continue
442+ }
443+ allErrs = append (allErrs , err )
444+ }
445+
402446 if resourcePrinter , found := printer .(* kubectl.HumanReadablePrinter ); found {
403447 resourceName := resourcePrinter .GetResourceKind ()
404448 if mapping != nil {
@@ -429,37 +473,8 @@ func RunGet(f *cmdutil.Factory, out io.Writer, errOut io.Writer, cmd *cobra.Comm
429473 }
430474 }
431475 w .Flush ()
432- if printer != nil {
433- printer . AfterPrint ( errOut , lastMapping .Resource )
476+ if printer != nil && lastMapping != nil {
477+ cmdutil . PrintFilterCount ( filteredResourceCount , lastMapping .Resource , errOut , filterOpts )
434478 }
435479 return utilerrors .NewAggregate (allErrs )
436480}
437-
438- // mustPrintWithKinds determines if printer is dealing
439- // with multiple resource kinds, in which case it will
440- // return true, indicating resource kind will be
441- // included as part of printer output
442- func mustPrintWithKinds (objs []runtime.Object , infos []* resource.Info , sorter * kubectl.RuntimeSort , printAll bool ) bool {
443- var lastMap * meta.RESTMapping
444-
445- if len (infos ) == 1 && printAll {
446- return true
447- }
448-
449- for ix := range objs {
450- var mapping * meta.RESTMapping
451- if sorter != nil {
452- mapping = infos [sorter .OriginalPosition (ix )].Mapping
453- } else {
454- mapping = infos [ix ].Mapping
455- }
456-
457- // display "kind" only if we have mixed resources
458- if lastMap != nil && mapping .Resource != lastMap .Resource {
459- return true
460- }
461- lastMap = mapping
462- }
463-
464- return false
465- }
0 commit comments