mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-28 14:07:14 +00:00
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
This commit is contained in:
commit
c7e0e50495
@ -23,6 +23,7 @@ go_test(
|
|||||||
"//pkg/api:go_default_library",
|
"//pkg/api:go_default_library",
|
||||||
"//pkg/api/testapi:go_default_library",
|
"//pkg/api/testapi:go_default_library",
|
||||||
"//pkg/api/v1:go_default_library",
|
"//pkg/api/v1:go_default_library",
|
||||||
|
"//pkg/apis/apps:go_default_library",
|
||||||
"//pkg/apis/autoscaling:go_default_library",
|
"//pkg/apis/autoscaling:go_default_library",
|
||||||
"//pkg/apis/batch:go_default_library",
|
"//pkg/apis/batch:go_default_library",
|
||||||
"//pkg/apis/extensions: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/settings"
|
||||||
"k8s.io/kubernetes/pkg/apis/storage"
|
"k8s.io/kubernetes/pkg/apis/storage"
|
||||||
storageutil "k8s.io/kubernetes/pkg/apis/storage/util"
|
storageutil "k8s.io/kubernetes/pkg/apis/storage/util"
|
||||||
|
"k8s.io/kubernetes/pkg/controller"
|
||||||
"k8s.io/kubernetes/pkg/printers"
|
"k8s.io/kubernetes/pkg/printers"
|
||||||
"k8s.io/kubernetes/pkg/util/node"
|
"k8s.io/kubernetes/pkg/util/node"
|
||||||
)
|
)
|
||||||
@ -103,6 +104,7 @@ var (
|
|||||||
networkPolicyColumns = []string{"NAME", "POD-SELECTOR", "AGE"}
|
networkPolicyColumns = []string{"NAME", "POD-SELECTOR", "AGE"}
|
||||||
certificateSigningRequestColumns = []string{"NAME", "AGE", "REQUESTOR", "CONDITION"}
|
certificateSigningRequestColumns = []string{"NAME", "AGE", "REQUESTOR", "CONDITION"}
|
||||||
podPresetColumns = []string{"NAME", "AGE"}
|
podPresetColumns = []string{"NAME", "AGE"}
|
||||||
|
controllerRevisionColumns = []string{"NAME", "CONTROLLER", "REVISION", "AGE"}
|
||||||
)
|
)
|
||||||
|
|
||||||
func printPod(pod *api.Pod, w io.Writer, options printers.PrintOptions) error {
|
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, printPodPreset)
|
||||||
h.Handler(podPresetColumns, nil, printPodPresetList)
|
h.Handler(podPresetColumns, nil, printPodPresetList)
|
||||||
h.Handler(statusColumns, nil, printStatus)
|
h.Handler(statusColumns, nil, printStatus)
|
||||||
|
h.Handler(controllerRevisionColumns, nil, printControllerRevision)
|
||||||
|
h.Handler(controllerRevisionColumns, nil, printControllerRevisionList)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Pass ports=nil for all ports.
|
// Pass ports=nil for all ports.
|
||||||
@ -2000,3 +2004,39 @@ func formatEventSource(es api.EventSource) string {
|
|||||||
}
|
}
|
||||||
return strings.Join(EventSourceString, ", ")
|
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"
|
||||||
"k8s.io/kubernetes/pkg/api/testapi"
|
"k8s.io/kubernetes/pkg/api/testapi"
|
||||||
"k8s.io/kubernetes/pkg/api/v1"
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
|
"k8s.io/kubernetes/pkg/apis/apps"
|
||||||
"k8s.io/kubernetes/pkg/apis/autoscaling"
|
"k8s.io/kubernetes/pkg/apis/autoscaling"
|
||||||
"k8s.io/kubernetes/pkg/apis/batch"
|
"k8s.io/kubernetes/pkg/apis/batch"
|
||||||
"k8s.io/kubernetes/pkg/apis/extensions"
|
"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
Block a user