add jsonpath to kubectl

This commit is contained in:
Dai Zuozhuo
2015-08-04 16:14:31 +08:00
parent 8a43bd621e
commit b61a905b19
23 changed files with 250 additions and 144 deletions

View File

@@ -21,7 +21,6 @@ import (
"fmt"
"io"
"reflect"
"strconv"
"k8s.io/kubernetes/third_party/golang/template"
)
@@ -214,10 +213,9 @@ func (j *JSONPath) evalIdentifier(input []reflect.Value, node *IdentifierNode) (
func (j *JSONPath) evalArray(input []reflect.Value, node *ArrayNode) ([]reflect.Value, error) {
result := []reflect.Value{}
for _, value := range input {
if value.Kind() == reflect.Interface {
value = reflect.ValueOf(value.Interface())
}
if value.Kind() != reflect.Array && value.Kind() != reflect.Slice {
value, isNil := template.Indirect(value)
if isNil || (value.Kind() != reflect.Array && value.Kind() != reflect.Slice) {
return input, fmt.Errorf("%v is not array or slice", value)
}
params := node.Params
@@ -265,9 +263,11 @@ func (j *JSONPath) evalField(input []reflect.Value, node *FieldNode) ([]reflect.
results := []reflect.Value{}
for _, value := range input {
var result reflect.Value
if value.Kind() == reflect.Interface {
value = reflect.ValueOf(value.Interface())
value, isNil := template.Indirect(value)
if isNil {
continue
}
if value.Kind() == reflect.Struct {
result = value.FieldByName(node.Value)
} else if value.Kind() == reflect.Map {
@@ -287,6 +287,11 @@ func (j *JSONPath) evalField(input []reflect.Value, node *FieldNode) ([]reflect.
func (j *JSONPath) evalWildcard(input []reflect.Value, node *WildcardNode) ([]reflect.Value, error) {
results := []reflect.Value{}
for _, value := range input {
value, isNil := template.Indirect(value)
if isNil {
continue
}
kind := value.Kind()
if kind == reflect.Struct {
for i := 0; i < value.NumField(); i++ {
@@ -310,6 +315,11 @@ func (j *JSONPath) evalRecursive(input []reflect.Value, node *RecursiveNode) ([]
result := []reflect.Value{}
for _, value := range input {
results := []reflect.Value{}
value, isNil := template.Indirect(value)
if isNil {
continue
}
kind := value.Kind()
if kind == reflect.Struct {
for i := 0; i < value.NumField(); i++ {
@@ -340,9 +350,8 @@ func (j *JSONPath) evalRecursive(input []reflect.Value, node *RecursiveNode) ([]
func (j *JSONPath) evalFilter(input []reflect.Value, node *FilterNode) ([]reflect.Value, error) {
results := []reflect.Value{}
for _, value := range input {
if value.Kind() == reflect.Interface {
value = reflect.ValueOf(value.Interface())
}
value, _ = template.Indirect(value)
if value.Kind() != reflect.Array && value.Kind() != reflect.Slice {
return input, fmt.Errorf("%v is not array or slice", value)
}
@@ -407,77 +416,11 @@ func (j *JSONPath) evalFilter(input []reflect.Value, node *FilterNode) ([]reflec
// evalToText translates reflect value to corresponding text
func (j *JSONPath) evalToText(v reflect.Value) ([]byte, error) {
if v.Kind() == reflect.Interface {
v = reflect.ValueOf(v.Interface())
iface, ok := template.PrintableValue(v)
if !ok {
return nil, fmt.Errorf("can't print type %s", v.Type())
}
var buffer bytes.Buffer
switch v.Kind() {
case reflect.Invalid:
//pass
case reflect.Ptr:
text, err := j.evalToText(reflect.Indirect(v))
if err != nil {
return nil, err
}
buffer.Write(text)
case reflect.Bool:
if variable := v.Bool(); variable {
buffer.WriteString("True")
} else {
buffer.WriteString("False")
}
case reflect.Float32:
buffer.WriteString(strconv.FormatFloat(v.Float(), 'f', -1, 32))
case reflect.Float64:
buffer.WriteString(strconv.FormatFloat(v.Float(), 'f', -1, 64))
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
buffer.WriteString(strconv.FormatInt(v.Int(), 10))
case reflect.String:
buffer.WriteString(v.String())
case reflect.Array, reflect.Slice:
buffer.WriteString("[")
for i := 0; i < v.Len(); i++ {
text, err := j.evalToText(v.Index(i))
if err != nil {
return nil, err
}
buffer.Write(text)
if i != v.Len()-1 {
buffer.WriteString(", ")
}
}
buffer.WriteString("]")
case reflect.Struct:
buffer.WriteString("{")
for i := 0; i < v.NumField(); i++ {
text, err := j.evalToText(v.Field(i))
if err != nil {
return nil, err
}
pair := fmt.Sprintf("%s: %s", v.Type().Field(i).Name, text)
buffer.WriteString(pair)
if i != v.NumField()-1 {
buffer.WriteString(", ")
}
}
buffer.WriteString("}")
case reflect.Map:
buffer.WriteString("{")
for i, key := range v.MapKeys() {
text, err := j.evalToText(v.MapIndex(key))
if err != nil {
return nil, err
}
pair := fmt.Sprintf("%s: %s", key, text)
buffer.WriteString(pair)
if i != len(v.MapKeys())-1 {
buffer.WriteString(", ")
}
}
buffer.WriteString("}")
default:
return nil, fmt.Errorf("%v is not printable", v.Kind())
}
fmt.Fprint(&buffer, iface)
return buffer.Bytes(), nil
}