...

Source file src/github.com/chaos-mesh/chaos-mesh/e2e-test/e2e/chaos/podchaos/pod_kill.go

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

     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 podchaos
    17  
    18  import (
    19  	"context"
    20  	"time"
    21  
    22  	"github.com/chaos-mesh/chaos-mesh/api/v1alpha1"
    23  	"github.com/chaos-mesh/chaos-mesh/e2e-test/e2e/util"
    24  	"github.com/chaos-mesh/chaos-mesh/e2e-test/pkg/fixture"
    25  
    26  	corev1 "k8s.io/api/core/v1"
    27  	apierrors "k8s.io/apimachinery/pkg/api/errors"
    28  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    29  	"k8s.io/apimachinery/pkg/labels"
    30  	"k8s.io/apimachinery/pkg/types"
    31  	"k8s.io/apimachinery/pkg/util/wait"
    32  	"k8s.io/client-go/kubernetes"
    33  	"k8s.io/kubernetes/test/e2e/framework"
    34  	"k8s.io/utils/pointer"
    35  	"sigs.k8s.io/controller-runtime/pkg/client"
    36  )
    37  
    38  func TestcasePodKillOnceThenDelete(ns string, kubeCli kubernetes.Interface, cli client.Client) {
    39  	ctx, cancel := context.WithCancel(context.Background())
    40  	defer cancel()
    41  
    42  	pod := fixture.NewCommonNginxPod("nginx", ns)
    43  	_, err := kubeCli.CoreV1().Pods(ns).Create(context.TODO(), pod, metav1.CreateOptions{})
    44  	framework.ExpectNoError(err, "create nginx pod error")
    45  	err = waitPodRunning("nginx", ns, kubeCli)
    46  	framework.ExpectNoError(err, "wait nginx running error")
    47  
    48  	podKillChaos := &v1alpha1.PodChaos{
    49  		ObjectMeta: metav1.ObjectMeta{
    50  			Name:      "nginx-kill",
    51  			Namespace: ns,
    52  		},
    53  		Spec: v1alpha1.PodChaosSpec{
    54  			Action: v1alpha1.PodKillAction,
    55  			ContainerSelector: v1alpha1.ContainerSelector{
    56  				PodSelector: v1alpha1.PodSelector{
    57  					Selector: v1alpha1.PodSelectorSpec{
    58  						GenericSelectorSpec: v1alpha1.GenericSelectorSpec{
    59  							Namespaces: []string{
    60  								ns,
    61  							},
    62  							LabelSelectors: map[string]string{
    63  								"app": "nginx",
    64  							},
    65  						},
    66  					},
    67  					Mode: v1alpha1.OneMode,
    68  				},
    69  			},
    70  		},
    71  	}
    72  	err = cli.Create(ctx, podKillChaos)
    73  	framework.ExpectNoError(err, "create pod chaos error")
    74  
    75  	err = wait.Poll(5*time.Second, 5*time.Minute, func() (done bool, err error) {
    76  		_, err = kubeCli.CoreV1().Pods(ns).Get(context.TODO(), "nginx", metav1.GetOptions{})
    77  		if err != nil && apierrors.IsNotFound(err) {
    78  			return true, nil
    79  		}
    80  		return false, nil
    81  	})
    82  	framework.ExpectNoError(err, "Pod kill chaos perform failed")
    83  
    84  }
    85  func TestcasePodKillPauseThenUnPause(ns string, kubeCli kubernetes.Interface, cli client.Client) {
    86  	ctx, cancel := context.WithCancel(context.Background())
    87  	defer cancel()
    88  
    89  	nd := fixture.NewCommonNginxDeployment("nginx", ns, 3)
    90  	_, err := kubeCli.AppsV1().Deployments(ns).Create(context.TODO(), nd, metav1.CreateOptions{})
    91  	framework.ExpectNoError(err, "create nginx deployment error")
    92  	err = util.WaitDeploymentReady("nginx", ns, kubeCli)
    93  	framework.ExpectNoError(err, "wait nginx deployment ready error")
    94  
    95  	var pods *corev1.PodList
    96  	var newPods *corev1.PodList
    97  	listOption := metav1.ListOptions{
    98  		LabelSelector: labels.SelectorFromSet(map[string]string{
    99  			"app": "nginx",
   100  		}).String(),
   101  	}
   102  	pods, err = kubeCli.CoreV1().Pods(ns).List(context.TODO(), listOption)
   103  	framework.ExpectNoError(err, "get nginx pods error")
   104  
   105  	podKillChaos := &v1alpha1.PodChaos{
   106  		ObjectMeta: metav1.ObjectMeta{
   107  			Name:      "nginx-kill",
   108  			Namespace: ns,
   109  		},
   110  		Spec: v1alpha1.PodChaosSpec{
   111  			Action:   v1alpha1.PodKillAction,
   112  			Duration: pointer.StringPtr("9m"),
   113  			ContainerSelector: v1alpha1.ContainerSelector{
   114  				PodSelector: v1alpha1.PodSelector{
   115  					Selector: v1alpha1.PodSelectorSpec{
   116  						GenericSelectorSpec: v1alpha1.GenericSelectorSpec{
   117  							Namespaces: []string{
   118  								ns,
   119  							},
   120  							LabelSelectors: map[string]string{
   121  								"app": "nginx",
   122  							},
   123  						},
   124  					},
   125  					Mode: v1alpha1.OneMode,
   126  				},
   127  			},
   128  		},
   129  	}
   130  	err = cli.Create(ctx, podKillChaos)
   131  	framework.ExpectNoError(err, "create pod chaos error")
   132  
   133  	chaosKey := types.NamespacedName{
   134  		Namespace: ns,
   135  		Name:      "nginx-kill",
   136  	}
   137  
   138  	// some pod is killed as expected
   139  	err = wait.Poll(5*time.Second, 5*time.Minute, func() (done bool, err error) {
   140  		newPods, err = kubeCli.CoreV1().Pods(ns).List(context.TODO(), listOption)
   141  		framework.ExpectNoError(err, "get nginx pods error")
   142  		return !fixture.HaveSameUIDs(pods.Items, newPods.Items), nil
   143  	})
   144  	framework.ExpectNoError(err, "wait pod killed failed")
   145  
   146  	// pause experiment
   147  	err = util.PauseChaos(ctx, cli, podKillChaos)
   148  	framework.ExpectNoError(err, "pause chaos error")
   149  
   150  	err = wait.Poll(1*time.Second, 5*time.Second, func() (done bool, err error) {
   151  		chaos := &v1alpha1.PodChaos{}
   152  		err = cli.Get(ctx, chaosKey, chaos)
   153  		framework.ExpectNoError(err, "get pod chaos error")
   154  		if chaos.Status.Experiment.DesiredPhase == v1alpha1.StoppedPhase {
   155  			return true, nil
   156  		}
   157  		return false, err
   158  	})
   159  	framework.ExpectError(err, "chaos shouldn't enter stopped phase")
   160  
   161  	// wait for 1 minutes and no pod is killed
   162  	pods, err = kubeCli.CoreV1().Pods(ns).List(context.TODO(), listOption)
   163  	framework.ExpectNoError(err, "get nginx pods error")
   164  	err = wait.Poll(5*time.Second, 1*time.Minute, func() (done bool, err error) {
   165  		newPods, err = kubeCli.CoreV1().Pods(ns).List(context.TODO(), listOption)
   166  		framework.ExpectNoError(err, "get nginx pods error")
   167  		return !fixture.HaveSameUIDs(pods.Items, newPods.Items), nil
   168  	})
   169  	framework.ExpectError(err, "wait pod not killed failed")
   170  	framework.ExpectEqual(err.Error(), wait.ErrWaitTimeout.Error())
   171  
   172  }
   173