diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD index 267bccc4aa9..f64115e77ea 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/BUILD @@ -16,6 +16,7 @@ go_test( "helpers_test.go", "labels_test.go", "micro_time_test.go", + "options_test.go", "time_test.go", "types_test.go", ], @@ -25,6 +26,7 @@ go_test( "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer/json:go_default_library", + "//vendor/github.com/google/gofuzz:go_default_library", "//vendor/sigs.k8s.io/yaml:go_default_library", ], ) diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/options_test.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/options_test.go new file mode 100644 index 00000000000..3367a57f07a --- /dev/null +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/options_test.go @@ -0,0 +1,62 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1 + +import ( + "encoding/json" + "fmt" + "reflect" + "testing" + + fuzz "github.com/google/gofuzz" +) + +func TestPatchOptionsIsSuperSetOfUpdateOptions(t *testing.T) { + f := fuzz.New() + for i := 0; i < 1000; i++ { + t.Run(fmt.Sprintf("Run %d/1000", i), func(t *testing.T) { + update := UpdateOptions{} + f.Fuzz(&update) + + b, err := json.Marshal(update) + if err != nil { + t.Fatalf("failed to marshal UpdateOptions (%v): %v", err, update) + } + patch := PatchOptions{} + err = json.Unmarshal(b, &patch) + if err != nil { + t.Fatalf("failed to unmarshal UpdateOptions into PatchOptions: %v", err) + } + + b, err = json.Marshal(patch) + if err != nil { + t.Fatalf("failed to marshal PatchOptions (%v): %v", err, patch) + } + got := UpdateOptions{} + err = json.Unmarshal(b, &got) + if err != nil { + t.Fatalf("failed to unmarshal UpdateOptions into UpdateOptions: %v", err) + } + + if !reflect.DeepEqual(update, got) { + t.Fatalf(`UpdateOptions -> PatchOptions -> UpdateOptions round-trip failed: +got: %v +want: %v`, got, update) + } + }) + } +} diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go index 76c6a425c2e..e8d94c15435 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go @@ -508,6 +508,7 @@ type CreateOptions struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // PatchOptions may be provided when patching an API object. +// PatchOptions is meant to be a superset of UpdateOptions. type PatchOptions struct { TypeMeta `json:",inline"` @@ -529,6 +530,7 @@ type PatchOptions struct { // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object // UpdateOptions may be provided when updating an API object. +// All fields in UpdateOptions should also be present in PatchOptions. type UpdateOptions struct { TypeMeta `json:",inline"`