github.com/helmwave/helmwave@v0.36.4-0.20240509190856-b35563eba4c6/pkg/plan/kubedog_internal_test.go (about) 1 package plan 2 3 import ( 4 "errors" 5 "testing" 6 7 "github.com/helmwave/helmwave/pkg/kubedog" 8 "github.com/helmwave/helmwave/pkg/release" 9 "github.com/helmwave/helmwave/pkg/release/uniqname" 10 log "github.com/sirupsen/logrus" 11 "github.com/stretchr/testify/suite" 12 helmRelease "helm.sh/helm/v3/pkg/release" 13 ) 14 15 type KubedogTestSuite struct { 16 suite.Suite 17 } 18 19 func TestKubedogTestSuite(t *testing.T) { 20 t.Parallel() 21 suite.Run(t, new(KubedogTestSuite)) 22 } 23 24 func (s *KubedogTestSuite) TestNoReleases() { 25 p := New("") 26 p.NewBody() 27 28 spec, _, err := p.kubedogSpecs(&kubedog.Config{}, nil) 29 30 s.Require().NoError(err) 31 32 s.Require().Empty(spec.Generics) 33 s.Require().Empty(spec.Jobs) 34 s.Require().Empty(spec.DaemonSets) 35 s.Require().Empty(spec.Canaries) 36 s.Require().Empty(spec.Deployments) 37 s.Require().Empty(spec.StatefulSets) 38 } 39 40 func (s *KubedogTestSuite) TestCallsManifestFunction() { 41 p := New("") 42 p.NewBody() 43 44 rel := &MockReleaseConfig{} 45 p.SetReleases(rel) 46 47 s.Require().Panics(func() { 48 _, _, _ = p.kubedogSpecs(&kubedog.Config{}, nil) 49 }) 50 } 51 52 func (s *KubedogTestSuite) TestSyncSpecs() { 53 p := New("") 54 p.NewBody() 55 56 relName := "bla" 57 relNS := "blabla" 58 kubecontext := "blacontext" 59 u, _ := uniqname.Generate(relName, relNS) 60 61 p.manifests[u] = ` 62 kind: Canary 63 metadata: 64 name: blabla 65 --- 66 kind: DaemonSet 67 metadata: 68 name: blabla 69 --- 70 kind: Deployment 71 metadata: 72 name: blabla 73 --- 74 apiVersion: v1 75 kind: ServiceAccount 76 metadata: 77 name: bla 78 --- 79 kind: Job 80 metadata: 81 name: blabla 82 --- 83 kind: StatefulSet 84 metadata: 85 name: blabla 86 --- 87 ` 88 89 mockedRelease := &MockReleaseConfig{} 90 mockedRelease.On("KubeContext").Return(kubecontext) 91 mockedRelease.On("Uniq").Return(u) 92 mockedRelease.On("Namespace").Return(relNS) 93 mockedRelease.On("Logger").Return(log.WithField("test", s.T().Name())) 94 p.SetReleases(mockedRelease) 95 96 spec, context, err := p.kubedogSyncSpecs(&kubedog.Config{TrackGeneric: true}) 97 98 s.Require().NoError(err) 99 100 s.Require().Len(spec.Canaries, 1) 101 s.Require().Len(spec.DaemonSets, 1) 102 s.Require().Len(spec.Deployments, 1) 103 s.Require().Len(spec.Generics, 1) 104 s.Require().Len(spec.Jobs, 1) 105 s.Require().Len(spec.StatefulSets, 1) 106 107 s.Require().Equal(kubecontext, context) 108 109 mockedRelease.AssertExpectations(s.T()) 110 } 111 112 func (s *KubedogTestSuite) TestRollbackSpecs() { 113 p := New("") 114 p.NewBody() 115 116 relName := "bla" 117 relNS := "blabla" 118 kubecontext := "blacontext" 119 version := 666 120 u, _ := uniqname.Generate(relName, relNS) 121 122 manifest := ` 123 kind: Canary 124 metadata: 125 name: blabla 126 --- 127 kind: DaemonSet 128 metadata: 129 name: blabla 130 --- 131 kind: Deployment 132 metadata: 133 name: blabla 134 --- 135 apiVersion: v1 136 kind: ServiceAccount 137 metadata: 138 name: bla 139 --- 140 kind: Job 141 metadata: 142 name: blabla 143 --- 144 kind: StatefulSet 145 metadata: 146 name: blabla 147 --- 148 ` 149 150 mockedRelease := &MockReleaseConfig{} 151 mockedRelease.On("KubeContext").Return(kubecontext) 152 mockedRelease.On("Uniq").Return(u) 153 mockedRelease.On("Namespace").Return(relNS) 154 mockedRelease.On("Logger").Return(log.WithField("test", s.T().Name())) 155 mockedRelease.On("Get", version).Return(&helmRelease.Release{Manifest: manifest}, nil) 156 p.SetReleases(mockedRelease) 157 158 spec, context, err := p.kubedogRollbackSpecs(version, &kubedog.Config{TrackGeneric: true}) 159 160 s.Require().NoError(err) 161 162 s.Require().Len(spec.Canaries, 1) 163 s.Require().Len(spec.DaemonSets, 1) 164 s.Require().Len(spec.Deployments, 1) 165 s.Require().Len(spec.Generics, 1) 166 s.Require().Len(spec.Jobs, 1) 167 s.Require().Len(spec.StatefulSets, 1) 168 169 s.Require().Equal(kubecontext, context) 170 171 mockedRelease.AssertExpectations(s.T()) 172 } 173 174 func (s *KubedogTestSuite) TestRollbackSpecsGetError() { 175 p := New("") 176 p.NewBody() 177 178 kubecontext := "blacontext" 179 version := 666 180 errExpected := errors.New("test error") 181 182 mockedRelease := &MockReleaseConfig{} 183 mockedRelease.On("KubeContext").Return(kubecontext) 184 mockedRelease.On("Logger").Return(log.WithField("test", s.T().Name())) 185 mockedRelease.On("Get", version).Return((*helmRelease.Release)(nil), errExpected) 186 p.SetReleases(mockedRelease) 187 188 _, _, err := p.kubedogRollbackSpecs(version, &kubedog.Config{TrackGeneric: true}) 189 190 s.Require().ErrorIs(err, errExpected) 191 mockedRelease.AssertExpectations(s.T()) 192 } 193 194 func (s *KubedogTestSuite) TestSpecsMultipleContexts() { 195 p := New("") 196 p.NewBody() 197 198 relName := "bla" 199 relNS := "blabla" 200 u, _ := uniqname.Generate(relName, relNS) 201 202 mockedRelease1 := &MockReleaseConfig{} 203 mockedRelease1.On("KubeContext").Return("bla1") 204 mockedRelease1.On("Uniq").Return(u) 205 mockedRelease1.On("Namespace").Return(relNS) 206 mockedRelease1.On("Logger").Return(log.WithField("test", s.T().Name())) 207 208 mockedRelease2 := &MockReleaseConfig{} 209 mockedRelease2.On("KubeContext").Return("bla2") 210 mockedRelease2.On("Uniq").Return(u) 211 mockedRelease2.On("Namespace").Return(relNS) 212 mockedRelease2.On("Logger").Return(log.WithField("test", s.T().Name())) 213 214 p.SetReleases(mockedRelease1, mockedRelease2) 215 216 _, _, err := p.kubedogSpecs(&kubedog.Config{TrackGeneric: true}, func(rel release.Config) (string, error) { 217 return "", nil 218 }) 219 220 s.Require().ErrorIs(err, ErrMultipleKubecontexts) 221 mockedRelease1.AssertExpectations(s.T()) 222 mockedRelease2.AssertExpectations(s.T()) 223 }