@@ -910,6 +910,100 @@ metadata:
910
910
g .Expect (env .Delete (ctx , resourceConfigMapWithMissingNamespace )).To (Succeed ())
911
911
g .Expect (env .Delete (ctx , missingNs )).To (Succeed ())
912
912
})
913
+
914
+ t .Run ("Should only create ClusterResourceSetBinding after the remote cluster's Kubernetes API Server Service has been created" , func (t * testing.T ) {
915
+ g := NewWithT (t )
916
+ ns := setup (t , g )
917
+ defer teardown (t , g , ns )
918
+
919
+ kubernetesAPIServerService := & corev1.Service {
920
+ TypeMeta : metav1.TypeMeta {Kind : "Service" , APIVersion : "v1" },
921
+ ObjectMeta : metav1.ObjectMeta {
922
+ Name : "kubernetes" ,
923
+ Namespace : metav1 .NamespaceDefault ,
924
+ },
925
+ }
926
+
927
+ fakeService := & corev1.Service {
928
+ TypeMeta : metav1.TypeMeta {Kind : "Service" , APIVersion : "v1" },
929
+ ObjectMeta : metav1.ObjectMeta {
930
+ Name : "fake" ,
931
+ Namespace : metav1 .NamespaceDefault ,
932
+ },
933
+ Spec : corev1.ServiceSpec {
934
+ Ports : []corev1.ServicePort {
935
+ {
936
+ Name : "https" ,
937
+ Port : 443 ,
938
+ },
939
+ },
940
+ Type : "ClusterIP" ,
941
+ },
942
+ }
943
+
944
+ t .Log ("Verifying Kubernetes API Server Service has been created" )
945
+ g .Expect (env .Get (ctx , client .ObjectKeyFromObject (kubernetesAPIServerService ), kubernetesAPIServerService )).To (Succeed ())
946
+
947
+ fakeService .Spec .ClusterIP = kubernetesAPIServerService .Spec .ClusterIP
948
+
949
+ t .Log ("Let Kubernetes API Server Service fail to create by occupying its IP" )
950
+ g .Eventually (func () error {
951
+ err := env .Delete (ctx , kubernetesAPIServerService )
952
+ if err != nil {
953
+ return err
954
+ }
955
+ err = env .Create (ctx , fakeService )
956
+ if err != nil {
957
+ return err
958
+ }
959
+ return nil
960
+ }, timeout ).Should (Succeed ())
961
+ g .Expect (apierrors .IsNotFound (env .Get (ctx , client .ObjectKeyFromObject (kubernetesAPIServerService ), kubernetesAPIServerService ))).To (BeTrue ())
962
+
963
+ clusterResourceSetInstance := & addonsv1.ClusterResourceSet {
964
+ ObjectMeta : metav1.ObjectMeta {
965
+ Name : clusterResourceSetName ,
966
+ Namespace : ns .Name ,
967
+ },
968
+ Spec : addonsv1.ClusterResourceSetSpec {
969
+ ClusterSelector : metav1.LabelSelector {
970
+ MatchLabels : labels ,
971
+ },
972
+ },
973
+ }
974
+ // Create the ClusterResourceSet.
975
+ g .Expect (env .Create (ctx , clusterResourceSetInstance )).To (Succeed ())
976
+
977
+ testCluster .SetLabels (labels )
978
+ g .Expect (env .Update (ctx , testCluster )).To (Succeed ())
979
+
980
+ // ClusterResourceSetBinding for the Cluster is not created because the Kubernetes API Server Service doesn't exist.
981
+ clusterResourceSetBindingKey := client.ObjectKey {
982
+ Namespace : testCluster .Namespace ,
983
+ Name : testCluster .Name ,
984
+ }
985
+ g .Consistently (func () bool {
986
+ binding := & addonsv1.ClusterResourceSetBinding {}
987
+
988
+ err := env .Get (ctx , clusterResourceSetBindingKey , binding )
989
+ return apierrors .IsNotFound (err )
990
+ }, timeout ).Should (BeTrue ())
991
+
992
+ t .Log ("Make sure Kubernetes API Server Service has been created" )
993
+ g .Expect (env .Delete (ctx , fakeService )).Should (Succeed ())
994
+ g .Eventually (func () bool {
995
+ err := env .Get (ctx , client .ObjectKeyFromObject (kubernetesAPIServerService ), kubernetesAPIServerService )
996
+ return err == nil
997
+ }, timeout ).Should (BeTrue ())
998
+
999
+ // Wait until ClusterResourceSetBinding is created for the Cluster
1000
+ g .Eventually (func () bool {
1001
+ binding := & addonsv1.ClusterResourceSetBinding {}
1002
+
1003
+ err := env .Get (ctx , clusterResourceSetBindingKey , binding )
1004
+ return err == nil
1005
+ }, timeout ).Should (BeTrue ())
1006
+ })
913
1007
}
914
1008
915
1009
func clusterResourceSetBindingReady (env * envtest.Environment , cluster * clusterv1.Cluster ) func () bool {
0 commit comments