Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 22a8b6e

Browse filesBrowse files
danwinshipzylxjtu
authored andcommitted
Add an integration test for PreferSameTrafficDistribution
1 parent 292b9a3 commit 22a8b6e
Copy full SHA for 22a8b6e

File tree

Expand file treeCollapse file tree

1 file changed

+203
-0
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+203
-0
lines changed

‎test/integration/service/service_test.go

Copy file name to clipboardExpand all lines: test/integration/service/service_test.go
+203Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,209 @@ func Test_TransitionsForTrafficDistribution(t *testing.T) {
551551
assertEndpointSliceHints(t, ctx, client, ns.GetName(), svc.GetName(), false, false)
552552
}
553553

554+
// Test transitions involving the `trafficDistribution` field with
555+
// PreferSameTrafficDistribution enabled.
556+
func Test_TransitionsForPreferSameTrafficDistribution(t *testing.T) {
557+
558+
////////////////////////////////////////////////////////////////////////////
559+
// Setup components, like kube-apiserver and EndpointSlice controller.
560+
////////////////////////////////////////////////////////////////////////////
561+
562+
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ServiceTrafficDistribution, true)
563+
featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PreferSameTrafficDistribution, true)
564+
565+
// Disable ServiceAccount admission plugin as we don't have serviceaccount controller running.
566+
server := kubeapiservertesting.StartTestServerOrDie(t, nil, framework.DefaultTestServerFlags(), framework.SharedEtcd())
567+
defer server.TearDownFn()
568+
569+
client, err := clientset.NewForConfig(server.ClientConfig)
570+
if err != nil {
571+
t.Fatalf("Error creating clientset: %v", err)
572+
}
573+
574+
resyncPeriod := 12 * time.Hour
575+
informers := informers.NewSharedInformerFactory(client, resyncPeriod)
576+
577+
ctx := ktesting.Init(t)
578+
defer ctx.Cancel("test has completed")
579+
epsController := endpointslice.NewController(
580+
ctx,
581+
informers.Core().V1().Pods(),
582+
informers.Core().V1().Services(),
583+
informers.Core().V1().Nodes(),
584+
informers.Discovery().V1().EndpointSlices(),
585+
int32(100),
586+
client,
587+
1*time.Second,
588+
)
589+
590+
informers.Start(ctx.Done())
591+
go epsController.Run(ctx, 1)
592+
593+
////////////////////////////////////////////////////////////////////////////
594+
// Create a namespace, node, pod in the node, and a service exposing the pod.
595+
////////////////////////////////////////////////////////////////////////////
596+
597+
ns := framework.CreateNamespaceOrDie(client, "test-service-traffic-distribution", t)
598+
defer framework.DeleteNamespaceOrDie(client, ns, t)
599+
600+
node := &corev1.Node{
601+
ObjectMeta: metav1.ObjectMeta{
602+
Name: "fake-node",
603+
Labels: map[string]string{
604+
corev1.LabelTopologyZone: "fake-zone-1",
605+
},
606+
},
607+
}
608+
609+
pod := &corev1.Pod{
610+
ObjectMeta: metav1.ObjectMeta{
611+
Name: "test-pod",
612+
Namespace: ns.GetName(),
613+
Labels: map[string]string{
614+
"foo": "bar",
615+
},
616+
},
617+
Spec: corev1.PodSpec{
618+
NodeName: node.GetName(),
619+
Containers: []corev1.Container{
620+
{
621+
Name: "fake-name",
622+
Image: "fake-image",
623+
Ports: []corev1.ContainerPort{
624+
{
625+
Name: "port-443",
626+
ContainerPort: 443,
627+
},
628+
},
629+
},
630+
},
631+
},
632+
Status: corev1.PodStatus{
633+
Phase: corev1.PodRunning,
634+
Conditions: []corev1.PodCondition{
635+
{
636+
Type: corev1.PodReady,
637+
Status: corev1.ConditionTrue,
638+
},
639+
},
640+
PodIP: "10.0.0.1",
641+
PodIPs: []corev1.PodIP{
642+
{
643+
IP: "10.0.0.1",
644+
},
645+
},
646+
},
647+
}
648+
649+
svc := &corev1.Service{
650+
ObjectMeta: metav1.ObjectMeta{
651+
Name: "test-service",
652+
Namespace: ns.GetName(),
653+
},
654+
Spec: corev1.ServiceSpec{
655+
Selector: map[string]string{
656+
"foo": "bar",
657+
},
658+
Ports: []corev1.ServicePort{
659+
{Name: "port-443", Port: 443, Protocol: "TCP", TargetPort: intstr.FromInt32(443)},
660+
},
661+
},
662+
}
663+
664+
_, err = client.CoreV1().Nodes().Create(ctx, node, metav1.CreateOptions{})
665+
if err != nil {
666+
t.Fatalf("Failed to create test node: %v", err)
667+
}
668+
_, err = client.CoreV1().Pods(ns.Name).Create(ctx, pod, metav1.CreateOptions{})
669+
if err != nil {
670+
t.Fatalf("Failed to create test ready pod: %v", err)
671+
}
672+
_, err = client.CoreV1().Pods(ns.Name).UpdateStatus(ctx, pod, metav1.UpdateOptions{})
673+
if err != nil {
674+
t.Fatalf("Failed to update status for test pod to Ready: %v", err)
675+
}
676+
_, err = client.CoreV1().Services(ns.Name).Create(ctx, svc, metav1.CreateOptions{})
677+
if err != nil {
678+
t.Fatalf("Failed to create test service: %v", err)
679+
}
680+
681+
////////////////////////////////////////////////////////////////////////////
682+
// Assert that without the presence of `trafficDistribution` field there are
683+
// no zone hints in EndpointSlice.
684+
////////////////////////////////////////////////////////////////////////////
685+
686+
assertEndpointSliceHints(t, ctx, client, ns.GetName(), svc.GetName(), false, false)
687+
688+
////////////////////////////////////////////////////////////////////////////
689+
// Update the service by setting `trafficDistribution: PreferSameZone`
690+
//
691+
// Assert that the respective EndpointSlices get the same-zone hints.
692+
////////////////////////////////////////////////////////////////////////////
693+
694+
trafficDist := corev1.ServiceTrafficDistributionPreferSameZone
695+
svc.Spec.TrafficDistribution = &trafficDist
696+
_, err = client.CoreV1().Services(ns.Name).Update(ctx, svc, metav1.UpdateOptions{})
697+
if err != nil {
698+
t.Fatalf("Failed to update test service with 'trafficDistribution: PreferSameZone': %v", err)
699+
}
700+
701+
assertEndpointSliceHints(t, ctx, client, ns.GetName(), svc.GetName(), true, false)
702+
703+
////////////////////////////////////////////////////////////////////////////
704+
// Change `trafficDistribution` to `PreferSameNode`.
705+
//
706+
// Assert that the respective EndpointSlices have both same-zone and
707+
// same-node hints.
708+
////////////////////////////////////////////////////////////////////////////
709+
710+
trafficDist = corev1.ServiceTrafficDistributionPreferSameNode
711+
svc.Spec.TrafficDistribution = &trafficDist
712+
_, err = client.CoreV1().Services(ns.Name).Update(ctx, svc, metav1.UpdateOptions{})
713+
if err != nil {
714+
t.Fatalf("Failed to update test service with 'trafficDistribution: PreferSameNode': %v", err)
715+
}
716+
717+
assertEndpointSliceHints(t, ctx, client, ns.GetName(), svc.GetName(), true, true)
718+
719+
////////////////////////////////////////////////////////////////////////////
720+
// Remove the field `trafficDistribution` from the service.
721+
//
722+
// Assert that EndpointSlice for service again has no zone hints.
723+
////////////////////////////////////////////////////////////////////////////
724+
725+
svc.Spec.TrafficDistribution = nil
726+
_, err = client.CoreV1().Services(ns.Name).Update(ctx, svc, metav1.UpdateOptions{})
727+
if err != nil {
728+
t.Fatalf("Failed to remove annotation 'service.kubernetes.io/topology-mode=Auto' from service: %v", err)
729+
}
730+
731+
assertEndpointSliceHints(t, ctx, client, ns.GetName(), svc.GetName(), false, false)
732+
733+
////////////////////////////////////////////////////////////////////////////
734+
// Update the Node to no longer have a zone label, and re-enable
735+
// `PreferSameNode`.
736+
//
737+
// Assert that the respective EndpointSlices have same-node hints but not
738+
// same-zone.
739+
////////////////////////////////////////////////////////////////////////////
740+
741+
delete(node.Labels, corev1.LabelTopologyZone)
742+
_, err = client.CoreV1().Nodes().Update(ctx, node, metav1.UpdateOptions{})
743+
if err != nil {
744+
t.Fatalf("Failed to update test node with no zone label: %v", err)
745+
}
746+
747+
trafficDist = corev1.ServiceTrafficDistributionPreferSameNode
748+
svc.Spec.TrafficDistribution = &trafficDist
749+
_, err = client.CoreV1().Services(ns.Name).Update(ctx, svc, metav1.UpdateOptions{})
750+
if err != nil {
751+
t.Fatalf("Failed to update test service with 'trafficDistribution: PreferSameNode': %v", err)
752+
}
753+
754+
assertEndpointSliceHints(t, ctx, client, ns.GetName(), svc.GetName(), false, true)
755+
}
756+
554757
func Test_TrafficDistribution_FeatureGateEnableDisable(t *testing.T) {
555758

556759
////////////////////////////////////////////////////////////////////////////

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.