Merge pull request #46655 from janetkuo/controllerrevision-printer

Automatic merge from submit-queue (batch tested with PRs 46661, 46562, 46657, 46655, 46640)

Implement kubectl get controllerrevisions

Before:
```console
$ kubectl get controllerrevisions 
error: unknown type &apps.ControllerRevision{TypeMeta:v1.TypeMeta{Kind:"", APIVersion:""}, ObjectMeta:v1.ObjectMeta{....}...}
```
After:
```console
$ kubectl get controllerrevisions 
NAME          CONTROLLER       REVISION   AGE
foo-2312378   DaemonSet/foo    1          2d
```

**Release note**:

```release-note
```

@kubernetes/sig-apps-pr-reviews @kubernetes/sig-cli-maintainers
pull/6/head
Kubernetes Submit Queue 2017-05-31 01:08:07 -07:00 committed by GitHub
commit c7e0e50495
3 changed files with 119 additions and 0 deletions

View File

@ -23,6 +23,7 @@ go_test(
"//pkg/api:go_default_library",
"//pkg/api/testapi:go_default_library",
"//pkg/api/v1:go_default_library",
"//pkg/apis/apps:go_default_library",
"//pkg/apis/autoscaling:go_default_library",
"//pkg/apis/batch:go_default_library",
"//pkg/apis/extensions:go_default_library",

View File

@ -44,6 +44,7 @@ import (
"k8s.io/kubernetes/pkg/apis/settings"
"k8s.io/kubernetes/pkg/apis/storage"
storageutil "k8s.io/kubernetes/pkg/apis/storage/util"
"k8s.io/kubernetes/pkg/controller"
"k8s.io/kubernetes/pkg/printers"
"k8s.io/kubernetes/pkg/util/node"
)
@ -103,6 +104,7 @@ var (
networkPolicyColumns = []string{"NAME", "POD-SELECTOR", "AGE"}
certificateSigningRequestColumns = []string{"NAME", "AGE", "REQUESTOR", "CONDITION"}
podPresetColumns = []string{"NAME", "AGE"}
controllerRevisionColumns = []string{"NAME", "CONTROLLER", "REVISION", "AGE"}
)
func printPod(pod *api.Pod, w io.Writer, options printers.PrintOptions) error {
@ -201,6 +203,8 @@ func AddHandlers(h *printers.HumanReadablePrinter) {
h.Handler(podPresetColumns, nil, printPodPreset)
h.Handler(podPresetColumns, nil, printPodPresetList)
h.Handler(statusColumns, nil, printStatus)
h.Handler(controllerRevisionColumns, nil, printControllerRevision)
h.Handler(controllerRevisionColumns, nil, printControllerRevisionList)
}
// Pass ports=nil for all ports.
@ -2000,3 +2004,39 @@ func formatEventSource(es api.EventSource) string {
}
return strings.Join(EventSourceString, ", ")
}
func printControllerRevision(history *apps.ControllerRevision, w io.Writer, options printers.PrintOptions) error {
name := printers.FormatResourceName(options.Kind, history.Name, options.WithKind)
if options.WithNamespace {
if _, err := fmt.Fprintf(w, "%s\t", history.Namespace); err != nil {
return err
}
}
controllerRef := controller.GetControllerOf(history)
controllerName := "<none>"
if controllerRef != nil {
withKind := true
controllerName = printers.FormatResourceName(controllerRef.Kind, controllerRef.Name, withKind)
}
revision := history.Revision
age := translateTimestamp(history.CreationTimestamp)
if _, err := fmt.Fprintf(w, "%s\t%s\t%d\t%s", name, controllerName, revision, age); err != nil {
return err
}
if _, err := fmt.Fprint(w, printers.AppendLabels(history.Labels, options.ColumnLabels)); err != nil {
return err
}
_, err := fmt.Fprint(w, printers.AppendAllLabels(options.ShowLabels, history.Labels))
return err
}
func printControllerRevisionList(list *apps.ControllerRevisionList, w io.Writer, options printers.PrintOptions) error {
for _, item := range list.Items {
if err := printControllerRevision(&item, w, options); err != nil {
return err
}
}
return nil
}

View File

@ -40,6 +40,7 @@ import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/apis/apps"
"k8s.io/kubernetes/pkg/apis/autoscaling"
"k8s.io/kubernetes/pkg/apis/batch"
"k8s.io/kubernetes/pkg/apis/extensions"
@ -2257,3 +2258,80 @@ func TestAllowMissingKeys(t *testing.T) {
}
}
}
func TestPrintControllerRevision(t *testing.T) {
tests := []struct {
history apps.ControllerRevision
expect string
}{
{
apps.ControllerRevision{
ObjectMeta: metav1.ObjectMeta{
Name: "test1",
CreationTimestamp: metav1.Time{Time: time.Now().Add(1.9e9)},
OwnerReferences: []metav1.OwnerReference{
{
Controller: boolP(true),
Kind: "DaemonSet",
Name: "foo",
},
},
},
Revision: 1,
},
"test1\tDaemonSet/foo\t1\t0s\n",
},
{
apps.ControllerRevision{
ObjectMeta: metav1.ObjectMeta{
Name: "test2",
CreationTimestamp: metav1.Time{Time: time.Now().Add(1.9e9)},
OwnerReferences: []metav1.OwnerReference{
{
Controller: boolP(false),
Kind: "ABC",
Name: "foo",
},
},
},
Revision: 2,
},
"test2\t<none>\t2\t0s\n",
},
{
apps.ControllerRevision{
ObjectMeta: metav1.ObjectMeta{
Name: "test3",
CreationTimestamp: metav1.Time{Time: time.Now().Add(1.9e9)},
OwnerReferences: []metav1.OwnerReference{},
},
Revision: 3,
},
"test3\t<none>\t3\t0s\n",
},
{
apps.ControllerRevision{
ObjectMeta: metav1.ObjectMeta{
Name: "test4",
CreationTimestamp: metav1.Time{Time: time.Now().Add(1.9e9)},
OwnerReferences: nil,
},
Revision: 4,
},
"test4\t<none>\t4\t0s\n",
},
}
buf := bytes.NewBuffer([]byte{})
for _, test := range tests {
printControllerRevision(&test.history, buf, printers.PrintOptions{})
if buf.String() != test.expect {
t.Fatalf("Expected: %s, but got: %s", test.expect, buf.String())
}
buf.Reset()
}
}
func boolP(b bool) *bool {
return &b
}