@@ -31,12 +31,14 @@ import (
31
31
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
32
32
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
33
33
"k8s.io/apimachinery/pkg/runtime"
34
+ "k8s.io/apimachinery/pkg/runtime/schema"
34
35
"k8s.io/apimachinery/pkg/util/wait"
35
36
"k8s.io/apimachinery/pkg/watch"
36
37
utilfeature "k8s.io/apiserver/pkg/util/feature"
37
38
"k8s.io/client-go/dynamic"
38
39
clientfeatures "k8s.io/client-go/features"
39
40
"k8s.io/client-go/kubernetes"
41
+ "k8s.io/client-go/metadata"
40
42
"k8s.io/client-go/rest"
41
43
"k8s.io/client-go/tools/cache"
42
44
"k8s.io/client-go/util/consistencydetector"
@@ -66,13 +68,7 @@ var _ = SIGDescribe("API Streaming (aka. WatchList)", framework.WithSerial(), fe
66
68
nil ,
67
69
)
68
70
69
- ginkgo .By (fmt .Sprintf ("Adding 5 secrets to %s namespace" , f .Namespace .Name ))
70
- var expectedSecrets []v1.Secret
71
- for i := 1 ; i <= 5 ; i ++ {
72
- secret , err := f .ClientSet .CoreV1 ().Secrets (f .Namespace .Name ).Create (ctx , newSecret (fmt .Sprintf ("secret-%d" , i )), metav1.CreateOptions {})
73
- framework .ExpectNoError (err )
74
- expectedSecrets = append (expectedSecrets , * secret )
75
- }
71
+ expectedSecrets := addWellKnownSecrets (ctx , f )
76
72
77
73
ginkgo .By ("Starting the secret informer" )
78
74
go secretInformer .Run (stopCh )
@@ -99,13 +95,7 @@ var _ = SIGDescribe("API Streaming (aka. WatchList)", framework.WithSerial(), fe
99
95
ginkgo .It ("should be requested by client-go's List method when WatchListClient is enabled" , func (ctx context.Context ) {
100
96
featuregatetesting .SetFeatureGateDuringTest (ginkgo .GinkgoTB (), utilfeature .DefaultFeatureGate , featuregate .Feature (clientfeatures .WatchListClient ), true )
101
97
102
- ginkgo .By (fmt .Sprintf ("Adding 5 secrets to %s namespace" , f .Namespace .Name ))
103
- var expectedSecrets []v1.Secret
104
- for i := 1 ; i <= 5 ; i ++ {
105
- secret , err := f .ClientSet .CoreV1 ().Secrets (f .Namespace .Name ).Create (ctx , newSecret (fmt .Sprintf ("secret-%d" , i )), metav1.CreateOptions {})
106
- framework .ExpectNoError (err )
107
- expectedSecrets = append (expectedSecrets , * secret )
108
- }
98
+ expectedSecrets := addWellKnownSecrets (ctx , f )
109
99
110
100
rt , clientConfig := clientConfigWithRoundTripper (f )
111
101
wrappedKubeClient , err := kubernetes .NewForConfig (clientConfig )
@@ -152,6 +142,35 @@ var _ = SIGDescribe("API Streaming (aka. WatchList)", framework.WithSerial(), fe
152
142
expectedRequestMadeByDynamicClient := getExpectedRequestMadeByClientFor (secretList .GetResourceVersion ())
153
143
gomega .Expect (rt .actualRequests ).To (gomega .Equal (expectedRequestMadeByDynamicClient ))
154
144
})
145
+ ginkgo .It ("should be requested by metadata client's List method when WatchListClient is enabled" , func (ctx context.Context ) {
146
+ featuregatetesting .SetFeatureGateDuringTest (ginkgo .GinkgoTB (), utilfeature .DefaultFeatureGate , featuregate .Feature (clientfeatures .WatchListClient ), true )
147
+
148
+ metaClient , err := metadata .NewForConfig (f .ClientConfig ())
149
+ framework .ExpectNoError (err )
150
+ expectedMetaSecrets := []metav1.PartialObjectMetadata {}
151
+ for _ , addedSecret := range addWellKnownSecrets (ctx , f ) {
152
+ addedSecretMeta , err := metaClient .Resource (v1 .SchemeGroupVersion .WithResource ("secrets" )).Namespace (f .Namespace .Name ).Get (ctx , addedSecret .Name , metav1.GetOptions {})
153
+ framework .ExpectNoError (err )
154
+ expectedMetaSecrets = append (expectedMetaSecrets , * addedSecretMeta )
155
+ }
156
+
157
+ rt , clientConfig := clientConfigWithRoundTripper (f )
158
+ wrappedMetaClient , err := metadata .NewForConfig (clientConfig )
159
+ framework .ExpectNoError (err )
160
+
161
+ ginkgo .By ("Streaming secrets metadata from the server" )
162
+ secretMetaList , err := wrappedMetaClient .Resource (v1 .SchemeGroupVersion .WithResource ("secrets" )).Namespace (f .Namespace .Name ).List (ctx , metav1.ListOptions {})
163
+ framework .ExpectNoError (err )
164
+
165
+ ginkgo .By ("Verifying if the secret meta list was properly streamed" )
166
+ streamedMetaSecrets := secretMetaList .Items
167
+ gomega .Expect (cmp .Equal (expectedMetaSecrets , streamedMetaSecrets )).To (gomega .BeTrueBecause ("data received via watchlist must match the added data" ))
168
+ gomega .Expect (secretMetaList .GetObjectKind ().GroupVersionKind ()).To (gomega .Equal (schema.GroupVersion {}.WithKind ("PartialObjectMetadataList" )))
169
+
170
+ ginkgo .By ("Verifying if expected requests were sent to the server" )
171
+ expectedRequestMadeByMetaClient := getExpectedRequestMadeByClientFor (secretMetaList .GetResourceVersion ())
172
+ gomega .Expect (rt .actualRequests ).To (gomega .Equal (expectedRequestMadeByMetaClient ))
173
+ })
155
174
})
156
175
157
176
type roundTripper struct {
@@ -204,6 +223,17 @@ func getExpectedRequestMadeByClientFor(rv string) []string {
204
223
return expectedRequestMadeByClient
205
224
}
206
225
226
+ func addWellKnownSecrets (ctx context.Context , f * framework.Framework ) []v1.Secret {
227
+ ginkgo .By (fmt .Sprintf ("Adding 5 secrets to %s namespace" , f .Namespace .Name ))
228
+ var secrets []v1.Secret
229
+ for i := 1 ; i <= 5 ; i ++ {
230
+ secret , err := f .ClientSet .CoreV1 ().Secrets (f .Namespace .Name ).Create (ctx , newSecret (fmt .Sprintf ("secret-%d" , i )), metav1.CreateOptions {})
231
+ framework .ExpectNoError (err )
232
+ secrets = append (secrets , * secret )
233
+ }
234
+ return secrets
235
+ }
236
+
207
237
type byName []v1.Secret
208
238
209
239
func (a byName ) Len () int { return len (a ) }
0 commit comments