diff --git a/contrib/completions/bash/kubectl b/contrib/completions/bash/kubectl index f7bc2ac465b..5bf6c2c46e6 100644 --- a/contrib/completions/bash/kubectl +++ b/contrib/completions/bash/kubectl @@ -273,6 +273,15 @@ _kubectl_describe() must_have_one_flag=() must_have_one_noun=() + must_have_one_noun+=("limitrange") + must_have_one_noun+=("minion") + must_have_one_noun+=("node") + must_have_one_noun+=("persistentvolume") + must_have_one_noun+=("persistentvolumeclaim") + must_have_one_noun+=("pod") + must_have_one_noun+=("replicationcontroller") + must_have_one_noun+=("resourcequota") + must_have_one_noun+=("service") } _kubectl_create() diff --git a/pkg/kubectl/cmd/describe.go b/pkg/kubectl/cmd/describe.go index fcb2f24714e..0b19931332c 100644 --- a/pkg/kubectl/cmd/describe.go +++ b/pkg/kubectl/cmd/describe.go @@ -22,6 +22,7 @@ import ( "github.com/spf13/cobra" + "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl" cmdutil "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/cmd/util" "github.com/GoogleCloudPlatform/kubernetes/pkg/kubectl/resource" ) @@ -38,6 +39,7 @@ given resource.`, err := RunDescribe(f, out, cmd, args) cmdutil.CheckErr(err) }, + ValidArgs: kubectl.DescribableResources(), } return cmd } diff --git a/pkg/kubectl/describe.go b/pkg/kubectl/describe.go index b613b7776ab..60fd22adb58 100644 --- a/pkg/kubectl/describe.go +++ b/pkg/kubectl/describe.go @@ -58,26 +58,38 @@ func (e ErrNoDescriber) Error() string { return fmt.Sprintf("no describer has been defined for %v", e.Types) } +func describerMap(c *client.Client) map[string]Describer { + m := map[string]Describer{ + "Pod": &PodDescriber{c}, + "ReplicationController": &ReplicationControllerDescriber{c}, + "Service": &ServiceDescriber{c}, + "Minion": &NodeDescriber{c}, + "Node": &NodeDescriber{c}, + "LimitRange": &LimitRangeDescriber{c}, + "ResourceQuota": &ResourceQuotaDescriber{c}, + "PersistentVolume": &PersistentVolumeDescriber{c}, + "PersistentVolumeClaim": &PersistentVolumeClaimDescriber{c}, + } + return m +} + +// List of all resource types we can describe +func DescribableResources() []string { + keys := make([]string, 0) + + for k := range describerMap(nil) { + resource := strings.ToLower(k) + keys = append(keys, resource) + } + return keys +} + // Describer returns the default describe functions for each of the standard // Kubernetes types. func DescriberFor(kind string, c *client.Client) (Describer, bool) { - switch kind { - case "Pod": - return &PodDescriber{c}, true - case "ReplicationController": - return &ReplicationControllerDescriber{c}, true - case "Service": - return &ServiceDescriber{c}, true - case "PersistentVolume": - return &PersistentVolumeDescriber{c}, true - case "PersistentVolumeClaim": - return &PersistentVolumeClaimDescriber{c}, true - case "Minion", "Node": - return &NodeDescriber{c}, true - case "LimitRange": - return &LimitRangeDescriber{c}, true - case "ResourceQuota": - return &ResourceQuotaDescriber{c}, true + f, ok := describerMap(c)[kind] + if ok { + return f, true } return nil, false }