github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/pkg/cli/cmd/fault/fault_pod_test.go (about) 1 /* 2 Copyright (C) 2022-2023 ApeCloud Co., Ltd 3 4 This file is part of KubeBlocks project 5 6 This program is free software: you can redistribute it and/or modify 7 it under the terms of the GNU Affero General Public License as published by 8 the Free Software Foundation, either version 3 of the License, or 9 (at your option) any later version. 10 11 This program is distributed in the hope that it will be useful 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU Affero General Public License for more details. 15 16 You should have received a copy of the GNU Affero General Public License 17 along with this program. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 package fault 21 22 import ( 23 . "github.com/onsi/ginkgo/v2" 24 . "github.com/onsi/gomega" 25 26 "github.com/chaos-mesh/chaos-mesh/api/v1alpha1" 27 "k8s.io/cli-runtime/pkg/genericiooptions" 28 clientfake "k8s.io/client-go/rest/fake" 29 cmdtesting "k8s.io/kubectl/pkg/cmd/testing" 30 31 "github.com/1aal/kubeblocks/pkg/cli/testing" 32 ) 33 34 var _ = Describe("Fault POD", func() { 35 var ( 36 tf *cmdtesting.TestFactory 37 streams genericiooptions.IOStreams 38 ) 39 BeforeEach(func() { 40 streams, _, _, _ = genericiooptions.NewTestIOStreams() 41 tf = cmdtesting.NewTestFactory().WithNamespace(testing.Namespace) 42 tf.Client = &clientfake.RESTClient{} 43 }) 44 45 AfterEach(func() { 46 tf.Cleanup() 47 }) 48 49 Context("test fault pod", func() { 50 It("fault pod kill", func() { 51 inputs := [][]string{ 52 {"--dry-run=client"}, 53 {"--mode=one", "--dry-run=client"}, 54 {"--mode=fixed", "--value=2", "--dry-run=client"}, 55 {"--mode=fixed-percent", "--value=50", "--dry-run=client"}, 56 {"--mode=random-max-percent", "--value=50", "--dry-run=client"}, 57 {"--grace-period=5", "--dry-run=client"}, 58 {"--ns-fault=kb-system", "--dry-run=client"}, 59 {"--node=minikube-m02", "--dry-run=client"}, 60 {"--label=app.kubernetes.io/component=mysql", "--dry-run=client"}, 61 {"--node-label=kubernetes.io/arch=arm64", "--dry-run=client"}, 62 {"--annotation=example-annotation=group-a", "--dry-run=client"}, 63 } 64 o := NewPodChaosOptions(tf, streams, string(v1alpha1.PodKillAction)) 65 cmd := o.NewCobraCommand(Kill, KillShort) 66 o.AddCommonFlag(cmd) 67 cmd.Flags().Int64VarP(&o.GracePeriod, "grace-period", "g", 0, "Grace period represents the duration in seconds before the pod should be killed") 68 69 for _, input := range inputs { 70 Expect(cmd.Flags().Parse(input)).Should(Succeed()) 71 Expect(o.CreateOptions.Complete()) 72 Expect(o.Complete()).Should(Succeed()) 73 Expect(o.Validate()).Should(Succeed()) 74 Expect(o.Run()).Should(Succeed()) 75 } 76 }) 77 78 It("fault pod kill-container", func() { 79 inputs := [][]string{ 80 {"--container=mysql", "--container=config-manager", "--dry-run=client"}, 81 } 82 o := NewPodChaosOptions(tf, streams, string(v1alpha1.ContainerKillAction)) 83 cmd := o.NewCobraCommand(KillContainer, KillContainerShort) 84 o.AddCommonFlag(cmd) 85 cmd.Flags().StringArrayVarP(&o.ContainerNames, "container", "c", nil, "the name of the container you want to kill, such as mysql, prometheus.") 86 87 for _, input := range inputs { 88 Expect(cmd.Flags().Parse(input)).Should(Succeed()) 89 Expect(o.CreateOptions.Complete()) 90 Expect(o.Complete()).Should(Succeed()) 91 Expect(o.Validate()).Should(Succeed()) 92 Expect(o.Run()).Should(Succeed()) 93 } 94 }) 95 }) 96 })