From 71970d6475f6570d933fa9f22be2ebc20a9ace6f Mon Sep 17 00:00:00 2001 From: Antoine Pelisse Date: Wed, 1 Aug 2018 10:35:43 -0700 Subject: [PATCH] dry-run: Update DynamicClient to pass Create/Update options --- pkg/controller/garbagecollector/operations.go | 4 +- pkg/kubectl/cmd/create/create.go | 3 +- pkg/kubectl/cmd/expose.go | 3 +- .../test/integration/basic_test.go | 16 +++--- .../test/integration/finalization_test.go | 4 +- .../test/integration/fixtures/resources.go | 2 +- .../test/integration/helpers.go | 2 +- .../test/integration/subresources_test.go | 32 ++++++------ .../test/integration/table_test.go | 2 +- .../test/integration/validation_test.go | 8 +-- .../client-go/deprecated-dynamic/client.go | 6 +-- .../k8s.io/client-go/dynamic/client_test.go | 6 +-- .../k8s.io/client-go/dynamic/fake/simple.go | 8 +-- .../src/k8s.io/client-go/dynamic/interface.go | 8 +-- .../src/k8s.io/client-go/dynamic/simple.go | 49 +++++++++++++++---- test/e2e/apimachinery/aggregator.go | 2 +- test/e2e/apimachinery/crd_watch.go | 2 +- test/e2e/apimachinery/garbage_collector.go | 8 +-- test/e2e/apimachinery/webhook.go | 4 +- .../etcd/etcd_storage_path_test.go | 2 +- .../garbage_collector_test.go | 10 ++-- test/integration/master/crd_test.go | 4 +- 22 files changed, 108 insertions(+), 77 deletions(-) diff --git a/pkg/controller/garbagecollector/operations.go b/pkg/controller/garbagecollector/operations.go index 9f0145869c1..ec9a096bffe 100644 --- a/pkg/controller/garbagecollector/operations.go +++ b/pkg/controller/garbagecollector/operations.go @@ -73,7 +73,7 @@ func (gc *GarbageCollector) updateObject(item objectReference, obj *unstructured if err != nil { return nil, err } - return gc.dynamicClient.Resource(resource).Namespace(resourceDefaultNamespace(namespaced, item.Namespace)).Update(obj) + return gc.dynamicClient.Resource(resource).Namespace(resourceDefaultNamespace(namespaced, item.Namespace)).Update(obj, metav1.UpdateOptions{}) } func (gc *GarbageCollector) patchObject(item objectReference, patch []byte, pt types.PatchType) (*unstructured.Unstructured, error) { @@ -81,7 +81,7 @@ func (gc *GarbageCollector) patchObject(item objectReference, patch []byte, pt t if err != nil { return nil, err } - return gc.dynamicClient.Resource(resource).Namespace(resourceDefaultNamespace(namespaced, item.Namespace)).Patch(item.Name, pt, patch) + return gc.dynamicClient.Resource(resource).Namespace(resourceDefaultNamespace(namespaced, item.Namespace)).Patch(item.Name, pt, patch, metav1.UpdateOptions{}) } // TODO: Using Patch when strategicmerge supports deleting an entry from a diff --git a/pkg/kubectl/cmd/create/create.go b/pkg/kubectl/cmd/create/create.go index e72b6d0796a..2b218002982 100644 --- a/pkg/kubectl/cmd/create/create.go +++ b/pkg/kubectl/cmd/create/create.go @@ -28,6 +28,7 @@ import ( "github.com/spf13/cobra" "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" kruntime "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -434,7 +435,7 @@ func (o *CreateSubcommandOptions) Run() error { if mapping.Scope.Name() == meta.RESTScopeNameRoot { o.Namespace = "" } - actualObject, err := o.DynamicClient.Resource(mapping.Resource).Namespace(o.Namespace).Create(asUnstructured) + actualObject, err := o.DynamicClient.Resource(mapping.Resource).Namespace(o.Namespace).Create(asUnstructured, metav1.CreateOptions{}) if err != nil { return err } diff --git a/pkg/kubectl/cmd/expose.go b/pkg/kubectl/cmd/expose.go index 13d4655e7b1..38d7a26fb19 100644 --- a/pkg/kubectl/cmd/expose.go +++ b/pkg/kubectl/cmd/expose.go @@ -24,6 +24,7 @@ import ( "github.com/spf13/cobra" "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructuredscheme" "k8s.io/apimachinery/pkg/runtime" @@ -341,7 +342,7 @@ func (o *ExposeServiceOptions) RunExpose(cmd *cobra.Command, args []string) erro return err } // Serialize the object with the annotation applied. - actualObject, err := o.DynamicClient.Resource(objMapping.Resource).Namespace(o.Namespace).Create(asUnstructured) + actualObject, err := o.DynamicClient.Resource(objMapping.Resource).Namespace(o.Namespace).Create(asUnstructured, metav1.CreateOptions{}) if err != nil { return err } diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/basic_test.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/basic_test.go index 7d0ae0c057e..5ae99f7f48a 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/basic_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/basic_test.go @@ -213,7 +213,7 @@ func testSimpleCRUD(t *testing.T, ns string, noxuDefinition *apiextensionsv1beta } gottenNoxuInstance.Object["updated"] = version2 - updatedNoxuInstance, err := noxuResourceClient2.Update(gottenNoxuInstance) + updatedNoxuInstance, err := noxuResourceClient2.Update(gottenNoxuInstance, metav1.UpdateOptions{}) if disabledVersions[version2] { if !errors.IsNotFound(err) { t.Errorf("expected the update operation fail with NotFound for disabled version %s, got error: %v", version2, err) @@ -580,7 +580,7 @@ func TestSelfLink(t *testing.T) { noxuNamespacedResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) noxuInstanceToCreate := fixtures.NewNoxuInstance(ns, "foo") - createdNoxuInstance, err := noxuNamespacedResourceClient.Create(noxuInstanceToCreate) + createdNoxuInstance, err := noxuNamespacedResourceClient.Create(noxuInstanceToCreate, metav1.CreateOptions{}) if err != nil { t.Fatal(err) } @@ -599,7 +599,7 @@ func TestSelfLink(t *testing.T) { curletResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, curletDefinition) curletInstanceToCreate := fixtures.NewCurletInstance(ns, "foo") - createdCurletInstance, err := curletResourceClient.Create(curletInstanceToCreate) + createdCurletInstance, err := curletResourceClient.Create(curletInstanceToCreate, metav1.CreateOptions{}) if err != nil { t.Fatal(err) } @@ -626,7 +626,7 @@ func TestPreserveInt(t *testing.T) { noxuNamespacedResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) noxuInstanceToCreate := fixtures.NewNoxuInstance(ns, "foo") - createdNoxuInstance, err := noxuNamespacedResourceClient.Create(noxuInstanceToCreate) + createdNoxuInstance, err := noxuNamespacedResourceClient.Create(noxuInstanceToCreate, metav1.CreateOptions{}) if err != nil { t.Fatal(err) } @@ -668,25 +668,25 @@ func TestPatch(t *testing.T) { noxuNamespacedResourceClient := newNamespacedCustomResourceClient(ns, dynamicClient, noxuDefinition) noxuInstanceToCreate := fixtures.NewNoxuInstance(ns, "foo") - createdNoxuInstance, err := noxuNamespacedResourceClient.Create(noxuInstanceToCreate) + createdNoxuInstance, err := noxuNamespacedResourceClient.Create(noxuInstanceToCreate, metav1.CreateOptions{}) if err != nil { t.Fatal(err) } patch := []byte(`{"num": {"num2":999}}`) - createdNoxuInstance, err = noxuNamespacedResourceClient.Patch("foo", types.MergePatchType, patch) + createdNoxuInstance, err = noxuNamespacedResourceClient.Patch("foo", types.MergePatchType, patch, metav1.UpdateOptions{}) if err != nil { t.Fatalf("unexpected error: %v", err) } // a patch with no change - createdNoxuInstance, err = noxuNamespacedResourceClient.Patch("foo", types.MergePatchType, patch) + createdNoxuInstance, err = noxuNamespacedResourceClient.Patch("foo", types.MergePatchType, patch, metav1.UpdateOptions{}) if err != nil { t.Fatalf("unexpected error: %v", err) } // an empty patch - createdNoxuInstance, err = noxuNamespacedResourceClient.Patch("foo", types.MergePatchType, []byte(`{}`)) + createdNoxuInstance, err = noxuNamespacedResourceClient.Patch("foo", types.MergePatchType, []byte(`{}`), metav1.UpdateOptions{}) if err != nil { t.Fatalf("unexpected error: %v", err) } diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/finalization_test.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/finalization_test.go index 8f1bf0a2e71..745aa585416 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/finalization_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/finalization_test.go @@ -76,7 +76,7 @@ func TestFinalization(t *testing.T) { // object will be deleted as part of the finalizer update. for { gottenNoxuInstance.SetFinalizers(nil) - _, err = noxuResourceClient.Update(gottenNoxuInstance) + _, err = noxuResourceClient.Update(gottenNoxuInstance, metav1.UpdateOptions{}) if err == nil { break } @@ -137,7 +137,7 @@ func TestFinalizationAndDeletion(t *testing.T) { // Update the CR to remove the finalizer. for { gottenNoxuInstance.SetFinalizers(nil) - _, err = noxuResourceClient.Update(gottenNoxuInstance) + _, err = noxuResourceClient.Update(gottenNoxuInstance, metav1.UpdateOptions{}) if err == nil { break } diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/fixtures/resources.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/fixtures/resources.go index 49de84a9f3e..9a1f2d84845 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/fixtures/resources.go +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/fixtures/resources.go @@ -313,7 +313,7 @@ func isWatchCachePrimed(crd *apiextensionsv1beta1.CustomResourceDefinition, dyna "spec": map[string]interface{}{}, }, } - createdInstance, err := resourceClient.Create(instance) + createdInstance, err := resourceClient.Create(instance, metav1.CreateOptions{}) if err != nil { return false, err } diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/helpers.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/helpers.go index 5aa231d4551..76344034564 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/helpers.go +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/helpers.go @@ -35,7 +35,7 @@ func instantiateCustomResource(t *testing.T, instanceToCreate *unstructured.Unst } func instantiateVersionedCustomResource(t *testing.T, instanceToCreate *unstructured.Unstructured, client dynamic.ResourceInterface, definition *apiextensionsv1beta1.CustomResourceDefinition, version string) (*unstructured.Unstructured, error) { - createdInstance, err := client.Create(instanceToCreate) + createdInstance, err := client.Create(instanceToCreate, metav1.CreateOptions{}) if err != nil { t.Logf("%#v", createdInstance) return nil, err diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/subresources_test.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/subresources_test.go index 4fd50a5a4b7..5d4397b61ce 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/subresources_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/subresources_test.go @@ -128,7 +128,7 @@ func TestStatusSubresource(t *testing.T) { // UpdateStatus should not update spec. // Check that .spec.num = 10 and .status.num = 20 - updatedStatusInstance, err := noxuResourceClient.UpdateStatus(gottenNoxuInstance) + updatedStatusInstance, err := noxuResourceClient.UpdateStatus(gottenNoxuInstance, metav1.UpdateOptions{}) if err != nil { t.Fatalf("unable to update status: %v", err) } @@ -168,7 +168,7 @@ func TestStatusSubresource(t *testing.T) { // Update should not update status. // Check that .spec.num = 40 and .status.num = 20 - updatedInstance, err := noxuResourceClient.Update(gottenNoxuInstance) + updatedInstance, err := noxuResourceClient.Update(gottenNoxuInstance, metav1.UpdateOptions{}) if err != nil { t.Fatalf("unable to update instance: %v", err) } @@ -247,7 +247,7 @@ func TestScaleSubresource(t *testing.T) { if err != nil { t.Fatalf("unexpected error: %v", err) } - _, err = noxuResourceClient.UpdateStatus(gottenNoxuInstance) + _, err = noxuResourceClient.UpdateStatus(gottenNoxuInstance, metav1.UpdateOptions{}) if err != nil { t.Fatalf("unable to update status: %v", err) } @@ -315,7 +315,7 @@ func TestScaleSubresource(t *testing.T) { if err != nil { t.Fatalf("unexpected error: %v", err) } - _, err = noxuResourceClient.Update(gottenNoxuInstance) + _, err = noxuResourceClient.Update(gottenNoxuInstance, metav1.UpdateOptions{}) if err == nil { t.Fatalf("unexpected non-error: .spec.replicas should be less than 2147483647") } @@ -432,7 +432,7 @@ func TestValidateOnlyStatus(t *testing.T) { if err != nil { t.Fatalf("unexpected error setting .spec.num: %v", err) } - createdNoxuInstance, err = noxuResourceClient.UpdateStatus(createdNoxuInstance) + createdNoxuInstance, err = noxuResourceClient.UpdateStatus(createdNoxuInstance, metav1.UpdateOptions{}) if err != nil { t.Errorf("unexpected error: %v", err) } @@ -442,7 +442,7 @@ func TestValidateOnlyStatus(t *testing.T) { if err != nil { t.Fatalf("unexpected error setting .status.num: %v", err) } - createdNoxuInstance, err = noxuResourceClient.UpdateStatus(createdNoxuInstance) + createdNoxuInstance, err = noxuResourceClient.UpdateStatus(createdNoxuInstance, metav1.UpdateOptions{}) if err == nil { t.Fatal("expected error, but got none") } @@ -575,7 +575,7 @@ func TestGeneration(t *testing.T) { } // UpdateStatus does not increment generation - updatedStatusInstance, err := noxuResourceClient.UpdateStatus(gottenNoxuInstance) + updatedStatusInstance, err := noxuResourceClient.UpdateStatus(gottenNoxuInstance, metav1.UpdateOptions{}) if err != nil { t.Fatalf("unable to update status: %v", err) } @@ -595,7 +595,7 @@ func TestGeneration(t *testing.T) { } // Update increments generation - updatedInstance, err := noxuResourceClient.Update(gottenNoxuInstance) + updatedInstance, err := noxuResourceClient.Update(gottenNoxuInstance, metav1.UpdateOptions{}) if err != nil { t.Fatalf("unable to update instance: %v", err) } @@ -644,7 +644,7 @@ func TestSubresourcePatch(t *testing.T) { } patch := []byte(`{"spec": {"num":999}, "status": {"num":999}}`) - patchedNoxuInstance, err := noxuResourceClient.Patch("foo", types.MergePatchType, patch, "status") + patchedNoxuInstance, err := noxuResourceClient.Patch("foo", types.MergePatchType, patch, metav1.UpdateOptions{}, "status") if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -679,19 +679,19 @@ func TestSubresourcePatch(t *testing.T) { } // no-op patch - _, err = noxuResourceClient.Patch("foo", types.MergePatchType, patch, "status") + _, err = noxuResourceClient.Patch("foo", types.MergePatchType, patch, metav1.UpdateOptions{}, "status") if err != nil { t.Fatalf("unexpected error: %v", err) } // empty patch - _, err = noxuResourceClient.Patch("foo", types.MergePatchType, []byte(`{}`), "status") + _, err = noxuResourceClient.Patch("foo", types.MergePatchType, []byte(`{}`), metav1.UpdateOptions{}, "status") if err != nil { t.Fatalf("unexpected error: %v", err) } patch = []byte(`{"spec": {"replicas":7}, "status": {"replicas":7}}`) - patchedNoxuInstance, err = noxuResourceClient.Patch("foo", types.MergePatchType, patch, "scale") + patchedNoxuInstance, err = noxuResourceClient.Patch("foo", types.MergePatchType, patch, metav1.UpdateOptions{}, "scale") if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -720,24 +720,24 @@ func TestSubresourcePatch(t *testing.T) { } // no-op patch - _, err = noxuResourceClient.Patch("foo", types.MergePatchType, patch, "scale") + _, err = noxuResourceClient.Patch("foo", types.MergePatchType, patch, metav1.UpdateOptions{}, "scale") if err != nil { t.Fatalf("unexpected error: %v", err) } // empty patch - _, err = noxuResourceClient.Patch("foo", types.MergePatchType, []byte(`{}`), "scale") + _, err = noxuResourceClient.Patch("foo", types.MergePatchType, []byte(`{}`), metav1.UpdateOptions{}, "scale") if err != nil { t.Fatalf("unexpected error: %v", err) } // make sure strategic merge patch is not supported for both status and scale - _, err = noxuResourceClient.Patch("foo", types.StrategicMergePatchType, patch, "status") + _, err = noxuResourceClient.Patch("foo", types.StrategicMergePatchType, patch, metav1.UpdateOptions{}, "status") if err == nil { t.Fatalf("unexpected non-error: strategic merge patch is not supported for custom resources") } - _, err = noxuResourceClient.Patch("foo", types.StrategicMergePatchType, patch, "scale") + _, err = noxuResourceClient.Patch("foo", types.StrategicMergePatchType, patch, metav1.UpdateOptions{}, "scale") if err == nil { t.Fatalf("unexpected non-error: strategic merge patch is not supported for custom resources") } diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/table_test.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/table_test.go index c62530c0441..7aab4f4086d 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/table_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/table_test.go @@ -108,7 +108,7 @@ func TestTableGet(t *testing.T) { t.Logf("table crd created: %#v", crd) crClient := newNamespacedCustomResourceClient("", dynamicClient, crd) - foo, err := crClient.Create(newTableInstance("foo")) + foo, err := crClient.Create(newTableInstance("foo"), metav1.CreateOptions{}) if err != nil { t.Fatalf("unable to create noxu instance: %v", err) } diff --git a/staging/src/k8s.io/apiextensions-apiserver/test/integration/validation_test.go b/staging/src/k8s.io/apiextensions-apiserver/test/integration/validation_test.go index 9460eac32cc..37f9d094381 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/test/integration/validation_test.go +++ b/staging/src/k8s.io/apiextensions-apiserver/test/integration/validation_test.go @@ -71,7 +71,7 @@ func TestForProperValidationErrors(t *testing.T) { } for _, tc := range tests { - _, err := noxuResourceClient.Create(tc.instanceFn()) + _, err := noxuResourceClient.Create(tc.instanceFn(), metav1.CreateOptions{}) if err == nil { t.Errorf("%v: expected %v", tc.name, tc.expectedError) continue @@ -225,7 +225,7 @@ func TestCustomResourceUpdateValidation(t *testing.T) { "delta": "hello", } - _, err = noxuResourceClient.Update(gottenNoxuInstance) + _, err = noxuResourceClient.Update(gottenNoxuInstance, metav1.UpdateOptions{}) if err == nil { t.Fatalf("unexpected non-error: alpha and beta should be present while updating %v", gottenNoxuInstance) } @@ -309,7 +309,7 @@ func TestCustomResourceValidationErrors(t *testing.T) { } for _, tc := range tests { - _, err := noxuResourceClient.Create(tc.instanceFn()) + _, err := noxuResourceClient.Create(tc.instanceFn(), metav1.CreateOptions{}) if err == nil { t.Errorf("%v: expected %v", tc.name, tc.expectedError) continue @@ -357,7 +357,7 @@ func TestCRValidationOnCRDUpdate(t *testing.T) { // CR is now accepted err = wait.Poll(500*time.Millisecond, wait.ForeverTestTimeout, func() (bool, error) { - _, err := noxuResourceClient.Create(newNoxuValidationInstance(ns, "foo")) + _, err := noxuResourceClient.Create(newNoxuValidationInstance(ns, "foo"), metav1.CreateOptions{}) if statusError, isStatus := err.(*apierrors.StatusError); isStatus { if strings.Contains(statusError.Error(), "is invalid") { return false, nil diff --git a/staging/src/k8s.io/client-go/deprecated-dynamic/client.go b/staging/src/k8s.io/client-go/deprecated-dynamic/client.go index 0974fe64dea..3b8efffab6b 100644 --- a/staging/src/k8s.io/client-go/deprecated-dynamic/client.go +++ b/staging/src/k8s.io/client-go/deprecated-dynamic/client.go @@ -107,11 +107,11 @@ type oldResourceShimType struct { } func (s oldResourceShimType) Create(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) { - return s.ResourceInterface.Create(obj, s.subresources...) + return s.ResourceInterface.Create(obj, metav1.CreateOptions{}, s.subresources...) } func (s oldResourceShimType) Update(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) { - return s.ResourceInterface.Update(obj, s.subresources...) + return s.ResourceInterface.Update(obj, metav1.UpdateOptions{}, s.subresources...) } func (s oldResourceShimType) Delete(name string, opts *metav1.DeleteOptions) error { @@ -127,5 +127,5 @@ func (s oldResourceShimType) List(opts metav1.ListOptions) (runtime.Object, erro } func (s oldResourceShimType) Patch(name string, pt types.PatchType, data []byte) (*unstructured.Unstructured, error) { - return s.ResourceInterface.Patch(name, pt, data, s.subresources...) + return s.ResourceInterface.Patch(name, pt, data, metav1.UpdateOptions{}, s.subresources...) } diff --git a/staging/src/k8s.io/client-go/dynamic/client_test.go b/staging/src/k8s.io/client-go/dynamic/client_test.go index e8fe938676b..e74cb832a06 100644 --- a/staging/src/k8s.io/client-go/dynamic/client_test.go +++ b/staging/src/k8s.io/client-go/dynamic/client_test.go @@ -404,7 +404,7 @@ func TestCreate(t *testing.T) { } defer srv.Close() - got, err := cl.Resource(resource).Namespace(tc.namespace).Create(tc.obj, tc.subresource...) + got, err := cl.Resource(resource).Namespace(tc.namespace).Create(tc.obj, metav1.CreateOptions{}, tc.subresource...) if err != nil { t.Errorf("unexpected error when creating %q: %v", tc.name, err) continue @@ -481,7 +481,7 @@ func TestUpdate(t *testing.T) { } defer srv.Close() - got, err := cl.Resource(resource).Namespace(tc.namespace).Update(tc.obj, tc.subresource...) + got, err := cl.Resource(resource).Namespace(tc.namespace).Update(tc.obj, metav1.UpdateOptions{}, tc.subresource...) if err != nil { t.Errorf("unexpected error when updating %q: %v", tc.name, err) continue @@ -638,7 +638,7 @@ func TestPatch(t *testing.T) { } defer srv.Close() - got, err := cl.Resource(resource).Namespace(tc.namespace).Patch(tc.name, types.StrategicMergePatchType, tc.patch, tc.subresource...) + got, err := cl.Resource(resource).Namespace(tc.namespace).Patch(tc.name, types.StrategicMergePatchType, tc.patch, metav1.UpdateOptions{}, tc.subresource...) if err != nil { t.Errorf("unexpected error when patching %q: %v", tc.name, err) continue diff --git a/staging/src/k8s.io/client-go/dynamic/fake/simple.go b/staging/src/k8s.io/client-go/dynamic/fake/simple.go index 7be914c958b..24e5c7bfff7 100644 --- a/staging/src/k8s.io/client-go/dynamic/fake/simple.go +++ b/staging/src/k8s.io/client-go/dynamic/fake/simple.go @@ -86,7 +86,7 @@ func (c *dynamicResourceClient) Namespace(ns string) dynamic.ResourceInterface { return &ret } -func (c *dynamicResourceClient) Create(obj *unstructured.Unstructured, subresources ...string) (*unstructured.Unstructured, error) { +func (c *dynamicResourceClient) Create(obj *unstructured.Unstructured, opts metav1.CreateOptions, subresources ...string) (*unstructured.Unstructured, error) { var uncastRet runtime.Object var err error switch { @@ -132,7 +132,7 @@ func (c *dynamicResourceClient) Create(obj *unstructured.Unstructured, subresour return ret, err } -func (c *dynamicResourceClient) Update(obj *unstructured.Unstructured, subresources ...string) (*unstructured.Unstructured, error) { +func (c *dynamicResourceClient) Update(obj *unstructured.Unstructured, opts metav1.UpdateOptions, subresources ...string) (*unstructured.Unstructured, error) { var uncastRet runtime.Object var err error switch { @@ -168,7 +168,7 @@ func (c *dynamicResourceClient) Update(obj *unstructured.Unstructured, subresour return ret, err } -func (c *dynamicResourceClient) UpdateStatus(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) { +func (c *dynamicResourceClient) UpdateStatus(obj *unstructured.Unstructured, opts metav1.UpdateOptions) (*unstructured.Unstructured, error) { var uncastRet runtime.Object var err error switch { @@ -331,7 +331,7 @@ func (c *dynamicResourceClient) Watch(opts metav1.ListOptions) (watch.Interface, panic("math broke") } -func (c *dynamicResourceClient) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (*unstructured.Unstructured, error) { +func (c *dynamicResourceClient) Patch(name string, pt types.PatchType, data []byte, opts metav1.UpdateOptions, subresources ...string) (*unstructured.Unstructured, error) { var uncastRet runtime.Object var err error switch { diff --git a/staging/src/k8s.io/client-go/dynamic/interface.go b/staging/src/k8s.io/client-go/dynamic/interface.go index 3f364f872a7..c457be1780b 100644 --- a/staging/src/k8s.io/client-go/dynamic/interface.go +++ b/staging/src/k8s.io/client-go/dynamic/interface.go @@ -29,15 +29,15 @@ type Interface interface { } type ResourceInterface interface { - Create(obj *unstructured.Unstructured, subresources ...string) (*unstructured.Unstructured, error) - Update(obj *unstructured.Unstructured, subresources ...string) (*unstructured.Unstructured, error) - UpdateStatus(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) + Create(obj *unstructured.Unstructured, options metav1.CreateOptions, subresources ...string) (*unstructured.Unstructured, error) + Update(obj *unstructured.Unstructured, options metav1.UpdateOptions, subresources ...string) (*unstructured.Unstructured, error) + UpdateStatus(obj *unstructured.Unstructured, options metav1.UpdateOptions) (*unstructured.Unstructured, error) Delete(name string, options *metav1.DeleteOptions, subresources ...string) error DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error Get(name string, options metav1.GetOptions, subresources ...string) (*unstructured.Unstructured, error) List(opts metav1.ListOptions) (*unstructured.UnstructuredList, error) Watch(opts metav1.ListOptions) (watch.Interface, error) - Patch(name string, pt types.PatchType, data []byte, subresources ...string) (*unstructured.Unstructured, error) + Patch(name string, pt types.PatchType, data []byte, options metav1.UpdateOptions, subresources ...string) (*unstructured.Unstructured, error) } type NamespaceableResourceInterface interface { diff --git a/staging/src/k8s.io/client-go/dynamic/simple.go b/staging/src/k8s.io/client-go/dynamic/simple.go index 2bc7b50e5c7..9e21cda6e37 100644 --- a/staging/src/k8s.io/client-go/dynamic/simple.go +++ b/staging/src/k8s.io/client-go/dynamic/simple.go @@ -82,7 +82,7 @@ func (c *dynamicResourceClient) Namespace(ns string) ResourceInterface { return &ret } -func (c *dynamicResourceClient) Create(obj *unstructured.Unstructured, subresources ...string) (*unstructured.Unstructured, error) { +func (c *dynamicResourceClient) Create(obj *unstructured.Unstructured, opts metav1.CreateOptions, subresources ...string) (*unstructured.Unstructured, error) { outBytes, err := runtime.Encode(unstructured.UnstructuredJSONScheme, obj) if err != nil { return nil, err @@ -96,7 +96,12 @@ func (c *dynamicResourceClient) Create(obj *unstructured.Unstructured, subresour name = accessor.GetName() } - result := c.client.client.Post().AbsPath(append(c.makeURLSegments(name), subresources...)...).Body(outBytes).Do() + result := c.client.client. + Post(). + AbsPath(append(c.makeURLSegments(name), subresources...)...). + Body(outBytes). + SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1). + Do() if err := result.Error(); err != nil { return nil, err } @@ -112,7 +117,7 @@ func (c *dynamicResourceClient) Create(obj *unstructured.Unstructured, subresour return uncastObj.(*unstructured.Unstructured), nil } -func (c *dynamicResourceClient) Update(obj *unstructured.Unstructured, subresources ...string) (*unstructured.Unstructured, error) { +func (c *dynamicResourceClient) Update(obj *unstructured.Unstructured, opts metav1.UpdateOptions, subresources ...string) (*unstructured.Unstructured, error) { accessor, err := meta.Accessor(obj) if err != nil { return nil, err @@ -122,7 +127,12 @@ func (c *dynamicResourceClient) Update(obj *unstructured.Unstructured, subresour return nil, err } - result := c.client.client.Put().AbsPath(append(c.makeURLSegments(accessor.GetName()), subresources...)...).Body(outBytes).Do() + result := c.client.client. + Put(). + AbsPath(append(c.makeURLSegments(accessor.GetName()), subresources...)...). + Body(outBytes). + SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1). + Do() if err := result.Error(); err != nil { return nil, err } @@ -138,7 +148,7 @@ func (c *dynamicResourceClient) Update(obj *unstructured.Unstructured, subresour return uncastObj.(*unstructured.Unstructured), nil } -func (c *dynamicResourceClient) UpdateStatus(obj *unstructured.Unstructured) (*unstructured.Unstructured, error) { +func (c *dynamicResourceClient) UpdateStatus(obj *unstructured.Unstructured, opts metav1.UpdateOptions) (*unstructured.Unstructured, error) { accessor, err := meta.Accessor(obj) if err != nil { return nil, err @@ -149,7 +159,12 @@ func (c *dynamicResourceClient) UpdateStatus(obj *unstructured.Unstructured) (*u return nil, err } - result := c.client.client.Put().AbsPath(append(c.makeURLSegments(accessor.GetName()), "status")...).Body(outBytes).Do() + result := c.client.client. + Put(). + AbsPath(append(c.makeURLSegments(accessor.GetName()), "status")...). + Body(outBytes). + SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1). + Do() if err := result.Error(); err != nil { return nil, err } @@ -174,7 +189,11 @@ func (c *dynamicResourceClient) Delete(name string, opts *metav1.DeleteOptions, return err } - result := c.client.client.Delete().AbsPath(append(c.makeURLSegments(name), subresources...)...).Body(deleteOptionsByte).Do() + result := c.client.client. + Delete(). + AbsPath(append(c.makeURLSegments(name), subresources...)...). + Body(deleteOptionsByte). + Do() return result.Error() } @@ -187,7 +206,12 @@ func (c *dynamicResourceClient) DeleteCollection(opts *metav1.DeleteOptions, lis return err } - result := c.client.client.Delete().AbsPath(c.makeURLSegments("")...).Body(deleteOptionsByte).SpecificallyVersionedParams(&listOptions, dynamicParameterCodec, versionV1).Do() + result := c.client.client. + Delete(). + AbsPath(c.makeURLSegments("")...). + Body(deleteOptionsByte). + SpecificallyVersionedParams(&listOptions, dynamicParameterCodec, versionV1). + Do() return result.Error() } @@ -259,8 +283,13 @@ func (c *dynamicResourceClient) Watch(opts metav1.ListOptions) (watch.Interface, WatchWithSpecificDecoders(wrappedDecoderFn, unstructured.UnstructuredJSONScheme) } -func (c *dynamicResourceClient) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (*unstructured.Unstructured, error) { - result := c.client.client.Patch(pt).AbsPath(append(c.makeURLSegments(name), subresources...)...).Body(data).Do() +func (c *dynamicResourceClient) Patch(name string, pt types.PatchType, data []byte, opts metav1.UpdateOptions, subresources ...string) (*unstructured.Unstructured, error) { + result := c.client.client. + Patch(pt). + AbsPath(append(c.makeURLSegments(name), subresources...)...). + Body(data). + SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1). + Do() if err := result.Error(); err != nil { return nil, err } diff --git a/test/e2e/apimachinery/aggregator.go b/test/e2e/apimachinery/aggregator.go index 9b08fcbdc1b..63addc8e431 100644 --- a/test/e2e/apimachinery/aggregator.go +++ b/test/e2e/apimachinery/aggregator.go @@ -436,7 +436,7 @@ func TestSampleAPIServer(f *framework.Framework, image string) { unstruct := &unstructuredv1.Unstructured{} err = unstruct.UnmarshalJSON(jsonFlunder) framework.ExpectNoError(err, "unmarshalling test-flunder as unstructured for create using dynamic client") - unstruct, err = dynamicClient.Create(unstruct) + unstruct, err = dynamicClient.Create(unstruct, metav1.CreateOptions{}) framework.ExpectNoError(err, "listing flunders using dynamic client") // kubectl get flunders diff --git a/test/e2e/apimachinery/crd_watch.go b/test/e2e/apimachinery/crd_watch.go index 7ce8507d45d..93339f5980c 100644 --- a/test/e2e/apimachinery/crd_watch.go +++ b/test/e2e/apimachinery/crd_watch.go @@ -125,7 +125,7 @@ func watchCRWithName(crdResourceClient dynamic.ResourceInterface, name string) ( } func instantiateCustomResource(instanceToCreate *unstructured.Unstructured, client dynamic.ResourceInterface, definition *apiextensionsv1beta1.CustomResourceDefinition) (*unstructured.Unstructured, error) { - createdInstance, err := client.Create(instanceToCreate) + createdInstance, err := client.Create(instanceToCreate, metav1.CreateOptions{}) if err != nil { return nil, err } diff --git a/test/e2e/apimachinery/garbage_collector.go b/test/e2e/apimachinery/garbage_collector.go index 8573e72819e..6438133c480 100644 --- a/test/e2e/apimachinery/garbage_collector.go +++ b/test/e2e/apimachinery/garbage_collector.go @@ -935,7 +935,7 @@ var _ = SIGDescribe("Garbage collector", func() { }, }, } - persistedOwner, err := resourceClient.Create(owner) + persistedOwner, err := resourceClient.Create(owner, metav1.CreateOptions{}) if err != nil { framework.Failf("failed to create owner resource %q: %v", ownerName, err) } @@ -960,7 +960,7 @@ var _ = SIGDescribe("Garbage collector", func() { }, }, } - persistedDependent, err := resourceClient.Create(dependent) + persistedDependent, err := resourceClient.Create(dependent, metav1.CreateOptions{}) if err != nil { framework.Failf("failed to create dependent resource %q: %v", dependentName, err) } @@ -1036,7 +1036,7 @@ var _ = SIGDescribe("Garbage collector", func() { }, }, } - persistedOwner, err := resourceClient.Create(owner) + persistedOwner, err := resourceClient.Create(owner, metav1.CreateOptions{}) if err != nil { framework.Failf("failed to create owner resource %q: %v", ownerName, err) } @@ -1061,7 +1061,7 @@ var _ = SIGDescribe("Garbage collector", func() { }, }, } - _, err = resourceClient.Create(dependent) + _, err = resourceClient.Create(dependent, metav1.CreateOptions{}) if err != nil { framework.Failf("failed to create dependent resource %q: %v", dependentName, err) } diff --git a/test/e2e/apimachinery/webhook.go b/test/e2e/apimachinery/webhook.go index d44097f5285..e192bb930c5 100644 --- a/test/e2e/apimachinery/webhook.go +++ b/test/e2e/apimachinery/webhook.go @@ -1100,7 +1100,7 @@ func testCustomResourceWebhook(f *framework.Framework, crd *apiextensionsv1beta1 }, }, } - _, err := customResourceClient.Create(crInstance) + _, err := customResourceClient.Create(crInstance, metav1.CreateOptions{}) Expect(err).NotTo(BeNil()) expectedErrMsg := "the custom resource contains unwanted data" if !strings.Contains(err.Error(), expectedErrMsg) { @@ -1123,7 +1123,7 @@ func testMutatingCustomResourceWebhook(f *framework.Framework, crd *apiextension }, }, } - mutatedCR, err := customResourceClient.Create(cr) + mutatedCR, err := customResourceClient.Create(cr, metav1.CreateOptions{}) Expect(err).To(BeNil()) expectedCRData := map[string]interface{}{ "mutation-start": "yes", diff --git a/test/integration/etcd/etcd_storage_path_test.go b/test/integration/etcd/etcd_storage_path_test.go index e14bca84155..e30b1c025f8 100644 --- a/test/integration/etcd/etcd_storage_path_test.go +++ b/test/integration/etcd/etcd_storage_path_test.go @@ -810,7 +810,7 @@ func (c *allClient) create(stub, ns string, mapping *meta.RESTMapping, all *[]cl ns = "" } obj := &unstructured.Unstructured{Object: typeMetaAdder} - actual, err := c.dynamicClient.Resource(mapping.Resource).Namespace(ns).Create(obj) + actual, err := c.dynamicClient.Resource(mapping.Resource).Namespace(ns).Create(obj, metav1.CreateOptions{}) if err != nil { return err } diff --git a/test/integration/garbagecollector/garbage_collector_test.go b/test/integration/garbagecollector/garbage_collector_test.go index c8e9577e02a..061369dcc96 100644 --- a/test/integration/garbagecollector/garbage_collector_test.go +++ b/test/integration/garbagecollector/garbage_collector_test.go @@ -812,7 +812,7 @@ func TestCustomResourceCascadingDeletion(t *testing.T) { // Create a custom owner resource. owner := newCRDInstance(definition, ns.Name, names.SimpleNameGenerator.GenerateName("owner")) - owner, err := resourceClient.Create(owner) + owner, err := resourceClient.Create(owner, metav1.CreateOptions{}) if err != nil { t.Fatalf("failed to create owner resource %q: %v", owner.GetName(), err) } @@ -822,7 +822,7 @@ func TestCustomResourceCascadingDeletion(t *testing.T) { dependent := newCRDInstance(definition, ns.Name, names.SimpleNameGenerator.GenerateName("dependent")) link(t, owner, dependent) - dependent, err = resourceClient.Create(dependent) + dependent, err = resourceClient.Create(dependent, metav1.CreateOptions{}) if err != nil { t.Fatalf("failed to create dependent resource %q: %v", dependent.GetName(), err) } @@ -873,7 +873,7 @@ func TestMixedRelationships(t *testing.T) { definition, resourceClient := createRandomCustomResourceDefinition(t, apiExtensionClient, dynamicClient, ns.Name) // Create a custom owner resource. - customOwner, err := resourceClient.Create(newCRDInstance(definition, ns.Name, names.SimpleNameGenerator.GenerateName("owner"))) + customOwner, err := resourceClient.Create(newCRDInstance(definition, ns.Name, names.SimpleNameGenerator.GenerateName("owner")), metav1.CreateOptions{}) if err != nil { t.Fatalf("failed to create owner: %v", err) } @@ -900,7 +900,7 @@ func TestMixedRelationships(t *testing.T) { coreOwner.TypeMeta.Kind = "ConfigMap" coreOwner.TypeMeta.APIVersion = "v1" link(t, coreOwner, customDependent) - customDependent, err = resourceClient.Create(customDependent) + customDependent, err = resourceClient.Create(customDependent, metav1.CreateOptions{}) if err != nil { t.Fatalf("failed to create dependent: %v", err) } @@ -971,7 +971,7 @@ func TestCRDDeletionCascading(t *testing.T) { definition, resourceClient := createRandomCustomResourceDefinition(t, apiExtensionClient, dynamicClient, ns.Name) // Create a custom owner resource. - owner, err := resourceClient.Create(newCRDInstance(definition, ns.Name, names.SimpleNameGenerator.GenerateName("owner"))) + owner, err := resourceClient.Create(newCRDInstance(definition, ns.Name, names.SimpleNameGenerator.GenerateName("owner")), metav1.CreateOptions{}) if err != nil { t.Fatalf("failed to create owner: %v", err) } diff --git a/test/integration/master/crd_test.go b/test/integration/master/crd_test.go index 37ba367fbb2..61c11c6a6d4 100644 --- a/test/integration/master/crd_test.go +++ b/test/integration/master/crd_test.go @@ -199,7 +199,7 @@ func TestCRD(t *testing.T) { } createErr := make(chan error, 1) go func() { - _, err := dynamicClient.Resource(fooResource).Namespace("default").Create(unstructuredFoo) + _, err := dynamicClient.Resource(fooResource).Namespace("default").Create(unstructuredFoo, metav1.CreateOptions{}) t.Logf("Foo instance create returned: %v", err) if err != nil { createErr <- err @@ -272,7 +272,7 @@ func TestCRD(t *testing.T) { } fooUnstructured.UnmarshalJSON(bs) - _, err = dynamicClient.Resource(fooResource).Namespace("default").Update(fooUnstructured) + _, err = dynamicClient.Resource(fooResource).Namespace("default").Update(fooUnstructured, metav1.UpdateOptions{}) if err != nil && !errors.IsConflict(err) { t.Fatalf("Failed to update Foo instance: %v", err) } else if err == nil {