Skip to content

Commit f52cbea

Browse files
authored
Merge pull request kubernetes#88910 from liggitt/metadata-context
Metadata client: plumb context
2 parents cf4d797 + 04a72d5 commit f52cbea

File tree

12 files changed

+69
-66
lines changed

12 files changed

+69
-66
lines changed

pkg/controller/garbagecollector/garbagecollector.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package garbagecollector
1818

1919
import (
20+
"context"
2021
"fmt"
2122
"reflect"
2223
"sync"
@@ -347,7 +348,7 @@ func (gc *GarbageCollector) isDangling(reference metav1.OwnerReference, item *no
347348
// TODO: It's only necessary to talk to the API server if the owner node
348349
// is a "virtual" node. The local graph could lag behind the real
349350
// status, but in practice, the difference is small.
350-
owner, err = gc.metadataClient.Resource(resource).Namespace(resourceDefaultNamespace(namespaced, item.identity.Namespace)).Get(reference.Name, metav1.GetOptions{})
351+
owner, err = gc.metadataClient.Resource(resource).Namespace(resourceDefaultNamespace(namespaced, item.identity.Namespace)).Get(context.TODO(), reference.Name, metav1.GetOptions{})
351352
switch {
352353
case errors.IsNotFound(err):
353354
gc.absentOwnerCache.Add(reference.UID)

pkg/controller/garbagecollector/operations.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package garbagecollector
1818

1919
import (
20+
"context"
2021
"encoding/json"
2122
"fmt"
2223

@@ -56,23 +57,23 @@ func (gc *GarbageCollector) deleteObject(item objectReference, policy *metav1.De
5657
uid := item.UID
5758
preconditions := metav1.Preconditions{UID: &uid}
5859
deleteOptions := metav1.DeleteOptions{Preconditions: &preconditions, PropagationPolicy: policy}
59-
return gc.metadataClient.Resource(resource).Namespace(resourceDefaultNamespace(namespaced, item.Namespace)).Delete(item.Name, &deleteOptions)
60+
return gc.metadataClient.Resource(resource).Namespace(resourceDefaultNamespace(namespaced, item.Namespace)).Delete(context.TODO(), item.Name, deleteOptions)
6061
}
6162

6263
func (gc *GarbageCollector) getObject(item objectReference) (*metav1.PartialObjectMetadata, error) {
6364
resource, namespaced, err := gc.apiResource(item.APIVersion, item.Kind)
6465
if err != nil {
6566
return nil, err
6667
}
67-
return gc.metadataClient.Resource(resource).Namespace(resourceDefaultNamespace(namespaced, item.Namespace)).Get(item.Name, metav1.GetOptions{})
68+
return gc.metadataClient.Resource(resource).Namespace(resourceDefaultNamespace(namespaced, item.Namespace)).Get(context.TODO(), item.Name, metav1.GetOptions{})
6869
}
6970

7071
func (gc *GarbageCollector) patchObject(item objectReference, patch []byte, pt types.PatchType) (*metav1.PartialObjectMetadata, error) {
7172
resource, namespaced, err := gc.apiResource(item.APIVersion, item.Kind)
7273
if err != nil {
7374
return nil, err
7475
}
75-
return gc.metadataClient.Resource(resource).Namespace(resourceDefaultNamespace(namespaced, item.Namespace)).Patch(item.Name, pt, patch, metav1.PatchOptions{})
76+
return gc.metadataClient.Resource(resource).Namespace(resourceDefaultNamespace(namespaced, item.Namespace)).Patch(context.TODO(), item.Name, pt, patch, metav1.PatchOptions{})
7677
}
7778

7879
func (gc *GarbageCollector) removeFinalizer(owner *node, targetFinalizer string) error {

pkg/controller/garbagecollector/patch.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package garbagecollector
1818

1919
import (
20+
"context"
2021
"encoding/json"
2122
"fmt"
2223

@@ -67,7 +68,7 @@ func (gc *GarbageCollector) getMetadata(apiVersion, kind, namespace, name string
6768
m, ok := gc.dependencyGraphBuilder.monitors[apiResource]
6869
if !ok || m == nil {
6970
// If local cache doesn't exist for mapping.Resource, send a GET request to API server
70-
return gc.metadataClient.Resource(apiResource).Namespace(namespace).Get(name, metav1.GetOptions{})
71+
return gc.metadataClient.Resource(apiResource).Namespace(namespace).Get(context.TODO(), name, metav1.GetOptions{})
7172
}
7273
key := name
7374
if len(namespace) != 0 {
@@ -79,7 +80,7 @@ func (gc *GarbageCollector) getMetadata(apiVersion, kind, namespace, name string
7980
}
8081
if !exist {
8182
// If local cache doesn't contain the object, send a GET request to API server
82-
return gc.metadataClient.Resource(apiResource).Namespace(namespace).Get(name, metav1.GetOptions{})
83+
return gc.metadataClient.Resource(apiResource).Namespace(namespace).Get(context.TODO(), name, metav1.GetOptions{})
8384
}
8485
obj, ok := raw.(runtime.Object)
8586
if !ok {

pkg/controller/namespace/deletion/namespaced_resources_deleter.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -318,8 +318,8 @@ func (d *namespacedResourcesDeleter) deleteCollection(gvr schema.GroupVersionRes
318318
// resource deletions generically. it will ensure all resources in the namespace are purged prior to releasing
319319
// namespace itself.
320320
background := metav1.DeletePropagationBackground
321-
opts := &metav1.DeleteOptions{PropagationPolicy: &background}
322-
err := d.metadataClient.Resource(gvr).Namespace(namespace).DeleteCollection(opts, metav1.ListOptions{})
321+
opts := metav1.DeleteOptions{PropagationPolicy: &background}
322+
err := d.metadataClient.Resource(gvr).Namespace(namespace).DeleteCollection(context.TODO(), opts, metav1.ListOptions{})
323323

324324
if err == nil {
325325
return true, nil
@@ -355,7 +355,7 @@ func (d *namespacedResourcesDeleter) listCollection(gvr schema.GroupVersionResou
355355
return nil, false, nil
356356
}
357357

358-
partialList, err := d.metadataClient.Resource(gvr).Namespace(namespace).List(metav1.ListOptions{})
358+
partialList, err := d.metadataClient.Resource(gvr).Namespace(namespace).List(context.TODO(), metav1.ListOptions{})
359359
if err == nil {
360360
return partialList, true, nil
361361
}
@@ -388,8 +388,8 @@ func (d *namespacedResourcesDeleter) deleteEachItem(gvr schema.GroupVersionResou
388388
}
389389
for _, item := range unstructuredList.Items {
390390
background := metav1.DeletePropagationBackground
391-
opts := &metav1.DeleteOptions{PropagationPolicy: &background}
392-
if err = d.metadataClient.Resource(gvr).Namespace(namespace).Delete(item.GetName(), opts); err != nil && !errors.IsNotFound(err) && !errors.IsMethodNotSupported(err) {
391+
opts := metav1.DeleteOptions{PropagationPolicy: &background}
392+
if err = d.metadataClient.Resource(gvr).Namespace(namespace).Delete(context.TODO(), item.GetName(), opts); err != nil && !errors.IsNotFound(err) && !errors.IsMethodNotSupported(err) {
393393
return err
394394
}
395395
}

staging/src/k8s.io/client-go/metadata/fake/simple.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package fake
1818

1919
import (
20+
"context"
2021
"fmt"
2122
"strings"
2223

@@ -214,7 +215,7 @@ func (c *metadataResourceClient) UpdateStatus(obj *metav1.PartialObjectMetadata,
214215
}
215216

216217
// Delete records the object deletion and processes it via the reactor.
217-
func (c *metadataResourceClient) Delete(name string, opts *metav1.DeleteOptions, subresources ...string) error {
218+
func (c *metadataResourceClient) Delete(ctx context.Context, name string, opts metav1.DeleteOptions, subresources ...string) error {
218219
var err error
219220
switch {
220221
case len(c.namespace) == 0 && len(subresources) == 0:
@@ -238,7 +239,7 @@ func (c *metadataResourceClient) Delete(name string, opts *metav1.DeleteOptions,
238239
}
239240

240241
// DeleteCollection records the object collection deletion and processes it via the reactor.
241-
func (c *metadataResourceClient) DeleteCollection(opts *metav1.DeleteOptions, listOptions metav1.ListOptions) error {
242+
func (c *metadataResourceClient) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOptions metav1.ListOptions) error {
242243
var err error
243244
switch {
244245
case len(c.namespace) == 0:
@@ -255,7 +256,7 @@ func (c *metadataResourceClient) DeleteCollection(opts *metav1.DeleteOptions, li
255256
}
256257

257258
// Get records the object retrieval and processes it via the reactor.
258-
func (c *metadataResourceClient) Get(name string, opts metav1.GetOptions, subresources ...string) (*metav1.PartialObjectMetadata, error) {
259+
func (c *metadataResourceClient) Get(ctx context.Context, name string, opts metav1.GetOptions, subresources ...string) (*metav1.PartialObjectMetadata, error) {
259260
var uncastRet runtime.Object
260261
var err error
261262
switch {
@@ -290,7 +291,7 @@ func (c *metadataResourceClient) Get(name string, opts metav1.GetOptions, subres
290291
}
291292

292293
// List records the object deletion and processes it via the reactor.
293-
func (c *metadataResourceClient) List(opts metav1.ListOptions) (*metav1.PartialObjectMetadataList, error) {
294+
func (c *metadataResourceClient) List(ctx context.Context, opts metav1.ListOptions) (*metav1.PartialObjectMetadataList, error) {
294295
var obj runtime.Object
295296
var err error
296297
switch {
@@ -337,7 +338,7 @@ func (c *metadataResourceClient) List(opts metav1.ListOptions) (*metav1.PartialO
337338
return list, nil
338339
}
339340

340-
func (c *metadataResourceClient) Watch(opts metav1.ListOptions) (watch.Interface, error) {
341+
func (c *metadataResourceClient) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) {
341342
switch {
342343
case len(c.namespace) == 0:
343344
return c.client.Fake.
@@ -353,7 +354,7 @@ func (c *metadataResourceClient) Watch(opts metav1.ListOptions) (watch.Interface
353354
}
354355

355356
// Patch records the object patch and processes it via the reactor.
356-
func (c *metadataResourceClient) Patch(name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (*metav1.PartialObjectMetadata, error) {
357+
func (c *metadataResourceClient) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (*metav1.PartialObjectMetadata, error) {
357358
var uncastRet runtime.Object
358359
var err error
359360
switch {

staging/src/k8s.io/client-go/metadata/fake/simple_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package fake
1818

1919
import (
20+
"context"
2021
"fmt"
2122
"testing"
2223

@@ -72,7 +73,7 @@ func TestList(t *testing.T) {
7273
newPartialObjectMetadata("group/version", "TheKind", "ns-foo", "name-baz"),
7374
newPartialObjectMetadata("group2/version", "TheKind", "ns-foo", "name2-baz"),
7475
)
75-
listFirst, err := client.Resource(schema.GroupVersionResource{Group: "group", Version: "version", Resource: "thekinds"}).List(metav1.ListOptions{})
76+
listFirst, err := client.Resource(schema.GroupVersionResource{Group: "group", Version: "version", Resource: "thekinds"}).List(context.TODO(), metav1.ListOptions{})
7677
if err != nil {
7778
t.Fatal(err)
7879
}
@@ -100,7 +101,7 @@ func (tc *patchTestCase) runner(t *testing.T) {
100101
client := NewSimpleMetadataClient(scheme, tc.object)
101102
resourceInterface := client.Resource(schema.GroupVersionResource{Group: testGroup, Version: testVersion, Resource: testResource}).Namespace(testNamespace)
102103

103-
got, recErr := resourceInterface.Patch(testName, tc.patchType, tc.patchBytes, metav1.PatchOptions{})
104+
got, recErr := resourceInterface.Patch(context.TODO(), testName, tc.patchType, tc.patchBytes, metav1.PatchOptions{})
104105

105106
if err := tc.verifyErr(recErr); err != nil {
106107
t.Error(err)

staging/src/k8s.io/client-go/metadata/interface.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ limitations under the License.
1717
package metadata
1818

1919
import (
20+
"context"
21+
2022
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2123
"k8s.io/apimachinery/pkg/runtime/schema"
2224
"k8s.io/apimachinery/pkg/types"
@@ -32,12 +34,12 @@ type Interface interface {
3234
// ResourceInterface contains the set of methods that may be invoked on objects by their metadata.
3335
// Update is not supported by the server, but Patch can be used for the actions Update would handle.
3436
type ResourceInterface interface {
35-
Delete(name string, options *metav1.DeleteOptions, subresources ...string) error
36-
DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error
37-
Get(name string, options metav1.GetOptions, subresources ...string) (*metav1.PartialObjectMetadata, error)
38-
List(opts metav1.ListOptions) (*metav1.PartialObjectMetadataList, error)
39-
Watch(opts metav1.ListOptions) (watch.Interface, error)
40-
Patch(name string, pt types.PatchType, data []byte, options metav1.PatchOptions, subresources ...string) (*metav1.PartialObjectMetadata, error)
37+
Delete(ctx context.Context, name string, options metav1.DeleteOptions, subresources ...string) error
38+
DeleteCollection(ctx context.Context, options metav1.DeleteOptions, listOptions metav1.ListOptions) error
39+
Get(ctx context.Context, name string, options metav1.GetOptions, subresources ...string) (*metav1.PartialObjectMetadata, error)
40+
List(ctx context.Context, opts metav1.ListOptions) (*metav1.PartialObjectMetadataList, error)
41+
Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error)
42+
Patch(ctx context.Context, name string, pt types.PatchType, data []byte, options metav1.PatchOptions, subresources ...string) (*metav1.PartialObjectMetadata, error)
4143
}
4244

4345
// Getter handles both namespaced and non-namespaced resource types consistently.

staging/src/k8s.io/client-go/metadata/metadata.go

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,11 @@ func (c *client) Namespace(ns string) ResourceInterface {
120120
}
121121

122122
// Delete removes the provided resource from the server.
123-
func (c *client) Delete(name string, opts *metav1.DeleteOptions, subresources ...string) error {
123+
func (c *client) Delete(ctx context.Context, name string, opts metav1.DeleteOptions, subresources ...string) error {
124124
if len(name) == 0 {
125125
return fmt.Errorf("name is required")
126126
}
127-
if opts == nil {
128-
opts = &metav1.DeleteOptions{}
129-
}
130-
deleteOptionsByte, err := runtime.Encode(deleteOptionsCodec.LegacyCodec(schema.GroupVersion{Version: "v1"}), opts)
127+
deleteOptionsByte, err := runtime.Encode(deleteOptionsCodec.LegacyCodec(schema.GroupVersion{Version: "v1"}), &opts)
131128
if err != nil {
132129
return err
133130
}
@@ -136,16 +133,13 @@ func (c *client) Delete(name string, opts *metav1.DeleteOptions, subresources ..
136133
Delete().
137134
AbsPath(append(c.makeURLSegments(name), subresources...)...).
138135
Body(deleteOptionsByte).
139-
Do(context.TODO())
136+
Do(ctx)
140137
return result.Error()
141138
}
142139

143140
// DeleteCollection triggers deletion of all resources in the specified scope (namespace or cluster).
144-
func (c *client) DeleteCollection(opts *metav1.DeleteOptions, listOptions metav1.ListOptions) error {
145-
if opts == nil {
146-
opts = &metav1.DeleteOptions{}
147-
}
148-
deleteOptionsByte, err := runtime.Encode(deleteOptionsCodec.LegacyCodec(schema.GroupVersion{Version: "v1"}), opts)
141+
func (c *client) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOptions metav1.ListOptions) error {
142+
deleteOptionsByte, err := runtime.Encode(deleteOptionsCodec.LegacyCodec(schema.GroupVersion{Version: "v1"}), &opts)
149143
if err != nil {
150144
return err
151145
}
@@ -155,19 +149,19 @@ func (c *client) DeleteCollection(opts *metav1.DeleteOptions, listOptions metav1
155149
AbsPath(c.makeURLSegments("")...).
156150
Body(deleteOptionsByte).
157151
SpecificallyVersionedParams(&listOptions, dynamicParameterCodec, versionV1).
158-
Do(context.TODO())
152+
Do(ctx)
159153
return result.Error()
160154
}
161155

162156
// Get returns the resource with name from the specified scope (namespace or cluster).
163-
func (c *client) Get(name string, opts metav1.GetOptions, subresources ...string) (*metav1.PartialObjectMetadata, error) {
157+
func (c *client) Get(ctx context.Context, name string, opts metav1.GetOptions, subresources ...string) (*metav1.PartialObjectMetadata, error) {
164158
if len(name) == 0 {
165159
return nil, fmt.Errorf("name is required")
166160
}
167161
result := c.client.client.Get().AbsPath(append(c.makeURLSegments(name), subresources...)...).
168162
SetHeader("Accept", "application/vnd.kubernetes.protobuf;as=PartialObjectMetadata;g=meta.k8s.io;v=v1,application/json;as=PartialObjectMetadata;g=meta.k8s.io;v=v1,application/json").
169163
SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1).
170-
Do(context.TODO())
164+
Do(ctx)
171165
if err := result.Error(); err != nil {
172166
return nil, err
173167
}
@@ -199,11 +193,11 @@ func (c *client) Get(name string, opts metav1.GetOptions, subresources ...string
199193
}
200194

201195
// List returns all resources within the specified scope (namespace or cluster).
202-
func (c *client) List(opts metav1.ListOptions) (*metav1.PartialObjectMetadataList, error) {
196+
func (c *client) List(ctx context.Context, opts metav1.ListOptions) (*metav1.PartialObjectMetadataList, error) {
203197
result := c.client.client.Get().AbsPath(c.makeURLSegments("")...).
204198
SetHeader("Accept", "application/vnd.kubernetes.protobuf;as=PartialObjectMetadataList;g=meta.k8s.io;v=v1,application/json;as=PartialObjectMetadataList;g=meta.k8s.io;v=v1,application/json").
205199
SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1).
206-
Do(context.TODO())
200+
Do(ctx)
207201
if err := result.Error(); err != nil {
208202
return nil, err
209203
}
@@ -232,7 +226,7 @@ func (c *client) List(opts metav1.ListOptions) (*metav1.PartialObjectMetadataLis
232226
}
233227

234228
// Watch finds all changes to the resources in the specified scope (namespace or cluster).
235-
func (c *client) Watch(opts metav1.ListOptions) (watch.Interface, error) {
229+
func (c *client) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) {
236230
var timeout time.Duration
237231
if opts.TimeoutSeconds != nil {
238232
timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
@@ -243,11 +237,11 @@ func (c *client) Watch(opts metav1.ListOptions) (watch.Interface, error) {
243237
SetHeader("Accept", "application/vnd.kubernetes.protobuf;as=PartialObjectMetadata;g=meta.k8s.io;v=v1,application/json;as=PartialObjectMetadata;g=meta.k8s.io;v=v1,application/json").
244238
SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1).
245239
Timeout(timeout).
246-
Watch(context.TODO())
240+
Watch(ctx)
247241
}
248242

249243
// Patch modifies the named resource in the specified scope (namespace or cluster).
250-
func (c *client) Patch(name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (*metav1.PartialObjectMetadata, error) {
244+
func (c *client) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (*metav1.PartialObjectMetadata, error) {
251245
if len(name) == 0 {
252246
return nil, fmt.Errorf("name is required")
253247
}
@@ -257,7 +251,7 @@ func (c *client) Patch(name string, pt types.PatchType, data []byte, opts metav1
257251
Body(data).
258252
SetHeader("Accept", "application/vnd.kubernetes.protobuf;as=PartialObjectMetadata;g=meta.k8s.io;v=v1,application/json;as=PartialObjectMetadata;g=meta.k8s.io;v=v1,application/json").
259253
SpecificallyVersionedParams(&opts, dynamicParameterCodec, versionV1).
260-
Do(context.TODO())
254+
Do(ctx)
261255
if err := result.Error(); err != nil {
262256
return nil, err
263257
}

staging/src/k8s.io/client-go/metadata/metadata_test.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package metadata
1818

1919
import (
20+
"context"
2021
"encoding/json"
2122
"net/http"
2223
"net/http/httptest"
@@ -72,7 +73,7 @@ func TestClient(t *testing.T) {
7273
})
7374
},
7475
want: func(t *testing.T, client *Client) {
75-
obj, err := client.Resource(gvr).Namespace("ns").Get("name", metav1.GetOptions{})
76+
obj, err := client.Resource(gvr).Namespace("ns").Get(context.TODO(), "name", metav1.GetOptions{})
7677
if err != nil {
7778
t.Fatal(err)
7879
}
@@ -120,7 +121,7 @@ func TestClient(t *testing.T) {
120121
})
121122
},
122123
want: func(t *testing.T, client *Client) {
123-
objs, err := client.Resource(gvr).Namespace("ns").List(metav1.ListOptions{})
124+
objs, err := client.Resource(gvr).Namespace("ns").List(context.TODO(), metav1.ListOptions{})
124125
if err != nil {
125126
t.Fatal(err)
126127
}
@@ -162,7 +163,7 @@ func TestClient(t *testing.T) {
162163
})
163164
},
164165
want: func(t *testing.T, client *Client) {
165-
obj, err := client.Resource(gvr).Namespace("ns").Get("name", metav1.GetOptions{})
166+
obj, err := client.Resource(gvr).Namespace("ns").Get(context.TODO(), "name", metav1.GetOptions{})
166167
if err == nil || !runtime.IsMissingKind(err) {
167168
t.Fatal(err)
168169
}
@@ -191,7 +192,7 @@ func TestClient(t *testing.T) {
191192
})
192193
},
193194
want: func(t *testing.T, client *Client) {
194-
obj, err := client.Resource(gvr).Namespace("ns").Get("name", metav1.GetOptions{})
195+
obj, err := client.Resource(gvr).Namespace("ns").Get(context.TODO(), "name", metav1.GetOptions{})
195196
if err == nil || !runtime.IsMissingVersion(err) {
196197
t.Fatal(err)
197198
}
@@ -219,7 +220,7 @@ func TestClient(t *testing.T) {
219220
})
220221
},
221222
want: func(t *testing.T, client *Client) {
222-
obj, err := client.Resource(gvr).Namespace("ns").Get("name", metav1.GetOptions{})
223+
obj, err := client.Resource(gvr).Namespace("ns").Get(context.TODO(), "name", metav1.GetOptions{})
223224
if err == nil || !strings.Contains(err.Error(), "object does not appear to match the ObjectMeta schema") {
224225
t.Fatal(err)
225226
}

0 commit comments

Comments
 (0)