@@ -11,16 +11,64 @@ import (
1111 corev1 "k8s.io/api/core/v1"
1212 kerrors "k8s.io/apimachinery/pkg/api/errors"
1313 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+ "k8s.io/apimachinery/pkg/util/intstr"
1415 "k8s.io/apimachinery/pkg/util/wait"
1516 "k8s.io/client-go/kubernetes"
1617)
1718
18- var _ = ginkgo .Describe ("map services from host to virtual cluster and vice versa" , func () {
19- var f * framework.Framework
20-
21- ginkgo .JustBeforeEach (func () {
22- // use default framework
19+ var _ = ginkgo .Describe ("Verify mapping and syncing of services and endpoints" , func () {
20+ var (
21+ f * framework.Framework
22+ testService * corev1.Service
23+ testEndpoint * corev1.Endpoints
24+ serviceName = "test-service-sync"
25+ serviceNamespace = "default"
26+ endpointName = "test-service-sync"
27+ )
28+ ginkgo .BeforeAll (func () {
2329 f = framework .DefaultFramework
30+ testService = & corev1.Service {
31+ ObjectMeta : metav1.ObjectMeta {
32+ Name : serviceName ,
33+ Namespace : serviceNamespace ,
34+ },
35+ Spec : corev1.ServiceSpec {
36+ ClusterIP : "None" ,
37+ Ports : []corev1.ServicePort {
38+ {
39+ Name : "custom-port" ,
40+ Port : 8080 ,
41+ Protocol : corev1 .ProtocolTCP ,
42+ TargetPort : intstr .FromInt (5000 ),
43+ },
44+ },
45+ },
46+ }
47+ testEndpoint = & corev1.Endpoints {
48+ ObjectMeta : metav1.ObjectMeta {
49+ Name : endpointName ,
50+ Namespace : serviceNamespace ,
51+ },
52+ Subsets : []corev1.EndpointSubset {
53+ {
54+ Addresses : []corev1.EndpointAddress {
55+ {
56+ IP : "1.1.1.1" ,
57+ },
58+ },
59+ Ports : []corev1.EndpointPort {
60+ {
61+ Port : 5000 ,
62+ },
63+ },
64+ },
65+ },
66+ }
67+ })
68+
69+ ginkgo .AfterAll (func () {
70+ framework .ExpectNoError (f .VClusterClient .CoreV1 ().Endpoints (serviceNamespace ).Delete (f .Context , endpointName , metav1.DeleteOptions {}))
71+ framework .ExpectNoError (f .VClusterClient .CoreV1 ().Services (serviceNamespace ).Delete (f .Context , serviceName , metav1.DeleteOptions {}))
2472 })
2573
2674 ginkgo .It ("Test service mapping" , func () {
@@ -54,6 +102,39 @@ var _ = ginkgo.Describe("map services from host to virtual cluster and vice vers
54102 checkEndpointsSync (f .Context , f .VClusterClient , "test" , "nginx" , f .HostClient , f .VClusterNamespace , "nginx" )
55103 })
56104 })
105+
106+ ginkgo .Context ("Verify endpoint sync when endpoint is deployed before service" , func () {
107+ ginkgo .It ("Should sync Service, Endpoints, and EndpointSlice from vCluster to host cluster" , func () {
108+ ctx := f .Context
109+
110+ ginkgo .By ("Create Service Endpoint in vCluster" )
111+ _ , err := f .VClusterClient .CoreV1 ().Endpoints (serviceNamespace ).Create (f .Context , testEndpoint , metav1.CreateOptions {})
112+ framework .ExpectNoError (err )
113+
114+ ginkgo .By ("Create Service in vCluster" )
115+ _ , err = f .VClusterClient .CoreV1 ().Services (serviceNamespace ).Create (f .Context , testService , metav1.CreateOptions {})
116+ framework .ExpectNoError (err )
117+
118+ ginkgo .By ("Verify Endpoint exists in vCluster" )
119+ _ , err = f .VClusterClient .CoreV1 ().Endpoints (serviceNamespace ).Get (ctx , endpointName , metav1.GetOptions {})
120+ framework .ExpectNoError (err )
121+
122+ ginkgo .By ("Verify Service exists in vCluster" )
123+ _ , err = f .VClusterClient .CoreV1 ().Services (serviceNamespace ).Get (ctx , serviceName , metav1.GetOptions {})
124+ framework .ExpectNoError (err )
125+
126+ translatedServiceName := translate .SingleNamespaceHostName (serviceName , serviceNamespace , translate .VClusterName )
127+
128+ ginkgo .By ("Verify Service exists in Host Cluster" )
129+ _ , err = f .HostClient .CoreV1 ().Services (f .VClusterNamespace ).Get (ctx , translatedServiceName , metav1.GetOptions {})
130+ framework .ExpectNoError (err )
131+
132+ ginkgo .By ("Verify Endpoint exists in Host Cluster" )
133+ _ , err = f .HostClient .CoreV1 ().Endpoints (f .VClusterNamespace ).Get (ctx , translatedServiceName , metav1.GetOptions {})
134+ framework .ExpectNoError (err )
135+
136+ })
137+ })
57138})
58139
59140func testMapping (ctx context.Context , fromClient kubernetes.Interface , fromNamespace , fromName string , toClient kubernetes.Interface , toNamespace , toName string , checkEndpoints bool ) {
0 commit comments