Merge pull request #46022 from xilabao/add-rolebinding-to-describe-command

Automatic merge from submit-queue

add rolebinding/clusterrolebinding to describe.go

**What this PR does / why we need it**:

```
./cluster/kubectl.sh describe clusterrolebinding system:kube-dns
Name:		system:kube-dns
Labels:		kubernetes.io/bootstrapping=rbac-defaults
Annotations:	rbac.authorization.kubernetes.io/autoupdate=true
Role:
  Kind:	ClusterRole
  Name:	system:kube-dns
Subjects:
  Kind			Name		Namespace
  ----			----		---------
  ServiceAccount	kube-dns	kube-system
```

**Which issue this PR fixes**: 

**Special notes for your reviewer**:

**Release note**:

```release-note
NONE
```
This commit is contained in:
Kubernetes Submit Queue 2017-05-22 19:59:20 -07:00 committed by GitHub
commit e823e60bbf

View File

@ -59,6 +59,7 @@ import (
"k8s.io/kubernetes/pkg/apis/extensions"
versionedextension "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
"k8s.io/kubernetes/pkg/apis/policy"
"k8s.io/kubernetes/pkg/apis/rbac"
"k8s.io/kubernetes/pkg/apis/storage"
storageutil "k8s.io/kubernetes/pkg/apis/storage/util"
versionedclientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
@ -143,6 +144,8 @@ func describerMap(c clientset.Interface) map[schema.GroupKind]printers.Describer
certificates.Kind("CertificateSigningRequest"): &CertificateSigningRequestDescriber{c},
storage.Kind("StorageClass"): &StorageClassDescriber{c},
policy.Kind("PodDisruptionBudget"): &PodDisruptionBudgetDescriber{c},
rbac.Kind("RoleBinding"): &RoleBindingDescriber{c},
rbac.Kind("ClusterRoleBinding"): &ClusterRoleBindingDescriber{c},
}
return m
@ -2110,6 +2113,70 @@ func describeServiceAccount(serviceAccount *api.ServiceAccount, tokens []api.Sec
})
}
// RoleBindingDescriber generates information about a node.
type RoleBindingDescriber struct {
clientset.Interface
}
func (d *RoleBindingDescriber) Describe(namespace, name string, describerSettings printers.DescriberSettings) (string, error) {
binding, err := d.Rbac().RoleBindings(namespace).Get(name, metav1.GetOptions{})
if err != nil {
return "", err
}
return tabbedString(func(out io.Writer) error {
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", binding.Name)
printLabelsMultiline(w, "Labels", binding.Labels)
printAnnotationsMultiline(w, "Annotations", binding.Annotations)
w.Write(LEVEL_0, "Role:\n")
w.Write(LEVEL_1, "Kind:\t%s\n", binding.RoleRef.Kind)
w.Write(LEVEL_1, "Name:\t%s\n", binding.RoleRef.Name)
w.Write(LEVEL_0, "Subjects:\n")
w.Write(LEVEL_1, "Kind\tName\tNamespace\n")
w.Write(LEVEL_1, "----\t----\t---------\n")
for _, s := range binding.Subjects {
w.Write(LEVEL_1, "%s\t%s\t%s\n", s.Kind, s.Name, s.Namespace)
}
return nil
})
}
// ClusterRoleBindingDescriber generates information about a node.
type ClusterRoleBindingDescriber struct {
clientset.Interface
}
func (d *ClusterRoleBindingDescriber) Describe(namespace, name string, describerSettings printers.DescriberSettings) (string, error) {
binding, err := d.Rbac().ClusterRoleBindings().Get(name, metav1.GetOptions{})
if err != nil {
return "", err
}
return tabbedString(func(out io.Writer) error {
w := NewPrefixWriter(out)
w.Write(LEVEL_0, "Name:\t%s\n", binding.Name)
printLabelsMultiline(w, "Labels", binding.Labels)
printAnnotationsMultiline(w, "Annotations", binding.Annotations)
w.Write(LEVEL_0, "Role:\n")
w.Write(LEVEL_1, "Kind:\t%s\n", binding.RoleRef.Kind)
w.Write(LEVEL_1, "Name:\t%s\n", binding.RoleRef.Name)
w.Write(LEVEL_0, "Subjects:\n")
w.Write(LEVEL_1, "Kind\tName\tNamespace\n")
w.Write(LEVEL_1, "----\t----\t---------\n")
for _, s := range binding.Subjects {
w.Write(LEVEL_1, "%s\t%s\t%s\n", s.Kind, s.Name, s.Namespace)
}
return nil
})
}
// NodeDescriber generates information about a node.
type NodeDescriber struct {
clientset.Interface