func checkPodIsolation(f1, f2 *e2e.Framework, nodeType NodeType) error { nodes := e2e.GetReadySchedulableNodesOrDie(f1.Client) var serverNode, clientNode *api.Node serverNode = &nodes.Items[0] if nodeType == DIFFERENT_NODE { if len(nodes.Items) == 1 { e2e.Skipf("Only one node is available in this environment") } clientNode = &nodes.Items[1] } else { clientNode = serverNode } podName := "isolation-webserver" defer f1.Client.Pods(f1.Namespace.Name).Delete(podName, nil) ip := e2e.LaunchWebserverPod(f1, podName, serverNode.Name) return checkConnectivityToHost(f2, clientNode.Name, "isolation-wget", ip, 10) }
func checkPodIsolation(f1, f2 *e2e.Framework, numNodes int) error { nodes, err := e2e.GetReadyNodes(f1) if err != nil { e2e.Failf("Failed to list nodes: %v", err) } var serverNode, clientNode *api.Node serverNode = &nodes.Items[0] if numNodes == 2 { if len(nodes.Items) == 1 { e2e.Skipf("Only one node is available in this environment") } clientNode = &nodes.Items[1] } else { clientNode = serverNode } podName := "isolation-webserver" defer f1.Client.Pods(f1.Namespace.Name).Delete(podName, nil) ip := e2e.LaunchWebserverPod(f1, podName, serverNode.Name) return checkConnectivityToHost(f2, clientNode.Name, "isolation-wget", ip, 10) }
func launchWebserverService(f *e2e.Framework, serviceName string, nodeName string) (serviceAddr string) { e2e.LaunchWebserverPod(f, serviceName, nodeName) // FIXME: make e2e.LaunchWebserverPod() set the label when creating the pod podClient := f.Client.Pods(f.Namespace.Name) pod, err := podClient.Get(serviceName) expectNoError(err) pod.ObjectMeta.Labels = make(map[string]string) pod.ObjectMeta.Labels["name"] = "web" podClient.Update(pod) servicePort := 8080 service := &api.Service{ ObjectMeta: api.ObjectMeta{ Name: serviceName, }, Spec: api.ServiceSpec{ Type: api.ServiceTypeClusterIP, Ports: []api.ServicePort{ { Protocol: api.ProtocolTCP, Port: int32(servicePort), }, }, Selector: map[string]string{ "name": "web", }, }, } serviceClient := f.Client.Services(f.Namespace.Name) _, err = serviceClient.Create(service) expectNoError(err) expectNoError(f.WaitForAnEndpoint(serviceName)) createdService, err := serviceClient.Get(serviceName) expectNoError(err) serviceAddr = fmt.Sprintf("%s:%d", createdService.Spec.ClusterIP, servicePort) e2e.Logf("Target service IP:port is %s", serviceAddr) return }
var _ = Describe("[networking] OVS", func() { Context("generic", func() { f1 := e2e.NewDefaultFramework("net-ovs1") oc := testexutil.NewCLI("get-flows", testexutil.KubeConfigPath()) It("should add and remove flows when pods are added and removed", func() { nodes := e2e.GetReadySchedulableNodesOrDie(f1.Client) origFlows := getFlowsForAllNodes(oc, nodes.Items) Expect(len(origFlows)).To(Equal(len(nodes.Items))) for _, flows := range origFlows { Expect(len(flows)).ToNot(Equal(0)) } podName := "ovs-test-webserver" deployNodeName := nodes.Items[0].Name ipPort := e2e.LaunchWebserverPod(f1, podName, deployNodeName) ip := strings.Split(ipPort, ":")[0] newFlows := getFlowsForAllNodes(oc, nodes.Items) for _, node := range nodes.Items { if node.Name != deployNodeName { Expect(reflect.DeepEqual(origFlows[node.Name], newFlows[node.Name])).To(BeTrue(), "Flows on non-deployed-to nodes should be unchanged") } } foundPodFlow := false for _, flow := range newFlows[deployNodeName] { if strings.Contains(flow, "="+ip+",") || strings.Contains(flow, "="+ip+" ") { foundPodFlow = true break }
}) framework.KubeDescribe("Granular Checks", func() { connectivityTimeout := 10 It("should function for pod communication on a single node", func() { By("Picking a node") nodes := framework.GetReadySchedulableNodesOrDie(f.Client) node := nodes.Items[0] By("Creating a webserver pod") podName := "same-node-webserver" defer f.Client.Pods(f.Namespace.Name).Delete(podName, nil) ip := framework.LaunchWebserverPod(f, podName, node.Name) By("Checking that the webserver is accessible from a pod on the same node") framework.ExpectNoError(framework.CheckConnectivityToHost(f, node.Name, "same-node-wget", ip, connectivityTimeout)) }) It("should function for pod communication between nodes", func() { podClient := f.Client.Pods(f.Namespace.Name) By("Picking multiple nodes") nodes := framework.GetReadySchedulableNodesOrDie(f.Client) if len(nodes.Items) == 1 { framework.Skipf("The test requires two Ready nodes on %s, but found just one.", framework.TestContext.Provider) }