@@ -41,6 +41,7 @@ import (
4141 "sigs.k8s.io/kubefed/pkg/apis/core/common"
4242 "sigs.k8s.io/kubefed/pkg/apis/core/typeconfig"
4343 fedv1a1 "sigs.k8s.io/kubefed/pkg/apis/core/v1alpha1"
44+ "sigs.k8s.io/kubefed/pkg/apis/core/v1beta1"
4445 genericclient "sigs.k8s.io/kubefed/pkg/client/generic"
4546 "sigs.k8s.io/kubefed/pkg/controller/sync"
4647 "sigs.k8s.io/kubefed/pkg/controller/sync/status"
@@ -65,6 +66,7 @@ type FederatedTypeCrudTester struct {
6566 // operation that involves member clusters may take longer due to
6667 // propagation latency.
6768 clusterWaitTimeout time.Duration
69+ clustersNamespace string
6870}
6971
7072type TestClusterConfig struct {
@@ -77,7 +79,7 @@ type TestCluster struct {
7779 Client util.ResourceClient
7880}
7981
80- func NewFederatedTypeCrudTester (testLogger TestLogger , typeConfig typeconfig.Interface , kubeConfig * rest.Config , testClusters map [string ]TestCluster , waitInterval , clusterWaitTimeout time.Duration ) (* FederatedTypeCrudTester , error ) {
82+ func NewFederatedTypeCrudTester (testLogger TestLogger , typeConfig typeconfig.Interface , kubeConfig * rest.Config , testClusters map [string ]TestCluster , clustersNamespace string , waitInterval , clusterWaitTimeout time.Duration ) (* FederatedTypeCrudTester , error ) {
8183 return & FederatedTypeCrudTester {
8284 tl : testLogger ,
8385 typeConfig : typeConfig ,
@@ -87,11 +89,12 @@ func NewFederatedTypeCrudTester(testLogger TestLogger, typeConfig typeconfig.Int
8789 testClusters : testClusters ,
8890 waitInterval : waitInterval ,
8991 clusterWaitTimeout : clusterWaitTimeout ,
92+ clustersNamespace : clustersNamespace ,
9093 }, nil
9194}
9295
93- func (c * FederatedTypeCrudTester ) CheckLifecycle (targetObject * unstructured.Unstructured , overrides []interface {}) {
94- fedObject := c .CheckCreate (targetObject , overrides )
96+ func (c * FederatedTypeCrudTester ) CheckLifecycle (targetObject * unstructured.Unstructured , overrides []interface {}, selectors map [ string ] string ) {
97+ fedObject := c .CheckCreate (targetObject , overrides , selectors )
9598
9699 c .CheckStatusCreated (util .NewQualifiedName (fedObject ))
97100
@@ -104,7 +107,7 @@ func (c *FederatedTypeCrudTester) CheckLifecycle(targetObject *unstructured.Unst
104107 c .CheckDelete (fedObject , false )
105108}
106109
107- func (c * FederatedTypeCrudTester ) Create (targetObject * unstructured.Unstructured , overrides []interface {}) * unstructured.Unstructured {
110+ func (c * FederatedTypeCrudTester ) Create (targetObject * unstructured.Unstructured , overrides []interface {}, selectors map [ string ] string ) * unstructured.Unstructured {
108111 qualifiedName := util .NewQualifiedName (targetObject )
109112 kind := c .typeConfig .GetTargetType ().Kind
110113 fedKind := c .typeConfig .GetFederatedType ().Kind
@@ -113,10 +116,7 @@ func (c *FederatedTypeCrudTester) Create(targetObject *unstructured.Unstructured
113116 c .tl .Fatalf ("Error obtaining %s from %s %q: %v" , fedKind , kind , qualifiedName , err )
114117 }
115118
116- fedObject , err = c .setAdditionalTestData (fedObject , overrides , targetObject .GetGenerateName ())
117- if err != nil {
118- c .tl .Fatalf ("Error setting overrides and placement on %s %q: %v" , fedKind , qualifiedName , err )
119- }
119+ fedObject = c .setAdditionalTestData (fedObject , overrides , selectors , targetObject .GetGenerateName ())
120120
121121 return c .createResource (c .typeConfig .GetFederatedType (), fedObject )
122122}
@@ -141,15 +141,15 @@ func (c *FederatedTypeCrudTester) resourceClient(apiResource metav1.APIResource)
141141 return client
142142}
143143
144- func (c * FederatedTypeCrudTester ) CheckCreate (targetObject * unstructured.Unstructured , overrides []interface {}) * unstructured.Unstructured {
145- fedObject := c .Create (targetObject , overrides )
144+ func (c * FederatedTypeCrudTester ) CheckCreate (targetObject * unstructured.Unstructured , overrides []interface {}, selectors map [ string ] string ) * unstructured.Unstructured {
145+ fedObject := c .Create (targetObject , overrides , selectors )
146146
147147 c .CheckPropagation (fedObject )
148148 return fedObject
149149}
150150
151151// AdditionalTestData additionally sets fixture overrides and placement clusternames into federated object
152- func (c * FederatedTypeCrudTester ) setAdditionalTestData (fedObject * unstructured.Unstructured , overrides []interface {}, generateName string ) ( * unstructured.Unstructured , error ) {
152+ func (c * FederatedTypeCrudTester ) setAdditionalTestData (fedObject * unstructured.Unstructured , overrides []interface {}, selectors map [ string ] string , generateName string ) * unstructured.Unstructured {
153153 fedKind := c .typeConfig .GetFederatedType ().Kind
154154 qualifiedName := util .NewQualifiedName (fedObject )
155155
@@ -159,17 +159,23 @@ func (c *FederatedTypeCrudTester) setAdditionalTestData(fedObject *unstructured.
159159 c .tl .Fatalf ("Error updating overrides in %s %q: %v" , fedKind , qualifiedName , err )
160160 }
161161 }
162- clusterNames := []string {}
163- for name := range c .testClusters {
164- clusterNames = append (clusterNames , name )
165- }
166- err := util .SetClusterNames (fedObject , clusterNames )
167- if err != nil {
168- c .tl .Fatalf ("Error setting cluster names in %s %q: %v" , fedKind , qualifiedName , err )
162+ if selectors != nil {
163+ if err := util .SetClusterSelector (fedObject , selectors ); err != nil {
164+ c .tl .Fatalf ("Error setting cluster selectors for %s/%s: %v" , fedObject .GetKind (), fedObject .GetName (), err )
165+ }
166+ } else {
167+ clusterNames := []string {}
168+ for name := range c .testClusters {
169+ clusterNames = append (clusterNames , name )
170+ }
171+ err := util .SetClusterNames (fedObject , clusterNames )
172+ if err != nil {
173+ c .tl .Fatalf ("Error setting cluster names in %s %q: %v" , fedKind , qualifiedName , err )
174+ }
169175 }
170176 fedObject .SetGenerateName (generateName )
171177
172- return fedObject , err
178+ return fedObject
173179}
174180
175181func (c * FederatedTypeCrudTester ) CheckUpdate (fedObject * unstructured.Unstructured ) {
@@ -334,7 +340,14 @@ func (c *FederatedTypeCrudTester) CheckDelete(fedObject *unstructured.Unstructur
334340 if deletingInCluster {
335341 stateMsg = "not present"
336342 }
343+ clusters , err := util .ComputePlacement (fedObject , c .getClusters (), false )
344+ if err != nil {
345+ c .tl .Fatalf ("Couldn't retrieve clusters for %s/%s: %v" , federatedKind , name , err )
346+ }
337347 for clusterName , testCluster := range c .testClusters {
348+ if ! clusters .Has (clusterName ) {
349+ continue
350+ }
338351 namespace = util .QualifiedNameForCluster (clusterName , qualifiedName ).Namespace
339352 err = wait .PollImmediate (c .waitInterval , waitTimeout , func () (bool , error ) {
340353 obj , err := testCluster .Client .Resources (namespace ).Get (context .Background (), name , metav1.GetOptions {})
@@ -425,16 +438,33 @@ func (c *FederatedTypeCrudTester) CheckReplicaSet(fedObject *unstructured.Unstru
425438 }
426439}
427440
441+ func (c * FederatedTypeCrudTester ) getClusters () []* v1beta1.KubeFedCluster {
442+ client , err := genericclient .New (c .kubeConfig )
443+ if err != nil {
444+ c .tl .Fatalf ("Failed to get kubefed clientset: %v" , err )
445+ }
446+
447+ fedClusters := []* v1beta1.KubeFedCluster {}
448+ for cluster := range c .testClusters {
449+ clusterResource := & v1beta1.KubeFedCluster {}
450+ err = client .Get (context .Background (), clusterResource , c .clustersNamespace , cluster )
451+ if err != nil {
452+ c .tl .Fatalf ("Cannot get cluster %s: %v" , cluster , err )
453+ }
454+ fedClusters = append (fedClusters , clusterResource )
455+ }
456+ return fedClusters
457+ }
458+
428459// CheckPropagation checks propagation for the crud tester's clients
429460func (c * FederatedTypeCrudTester ) CheckPropagation (fedObject * unstructured.Unstructured ) {
430461 federatedKind := c .typeConfig .GetFederatedType ().Kind
431462 qualifiedName := util .NewQualifiedName (fedObject )
432463
433- clusterNames , err := util .GetClusterNames (fedObject )
464+ selectedClusters , err := util .ComputePlacement (fedObject , c . getClusters (), false )
434465 if err != nil {
435466 c .tl .Fatalf ("Error retrieving cluster names for %s %q: %v" , federatedKind , qualifiedName , err )
436467 }
437- selectedClusters := sets .NewString (clusterNames ... )
438468
439469 templateVersion , err := sync .GetTemplateHash (fedObject .Object )
440470 if err != nil {
0 commit comments