diff --git a/go.mod b/go.mod index cef2aa8de..c23603198 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( k8s.io/api v0.0.0-20211029201511-cca52a076791 k8s.io/apimachinery v0.0.0-20211028185107-b255da54548a k8s.io/cli-runtime v0.0.0-20211027005851-fd0a6d95140a - k8s.io/client-go v0.0.0-20211102163907-e57f40404feb + k8s.io/client-go v0.0.0-20211103203847-980663e185ab k8s.io/component-base v0.0.0-20211027004438-bd08cb7812c3 k8s.io/component-helpers v0.0.0-20211027004542-73bcdef827e4 k8s.io/klog/v2 v2.30.0 @@ -50,7 +50,7 @@ replace ( k8s.io/api => k8s.io/api v0.0.0-20211029201511-cca52a076791 k8s.io/apimachinery => k8s.io/apimachinery v0.0.0-20211028185107-b255da54548a k8s.io/cli-runtime => k8s.io/cli-runtime v0.0.0-20211027005851-fd0a6d95140a - k8s.io/client-go => k8s.io/client-go v0.0.0-20211102163907-e57f40404feb + k8s.io/client-go => k8s.io/client-go v0.0.0-20211103203847-980663e185ab k8s.io/code-generator => k8s.io/code-generator v0.0.0-20211102141458-35fbf2653103 k8s.io/component-base => k8s.io/component-base v0.0.0-20211027004438-bd08cb7812c3 k8s.io/component-helpers => k8s.io/component-helpers v0.0.0-20211027004542-73bcdef827e4 diff --git a/go.sum b/go.sum index e8ae1fa92..1c5d586ca 100644 --- a/go.sum +++ b/go.sum @@ -908,8 +908,8 @@ k8s.io/apimachinery v0.0.0-20211028185107-b255da54548a h1:3NA1KMmF0ie/tLSNnA3v1i k8s.io/apimachinery v0.0.0-20211028185107-b255da54548a/go.mod h1:oyH3LcOKLLooQH1NlpHlilzkWxqsiHWETyHgssntcXg= k8s.io/cli-runtime v0.0.0-20211027005851-fd0a6d95140a h1:6N6d0a80cFO2PI8RssKTsofnWWdzr4LBWKKe0t+1kAk= k8s.io/cli-runtime v0.0.0-20211027005851-fd0a6d95140a/go.mod h1:C/9bEqryTALzT3y/AJFeg2TqzudoaRZrdr4Zdoeetn0= -k8s.io/client-go v0.0.0-20211102163907-e57f40404feb h1:UfnbQ/wq4DHX52UrB9VFuy928tusLs7SnNiM2Q2d0Yc= -k8s.io/client-go v0.0.0-20211102163907-e57f40404feb/go.mod h1:AeiEb+/G5s6RA7edXOQ1MJ1JyCAxXwoAYZ7CJhpF0Ow= +k8s.io/client-go v0.0.0-20211103203847-980663e185ab h1:N6JhDz4/SHsR0LnjSTU6ywbLkvg1ZbWWT+V3Wj4k8w0= +k8s.io/client-go v0.0.0-20211103203847-980663e185ab/go.mod h1:AeiEb+/G5s6RA7edXOQ1MJ1JyCAxXwoAYZ7CJhpF0Ow= k8s.io/code-generator v0.0.0-20211102141458-35fbf2653103/go.mod h1:alK4pz5+y/zKXOPBnND3TvXOC/iF2oYTBDynHO1+qlI= k8s.io/component-base v0.0.0-20211027004438-bd08cb7812c3 h1:Hx2Olj7sA4W9r8veeamsvNiiYf5SMTN/N/1uAMQk13c= k8s.io/component-base v0.0.0-20211027004438-bd08cb7812c3/go.mod h1:7xqZFY7A2hOLqh+cOR9jinp+xJVXp6F5I1rOO+kBKJc= diff --git a/pkg/cmd/label/label.go b/pkg/cmd/label/label.go index 9b608ea20..f6fa87e8b 100644 --- a/pkg/cmd/label/label.go +++ b/pkg/cmd/label/label.go @@ -44,6 +44,12 @@ import ( "k8s.io/kubectl/pkg/util/templates" ) +const ( + MsgNotLabeled = "not labeled" + MsgLabeled = "labeled" + MsgUnLabeled = "unlabeled" +) + // LabelOptions have the data required to perform the label operation type LabelOptions struct { // Filename options @@ -390,9 +396,12 @@ func (o *LabelOptions) RunLabel() error { } func updateDataChangeMsg(oldObj []byte, newObj []byte) string { - msg := "not labeled" + msg := MsgNotLabeled if !reflect.DeepEqual(oldObj, newObj) { - msg = "labeled" + msg = MsgLabeled + if len(newObj) < len(oldObj) { + msg = MsgUnLabeled + } } return msg } diff --git a/pkg/cmd/label/label_test.go b/pkg/cmd/label/label_test.go index 63176eeda..a939e8860 100644 --- a/pkg/cmd/label/label_test.go +++ b/pkg/cmd/label/label_test.go @@ -24,10 +24,11 @@ import ( "strings" "testing" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/json" "k8s.io/cli-runtime/pkg/genericclioptions" "k8s.io/cli-runtime/pkg/resource" "k8s.io/client-go/rest/fake" @@ -565,3 +566,143 @@ func TestLabelResourceVersion(t *testing.T) { t.Fatalf("unexpected error: %v", err) } } + +func TestLabelMsg(t *testing.T) { + tests := []struct { + obj runtime.Object + overwrite bool + resourceVersion string + labels map[string]string + remove []string + expectObj runtime.Object + expectMsg string + expectErr bool + }{ + { + obj: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{"a": "b"}, + }, + }, + labels: map[string]string{"a": "b"}, + expectMsg: MsgNotLabeled, + expectErr: true, + }, + { + obj: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{}, + }, + labels: map[string]string{"a": "b"}, + expectObj: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{"a": "b"}, + }, + }, + expectMsg: MsgLabeled, + }, + { + obj: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{"a": "b"}, + }, + }, + labels: map[string]string{"a": "c"}, + overwrite: true, + expectObj: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{"a": "c"}, + }, + }, + expectMsg: MsgLabeled, + }, + { + obj: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{"a": "b"}, + }, + }, + labels: map[string]string{"c": "d"}, + expectObj: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{"a": "b", "c": "d"}, + }, + }, + expectMsg: MsgLabeled, + }, + { + obj: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{"a": "b"}, + }, + }, + labels: map[string]string{"c": "d"}, + resourceVersion: "2", + expectObj: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{"a": "b", "c": "d"}, + ResourceVersion: "2", + }, + }, + expectMsg: MsgLabeled, + }, + { + obj: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{"a": "b"}, + }, + }, + labels: map[string]string{}, + remove: []string{"a"}, + expectObj: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{}, + }, + }, + expectMsg: MsgUnLabeled, + }, + { + obj: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{"a": "b", "c": "d"}, + }, + }, + labels: map[string]string{"e": "f"}, + remove: []string{"a"}, + expectObj: &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "c": "d", + "e": "f", + }, + }, + }, + expectMsg: MsgLabeled, + }, + } + + for _, test := range tests { + oldData, err := json.Marshal(test.obj) + if err != nil { + t.Errorf("unexpected error: %v %v", err, test) + } + + err = labelFunc(test.obj, test.overwrite, test.resourceVersion, test.labels, test.remove) + if test.expectErr && err == nil { + t.Errorf("unexpected non-error: %v", test) + continue + } + if !test.expectErr && err != nil { + t.Errorf("unexpected error: %v %v", err, test) + } + + newObj, err := json.Marshal(test.obj) + if err != nil { + t.Errorf("unexpected error: %v %v", err, test) + } + + dataChangeMsg := updateDataChangeMsg(oldData, newObj) + if dataChangeMsg != test.expectMsg { + t.Errorf("unexpected dataChangeMsg: %v != %v, %v", dataChangeMsg, test.expectMsg, test) + } + } +}