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  }