mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-10-31 18:28:13 +00:00 
			
		
		
		
	drop unused code pointed out by linter
Signed-off-by: Davanum Srinivas <davanum@gmail.com>
This commit is contained in:
		| @@ -61,20 +61,8 @@ const ( | |||||||
| 	// The no. of NodeSpec updates NC can process concurrently. | 	// The no. of NodeSpec updates NC can process concurrently. | ||||||
| 	cidrUpdateWorkers = 30 | 	cidrUpdateWorkers = 30 | ||||||
|  |  | ||||||
| 	// The max no. of NodeSpec updates that can be enqueued. |  | ||||||
| 	cidrUpdateQueueSize = 5000 |  | ||||||
|  |  | ||||||
| 	// cidrUpdateRetries is the no. of times a NodeSpec update will be retried before dropping it. | 	// cidrUpdateRetries is the no. of times a NodeSpec update will be retried before dropping it. | ||||||
| 	cidrUpdateRetries = 3 | 	cidrUpdateRetries = 3 | ||||||
|  |  | ||||||
| 	// updateRetryTimeout is the time to wait before requeing a failed node for retry |  | ||||||
| 	updateRetryTimeout = 250 * time.Millisecond |  | ||||||
|  |  | ||||||
| 	// maxUpdateRetryTimeout is the maximum amount of time between timeouts. |  | ||||||
| 	maxUpdateRetryTimeout = 5 * time.Second |  | ||||||
|  |  | ||||||
| 	// updateMaxRetries is the max retries for a failed node |  | ||||||
| 	updateMaxRetries = 10 |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // nodePollInterval is used in listing node | // nodePollInterval is used in listing node | ||||||
|   | |||||||
| @@ -19,9 +19,6 @@ package nodeipam | |||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"net" |  | ||||||
| 	"time" |  | ||||||
|  |  | ||||||
| 	utilruntime "k8s.io/apimachinery/pkg/util/runtime" | 	utilruntime "k8s.io/apimachinery/pkg/util/runtime" | ||||||
| 	coreinformers "k8s.io/client-go/informers/core/v1" | 	coreinformers "k8s.io/client-go/informers/core/v1" | ||||||
| 	clientset "k8s.io/client-go/kubernetes" | 	clientset "k8s.io/client-go/kubernetes" | ||||||
| @@ -33,18 +30,7 @@ import ( | |||||||
| 	controllersmetrics "k8s.io/component-base/metrics/prometheus/controllers" | 	controllersmetrics "k8s.io/component-base/metrics/prometheus/controllers" | ||||||
| 	"k8s.io/klog/v2" | 	"k8s.io/klog/v2" | ||||||
| 	"k8s.io/kubernetes/pkg/controller/nodeipam/ipam" | 	"k8s.io/kubernetes/pkg/controller/nodeipam/ipam" | ||||||
| ) | 	"net" | ||||||
|  |  | ||||||
| const ( |  | ||||||
| 	// ipamResyncInterval is the amount of time between when the cloud and node |  | ||||||
| 	// CIDR range assignments are synchronized. |  | ||||||
| 	ipamResyncInterval = 30 * time.Second |  | ||||||
| 	// ipamMaxBackoff is the maximum backoff for retrying synchronization of a |  | ||||||
| 	// given in the error state. |  | ||||||
| 	ipamMaxBackoff = 10 * time.Second |  | ||||||
| 	// ipamInitialRetry is the initial retry interval for retrying synchronization of a |  | ||||||
| 	// given in the error state. |  | ||||||
| 	ipamInitialBackoff = 250 * time.Millisecond |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // ipamController is an interface abstracting an interface for | // ipamController is an interface abstracting an interface for | ||||||
|   | |||||||
| @@ -23,7 +23,6 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"math/rand" | 	"math/rand" | ||||||
| 	"net" | 	"net" | ||||||
| 	"net/http" |  | ||||||
| 	"sort" | 	"sort" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
| @@ -40,7 +39,6 @@ import ( | |||||||
| 	"k8s.io/apimachinery/pkg/runtime/schema" | 	"k8s.io/apimachinery/pkg/runtime/schema" | ||||||
| 	"k8s.io/apimachinery/pkg/types" | 	"k8s.io/apimachinery/pkg/types" | ||||||
| 	"k8s.io/apimachinery/pkg/util/intstr" | 	"k8s.io/apimachinery/pkg/util/intstr" | ||||||
| 	utilnet "k8s.io/apimachinery/pkg/util/net" |  | ||||||
| 	utilrand "k8s.io/apimachinery/pkg/util/rand" | 	utilrand "k8s.io/apimachinery/pkg/util/rand" | ||||||
| 	"k8s.io/apimachinery/pkg/util/sets" | 	"k8s.io/apimachinery/pkg/util/sets" | ||||||
| 	"k8s.io/apimachinery/pkg/util/wait" | 	"k8s.io/apimachinery/pkg/util/wait" | ||||||
| @@ -52,7 +50,6 @@ import ( | |||||||
| 	watchtools "k8s.io/client-go/tools/watch" | 	watchtools "k8s.io/client-go/tools/watch" | ||||||
| 	"k8s.io/client-go/util/retry" | 	"k8s.io/client-go/util/retry" | ||||||
|  |  | ||||||
| 	cloudprovider "k8s.io/cloud-provider" |  | ||||||
| 	netutils "k8s.io/utils/net" | 	netutils "k8s.io/utils/net" | ||||||
| 	utilpointer "k8s.io/utils/pointer" | 	utilpointer "k8s.io/utils/pointer" | ||||||
|  |  | ||||||
| @@ -429,21 +426,6 @@ func verifyServeHostnameServiceDown(ctx context.Context, c clientset.Interface, | |||||||
| 	return fmt.Errorf("waiting for service to be down timed out") | 	return fmt.Errorf("waiting for service to be down timed out") | ||||||
| } | } | ||||||
|  |  | ||||||
| // testNotReachableHTTP tests that a HTTP request doesn't connect to the given host and port. |  | ||||||
| func testNotReachableHTTP(host string, port int, timeout time.Duration) { |  | ||||||
| 	pollfn := func() (bool, error) { |  | ||||||
| 		result := e2enetwork.PokeHTTP(host, port, "/", nil) |  | ||||||
| 		if result.Code == 0 { |  | ||||||
| 			return true, nil |  | ||||||
| 		} |  | ||||||
| 		return false, nil // caller can retry |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if err := wait.PollImmediate(framework.Poll, timeout, pollfn); err != nil { |  | ||||||
| 		framework.Failf("HTTP service %v:%v reachable after %v: %v", host, port, timeout, err) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // UDPPokeParams is a struct for UDP poke parameters. | // UDPPokeParams is a struct for UDP poke parameters. | ||||||
| type UDPPokeParams struct { | type UDPPokeParams struct { | ||||||
| 	Timeout  time.Duration | 	Timeout  time.Duration | ||||||
| @@ -474,241 +456,6 @@ const ( | |||||||
| 	// Any time we add new errors, we should audit all callers of this. | 	// Any time we add new errors, we should audit all callers of this. | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // pokeUDP tries to connect to a host on a port and send the given request. Callers |  | ||||||
| // can specify additional success parameters, if desired. |  | ||||||
| // |  | ||||||
| // The result status will be characterized as precisely as possible, given the |  | ||||||
| // known users of this. |  | ||||||
| // |  | ||||||
| // The result error will be populated for any status other than Success. |  | ||||||
| // |  | ||||||
| // The result response will be populated if the UDP transaction was completed, even |  | ||||||
| // if the other test params make this a failure). |  | ||||||
| func pokeUDP(host string, port int, request string, params *UDPPokeParams) UDPPokeResult { |  | ||||||
| 	hostPort := net.JoinHostPort(host, strconv.Itoa(port)) |  | ||||||
| 	url := fmt.Sprintf("udp://%s", hostPort) |  | ||||||
|  |  | ||||||
| 	ret := UDPPokeResult{} |  | ||||||
|  |  | ||||||
| 	// Sanity check inputs, because it has happened.  These are the only things |  | ||||||
| 	// that should hard fail the test - they are basically ASSERT()s. |  | ||||||
| 	if host == "" { |  | ||||||
| 		framework.Failf("Got empty host for UDP poke (%s)", url) |  | ||||||
| 		return ret |  | ||||||
| 	} |  | ||||||
| 	if port == 0 { |  | ||||||
| 		framework.Failf("Got port==0 for UDP poke (%s)", url) |  | ||||||
| 		return ret |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Set default params. |  | ||||||
| 	if params == nil { |  | ||||||
| 		params = &UDPPokeParams{} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	framework.Logf("Poking %v", url) |  | ||||||
|  |  | ||||||
| 	con, err := net.Dial("udp", hostPort) |  | ||||||
| 	if err != nil { |  | ||||||
| 		ret.Status = UDPError |  | ||||||
| 		ret.Error = err |  | ||||||
| 		framework.Logf("Poke(%q): %v", url, err) |  | ||||||
| 		return ret |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	_, err = con.Write([]byte(fmt.Sprintf("%s\n", request))) |  | ||||||
| 	if err != nil { |  | ||||||
| 		ret.Error = err |  | ||||||
| 		neterr, ok := err.(net.Error) |  | ||||||
| 		if ok && neterr.Timeout() { |  | ||||||
| 			ret.Status = UDPTimeout |  | ||||||
| 		} else if strings.Contains(err.Error(), "connection refused") { |  | ||||||
| 			ret.Status = UDPRefused |  | ||||||
| 		} else { |  | ||||||
| 			ret.Status = UDPError |  | ||||||
| 		} |  | ||||||
| 		framework.Logf("Poke(%q): %v", url, err) |  | ||||||
| 		return ret |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if params.Timeout != 0 { |  | ||||||
| 		err = con.SetDeadline(time.Now().Add(params.Timeout)) |  | ||||||
| 		if err != nil { |  | ||||||
| 			ret.Status = UDPError |  | ||||||
| 			ret.Error = err |  | ||||||
| 			framework.Logf("Poke(%q): %v", url, err) |  | ||||||
| 			return ret |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	bufsize := len(params.Response) + 1 |  | ||||||
| 	if bufsize == 0 { |  | ||||||
| 		bufsize = 4096 |  | ||||||
| 	} |  | ||||||
| 	var buf = make([]byte, bufsize) |  | ||||||
| 	n, err := con.Read(buf) |  | ||||||
| 	if err != nil { |  | ||||||
| 		ret.Error = err |  | ||||||
| 		neterr, ok := err.(net.Error) |  | ||||||
| 		if ok && neterr.Timeout() { |  | ||||||
| 			ret.Status = UDPTimeout |  | ||||||
| 		} else if strings.Contains(err.Error(), "connection refused") { |  | ||||||
| 			ret.Status = UDPRefused |  | ||||||
| 		} else { |  | ||||||
| 			ret.Status = UDPError |  | ||||||
| 		} |  | ||||||
| 		framework.Logf("Poke(%q): %v", url, err) |  | ||||||
| 		return ret |  | ||||||
| 	} |  | ||||||
| 	ret.Response = buf[0:n] |  | ||||||
|  |  | ||||||
| 	if params.Response != "" && string(ret.Response) != params.Response { |  | ||||||
| 		ret.Status = UDPBadResponse |  | ||||||
| 		ret.Error = fmt.Errorf("response does not match expected string: %q", string(ret.Response)) |  | ||||||
| 		framework.Logf("Poke(%q): %v", url, ret.Error) |  | ||||||
| 		return ret |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	ret.Status = UDPSuccess |  | ||||||
| 	framework.Logf("Poke(%q): success", url) |  | ||||||
| 	return ret |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // testReachableUDP tests that the given host serves UDP on the given port. |  | ||||||
| func testReachableUDP(host string, port int, timeout time.Duration) { |  | ||||||
| 	pollfn := func() (bool, error) { |  | ||||||
| 		result := pokeUDP(host, port, "echo hello", &UDPPokeParams{ |  | ||||||
| 			Timeout:  3 * time.Second, |  | ||||||
| 			Response: "hello", |  | ||||||
| 		}) |  | ||||||
| 		if result.Status == UDPSuccess { |  | ||||||
| 			return true, nil |  | ||||||
| 		} |  | ||||||
| 		return false, nil // caller can retry |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if err := wait.PollImmediate(framework.Poll, timeout, pollfn); err != nil { |  | ||||||
| 		framework.Failf("Could not reach UDP service through %v:%v after %v: %v", host, port, timeout, err) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // testNotReachableUDP tests that the given host doesn't serve UDP on the given port. |  | ||||||
| func testNotReachableUDP(host string, port int, timeout time.Duration) { |  | ||||||
| 	pollfn := func() (bool, error) { |  | ||||||
| 		result := pokeUDP(host, port, "echo hello", &UDPPokeParams{Timeout: 3 * time.Second}) |  | ||||||
| 		if result.Status != UDPSuccess && result.Status != UDPError { |  | ||||||
| 			return true, nil |  | ||||||
| 		} |  | ||||||
| 		return false, nil // caller can retry |  | ||||||
| 	} |  | ||||||
| 	if err := wait.PollImmediate(framework.Poll, timeout, pollfn); err != nil { |  | ||||||
| 		framework.Failf("UDP service %v:%v reachable after %v: %v", host, port, timeout, err) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // testRejectedUDP tests that the given host rejects a UDP request on the given port. |  | ||||||
| func testRejectedUDP(host string, port int, timeout time.Duration) { |  | ||||||
| 	pollfn := func() (bool, error) { |  | ||||||
| 		result := pokeUDP(host, port, "echo hello", &UDPPokeParams{Timeout: 3 * time.Second}) |  | ||||||
| 		if result.Status == UDPRefused { |  | ||||||
| 			return true, nil |  | ||||||
| 		} |  | ||||||
| 		return false, nil // caller can retry |  | ||||||
| 	} |  | ||||||
| 	if err := wait.PollImmediate(framework.Poll, timeout, pollfn); err != nil { |  | ||||||
| 		framework.Failf("UDP service %v:%v not rejected: %v", host, port, err) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // TestHTTPHealthCheckNodePort tests a HTTP connection by the given request to the given host and port. |  | ||||||
| func TestHTTPHealthCheckNodePort(host string, port int, request string, timeout time.Duration, expectSucceed bool, threshold int) error { |  | ||||||
| 	count := 0 |  | ||||||
| 	condition := func() (bool, error) { |  | ||||||
| 		success, _ := testHTTPHealthCheckNodePort(host, port, request) |  | ||||||
| 		if success && expectSucceed || |  | ||||||
| 			!success && !expectSucceed { |  | ||||||
| 			count++ |  | ||||||
| 		} |  | ||||||
| 		if count >= threshold { |  | ||||||
| 			return true, nil |  | ||||||
| 		} |  | ||||||
| 		return false, nil |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if err := wait.PollImmediate(time.Second, timeout, condition); err != nil { |  | ||||||
| 		return fmt.Errorf("error waiting for healthCheckNodePort: expected at least %d succeed=%v on %v%v, got %d", threshold, expectSucceed, host, port, count) |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func testHTTPHealthCheckNodePort(ip string, port int, request string) (bool, error) { |  | ||||||
| 	ipPort := net.JoinHostPort(ip, strconv.Itoa(port)) |  | ||||||
| 	url := fmt.Sprintf("http://%s%s", ipPort, request) |  | ||||||
| 	if ip == "" || port == 0 { |  | ||||||
| 		framework.Failf("Got empty IP for reachability check (%s)", url) |  | ||||||
| 		return false, fmt.Errorf("invalid input ip or port") |  | ||||||
| 	} |  | ||||||
| 	framework.Logf("Testing HTTP health check on %v", url) |  | ||||||
| 	resp, err := httpGetNoConnectionPoolTimeout(url, 5*time.Second) |  | ||||||
| 	if err != nil { |  | ||||||
| 		framework.Logf("Got error testing for reachability of %s: %v", url, err) |  | ||||||
| 		return false, err |  | ||||||
| 	} |  | ||||||
| 	defer resp.Body.Close() |  | ||||||
| 	if err != nil { |  | ||||||
| 		framework.Logf("Got error reading response from %s: %v", url, err) |  | ||||||
| 		return false, err |  | ||||||
| 	} |  | ||||||
| 	// HealthCheck responder returns 503 for no local endpoints |  | ||||||
| 	if resp.StatusCode == 503 { |  | ||||||
| 		return false, nil |  | ||||||
| 	} |  | ||||||
| 	// HealthCheck responder returns 200 for non-zero local endpoints |  | ||||||
| 	if resp.StatusCode == 200 { |  | ||||||
| 		return true, nil |  | ||||||
| 	} |  | ||||||
| 	return false, fmt.Errorf("unexpected HTTP response code %s from health check responder at %s", resp.Status, url) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func testHTTPHealthCheckNodePortFromTestContainer(ctx context.Context, config *e2enetwork.NetworkingTestConfig, host string, port int, timeout time.Duration, expectSucceed bool, threshold int) error { |  | ||||||
| 	count := 0 |  | ||||||
| 	pollFn := func() (bool, error) { |  | ||||||
| 		statusCode, err := config.GetHTTPCodeFromTestContainer(ctx, |  | ||||||
| 			"/healthz", |  | ||||||
| 			host, |  | ||||||
| 			port) |  | ||||||
| 		if err != nil { |  | ||||||
| 			framework.Logf("Got error reading status code from http://%s:%d/healthz via test container: %v", host, port, err) |  | ||||||
| 			return false, nil |  | ||||||
| 		} |  | ||||||
| 		framework.Logf("Got status code from http://%s:%d/healthz via test container: %d", host, port, statusCode) |  | ||||||
| 		success := statusCode == 200 |  | ||||||
| 		if (success && expectSucceed) || |  | ||||||
| 			(!success && !expectSucceed) { |  | ||||||
| 			count++ |  | ||||||
| 		} |  | ||||||
| 		return count >= threshold, nil |  | ||||||
| 	} |  | ||||||
| 	err := wait.PollImmediate(time.Second, timeout, pollFn) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return fmt.Errorf("error waiting for healthCheckNodePort: expected at least %d succeed=%v on %v:%v/healthz, got %d", threshold, expectSucceed, host, port, count) |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Does an HTTP GET, but does not reuse TCP connections |  | ||||||
| // This masks problems where the iptables rule has changed, but we don't see it |  | ||||||
| func httpGetNoConnectionPoolTimeout(url string, timeout time.Duration) (*http.Response, error) { |  | ||||||
| 	tr := utilnet.SetTransportDefaults(&http.Transport{ |  | ||||||
| 		DisableKeepAlives: true, |  | ||||||
| 	}) |  | ||||||
| 	client := &http.Client{ |  | ||||||
| 		Transport: tr, |  | ||||||
| 		Timeout:   timeout, |  | ||||||
| 	} |  | ||||||
| 	return client.Get(url) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func getServeHostnameService(name string) *v1.Service { | func getServeHostnameService(name string) *v1.Service { | ||||||
| 	svc := defaultServeHostnameService.DeepCopy() | 	svc := defaultServeHostnameService.DeepCopy() | ||||||
| 	svc.ObjectMeta.Name = name | 	svc.ObjectMeta.Name = name | ||||||
| @@ -727,23 +474,6 @@ func waitForAPIServerUp(ctx context.Context, c clientset.Interface) error { | |||||||
| 	return fmt.Errorf("waiting for apiserver timed out") | 	return fmt.Errorf("waiting for apiserver timed out") | ||||||
| } | } | ||||||
|  |  | ||||||
| // getEndpointNodesWithInternalIP returns a map of nodenames:internal-ip on which the |  | ||||||
| // endpoints of the Service are running. |  | ||||||
| func getEndpointNodesWithInternalIP(ctx context.Context, jig *e2eservice.TestJig) (map[string]string, error) { |  | ||||||
| 	nodesWithIPs, err := jig.GetEndpointNodesWithIP(ctx, v1.NodeInternalIP) |  | ||||||
| 	if err != nil { |  | ||||||
| 		return nil, err |  | ||||||
| 	} |  | ||||||
| 	endpointsNodeMap := make(map[string]string, len(nodesWithIPs)) |  | ||||||
| 	for nodeName, internalIPs := range nodesWithIPs { |  | ||||||
| 		if len(internalIPs) < 1 { |  | ||||||
| 			return nil, fmt.Errorf("no internal ip found for node %s", nodeName) |  | ||||||
| 		} |  | ||||||
| 		endpointsNodeMap[nodeName] = internalIPs[0] |  | ||||||
| 	} |  | ||||||
| 	return endpointsNodeMap, nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| var _ = common.SIGDescribe("Services", func() { | var _ = common.SIGDescribe("Services", func() { | ||||||
| 	f := framework.NewDefaultFramework("services") | 	f := framework.NewDefaultFramework("services") | ||||||
| 	f.NamespacePodSecurityLevel = admissionapi.LevelPrivileged | 	f.NamespacePodSecurityLevel = admissionapi.LevelPrivileged | ||||||
| @@ -4026,62 +3756,6 @@ func execAffinityTestForNonLBServiceWithOptionalTransition(ctx context.Context, | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| func execAffinityTestForLBServiceWithTransition(ctx context.Context, f *framework.Framework, cs clientset.Interface, svc *v1.Service) { |  | ||||||
| 	execAffinityTestForLBServiceWithOptionalTransition(ctx, f, cs, svc, true) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func execAffinityTestForLBService(ctx context.Context, f *framework.Framework, cs clientset.Interface, svc *v1.Service) { |  | ||||||
| 	execAffinityTestForLBServiceWithOptionalTransition(ctx, f, cs, svc, false) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // execAffinityTestForLBServiceWithOptionalTransition is a helper function that wrap the logic of |  | ||||||
| // affinity test for load balancer services, similar to |  | ||||||
| // execAffinityTestForNonLBServiceWithOptionalTransition. |  | ||||||
| func execAffinityTestForLBServiceWithOptionalTransition(ctx context.Context, f *framework.Framework, cs clientset.Interface, svc *v1.Service, isTransitionTest bool) { |  | ||||||
| 	numPods, ns, serviceName := 3, f.Namespace.Name, svc.ObjectMeta.Name |  | ||||||
|  |  | ||||||
| 	ginkgo.By("creating service in namespace " + ns) |  | ||||||
| 	svc.Spec.SessionAffinity = v1.ServiceAffinityClientIP |  | ||||||
| 	_, _, err := StartServeHostnameService(ctx, cs, svc, ns, numPods) |  | ||||||
| 	framework.ExpectNoError(err, "failed to create replication controller with service in the namespace: %s", ns) |  | ||||||
| 	jig := e2eservice.NewTestJig(cs, ns, serviceName) |  | ||||||
| 	ginkgo.By("waiting for loadbalancer for service " + ns + "/" + serviceName) |  | ||||||
| 	svc, err = jig.WaitForLoadBalancer(ctx, e2eservice.GetServiceLoadBalancerCreationTimeout(ctx, cs)) |  | ||||||
| 	framework.ExpectNoError(err) |  | ||||||
| 	ginkgo.DeferCleanup(func(ctx context.Context) { |  | ||||||
| 		podNodePairs, err := e2enode.PodNodePairs(ctx, cs, ns) |  | ||||||
| 		framework.Logf("[pod,node] pairs: %+v; err: %v", podNodePairs, err) |  | ||||||
| 		_ = StopServeHostnameService(ctx, cs, ns, serviceName) |  | ||||||
| 		lb := cloudprovider.DefaultLoadBalancerName(svc) |  | ||||||
| 		framework.Logf("cleaning load balancer resource for %s", lb) |  | ||||||
| 		e2eservice.CleanupServiceResources(ctx, cs, lb, framework.TestContext.CloudConfig.Region, framework.TestContext.CloudConfig.Zone) |  | ||||||
| 	}) |  | ||||||
| 	ingressIP := e2eservice.GetIngressPoint(&svc.Status.LoadBalancer.Ingress[0]) |  | ||||||
| 	port := int(svc.Spec.Ports[0].Port) |  | ||||||
|  |  | ||||||
| 	if !isTransitionTest { |  | ||||||
| 		if !checkAffinity(ctx, cs, nil, ingressIP, port, true) { |  | ||||||
| 			framework.Failf("Failed to verify affinity for loadbalance service %s/%s", ns, serviceName) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	if isTransitionTest { |  | ||||||
| 		svc, err = jig.UpdateService(ctx, func(svc *v1.Service) { |  | ||||||
| 			svc.Spec.SessionAffinity = v1.ServiceAffinityNone |  | ||||||
| 		}) |  | ||||||
| 		framework.ExpectNoError(err) |  | ||||||
| 		if !checkAffinity(ctx, cs, nil, ingressIP, port, false) { |  | ||||||
| 			framework.Failf("Failed to verify affinity for loadbalance service %s/%s without session affinity ", ns, serviceName) |  | ||||||
| 		} |  | ||||||
| 		svc, err = jig.UpdateService(ctx, func(svc *v1.Service) { |  | ||||||
| 			svc.Spec.SessionAffinity = v1.ServiceAffinityClientIP |  | ||||||
| 		}) |  | ||||||
| 		framework.ExpectNoError(err) |  | ||||||
| 		if !checkAffinity(ctx, cs, nil, ingressIP, port, true) { |  | ||||||
| 			framework.Failf("Failed to verify affinity for loadbalance service %s/%s with session affinity ", ns, serviceName) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func createAndGetExternalServiceFQDN(ctx context.Context, cs clientset.Interface, ns, serviceName string) string { | func createAndGetExternalServiceFQDN(ctx context.Context, cs clientset.Interface, ns, serviceName string) string { | ||||||
| 	_, _, err := StartServeHostnameService(ctx, cs, getServeHostnameService(serviceName), ns, 2) | 	_, _, err := StartServeHostnameService(ctx, cs, getServeHostnameService(serviceName), ns, 2) | ||||||
| 	framework.ExpectNoError(err, "Expected Service %s to be running", serviceName) | 	framework.ExpectNoError(err, "Expected Service %s to be running", serviceName) | ||||||
| @@ -4133,31 +3807,6 @@ func launchHostExecPod(ctx context.Context, client clientset.Interface, ns, name | |||||||
| 	return pod | 	return pod | ||||||
| } | } | ||||||
|  |  | ||||||
| // checkReachabilityFromPod checks reachability from the specified pod. |  | ||||||
| func checkReachabilityFromPod(expectToBeReachable bool, timeout time.Duration, namespace, pod, target string) { |  | ||||||
| 	cmd := fmt.Sprintf("wget -T 5 -qO- %q", target) |  | ||||||
| 	err := wait.PollImmediate(framework.Poll, timeout, func() (bool, error) { |  | ||||||
| 		_, err := e2eoutput.RunHostCmd(namespace, pod, cmd) |  | ||||||
| 		if expectToBeReachable && err != nil { |  | ||||||
| 			framework.Logf("Expect target to be reachable. But got err: %v. Retry until timeout", err) |  | ||||||
| 			return false, nil |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if !expectToBeReachable && err == nil { |  | ||||||
| 			framework.Logf("Expect target NOT to be reachable. But it is reachable. Retry until timeout") |  | ||||||
| 			return false, nil |  | ||||||
| 		} |  | ||||||
| 		return true, nil |  | ||||||
| 	}) |  | ||||||
| 	framework.ExpectNoError(err) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // enableAndDisableInternalLB returns two functions for enabling and disabling the internal load balancer |  | ||||||
| // setting for the supported cloud providers (currently GCE/GKE and Azure) and empty functions for others. |  | ||||||
| func enableAndDisableInternalLB() (enable func(svc *v1.Service), disable func(svc *v1.Service)) { |  | ||||||
| 	return framework.TestContext.CloudConfig.Provider.EnableAndDisableInternalLB() |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func validatePorts(ep, expectedEndpoints portsByPodUID) error { | func validatePorts(ep, expectedEndpoints portsByPodUID) error { | ||||||
| 	if len(ep) != len(expectedEndpoints) { | 	if len(ep) != len(expectedEndpoints) { | ||||||
| 		// should not happen because we check this condition before | 		// should not happen because we check this condition before | ||||||
|   | |||||||
| @@ -1,82 +0,0 @@ | |||||||
| /* |  | ||||||
| Copyright 2018 The Kubernetes Authors. |  | ||||||
|  |  | ||||||
| Licensed under the Apache License, Version 2.0 (the "License"); |  | ||||||
| you may not use this file except in compliance with the License. |  | ||||||
| You may obtain a copy of the License at |  | ||||||
|  |  | ||||||
|     http://www.apache.org/licenses/LICENSE-2.0 |  | ||||||
|  |  | ||||||
| Unless required by applicable law or agreed to in writing, software |  | ||||||
| distributed under the License is distributed on an "AS IS" BASIS, |  | ||||||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |  | ||||||
| See the License for the specific language governing permissions and |  | ||||||
| limitations under the License. |  | ||||||
| */ |  | ||||||
|  |  | ||||||
| package ipamperf |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"context" |  | ||||||
| 	"time" |  | ||||||
|  |  | ||||||
| 	"k8s.io/api/core/v1" |  | ||||||
| 	apierrors "k8s.io/apimachinery/pkg/api/errors" |  | ||||||
| 	"k8s.io/apimachinery/pkg/api/resource" |  | ||||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |  | ||||||
| 	clientset "k8s.io/client-go/kubernetes" |  | ||||||
| 	"k8s.io/klog/v2" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| const ( |  | ||||||
| 	maxCreateRetries = 10 |  | ||||||
| 	retryDelay       = 10 * time.Second |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| var ( |  | ||||||
| 	baseNodeTemplate = &v1.Node{ |  | ||||||
| 		ObjectMeta: metav1.ObjectMeta{ |  | ||||||
| 			GenerateName: "sample-node-", |  | ||||||
| 		}, |  | ||||||
| 		Status: v1.NodeStatus{ |  | ||||||
| 			Capacity: v1.ResourceList{ |  | ||||||
| 				v1.ResourcePods:   *resource.NewQuantity(110, resource.DecimalSI), |  | ||||||
| 				v1.ResourceCPU:    resource.MustParse("4"), |  | ||||||
| 				v1.ResourceMemory: resource.MustParse("32Gi"), |  | ||||||
| 			}, |  | ||||||
| 			Phase: v1.NodeRunning, |  | ||||||
| 			Conditions: []v1.NodeCondition{ |  | ||||||
| 				{Type: v1.NodeReady, Status: v1.ConditionTrue}, |  | ||||||
| 			}, |  | ||||||
| 		}, |  | ||||||
| 	} |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| func deleteNodes(clientSet *clientset.Clientset) { |  | ||||||
| 	klog.Info("Deleting nodes") |  | ||||||
| 	noGrace := int64(0) |  | ||||||
| 	if err := clientSet.CoreV1().Nodes().DeleteCollection(context.TODO(), metav1.DeleteOptions{GracePeriodSeconds: &noGrace}, metav1.ListOptions{}); err != nil { |  | ||||||
| 		klog.Errorf("Error deleting node: %v", err) |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func createNodes(clientSet *clientset.Clientset, config *Config) error { |  | ||||||
| 	klog.Infof("Creating %d nodes", config.NumNodes) |  | ||||||
| 	for i := 0; i < config.NumNodes; i++ { |  | ||||||
| 		var err error |  | ||||||
| 		for j := 0; j < maxCreateRetries; j++ { |  | ||||||
| 			if _, err = clientSet.CoreV1().Nodes().Create(context.TODO(), baseNodeTemplate, metav1.CreateOptions{}); err != nil && apierrors.IsServerTimeout(err) { |  | ||||||
| 				klog.Infof("Server timeout creating nodes, retrying after %v", retryDelay) |  | ||||||
| 				time.Sleep(retryDelay) |  | ||||||
| 				continue |  | ||||||
| 			} |  | ||||||
| 			break |  | ||||||
| 		} |  | ||||||
| 		if err != nil { |  | ||||||
| 			klog.Errorf("Error creating nodes: %v", err) |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	klog.Infof("%d nodes created", config.NumNodes) |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
		Reference in New Issue
	
	Block a user
	 Davanum Srinivas
					Davanum Srinivas