k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/test/e2e/network/service_cidrs.go (about) 1 /* 2 Copyright 2023 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package network 18 19 import ( 20 "context" 21 22 "github.com/onsi/ginkgo/v2" 23 v1 "k8s.io/api/core/v1" 24 networkingv1alpha1 "k8s.io/api/networking/v1alpha1" 25 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 26 "k8s.io/apimachinery/pkg/util/intstr" 27 "k8s.io/apimachinery/pkg/util/wait" 28 clientset "k8s.io/client-go/kubernetes" 29 "k8s.io/kubernetes/test/e2e/feature" 30 "k8s.io/kubernetes/test/e2e/framework" 31 e2enode "k8s.io/kubernetes/test/e2e/framework/node" 32 e2epod "k8s.io/kubernetes/test/e2e/framework/pod" 33 e2eservice "k8s.io/kubernetes/test/e2e/framework/service" 34 e2eskipper "k8s.io/kubernetes/test/e2e/framework/skipper" 35 "k8s.io/kubernetes/test/e2e/network/common" 36 admissionapi "k8s.io/pod-security-admission/api" 37 ) 38 39 var _ = common.SIGDescribe(feature.ServiceCIDRs, func() { 40 41 fr := framework.NewDefaultFramework("servicecidrs") 42 fr.NamespacePodSecurityEnforceLevel = admissionapi.LevelPrivileged 43 44 var ( 45 cs clientset.Interface 46 ns string 47 ) 48 49 ginkgo.BeforeEach(func(ctx context.Context) { 50 cs = fr.ClientSet 51 ns = fr.Namespace.Name 52 53 nodes, err := e2enode.GetBoundedReadySchedulableNodes(ctx, cs, 2) 54 framework.ExpectNoError(err) 55 if len(nodes.Items) < 2 { 56 e2eskipper.Skipf( 57 "Test requires >= 2 Ready nodes, but there are only %v nodes", 58 len(nodes.Items)) 59 } 60 61 }) 62 63 ginkgo.It("should create Services and servce on different Service CIDRs", func(ctx context.Context) { 64 // create a new service CIDR 65 svcCIDR := &networkingv1alpha1.ServiceCIDR{ 66 ObjectMeta: metav1.ObjectMeta{ 67 Name: "test-svc-cidr", 68 }, 69 Spec: networkingv1alpha1.ServiceCIDRSpec{ 70 CIDRs: []string{"10.196.196.0/24"}, 71 }, 72 } 73 _, err := cs.NetworkingV1alpha1().ServiceCIDRs().Create(context.TODO(), svcCIDR, metav1.CreateOptions{}) 74 framework.ExpectNoError(err, "error creating ServiceCIDR") 75 if pollErr := wait.PollUntilContextTimeout(ctx, framework.Poll, e2eservice.RespondingTimeout, false, func(ctx context.Context) (bool, error) { 76 svcCIDR, err := cs.NetworkingV1alpha1().ServiceCIDRs().Get(ctx, svcCIDR.Name, metav1.GetOptions{}) 77 if err != nil { 78 return false, nil 79 } 80 return isReady(svcCIDR), nil 81 }); pollErr != nil { 82 framework.Failf("Failed to wait for serviceCIDR to be ready: %v", pollErr) 83 } 84 85 serviceName := "cidr1-test" 86 jig := e2eservice.NewTestJig(cs, ns, serviceName) 87 88 ginkgo.By("creating service " + serviceName + " with type=NodePort in namespace " + ns) 89 nodePortService, err := jig.CreateTCPService(ctx, func(svc *v1.Service) { 90 svc.Spec.ClusterIP = "10.196.196.77" 91 svc.Spec.Type = v1.ServiceTypeNodePort 92 svc.Spec.Ports = []v1.ServicePort{ 93 {Port: 80, Name: "http", Protocol: v1.ProtocolTCP, TargetPort: intstr.FromInt(9376)}, 94 } 95 }) 96 framework.ExpectNoError(err) 97 err = jig.CreateServicePods(ctx, 2) 98 framework.ExpectNoError(err) 99 execPod := e2epod.CreateExecPodOrFail(ctx, cs, ns, "execpod", nil) 100 err = jig.CheckServiceReachability(ctx, nodePortService, execPod) 101 framework.ExpectNoError(err) 102 }) 103 104 }) 105 106 func isReady(serviceCIDR *networkingv1alpha1.ServiceCIDR) bool { 107 if serviceCIDR == nil { 108 return false 109 } 110 111 for _, condition := range serviceCIDR.Status.Conditions { 112 if condition.Type == string(networkingv1alpha1.ServiceCIDRConditionReady) { 113 return condition.Status == metav1.ConditionStatus(metav1.ConditionTrue) 114 } 115 } 116 return false 117 }