From 58776da6a4a0bb28e194ec6d595f9d5106e8b154 Mon Sep 17 00:00:00 2001 From: Deyuan Deng Date: Fri, 6 Mar 2015 13:04:52 -0500 Subject: [PATCH] Add more information to node describe --- hack/lib/test.sh | 29 +++++++++++++++++++++++++++++ hack/test-cmd.sh | 8 ++++++-- pkg/kubectl/describe.go | 33 ++++++++++++++++++++++----------- 3 files changed, 57 insertions(+), 13 deletions(-) diff --git a/hack/lib/test.sh b/hack/lib/test.sh index c6c6504758e..dd1c2099237 100644 --- a/hack/lib/test.sh +++ b/hack/lib/test.sh @@ -50,3 +50,32 @@ kube::test::get_object_assert() { return 1 fi } + +kube::test::describe_object_assert() { + local resource=$1 + local object=$2 + local matches=${@:3} + + result=$(eval kubectl describe "${kube_flags[@]}" $resource $object) + + for match in ${matches}; do + if [[ ! $(echo "$result" | grep ${match}) ]]; then + echo ${bold}${red} + echo "FAIL!" + echo "Describe $resource $object" + echo " Expected Match: $match" + echo " Not found in:" + echo "$result" + echo ${reset}${red} + caller + echo ${reset} + return 1 + fi + done + + echo -n ${green} + echo "Successful describe $resource $object:" + echo "$result" + echo -n ${reset} + return 0 +} diff --git a/hack/test-cmd.sh b/hack/test-cmd.sh index 19bf90448fe..346b471dd72 100755 --- a/hack/test-cmd.sh +++ b/hack/test-cmd.sh @@ -104,7 +104,7 @@ CTLRMGR_PID=$! kube::util::wait_for_url "http://127.0.0.1:${CTLRMGR_PORT}/healthz" "controller-manager: " kube::util::wait_for_url "http://127.0.0.1:${API_PORT}/api/v1beta1/minions/127.0.0.1" "apiserver(minions): " 0.2 25 -# expose kubectl directly for readability +# Expose kubectl directly for readability PATH="${KUBE_OUTPUT_HOSTBIN}":$PATH kube_api_versions=( @@ -139,7 +139,7 @@ for version in "${kube_api_versions[@]}"; do rc_replicas_field="spec.replicas" fi - # passing no arguments to create is an error + # Passing no arguments to create is an error ! kubectl create ########################### @@ -502,6 +502,8 @@ __EOF__ kube::test::get_object_assert nodes "{{range.items}}{{.$id_field}}:{{end}}" '127.0.0.1:' + kube::test::describe_object_assert nodes "127.0.0.1" "Name:" "Conditions:" "Addresses:" "Capacity:" "Pods:" + ########### # Minions # ########### @@ -513,6 +515,8 @@ __EOF__ # TODO: I should be a MinionList instead of List kube::test::get_object_assert minions '{{.kind}}' 'List' + + kube::test::describe_object_assert minions "127.0.0.1" "Name:" "Conditions:" "Addresses:" "Capacity:" "Pods:" fi kube::test::clear_all diff --git a/pkg/kubectl/describe.go b/pkg/kubectl/describe.go index 1dc4b4e37b7..41b5be643e8 100644 --- a/pkg/kubectl/describe.go +++ b/pkg/kubectl/describe.go @@ -46,7 +46,7 @@ func DescriberFor(kind string, c *client.Client) (Describer, bool) { case "Service": return &ServiceDescriber{c}, true case "Minion", "Node": - return &MinionDescriber{c}, true + return &NodeDescriber{c}, true case "LimitRange": return &LimitRangeDescriber{c}, true case "ResourceQuota": @@ -283,14 +283,14 @@ func (d *ServiceDescriber) Describe(namespace, name string) (string, error) { }) } -// MinionDescriber generates information about a minion. -type MinionDescriber struct { +// NodeDescriber generates information about a node. +type NodeDescriber struct { client.Interface } -func (d *MinionDescriber) Describe(namespace, name string) (string, error) { +func (d *NodeDescriber) Describe(namespace, name string) (string, error) { mc := d.Nodes() - minion, err := mc.Get(name) + node, err := mc.Get(name) if err != nil { return "", err } @@ -307,13 +307,13 @@ func (d *MinionDescriber) Describe(namespace, name string) (string, error) { pods = append(pods, pod) } - events, _ := d.Events(namespace).Search(minion) + events, _ := d.Events(namespace).Search(node) return tabbedString(func(out io.Writer) error { - fmt.Fprintf(out, "Name:\t%s\n", minion.Name) - if len(minion.Status.Conditions) > 0 { + fmt.Fprintf(out, "Name:\t%s\n", node.Name) + if len(node.Status.Conditions) > 0 { fmt.Fprint(out, "Conditions:\n Type\tStatus\tLastProbeTime\tLastTransitionTime\tReason\tMessage\n") - for _, c := range minion.Status.Conditions { + for _, c := range node.Status.Conditions { fmt.Fprintf(out, " %v \t%v \t%s \t%s \t%v \t%v\n", c.Type, c.Status, @@ -323,12 +323,23 @@ func (d *MinionDescriber) Describe(namespace, name string) (string, error) { c.Message) } } - if len(minion.Spec.Capacity) > 0 { + var addresses []string + for _, address := range node.Status.Addresses { + addresses = append(addresses, address.Address) + } + fmt.Fprintf(out, "Addresses:\t%s\n", strings.Join(addresses, ",")) + if len(node.Spec.Capacity) > 0 { fmt.Fprintf(out, "Capacity:\n") - for resource, value := range minion.Spec.Capacity { + for resource, value := range node.Spec.Capacity { fmt.Fprintf(out, " %s:\t%s\n", resource, value.String()) } } + if len(node.Spec.PodCIDR) > 0 { + fmt.Fprintf(out, "PodCIDR:\t%s\n", node.Spec.PodCIDR) + } + if len(node.Spec.ExternalID) > 0 { + fmt.Fprintf(out, "ExternalID:\t%s\n", node.Spec.ExternalID) + } fmt.Fprintf(out, "Pods:\t(%d in total)\n", len(pods)) for _, pod := range pods { if pod.Status.Host != name {