diff --git a/test/e2e/network/hostport.go b/test/e2e/network/hostport.go index e665435544e..7ddcb39a611 100644 --- a/test/e2e/network/hostport.go +++ b/test/e2e/network/hostport.go @@ -19,6 +19,7 @@ package network import ( "context" "fmt" + "math/rand" "net" "strconv" @@ -71,24 +72,24 @@ var _ = SIGDescribe("HostPort", func() { framework.Failf("No nodes available") } - nodeName := nodes.Items[0].Name + randomNode := &nodes.Items[rand.Intn(len(nodes.Items))] - ips := e2enode.GetAddressesByTypeAndFamily(&nodes.Items[0], v1.NodeInternalIP, family) + ips := e2enode.GetAddressesByTypeAndFamily(randomNode, v1.NodeInternalIP, family) if len(ips) == 0 { framework.Failf("Failed to get NodeIP") } hostIP := ips[0] - port := int32(54321) + port := int32(54323) // Create pods with the same HostPort ginkgo.By(fmt.Sprintf("Trying to create a pod(pod1) with hostport %v and hostIP %s and expect scheduled", port, localhost)) - createHostPortPodOnNode(f, "pod1", ns, localhost, port, v1.ProtocolTCP, nodeName) + createHostPortPodOnNode(f, "pod1", ns, localhost, port, v1.ProtocolTCP, randomNode.Name) ginkgo.By(fmt.Sprintf("Trying to create another pod(pod2) with hostport %v but hostIP %s on the node which pod1 resides and expect scheduled", port, hostIP)) - createHostPortPodOnNode(f, "pod2", ns, hostIP, port, v1.ProtocolTCP, nodeName) + createHostPortPodOnNode(f, "pod2", ns, hostIP, port, v1.ProtocolTCP, randomNode.Name) ginkgo.By(fmt.Sprintf("Trying to create a third pod(pod3) with hostport %v, hostIP %s but use UDP protocol on the node which pod2 resides", port, hostIP)) - createHostPortPodOnNode(f, "pod3", ns, hostIP, port, v1.ProtocolUDP, nodeName) + createHostPortPodOnNode(f, "pod3", ns, hostIP, port, v1.ProtocolUDP, randomNode.Name) // check that the port is being actually exposed to each container // create a pod on the host network in the same node @@ -99,7 +100,7 @@ var _ = SIGDescribe("HostPort", func() { }, Spec: v1.PodSpec{ HostNetwork: true, - NodeName: nodeName, + NodeName: randomNode.Name, Containers: []v1.Container{ { Name: "e2e-host-exec", diff --git a/test/e2e/storage/persistent_volumes-local.go b/test/e2e/storage/persistent_volumes-local.go index 35dce5150b5..61a0202d5fc 100644 --- a/test/e2e/storage/persistent_volumes-local.go +++ b/test/e2e/storage/persistent_volumes-local.go @@ -19,6 +19,7 @@ package storage import ( "context" "fmt" + "math/rand" "path/filepath" "strconv" "strings" @@ -53,7 +54,7 @@ import ( type localTestConfig struct { ns string nodes []v1.Node - node0 *v1.Node + randomNode *v1.Node client clientset.Interface timeouts *framework.TimeoutContext scName string @@ -159,8 +160,8 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { framework.ExpectNoError(err) scName = fmt.Sprintf("%v-%v", testSCPrefix, f.Namespace.Name) - // Choose the first node - node0 := &nodes.Items[0] + // Choose a random node + randomNode := &nodes.Items[rand.Intn(len(nodes.Items))] hostExec := utils.NewHostExec(f) ltrMgr := utils.NewLocalResourceManager("local-volume-test", hostExec, hostBase) @@ -169,7 +170,7 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { client: f.ClientSet, timeouts: f.Timeouts, nodes: nodes.Items, - node0: node0, + randomNode: randomNode, scName: scName, discoveryDir: filepath.Join(hostBase, f.Namespace.Name), hostExec: hostExec, @@ -193,10 +194,10 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { ginkgo.BeforeEach(func() { if testVolType == GCELocalSSDVolumeType { - SkipUnlessLocalSSDExists(config, "scsi", "fs", config.node0) + SkipUnlessLocalSSDExists(config, "scsi", "fs", config.randomNode) } setupStorageClass(config, &testMode) - testVols := setupLocalVolumesPVCsPVs(config, testVolType, config.node0, 1, testMode) + testVols := setupLocalVolumesPVCsPVs(config, testVolType, config.randomNode, 1, testMode) testVol = testVols[0] }) @@ -215,7 +216,7 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { ginkgo.By("Creating pod1") pod1, pod1Err = createLocalPod(config, testVol, nil) framework.ExpectNoError(pod1Err) - verifyLocalPod(config, testVol, pod1, config.node0.Name) + verifyLocalPod(config, testVol, pod1, config.randomNode.Name) writeCmd := createWriteCmd(volumeDir, testFile, testFileContent, testVol.localVolumeType) @@ -306,7 +307,7 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { ginkgo.It("should fail due to non-existent path", func() { testVol := &localTestVolume{ ltr: &utils.LocalTestResource{ - Node: config.node0, + Node: config.randomNode, Path: "/non-existent/location/nowhere", }, localVolumeType: DirectoryLocalVolumeType, @@ -325,10 +326,14 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { e2eskipper.Skipf("Runs only when number of nodes >= 2") } - testVols := setupLocalVolumesPVCsPVs(config, DirectoryLocalVolumeType, config.node0, 1, immediateMode) + testVols := setupLocalVolumesPVCsPVs(config, DirectoryLocalVolumeType, config.randomNode, 1, immediateMode) testVol := testVols[0] - pod := makeLocalPodWithNodeName(config, testVol, config.nodes[1].Name) + conflictNodeName := config.nodes[0].Name + if conflictNodeName == config.randomNode.Name { + conflictNodeName = config.nodes[1].Name + } + pod := makeLocalPodWithNodeName(config, testVol, conflictNodeName) pod, err := config.client.CoreV1().Pods(config.ns).Create(context.TODO(), pod, metav1.CreateOptions{}) framework.ExpectNoError(err) @@ -341,8 +346,9 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { ginkgo.Context("Pod with node different from PV's NodeAffinity", func() { var ( - testVol *localTestVolume - volumeType localVolumeType + testVol *localTestVolume + volumeType localVolumeType + conflictNodeName string ) ginkgo.BeforeEach(func() { @@ -352,7 +358,12 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { volumeType = DirectoryLocalVolumeType setupStorageClass(config, &immediateMode) - testVols := setupLocalVolumesPVCsPVs(config, volumeType, config.node0, 1, immediateMode) + testVols := setupLocalVolumesPVCsPVs(config, volumeType, config.randomNode, 1, immediateMode) + conflictNodeName = config.nodes[0].Name + if conflictNodeName == config.randomNode.Name { + conflictNodeName = config.nodes[1].Name + } + testVol = testVols[0] }) @@ -362,11 +373,11 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { }) ginkgo.It("should fail scheduling due to different NodeAffinity", func() { - testPodWithNodeConflict(config, volumeType, config.nodes[1].Name, makeLocalPodWithNodeAffinity, immediateMode) + testPodWithNodeConflict(config, volumeType, conflictNodeName, makeLocalPodWithNodeAffinity, immediateMode) }) ginkgo.It("should fail scheduling due to different NodeSelector", func() { - testPodWithNodeConflict(config, volumeType, config.nodes[1].Name, makeLocalPodWithNodeSelector, immediateMode) + testPodWithNodeConflict(config, volumeType, conflictNodeName, makeLocalPodWithNodeSelector, immediateMode) }) }) @@ -623,7 +634,7 @@ var _ = utils.SIGDescribe("PersistentVolumes-local ", func() { ginkgo.BeforeEach(func() { localVolume := &localTestVolume{ ltr: &utils.LocalTestResource{ - Node: config.node0, + Node: config.randomNode, Path: "/tmp", }, localVolumeType: DirectoryLocalVolumeType, @@ -711,7 +722,7 @@ type makeLocalPodWith func(config *localTestConfig, volume *localTestVolume, nod func testPodWithNodeConflict(config *localTestConfig, testVolType localVolumeType, nodeName string, makeLocalPodFunc makeLocalPodWith, bindingMode storagev1.VolumeBindingMode) { ginkgo.By(fmt.Sprintf("local-volume-type: %s", testVolType)) - testVols := setupLocalVolumesPVCsPVs(config, testVolType, config.node0, 1, bindingMode) + testVols := setupLocalVolumesPVCsPVs(config, testVolType, config.randomNode, 1, bindingMode) testVol := testVols[0] pod := makeLocalPodFunc(config, testVol, nodeName) @@ -729,7 +740,7 @@ func twoPodsReadWriteTest(f *framework.Framework, config *localTestConfig, testV ginkgo.By("Creating pod1 to write to the PV") pod1, pod1Err := createLocalPod(config, testVol, nil) framework.ExpectNoError(pod1Err) - verifyLocalPod(config, testVol, pod1, config.node0.Name) + verifyLocalPod(config, testVol, pod1, config.randomNode.Name) writeCmd := createWriteCmd(volumeDir, testFile, testFileContent, testVol.localVolumeType) @@ -742,7 +753,7 @@ func twoPodsReadWriteTest(f *framework.Framework, config *localTestConfig, testV ginkgo.By("Creating pod2 to read from the PV") pod2, pod2Err := createLocalPod(config, testVol, nil) framework.ExpectNoError(pod2Err) - verifyLocalPod(config, testVol, pod2, config.node0.Name) + verifyLocalPod(config, testVol, pod2, config.randomNode.Name) // testFileContent was written after creating pod1 testReadFileContent(f, volumeDir, testFile, testFileContent, pod2, testVol.localVolumeType) @@ -766,7 +777,7 @@ func twoPodsReadWriteSerialTest(f *framework.Framework, config *localTestConfig, ginkgo.By("Creating pod1") pod1, pod1Err := createLocalPod(config, testVol, nil) framework.ExpectNoError(pod1Err) - verifyLocalPod(config, testVol, pod1, config.node0.Name) + verifyLocalPod(config, testVol, pod1, config.randomNode.Name) writeCmd := createWriteCmd(volumeDir, testFile, testFileContent, testVol.localVolumeType) @@ -782,7 +793,7 @@ func twoPodsReadWriteSerialTest(f *framework.Framework, config *localTestConfig, ginkgo.By("Creating pod2") pod2, pod2Err := createLocalPod(config, testVol, nil) framework.ExpectNoError(pod2Err) - verifyLocalPod(config, testVol, pod2, config.node0.Name) + verifyLocalPod(config, testVol, pod2, config.randomNode.Name) ginkgo.By("Reading in pod2") testReadFileContent(f, volumeDir, testFile, testFileContent, pod2, testVol.localVolumeType)