...

Source file src/github.com/chaos-mesh/chaos-mesh/e2e-test/e2e/chaos/graceful-shutdown.go

Documentation: github.com/chaos-mesh/chaos-mesh/e2e-test/e2e/chaos

     1  // Copyright 2021 Chaos Mesh Authors.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  // http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  //
    15  
    16  package chaos
    17  
    18  import (
    19  	"context"
    20  	"net/http"
    21  	"strings"
    22  	"time"
    23  
    24  	"github.com/onsi/ginkgo/v2"
    25  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    26  	"k8s.io/apimachinery/pkg/runtime"
    27  	"k8s.io/client-go/kubernetes"
    28  	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
    29  	restClient "k8s.io/client-go/rest"
    30  	"k8s.io/kubernetes/test/e2e/framework"
    31  	"k8s.io/pod-security-admission/api"
    32  	"sigs.k8s.io/controller-runtime/pkg/client"
    33  
    34  	"github.com/chaos-mesh/chaos-mesh/api/v1alpha1"
    35  	httpchaostestcases "github.com/chaos-mesh/chaos-mesh/e2e-test/e2e/chaos/httpchaos"
    36  	iochaostestcases "github.com/chaos-mesh/chaos-mesh/e2e-test/e2e/chaos/iochaos"
    37  	e2econfig "github.com/chaos-mesh/chaos-mesh/e2e-test/e2e/config"
    38  	"github.com/chaos-mesh/chaos-mesh/e2e-test/e2e/util"
    39  	"github.com/chaos-mesh/chaos-mesh/e2e-test/pkg/fixture"
    40  	"github.com/chaos-mesh/chaos-mesh/pkg/log"
    41  	"github.com/chaos-mesh/chaos-mesh/pkg/portforward" // testcases
    42  )
    43  
    44  var _ = ginkgo.Describe("[Graceful-Shutdown]", func() {
    45  	f := framework.NewDefaultFramework("chaos-mesh")
    46  	f.NamespacePodSecurityEnforceLevel = api.LevelPrivileged
    47  	var ns string
    48  	var fwCancel context.CancelFunc
    49  	var fw portforward.PortForward
    50  	var kubeCli kubernetes.Interface
    51  	var config *restClient.Config
    52  	var cli client.Client
    53  	c := http.Client{
    54  		Timeout: 10 * time.Second,
    55  	}
    56  
    57  	ginkgo.BeforeEach(func() {
    58  		ns = f.Namespace.Name
    59  		ctx, cancel := context.WithCancel(context.Background())
    60  		clientRawConfig, err := e2econfig.LoadClientRawConfig()
    61  		framework.ExpectNoError(err, "failed to load raw config")
    62  		logger, err := log.NewDefaultZapLogger()
    63  		framework.ExpectNoError(err, "failed to create logger")
    64  		fw, err = portforward.NewPortForwarder(ctx, e2econfig.NewSimpleRESTClientGetter(clientRawConfig), true, logger)
    65  		framework.ExpectNoError(err, "failed to create port forwarder")
    66  		fwCancel = cancel
    67  		kubeCli = f.ClientSet
    68  		config, err = framework.LoadConfig()
    69  		framework.ExpectNoError(err, "config error")
    70  		scheme := runtime.NewScheme()
    71  		_ = clientgoscheme.AddToScheme(scheme)
    72  		_ = v1alpha1.AddToScheme(scheme)
    73  		cli, err = client.New(config, client.Options{Scheme: scheme})
    74  		framework.ExpectNoError(err, "create client error")
    75  	})
    76  
    77  	ginkgo.AfterEach(func() {
    78  		if fwCancel != nil {
    79  			fwCancel()
    80  		}
    81  	})
    82  
    83  	// io chaos case in [IOChaos] context
    84  	ginkgo.Context("[IOChaos]", func() {
    85  		var (
    86  			err      error
    87  			port     uint16
    88  			pfCancel context.CancelFunc
    89  		)
    90  
    91  		ginkgo.JustBeforeEach(func() {
    92  			svc := fixture.NewE2EService("io", ns)
    93  			_, err = kubeCli.CoreV1().Services(ns).Create(context.TODO(), svc, metav1.CreateOptions{})
    94  			framework.ExpectNoError(err, "create service error")
    95  			nd := fixture.NewIOTestDeployment("io-test", ns)
    96  			_, err = kubeCli.AppsV1().Deployments(ns).Create(context.TODO(), nd, metav1.CreateOptions{})
    97  			framework.ExpectNoError(err, "create io-test deployment error")
    98  			err = util.WaitDeploymentReady("io-test", ns, kubeCli)
    99  			framework.ExpectNoError(err, "wait io-test deployment ready error")
   100  			_, port, pfCancel, err = portforward.ForwardOnePort(fw, ns, "svc/io", 8080)
   101  			framework.ExpectNoError(err, "create helper io port port-forward failed")
   102  		})
   103  
   104  		ginkgo.JustAfterEach(func() {
   105  			if pfCancel != nil {
   106  				pfCancel()
   107  			}
   108  		})
   109  
   110  		// io chaos case in [Shutdown] context
   111  		ginkgo.It("[Shutdown]", func() {
   112  			iochaostestcases.TestcaseIOErrorGracefulShutdown(ns, cli, c, port)
   113  		})
   114  	})
   115  
   116  	//http chaos case in [HTTPChaos] context
   117  	ginkgo.Context("[HTTPChaos]", func() {
   118  		var (
   119  			err      error
   120  			port     uint16
   121  			pfCancel context.CancelFunc
   122  			client   httpchaostestcases.HTTPE2EClient
   123  		)
   124  
   125  		ginkgo.JustBeforeEach(func() {
   126  			svc := fixture.NewE2EService("http", ns)
   127  			svc, err = kubeCli.CoreV1().Services(ns).Create(context.TODO(), svc, metav1.CreateOptions{})
   128  			framework.ExpectNoError(err, "create service error")
   129  			for _, servicePort := range svc.Spec.Ports {
   130  				if servicePort.Name == "http" {
   131  					port = uint16(servicePort.NodePort)
   132  					break
   133  				}
   134  			}
   135  			nd := fixture.NewHTTPTestDeployment("http-test", ns)
   136  			_, err = kubeCli.AppsV1().Deployments(ns).Create(context.TODO(), nd, metav1.CreateOptions{})
   137  			framework.ExpectNoError(err, "create http-test deployment error")
   138  			err = util.WaitDeploymentReady("http-test", ns, kubeCli)
   139  			framework.ExpectNoError(err, "wait http-test deployment ready error")
   140  			podlist, err := kubeCli.CoreV1().Pods(ns).List(context.TODO(), metav1.ListOptions{})
   141  			framework.ExpectNoError(err, "find pod list error")
   142  			for _, item := range podlist.Items {
   143  				if strings.Contains(item.Name, "http-test") {
   144  					framework.Logf("get http-test-pod %v", item)
   145  					client.IP = item.Status.HostIP
   146  					break
   147  				}
   148  			}
   149  			client.C = &c
   150  		})
   151  
   152  		ginkgo.JustAfterEach(func() {
   153  			if pfCancel != nil {
   154  				pfCancel()
   155  			}
   156  		})
   157  
   158  		// http chaos case in [Shutdown] context
   159  		ginkgo.It("[Shutdown]", func() {
   160  			httpchaostestcases.TestcaseHttpGracefulAbortShutdown(ns, cli, client, port)
   161  		})
   162  	})
   163  })
   164