diff --git a/hack/make-rules/test-cmd-util.sh b/hack/make-rules/test-cmd-util.sh index 92c2998fee1..a46f07b84a4 100755 --- a/hack/make-rules/test-cmd-util.sh +++ b/hack/make-rules/test-cmd-util.sh @@ -3004,6 +3004,16 @@ run_rs_tests() { # Cleanup services kubectl delete service frontend{,-2} "${kube_flags[@]}" + # Test set commands + # Pre-condition: frontend replica set exists at generation 1 + kube::test::get_object_assert 'rs frontend' "{{${generation_field}}}" '1' + kubectl set image rs/frontend "${kube_flags[@]}" *=gcr.io/google-containers/pause:test-cmd + kube::test::get_object_assert 'rs frontend' "{{${generation_field}}}" '2' + kubectl set env rs/frontend "${kube_flags[@]}" foo=bar + kube::test::get_object_assert 'rs frontend' "{{${generation_field}}}" '3' + kubectl set resources rs/frontend "${kube_flags[@]}" --limits=cpu=200m,memory=512Mi + kube::test::get_object_assert 'rs frontend' "{{${generation_field}}}" '4' + ### Delete replica set with id # Pre-condition: frontend replica set exists kube::test::get_object_assert rs "{{range.items}}{{$id_field}}:{{end}}" 'frontend:' @@ -3083,6 +3093,14 @@ run_daemonset_tests() { kubectl apply -f hack/testdata/rollingupdate-daemonset.yaml "${kube_flags[@]}" # Template Generation should stay 1 kube::test::get_object_assert 'daemonsets bind' "{{${template_generation_field}}}" '1' + # Test set commands + kubectl set image daemonsets/bind "${kube_flags[@]}" *=gcr.io/google-containers/pause:test-cmd + kube::test::get_object_assert 'daemonsets bind' "{{${template_generation_field}}}" '2' + kubectl set env daemonsets/bind "${kube_flags[@]}" foo=bar + kube::test::get_object_assert 'daemonsets bind' "{{${template_generation_field}}}" '3' + kubectl set resources daemonsets/bind "${kube_flags[@]}" --limits=cpu=200m,memory=512Mi + kube::test::get_object_assert 'daemonsets bind' "{{${template_generation_field}}}" '4' + # Clean up kubectl delete -f hack/testdata/rollingupdate-daemonset.yaml "${kube_flags[@]}" @@ -4374,6 +4392,7 @@ runTests() { change_cause_annotation='.*kubernetes.io/change-cause.*' pdb_min_available=".spec.minAvailable" pdb_max_unavailable=".spec.maxUnavailable" + generation_field=".metadata.generation" template_generation_field=".spec.templateGeneration" container_len="(len .spec.template.spec.containers)" image_field0="(index .spec.template.spec.containers 0).image" diff --git a/pkg/kubectl/cmd/set/helper.go b/pkg/kubectl/cmd/set/helper.go index e0be8d82afc..eabbb974b17 100644 --- a/pkg/kubectl/cmd/set/helper.go +++ b/pkg/kubectl/cmd/set/helper.go @@ -126,7 +126,9 @@ type patchFn func(*resource.Info) ([]byte, error) // the changes in the object. Encoder must be able to encode the info into the appropriate destination type. // This function returns whether the mutation function made any change in the original object. func CalculatePatch(patch *Patch, encoder runtime.Encoder, mutateFn patchFn) bool { - patch.Before, patch.Err = runtime.Encode(encoder, patch.Info.Object) + versionedEncoder := api.Codecs.EncoderForVersion(encoder, patch.Info.Mapping.GroupVersionKind.GroupVersion()) + + patch.Before, patch.Err = runtime.Encode(versionedEncoder, patch.Info.Object) patch.After, patch.Err = mutateFn(patch.Info) if patch.Err != nil { diff --git a/pkg/kubectl/cmd/set/set_env.go b/pkg/kubectl/cmd/set/set_env.go index 05b16d731c8..c4d2a309b11 100644 --- a/pkg/kubectl/cmd/set/set_env.go +++ b/pkg/kubectl/cmd/set/set_env.go @@ -381,7 +381,9 @@ func (o *EnvOptions) RunEnv(f cmdutil.Factory) error { }) if err == nil { - return runtime.Encode(o.Encoder, info.Object) + // TODO: switch UpdatePodSpecForObject to work on v1.PodSpec, use info.VersionedObject, and avoid conversion completely + versionedEncoder := api.Codecs.EncoderForVersion(o.Encoder, info.Mapping.GroupVersionKind.GroupVersion()) + return runtime.Encode(versionedEncoder, info.Object) } return nil, err }) diff --git a/pkg/kubectl/cmd/set/set_image.go b/pkg/kubectl/cmd/set/set_image.go index 9386d3f5d76..d366d74049c 100644 --- a/pkg/kubectl/cmd/set/set_image.go +++ b/pkg/kubectl/cmd/set/set_image.go @@ -225,7 +225,9 @@ func (o *ImageOptions) Run() error { return nil }) if transformed && err == nil { - return runtime.Encode(o.Encoder, info.Object) + // TODO: switch UpdatePodSpecForObject to work on v1.PodSpec, use info.VersionedObject, and avoid conversion completely + versionedEncoder := api.Codecs.EncoderForVersion(o.Encoder, info.Mapping.GroupVersionKind.GroupVersion()) + return runtime.Encode(versionedEncoder, info.Object) } return nil, err }) diff --git a/pkg/kubectl/cmd/set/set_resources.go b/pkg/kubectl/cmd/set/set_resources.go index 8fcfd34362a..7ee0f99ec61 100644 --- a/pkg/kubectl/cmd/set/set_resources.go +++ b/pkg/kubectl/cmd/set/set_resources.go @@ -216,7 +216,9 @@ func (o *ResourcesOptions) Run() error { return nil }) if transformed && err == nil { - return runtime.Encode(o.Encoder, info.Object) + // TODO: switch UpdatePodSpecForObject to work on v1.PodSpec, use info.VersionedObject, and avoid conversion completely + versionedEncoder := api.Codecs.EncoderForVersion(o.Encoder, info.Mapping.GroupVersionKind.GroupVersion()) + return runtime.Encode(versionedEncoder, info.Object) } return nil, err }) diff --git a/pkg/kubectl/cmd/set/set_subject.go b/pkg/kubectl/cmd/set/set_subject.go index 349b7772752..a9120654cce 100644 --- a/pkg/kubectl/cmd/set/set_subject.go +++ b/pkg/kubectl/cmd/set/set_subject.go @@ -28,6 +28,7 @@ import ( "k8s.io/apimachinery/pkg/types" utilerrors "k8s.io/apimachinery/pkg/util/errors" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/rbac" "k8s.io/kubernetes/pkg/kubectl/cmd/templates" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" @@ -218,7 +219,9 @@ func (o *SubjectOptions) Run(f cmdutil.Factory, fn updateSubjects) error { transformed, err := updateSubjectForObject(info.Object, subjects, fn) if transformed && err == nil { - return runtime.Encode(o.Encoder, info.Object) + // TODO: switch UpdatePodSpecForObject to work on v1.PodSpec, use info.VersionedObject, and avoid conversion completely + versionedEncoder := api.Codecs.EncoderForVersion(o.Encoder, info.Mapping.GroupVersionKind.GroupVersion()) + return runtime.Encode(versionedEncoder, info.Object) } return nil, err })