Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
k3s
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
k3s
Commits
19434e1b
Commit
19434e1b
authored
Jun 01, 2016
by
Sylwester Brzeczkowski
Committed by
Sylwester Brzeczkowski
Jul 07, 2016
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
24133 fix: --no-headers works with custom columns now
parent
acda24ae
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
46 additions
and
24 deletions
+46
-24
clusterinfo_dump.go
pkg/kubectl/cmd/clusterinfo_dump.go
+4
-4
convert.go
pkg/kubectl/cmd/convert.go
+1
-1
printing.go
pkg/kubectl/cmd/util/printing.go
+2
-2
custom_column_printer.go
pkg/kubectl/custom_column_printer.go
+13
-9
custom_column_printer_test.go
pkg/kubectl/custom_column_printer_test.go
+20
-2
resource_printer.go
pkg/kubectl/resource_printer.go
+2
-2
resource_printer_test.go
pkg/kubectl/resource_printer_test.go
+4
-4
No files found.
pkg/kubectl/cmd/clusterinfo_dump.go
View file @
19434e1b
...
@@ -60,13 +60,13 @@ based on namespace and pod name.
...
@@ -60,13 +60,13 @@ based on namespace and pod name.
dumpExample
=
`# Dump current cluster state to stdout
dumpExample
=
`# Dump current cluster state to stdout
kubectl cluster-info dump
kubectl cluster-info dump
# Dump current cluster state to /path/to/cluster-state
# Dump current cluster state to /path/to/cluster-state
kubectl cluster-info dump --output-directory=/path/to/cluster-state
kubectl cluster-info dump --output-directory=/path/to/cluster-state
# Dump all namespaces to stdout
# Dump all namespaces to stdout
kubectl cluster-info dump --all-namespaces
kubectl cluster-info dump --all-namespaces
# Dump a set of namespaces to /path/to/cluster-state
# Dump a set of namespaces to /path/to/cluster-state
kubectl cluster-info dump --namespaces default,kube-system --output-directory=/path/to/cluster-state`
kubectl cluster-info dump --namespaces default,kube-system --output-directory=/path/to/cluster-state`
)
)
...
@@ -91,7 +91,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out
...
@@ -91,7 +91,7 @@ func dumpClusterInfo(f *cmdutil.Factory, cmd *cobra.Command, args []string, out
if
c
,
err
=
f
.
Client
();
err
!=
nil
{
if
c
,
err
=
f
.
Client
();
err
!=
nil
{
return
err
return
err
}
}
printer
,
_
,
err
:=
kubectl
.
GetPrinter
(
"json"
,
""
)
printer
,
_
,
err
:=
kubectl
.
GetPrinter
(
"json"
,
""
,
false
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
...
...
pkg/kubectl/cmd/convert.go
View file @
19434e1b
...
@@ -150,7 +150,7 @@ func (o *ConvertOptions) Complete(f *cmdutil.Factory, out io.Writer, cmd *cobra.
...
@@ -150,7 +150,7 @@ func (o *ConvertOptions) Complete(f *cmdutil.Factory, out io.Writer, cmd *cobra.
}
}
}
}
o
.
encoder
=
f
.
JSONEncoder
()
o
.
encoder
=
f
.
JSONEncoder
()
o
.
printer
,
_
,
err
=
kubectl
.
GetPrinter
(
outputFormat
,
templateFile
)
o
.
printer
,
_
,
err
=
kubectl
.
GetPrinter
(
outputFormat
,
templateFile
,
false
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
...
...
pkg/kubectl/cmd/util/printing.go
View file @
19434e1b
...
@@ -52,7 +52,7 @@ func AddOutputFlags(cmd *cobra.Command) {
...
@@ -52,7 +52,7 @@ func AddOutputFlags(cmd *cobra.Command) {
// AddNoHeadersFlags adds no-headers flags to a command.
// AddNoHeadersFlags adds no-headers flags to a command.
func
AddNoHeadersFlags
(
cmd
*
cobra
.
Command
)
{
func
AddNoHeadersFlags
(
cmd
*
cobra
.
Command
)
{
cmd
.
Flags
()
.
Bool
(
"no-headers"
,
false
,
"When using the default o
utpu
t, don't print headers."
)
cmd
.
Flags
()
.
Bool
(
"no-headers"
,
false
,
"When using the default o
r custom-column output forma
t, don't print headers."
)
}
}
// PrintSuccess prints message after finishing mutating operations
// PrintSuccess prints message after finishing mutating operations
...
@@ -121,7 +121,7 @@ func PrinterForCommand(cmd *cobra.Command) (kubectl.ResourcePrinter, bool, error
...
@@ -121,7 +121,7 @@ func PrinterForCommand(cmd *cobra.Command) (kubectl.ResourcePrinter, bool, error
}
}
}
}
printer
,
generic
,
err
:=
kubectl
.
GetPrinter
(
outputFormat
,
templateFile
)
printer
,
generic
,
err
:=
kubectl
.
GetPrinter
(
outputFormat
,
templateFile
,
GetFlagBool
(
cmd
,
"no-headers"
)
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
generic
,
err
return
nil
,
generic
,
err
}
}
...
...
pkg/kubectl/custom_column_printer.go
View file @
19434e1b
...
@@ -73,7 +73,7 @@ func massageJSONPath(pathExpression string) (string, error) {
...
@@ -73,7 +73,7 @@ func massageJSONPath(pathExpression string) (string, error) {
//
//
// NAME API_VERSION
// NAME API_VERSION
// foo bar
// foo bar
func
NewCustomColumnsPrinterFromSpec
(
spec
string
,
decoder
runtime
.
Decoder
)
(
*
CustomColumnsPrinter
,
error
)
{
func
NewCustomColumnsPrinterFromSpec
(
spec
string
,
decoder
runtime
.
Decoder
,
noHeaders
bool
)
(
*
CustomColumnsPrinter
,
error
)
{
if
len
(
spec
)
==
0
{
if
len
(
spec
)
==
0
{
return
nil
,
fmt
.
Errorf
(
"custom-columns format specified but no custom columns given"
)
return
nil
,
fmt
.
Errorf
(
"custom-columns format specified but no custom columns given"
)
}
}
...
@@ -90,7 +90,7 @@ func NewCustomColumnsPrinterFromSpec(spec string, decoder runtime.Decoder) (*Cus
...
@@ -90,7 +90,7 @@ func NewCustomColumnsPrinterFromSpec(spec string, decoder runtime.Decoder) (*Cus
}
}
columns
[
ix
]
=
Column
{
Header
:
colSpec
[
0
],
FieldSpec
:
spec
}
columns
[
ix
]
=
Column
{
Header
:
colSpec
[
0
],
FieldSpec
:
spec
}
}
}
return
&
CustomColumnsPrinter
{
Columns
:
columns
,
Decoder
:
decoder
},
nil
return
&
CustomColumnsPrinter
{
Columns
:
columns
,
Decoder
:
decoder
,
NoHeaders
:
noHeaders
},
nil
}
}
func
splitOnWhitespace
(
line
string
)
[]
string
{
func
splitOnWhitespace
(
line
string
)
[]
string
{
...
@@ -135,7 +135,7 @@ func NewCustomColumnsPrinterFromTemplate(templateReader io.Reader, decoder runti
...
@@ -135,7 +135,7 @@ func NewCustomColumnsPrinterFromTemplate(templateReader io.Reader, decoder runti
FieldSpec
:
spec
,
FieldSpec
:
spec
,
}
}
}
}
return
&
CustomColumnsPrinter
{
Columns
:
columns
,
Decoder
:
decoder
},
nil
return
&
CustomColumnsPrinter
{
Columns
:
columns
,
Decoder
:
decoder
,
NoHeaders
:
false
},
nil
}
}
// Column represents a user specified column
// Column represents a user specified column
...
@@ -150,17 +150,21 @@ type Column struct {
...
@@ -150,17 +150,21 @@ type Column struct {
// CustomColumnPrinter is a printer that knows how to print arbitrary columns
// CustomColumnPrinter is a printer that knows how to print arbitrary columns
// of data from templates specified in the `Columns` array
// of data from templates specified in the `Columns` array
type
CustomColumnsPrinter
struct
{
type
CustomColumnsPrinter
struct
{
Columns
[]
Column
Columns
[]
Column
Decoder
runtime
.
Decoder
Decoder
runtime
.
Decoder
NoHeaders
bool
}
}
func
(
s
*
CustomColumnsPrinter
)
PrintObj
(
obj
runtime
.
Object
,
out
io
.
Writer
)
error
{
func
(
s
*
CustomColumnsPrinter
)
PrintObj
(
obj
runtime
.
Object
,
out
io
.
Writer
)
error
{
w
:=
tabwriter
.
NewWriter
(
out
,
columnwidth
,
tabwidth
,
padding
,
padding_character
,
flags
)
w
:=
tabwriter
.
NewWriter
(
out
,
columnwidth
,
tabwidth
,
padding
,
padding_character
,
flags
)
headers
:=
make
([]
string
,
len
(
s
.
Columns
))
for
ix
:=
range
s
.
Columns
{
if
!
s
.
NoHeaders
{
headers
[
ix
]
=
s
.
Columns
[
ix
]
.
Header
headers
:=
make
([]
string
,
len
(
s
.
Columns
))
for
ix
:=
range
s
.
Columns
{
headers
[
ix
]
=
s
.
Columns
[
ix
]
.
Header
}
fmt
.
Fprintln
(
w
,
strings
.
Join
(
headers
,
"
\t
"
))
}
}
fmt
.
Fprintln
(
w
,
strings
.
Join
(
headers
,
"
\t
"
))
parsers
:=
make
([]
*
jsonpath
.
JSONPath
,
len
(
s
.
Columns
))
parsers
:=
make
([]
*
jsonpath
.
JSONPath
,
len
(
s
.
Columns
))
for
ix
:=
range
s
.
Columns
{
for
ix
:=
range
s
.
Columns
{
parsers
[
ix
]
=
jsonpath
.
New
(
fmt
.
Sprintf
(
"column%d"
,
ix
))
parsers
[
ix
]
=
jsonpath
.
New
(
fmt
.
Sprintf
(
"column%d"
,
ix
))
...
...
pkg/kubectl/custom_column_printer_test.go
View file @
19434e1b
...
@@ -19,6 +19,7 @@ package kubectl
...
@@ -19,6 +19,7 @@ package kubectl
import
(
import
(
"bytes"
"bytes"
"reflect"
"reflect"
"strings"
"testing"
"testing"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api"
...
@@ -67,6 +68,7 @@ func TestNewColumnPrinterFromSpec(t *testing.T) {
...
@@ -67,6 +68,7 @@ func TestNewColumnPrinterFromSpec(t *testing.T) {
expectedColumns
[]
Column
expectedColumns
[]
Column
expectErr
bool
expectErr
bool
name
string
name
string
noHeaders
bool
}{
}{
{
{
spec
:
""
,
spec
:
""
,
...
@@ -102,9 +104,14 @@ func TestNewColumnPrinterFromSpec(t *testing.T) {
...
@@ -102,9 +104,14 @@ func TestNewColumnPrinterFromSpec(t *testing.T) {
},
},
},
},
},
},
{
spec
:
"API_VERSION:apiVersion"
,
name
:
"no-headers"
,
noHeaders
:
true
,
},
}
}
for
_
,
test
:=
range
tests
{
for
_
,
test
:=
range
tests
{
printer
,
err
:=
NewCustomColumnsPrinterFromSpec
(
test
.
spec
,
api
.
Codecs
.
UniversalDecoder
())
printer
,
err
:=
NewCustomColumnsPrinterFromSpec
(
test
.
spec
,
api
.
Codecs
.
UniversalDecoder
()
,
test
.
noHeaders
)
if
test
.
expectErr
{
if
test
.
expectErr
{
if
err
==
nil
{
if
err
==
nil
{
t
.
Errorf
(
"[%s] unexpected non-error"
,
test
.
name
)
t
.
Errorf
(
"[%s] unexpected non-error"
,
test
.
name
)
...
@@ -115,8 +122,19 @@ func TestNewColumnPrinterFromSpec(t *testing.T) {
...
@@ -115,8 +122,19 @@ func TestNewColumnPrinterFromSpec(t *testing.T) {
t
.
Errorf
(
"[%s] unexpected error: %v"
,
test
.
name
,
err
)
t
.
Errorf
(
"[%s] unexpected error: %v"
,
test
.
name
,
err
)
continue
continue
}
}
if
test
.
noHeaders
{
buffer
:=
&
bytes
.
Buffer
{}
if
!
reflect
.
DeepEqual
(
test
.
expectedColumns
,
printer
.
Columns
)
{
printer
.
PrintObj
(
&
api
.
Pod
{},
buffer
)
if
err
!=
nil
{
t
.
Fatalf
(
"An error occurred printing Pod: %#v"
,
err
)
}
if
contains
(
strings
.
Fields
(
buffer
.
String
()),
"API_VERSION"
)
{
t
.
Errorf
(
"unexpected header API_VERSION"
)
}
}
else
if
!
reflect
.
DeepEqual
(
test
.
expectedColumns
,
printer
.
Columns
)
{
t
.
Errorf
(
"[%s]
\n
expected:
\n
%v
\n
saw:
\n
%v
\n
"
,
test
.
name
,
test
.
expectedColumns
,
printer
.
Columns
)
t
.
Errorf
(
"[%s]
\n
expected:
\n
%v
\n
saw:
\n
%v
\n
"
,
test
.
name
,
test
.
expectedColumns
,
printer
.
Columns
)
}
}
...
...
pkg/kubectl/resource_printer.go
View file @
19434e1b
...
@@ -62,7 +62,7 @@ const (
...
@@ -62,7 +62,7 @@ const (
// is agnostic to schema versions, so you must send arguments to PrintObj in the
// is agnostic to schema versions, so you must send arguments to PrintObj in the
// version you wish them to be shown using a VersionedPrinter (typically when
// version you wish them to be shown using a VersionedPrinter (typically when
// generic is true).
// generic is true).
func
GetPrinter
(
format
,
formatArgument
string
)
(
ResourcePrinter
,
bool
,
error
)
{
func
GetPrinter
(
format
,
formatArgument
string
,
noHeaders
bool
)
(
ResourcePrinter
,
bool
,
error
)
{
var
printer
ResourcePrinter
var
printer
ResourcePrinter
switch
format
{
switch
format
{
case
"json"
:
case
"json"
:
...
@@ -119,7 +119,7 @@ func GetPrinter(format, formatArgument string) (ResourcePrinter, bool, error) {
...
@@ -119,7 +119,7 @@ func GetPrinter(format, formatArgument string) (ResourcePrinter, bool, error) {
}
}
case
"custom-columns"
:
case
"custom-columns"
:
var
err
error
var
err
error
if
printer
,
err
=
NewCustomColumnsPrinterFromSpec
(
formatArgument
,
api
.
Codecs
.
UniversalDecoder
());
err
!=
nil
{
if
printer
,
err
=
NewCustomColumnsPrinterFromSpec
(
formatArgument
,
api
.
Codecs
.
UniversalDecoder
()
,
noHeaders
);
err
!=
nil
{
return
nil
,
false
,
err
return
nil
,
false
,
err
}
}
case
"custom-columns-file"
:
case
"custom-columns-file"
:
...
...
pkg/kubectl/resource_printer_test.go
View file @
19434e1b
...
@@ -75,7 +75,7 @@ func TestVersionedPrinter(t *testing.T) {
...
@@ -75,7 +75,7 @@ func TestVersionedPrinter(t *testing.T) {
}
}
func
TestPrintDefault
(
t
*
testing
.
T
)
{
func
TestPrintDefault
(
t
*
testing
.
T
)
{
printer
,
found
,
err
:=
GetPrinter
(
""
,
""
)
printer
,
found
,
err
:=
GetPrinter
(
""
,
""
,
false
)
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatalf
(
"unexpected error: %#v"
,
err
)
t
.
Fatalf
(
"unexpected error: %#v"
,
err
)
}
}
...
@@ -129,7 +129,7 @@ func TestPrinter(t *testing.T) {
...
@@ -129,7 +129,7 @@ func TestPrinter(t *testing.T) {
}
}
for
_
,
test
:=
range
printerTests
{
for
_
,
test
:=
range
printerTests
{
buf
:=
bytes
.
NewBuffer
([]
byte
{})
buf
:=
bytes
.
NewBuffer
([]
byte
{})
printer
,
found
,
err
:=
GetPrinter
(
test
.
Format
,
test
.
FormatArgument
)
printer
,
found
,
err
:=
GetPrinter
(
test
.
Format
,
test
.
FormatArgument
,
false
)
if
err
!=
nil
||
!
found
{
if
err
!=
nil
||
!
found
{
t
.
Errorf
(
"in %s, unexpected error: %#v"
,
test
.
Name
,
err
)
t
.
Errorf
(
"in %s, unexpected error: %#v"
,
test
.
Name
,
err
)
}
}
...
@@ -156,7 +156,7 @@ func TestBadPrinter(t *testing.T) {
...
@@ -156,7 +156,7 @@ func TestBadPrinter(t *testing.T) {
{
"bad jsonpath"
,
"jsonpath"
,
"{.Name"
,
fmt
.
Errorf
(
"error parsing jsonpath {.Name, unclosed action
\n
"
)},
{
"bad jsonpath"
,
"jsonpath"
,
"{.Name"
,
fmt
.
Errorf
(
"error parsing jsonpath {.Name, unclosed action
\n
"
)},
}
}
for
_
,
test
:=
range
badPrinterTests
{
for
_
,
test
:=
range
badPrinterTests
{
_
,
_
,
err
:=
GetPrinter
(
test
.
Format
,
test
.
FormatArgument
)
_
,
_
,
err
:=
GetPrinter
(
test
.
Format
,
test
.
FormatArgument
,
false
)
if
err
==
nil
||
err
.
Error
()
!=
test
.
Error
.
Error
()
{
if
err
==
nil
||
err
.
Error
()
!=
test
.
Error
.
Error
()
{
t
.
Errorf
(
"in %s, expect %s, got %s"
,
test
.
Name
,
test
.
Error
,
err
)
t
.
Errorf
(
"in %s, expect %s, got %s"
,
test
.
Name
,
test
.
Error
,
err
)
}
}
...
@@ -333,7 +333,7 @@ func TestNamePrinter(t *testing.T) {
...
@@ -333,7 +333,7 @@ func TestNamePrinter(t *testing.T) {
},
},
"pod/foo
\n
pod/bar
\n
"
},
"pod/foo
\n
pod/bar
\n
"
},
}
}
printer
,
_
,
_
:=
GetPrinter
(
"name"
,
""
)
printer
,
_
,
_
:=
GetPrinter
(
"name"
,
""
,
false
)
for
name
,
item
:=
range
tests
{
for
name
,
item
:=
range
tests
{
buff
:=
&
bytes
.
Buffer
{}
buff
:=
&
bytes
.
Buffer
{}
err
:=
printer
.
PrintObj
(
item
.
obj
,
buff
)
err
:=
printer
.
PrintObj
(
item
.
obj
,
buff
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment