diff --git a/cmd/kubelet/app/BUILD b/cmd/kubelet/app/BUILD index f5f79cfb13f..4437761bfd4 100644 --- a/cmd/kubelet/app/BUILD +++ b/cmd/kubelet/app/BUILD @@ -29,7 +29,6 @@ go_library( "//pkg/api/legacyscheme:go_default_library", "//pkg/apis/core:go_default_library", "//pkg/capabilities:go_default_library", - "//pkg/client/chaosclient:go_default_library", "//pkg/cloudprovider:go_default_library", "//pkg/cloudprovider/providers:go_default_library", "//pkg/credentialprovider:go_default_library", diff --git a/cmd/kubelet/app/server.go b/cmd/kubelet/app/server.go index b5d73579ed3..43a7950b334 100644 --- a/cmd/kubelet/app/server.go +++ b/cmd/kubelet/app/server.go @@ -62,7 +62,6 @@ import ( "k8s.io/kubernetes/pkg/api/legacyscheme" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/capabilities" - "k8s.io/kubernetes/pkg/client/chaosclient" "k8s.io/kubernetes/pkg/cloudprovider" "k8s.io/kubernetes/pkg/credentialprovider" "k8s.io/kubernetes/pkg/features" @@ -890,22 +889,9 @@ func createAPIServerClientConfig(s *options.KubeletServer) (*restclient.Config, clientConfig.QPS = float32(s.KubeAPIQPS) clientConfig.Burst = int(s.KubeAPIBurst) - addChaosToClientConfig(s, clientConfig) return clientConfig, nil } -// addChaosToClientConfig injects random errors into client connections if configured. -func addChaosToClientConfig(s *options.KubeletServer, config *restclient.Config) { - if s.ChaosChance != 0.0 { - config.WrapTransport = func(rt http.RoundTripper) http.RoundTripper { - seed := chaosclient.NewSeed(1) - // TODO: introduce a standard chaos package with more tunables - this is just a proof of concept - // TODO: introduce random latency and stalls - return chaosclient.NewChaosRoundTripper(rt, chaosclient.LogChaos, seed.P(s.ChaosChance, chaosclient.ErrSimulatedConnectionResetByPeer)) - } - } -} - // RunKubelet is responsible for setting up and running a kubelet. It is used in three different applications: // 1 Integration tests // 2 Kubelet binary diff --git a/pkg/BUILD b/pkg/BUILD index 0138315de05..e271227d879 100644 --- a/pkg/BUILD +++ b/pkg/BUILD @@ -52,7 +52,6 @@ filegroup( "//pkg/auth/authorizer/abac:all-srcs", "//pkg/auth/nodeidentifier:all-srcs", "//pkg/capabilities:all-srcs", - "//pkg/client/chaosclient:all-srcs", "//pkg/client/clientset_generated/internalclientset:all-srcs", "//pkg/client/conditions:all-srcs", "//pkg/client/informers/informers_generated/internalversion:all-srcs", diff --git a/pkg/client/chaosclient/BUILD b/pkg/client/chaosclient/BUILD deleted file mode 100644 index 7145808df50..00000000000 --- a/pkg/client/chaosclient/BUILD +++ /dev/null @@ -1,33 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", - "go_test", -) - -go_library( - name = "go_default_library", - srcs = ["chaosclient.go"], - importpath = "k8s.io/kubernetes/pkg/client/chaosclient", - deps = ["//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library"], -) - -go_test( - name = "go_default_test", - srcs = ["chaosclient_test.go"], - embed = [":go_default_library"], -) - -filegroup( - name = "package-srcs", - srcs = glob(["**"]), - tags = ["automanaged"], - visibility = ["//visibility:private"], -) - -filegroup( - name = "all-srcs", - srcs = [":package-srcs"], - tags = ["automanaged"], -) diff --git a/pkg/client/chaosclient/OWNERS b/pkg/client/chaosclient/OWNERS deleted file mode 100755 index 32c694e9193..00000000000 --- a/pkg/client/chaosclient/OWNERS +++ /dev/null @@ -1,6 +0,0 @@ -reviewers: -- smarterclayton -- liggitt -- davidopp -- eparis -- resouer diff --git a/pkg/client/chaosclient/chaosclient.go b/pkg/client/chaosclient/chaosclient.go deleted file mode 100644 index c985891d9dd..00000000000 --- a/pkg/client/chaosclient/chaosclient.go +++ /dev/null @@ -1,158 +0,0 @@ -/* -Copyright 2015 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 chaosclient makes it easy to simulate network latency, misbehaving -// servers, and random errors from servers. It is intended to stress test components -// under failure conditions and expose weaknesses in the error handling logic -// of the codebase. -package chaosclient - -import ( - "errors" - "fmt" - "log" - "math/rand" - "net/http" - "reflect" - "runtime" - - "k8s.io/apimachinery/pkg/util/net" -) - -// chaosrt provides the ability to perform simulations of HTTP client failures -// under the Golang http.Transport interface. -type chaosrt struct { - rt http.RoundTripper - notify ChaosNotifier - c []Chaos -} - -// Chaos intercepts requests to a remote HTTP endpoint and can inject arbitrary -// failures. -type Chaos interface { - // Intercept should return true if the normal flow should be skipped, and the - // return response and error used instead. Modifications to the request will - // be ignored, but may be used to make decisions about types of failures. - Intercept(req *http.Request) (bool, *http.Response, error) -} - -// ChaosNotifier notifies another component that the ChaosRoundTripper has simulated -// a failure. -type ChaosNotifier interface { - // OnChaos is invoked when a chaotic outcome was triggered. fn is the - // source of Chaos and req was the outgoing request - OnChaos(req *http.Request, c Chaos) -} - -// ChaosFunc takes an http.Request and decides whether to alter the response. It -// returns true if it wishes to mutate the response, with a http.Response or -// error. -type ChaosFunc func(req *http.Request) (bool, *http.Response, error) - -// Intercept calls the nested method `Intercept` -func (fn ChaosFunc) Intercept(req *http.Request) (bool, *http.Response, error) { - return fn.Intercept(req) -} - -func (fn ChaosFunc) String() string { - return runtime.FuncForPC(reflect.ValueOf(fn).Pointer()).Name() -} - -// NewChaosRoundTripper creates an http.RoundTripper that will intercept requests -// based on the provided Chaos functions. The notifier is invoked when a Chaos -// Intercept is fired. -func NewChaosRoundTripper(rt http.RoundTripper, notify ChaosNotifier, c ...Chaos) http.RoundTripper { - return &chaosrt{rt, notify, c} -} - -// RoundTrip gives each ChaosFunc an opportunity to intercept the request. The first -// interceptor wins. -func (rt *chaosrt) RoundTrip(req *http.Request) (*http.Response, error) { - for _, c := range rt.c { - if intercept, resp, err := c.Intercept(req); intercept { - rt.notify.OnChaos(req, c) - return resp, err - } - } - return rt.rt.RoundTrip(req) -} - -var _ = net.RoundTripperWrapper(&chaosrt{}) - -func (rt *chaosrt) WrappedRoundTripper() http.RoundTripper { - return rt.rt -} - -// Seed represents a consistent stream of chaos. -type Seed struct { - *rand.Rand -} - -// NewSeed creates an object that assists in generating random chaotic events -// based on a deterministic seed. -func NewSeed(seed int64) Seed { - return Seed{rand.New(rand.NewSource(seed))} -} - -type pIntercept struct { - Chaos - s Seed - p float64 -} - -// P returns a ChaosFunc that fires with a probability of p (p between 0.0 -// and 1.0 with 0.0 meaning never and 1.0 meaning always). -func (s Seed) P(p float64, c Chaos) Chaos { - return pIntercept{c, s, p} -} - -// Intercept intercepts requests with the provided probability p. -func (c pIntercept) Intercept(req *http.Request) (bool, *http.Response, error) { - if c.s.Float64() < c.p { - return c.Chaos.Intercept(req) - } - return false, nil, nil -} - -func (c pIntercept) String() string { - return fmt.Sprintf("P{%f %s}", c.p, c.Chaos) -} - -// ErrSimulatedConnectionResetByPeer emulates the golang net error when a connection -// is reset by a peer. -// TODO: make this more accurate -// TODO: add other error types -// TODO: add a helper for returning multiple errors randomly. -var ErrSimulatedConnectionResetByPeer = Error{errors.New("connection reset by peer")} - -// Error returns the nested error when C() is invoked. -type Error struct { - error -} - -// Intercept returns the nested error -func (e Error) Intercept(_ *http.Request) (bool, *http.Response, error) { - return true, nil, e.error -} - -// LogChaos is the default ChaosNotifier and writes a message to the Golang log. -var LogChaos = ChaosNotifier(logChaos{}) - -type logChaos struct{} - -func (logChaos) OnChaos(req *http.Request, c Chaos) { - log.Printf("Triggered chaotic behavior for %s %s: %v", req.Method, req.URL.String(), c) -} diff --git a/pkg/client/chaosclient/chaosclient_test.go b/pkg/client/chaosclient/chaosclient_test.go deleted file mode 100644 index 38286b3441d..00000000000 --- a/pkg/client/chaosclient/chaosclient_test.go +++ /dev/null @@ -1,82 +0,0 @@ -/* -Copyright 2015 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 chaosclient - -import ( - "net/http" - "net/http/httptest" - "net/url" - "testing" -) - -type TestLogChaos struct { - *testing.T -} - -func (t TestLogChaos) OnChaos(req *http.Request, c Chaos) { - t.Logf("CHAOS: chaotic behavior for %s %s: %v", req.Method, req.URL.String(), c) -} - -func unwrapURLError(err error) error { - if urlErr, ok := err.(*url.Error); ok && urlErr != nil { - return urlErr.Err - } - return err -} - -func TestChaos(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - w.WriteHeader(http.StatusOK) - })) - defer server.Close() - client := http.Client{ - Transport: NewChaosRoundTripper(http.DefaultTransport, TestLogChaos{t}, ErrSimulatedConnectionResetByPeer), - } - resp, err := client.Get(server.URL) - if unwrapURLError(err) != ErrSimulatedConnectionResetByPeer.error { - t.Fatalf("expected reset by peer: %v", err) - } - if resp != nil { - t.Fatalf("expected no response object: %#v", resp) - } -} - -func TestPartialChaos(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - w.WriteHeader(http.StatusOK) - })) - defer server.Close() - seed := NewSeed(1) - client := http.Client{ - Transport: NewChaosRoundTripper( - http.DefaultTransport, TestLogChaos{t}, - seed.P(0.5, ErrSimulatedConnectionResetByPeer), - ), - } - success, fail := 0, 0 - for { - _, err := client.Get(server.URL) - if err != nil { - fail++ - } else { - success++ - } - if success > 1 && fail > 1 { - break - } - } -} diff --git a/test/test_owners.csv b/test/test_owners.csv index fbdaa5700b3..c00f70f169d 100644 --- a/test/test_owners.csv +++ b/test/test_owners.csv @@ -574,7 +574,6 @@ k8s.io/kubernetes/pkg/apis/rbac/v1alpha1,liggitt,0, k8s.io/kubernetes/pkg/apis/rbac/validation,erictune,0, k8s.io/kubernetes/pkg/apis/storage/validation,caesarxuchao,1, k8s.io/kubernetes/pkg/auth/authorizer/abac,liggitt,0, -k8s.io/kubernetes/pkg/client/chaosclient,deads2k,1, k8s.io/kubernetes/pkg/client/legacylisters,jsafrane,1, k8s.io/kubernetes/pkg/client/listers/batch/internalversion,mqliang,0, k8s.io/kubernetes/pkg/client/listers/extensions/internalversion,eparis,1,