github.com/cloudposse/helm@v2.2.3+incompatible/pkg/helm/helm_test.go (about)

     1  /*
     2  Copyright 2016 The Kubernetes Authors All rights reserved.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package helm // import "k8s.io/helm/pkg/helm"
    18  
    19  import (
    20  	"errors"
    21  	"path/filepath"
    22  	"reflect"
    23  	"testing"
    24  
    25  	"github.com/golang/protobuf/proto"
    26  	"golang.org/x/net/context"
    27  
    28  	"k8s.io/helm/pkg/chartutil"
    29  	cpb "k8s.io/helm/pkg/proto/hapi/chart"
    30  	rls "k8s.io/helm/pkg/proto/hapi/release"
    31  	tpb "k8s.io/helm/pkg/proto/hapi/services"
    32  )
    33  
    34  // path to example charts relative to pkg/helm.
    35  const chartsDir = "../../docs/examples/"
    36  
    37  // sentinel error to indicate to the helm client to not send the request to tiller.
    38  var errSkip = errors.New("test: skip")
    39  
    40  // Verify ReleaseListOption's are applied to a ListReleasesRequest correctly.
    41  func TestListReleases_VerifyOptions(t *testing.T) {
    42  	// Options testdata
    43  	var limit = 2
    44  	var offset = "offset"
    45  	var filter = "filter"
    46  	var sortBy = int32(2)
    47  	var sortOrd = int32(1)
    48  	var codes = []rls.Status_Code{
    49  		rls.Status_FAILED,
    50  		rls.Status_DELETED,
    51  		rls.Status_DEPLOYED,
    52  		rls.Status_SUPERSEDED,
    53  	}
    54  	var namespace = "namespace"
    55  
    56  	// Expected ListReleasesRequest message
    57  	exp := &tpb.ListReleasesRequest{
    58  		Limit:       int64(limit),
    59  		Offset:      offset,
    60  		Filter:      filter,
    61  		SortBy:      tpb.ListSort_SortBy(sortBy),
    62  		SortOrder:   tpb.ListSort_SortOrder(sortOrd),
    63  		StatusCodes: codes,
    64  		Namespace:   namespace,
    65  	}
    66  
    67  	// Options used in ListReleases
    68  	ops := []ReleaseListOption{
    69  		ReleaseListSort(sortBy),
    70  		ReleaseListOrder(sortOrd),
    71  		ReleaseListLimit(limit),
    72  		ReleaseListOffset(offset),
    73  		ReleaseListFilter(filter),
    74  		ReleaseListStatuses(codes),
    75  		ReleaseListNamespace(namespace),
    76  	}
    77  
    78  	// BeforeCall option to intercept helm client ListReleasesRequest
    79  	b4c := BeforeCall(func(_ context.Context, msg proto.Message) error {
    80  		switch act := msg.(type) {
    81  		case *tpb.ListReleasesRequest:
    82  			t.Logf("ListReleasesRequest: %#+v\n", act)
    83  			assert(t, exp, act)
    84  		default:
    85  			t.Fatalf("expected message of type ListReleasesRequest, got %T\n", act)
    86  		}
    87  		return errSkip
    88  	})
    89  
    90  	NewClient(b4c).ListReleases(ops...)
    91  }
    92  
    93  // Verify InstallOption's are applied to an InstallReleaseRequest correctly.
    94  func TestInstallRelease_VerifyOptions(t *testing.T) {
    95  	// Options testdata
    96  	var disableHooks = true
    97  	var releaseName = "test"
    98  	var namespace = "default"
    99  	var reuseName = true
   100  	var dryRun = true
   101  	var chartName = "alpine"
   102  	var overrides = []byte("key1=value1,key2=value2")
   103  
   104  	// Expected InstallReleaseRequest message
   105  	exp := &tpb.InstallReleaseRequest{
   106  		Chart:        loadChart(t, chartName),
   107  		Values:       &cpb.Config{Raw: string(overrides)},
   108  		DryRun:       dryRun,
   109  		Name:         releaseName,
   110  		DisableHooks: disableHooks,
   111  		Namespace:    namespace,
   112  		ReuseName:    reuseName,
   113  	}
   114  
   115  	// Options used in InstallRelease
   116  	ops := []InstallOption{
   117  		ValueOverrides(overrides),
   118  		InstallDryRun(dryRun),
   119  		ReleaseName(releaseName),
   120  		InstallReuseName(reuseName),
   121  		InstallDisableHooks(disableHooks),
   122  	}
   123  
   124  	// BeforeCall option to intercept helm client InstallReleaseRequest
   125  	b4c := BeforeCall(func(_ context.Context, msg proto.Message) error {
   126  		switch act := msg.(type) {
   127  		case *tpb.InstallReleaseRequest:
   128  			t.Logf("InstallReleaseRequest: %#+v\n", act)
   129  			assert(t, exp, act)
   130  		default:
   131  			t.Fatalf("expected message of type InstallReleaseRequest, got %T\n", act)
   132  		}
   133  		return errSkip
   134  	})
   135  
   136  	NewClient(b4c).InstallRelease(chartName, namespace, ops...)
   137  }
   138  
   139  // Verify DeleteOptions's are applied to an UninstallReleaseRequest correctly.
   140  func TestDeleteRelease_VerifyOptions(t *testing.T) {
   141  	// Options testdata
   142  	var releaseName = "test"
   143  	var disableHooks = true
   144  	var purgeFlag = true
   145  
   146  	// Expected DeleteReleaseRequest message
   147  	exp := &tpb.UninstallReleaseRequest{
   148  		Name:         releaseName,
   149  		Purge:        purgeFlag,
   150  		DisableHooks: disableHooks,
   151  	}
   152  
   153  	// Options used in DeleteRelease
   154  	ops := []DeleteOption{
   155  		DeletePurge(purgeFlag),
   156  		DeleteDisableHooks(disableHooks),
   157  	}
   158  
   159  	// BeforeCall option to intercept helm client DeleteReleaseRequest
   160  	b4c := BeforeCall(func(_ context.Context, msg proto.Message) error {
   161  		switch act := msg.(type) {
   162  		case *tpb.UninstallReleaseRequest:
   163  			t.Logf("UninstallReleaseRequest: %#+v\n", act)
   164  			assert(t, exp, act)
   165  		default:
   166  			t.Fatalf("expected message of type UninstallReleaseRequest, got %T\n", act)
   167  		}
   168  		return errSkip
   169  	})
   170  
   171  	NewClient(b4c).DeleteRelease(releaseName, ops...)
   172  }
   173  
   174  // Verify UpdateOption's are applied to an UpdateReleaseRequest correctly.
   175  func TestUpdateRelease_VerifyOptions(t *testing.T) {
   176  	// Options testdata
   177  	var chartName = "alpine"
   178  	var releaseName = "test"
   179  	var disableHooks = true
   180  	var overrides = []byte("key1=value1,key2=value2")
   181  	var dryRun = false
   182  
   183  	// Expected UpdateReleaseRequest message
   184  	exp := &tpb.UpdateReleaseRequest{
   185  		Name:         releaseName,
   186  		Chart:        loadChart(t, chartName),
   187  		Values:       &cpb.Config{Raw: string(overrides)},
   188  		DryRun:       dryRun,
   189  		DisableHooks: disableHooks,
   190  	}
   191  
   192  	// Options used in UpdateRelease
   193  	ops := []UpdateOption{
   194  		UpgradeDryRun(dryRun),
   195  		UpdateValueOverrides(overrides),
   196  		UpgradeDisableHooks(disableHooks),
   197  	}
   198  
   199  	// BeforeCall option to intercept helm client UpdateReleaseRequest
   200  	b4c := BeforeCall(func(_ context.Context, msg proto.Message) error {
   201  		switch act := msg.(type) {
   202  		case *tpb.UpdateReleaseRequest:
   203  			t.Logf("UpdateReleaseRequest: %#+v\n", act)
   204  			assert(t, exp, act)
   205  		default:
   206  			t.Fatalf("expected message of type UpdateReleaseRequest, got %T\n", act)
   207  		}
   208  		return errSkip
   209  	})
   210  
   211  	NewClient(b4c).UpdateRelease(releaseName, chartName, ops...)
   212  }
   213  
   214  // Verify RollbackOption's are applied to a RollbackReleaseRequest correctly.
   215  func TestRollbackRelease_VerifyOptions(t *testing.T) {
   216  	// Options testdata
   217  	var disableHooks = true
   218  	var releaseName = "test"
   219  	var revision = int32(2)
   220  	var dryRun = true
   221  
   222  	// Expected RollbackReleaseRequest message
   223  	exp := &tpb.RollbackReleaseRequest{
   224  		Name:         releaseName,
   225  		DryRun:       dryRun,
   226  		Version:      revision,
   227  		DisableHooks: disableHooks,
   228  	}
   229  
   230  	// Options used in RollbackRelease
   231  	ops := []RollbackOption{
   232  		RollbackDryRun(dryRun),
   233  		RollbackVersion(revision),
   234  		RollbackDisableHooks(disableHooks),
   235  	}
   236  
   237  	// BeforeCall option to intercept helm client RollbackReleaseRequest
   238  	b4c := BeforeCall(func(_ context.Context, msg proto.Message) error {
   239  		switch act := msg.(type) {
   240  		case *tpb.RollbackReleaseRequest:
   241  			t.Logf("RollbackReleaseRequest: %#+v\n", act)
   242  			assert(t, exp, act)
   243  		default:
   244  			t.Fatalf("expected message of type RollbackReleaseRequest, got %T\n", act)
   245  		}
   246  		return errSkip
   247  	})
   248  
   249  	NewClient(b4c).RollbackRelease(releaseName, ops...)
   250  }
   251  
   252  // Verify StatusOption's are applied to a GetReleaseStatusRequest correctly.
   253  func TestReleaseStatus_VerifyOptions(t *testing.T) {
   254  	// Options testdata
   255  	var releaseName = "test"
   256  	var revision = int32(2)
   257  
   258  	// Expected GetReleaseStatusRequest message
   259  	exp := &tpb.GetReleaseStatusRequest{
   260  		Name:    releaseName,
   261  		Version: revision,
   262  	}
   263  
   264  	// BeforeCall option to intercept helm client GetReleaseStatusRequest
   265  	b4c := BeforeCall(func(_ context.Context, msg proto.Message) error {
   266  		switch act := msg.(type) {
   267  		case *tpb.GetReleaseStatusRequest:
   268  			t.Logf("GetReleaseStatusRequest: %#+v\n", act)
   269  			assert(t, exp, act)
   270  		default:
   271  			t.Fatalf("expected message of type GetReleaseStatusRequest, got %T\n", act)
   272  		}
   273  		return errSkip
   274  	})
   275  
   276  	NewClient(b4c).ReleaseStatus(releaseName, StatusReleaseVersion(revision))
   277  }
   278  
   279  // Verify ContentOption's are applied to a GetReleaseContentRequest correctly.
   280  func TestReleaseContent_VerifyOptions(t *testing.T) {
   281  	// Options testdata
   282  	var releaseName = "test"
   283  	var revision = int32(2)
   284  
   285  	// Expected GetReleaseContentRequest message
   286  	exp := &tpb.GetReleaseContentRequest{
   287  		Name:    releaseName,
   288  		Version: revision,
   289  	}
   290  
   291  	// BeforeCall option to intercept helm client GetReleaseContentRequest
   292  	b4c := BeforeCall(func(_ context.Context, msg proto.Message) error {
   293  		switch act := msg.(type) {
   294  		case *tpb.GetReleaseContentRequest:
   295  			t.Logf("GetReleaseContentRequest: %#+v\n", act)
   296  			assert(t, exp, act)
   297  		default:
   298  			t.Fatalf("expected message of type GetReleaseContentRequest, got %T\n", act)
   299  		}
   300  		return errSkip
   301  	})
   302  
   303  	NewClient(b4c).ReleaseContent(releaseName, ContentReleaseVersion(revision))
   304  }
   305  
   306  func assert(t *testing.T, expect, actual interface{}) {
   307  	if !reflect.DeepEqual(expect, actual) {
   308  		t.Fatalf("expected %#+v, actual %#+v\n", expect, actual)
   309  	}
   310  }
   311  
   312  func loadChart(t *testing.T, name string) *cpb.Chart {
   313  	c, err := chartutil.Load(filepath.Join(chartsDir, name))
   314  	if err != nil {
   315  		t.Fatalf("failed to load test chart (%q): %s\n", name, err)
   316  	}
   317  	return c
   318  }