mirror of https://github.com/k3s-io/k3s
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-maintainerspull/6/head
commit
c7e0e50495
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue