github.com/zoumo/helm@v2.5.0+incompatible/pkg/tiller/release_rollback_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 tiller
    18  
    19  import (
    20  	"strings"
    21  	"testing"
    22  
    23  	"k8s.io/helm/pkg/helm"
    24  	"k8s.io/helm/pkg/proto/hapi/release"
    25  	"k8s.io/helm/pkg/proto/hapi/services"
    26  )
    27  
    28  func TestRollbackRelease(t *testing.T) {
    29  	c := helm.NewContext()
    30  	rs := rsFixture()
    31  	rel := releaseStub()
    32  	rs.env.Releases.Create(rel)
    33  	upgradedRel := upgradeReleaseVersion(rel)
    34  	upgradedRel.Hooks = []*release.Hook{
    35  		{
    36  			Name:     "test-cm",
    37  			Kind:     "ConfigMap",
    38  			Path:     "test-cm",
    39  			Manifest: manifestWithRollbackHooks,
    40  			Events: []release.Hook_Event{
    41  				release.Hook_PRE_ROLLBACK,
    42  				release.Hook_POST_ROLLBACK,
    43  			},
    44  		},
    45  	}
    46  
    47  	upgradedRel.Manifest = "hello world"
    48  	rs.env.Releases.Update(rel)
    49  	rs.env.Releases.Create(upgradedRel)
    50  
    51  	req := &services.RollbackReleaseRequest{
    52  		Name: rel.Name,
    53  	}
    54  	res, err := rs.RollbackRelease(c, req)
    55  	if err != nil {
    56  		t.Fatalf("Failed rollback: %s", err)
    57  	}
    58  
    59  	if res.Release.Name == "" {
    60  		t.Errorf("Expected release name.")
    61  	}
    62  
    63  	if res.Release.Name != rel.Name {
    64  		t.Errorf("Updated release name does not match previous release name. Expected %s, got %s", rel.Name, res.Release.Name)
    65  	}
    66  
    67  	if res.Release.Namespace != rel.Namespace {
    68  		t.Errorf("Expected release namespace '%s', got '%s'.", rel.Namespace, res.Release.Namespace)
    69  	}
    70  
    71  	if res.Release.Version != 3 {
    72  		t.Errorf("Expected release version to be %v, got %v", 3, res.Release.Version)
    73  	}
    74  
    75  	updated, err := rs.env.Releases.Get(res.Release.Name, res.Release.Version)
    76  	if err != nil {
    77  		t.Errorf("Expected release for %s (%v).", res.Release.Name, rs.env.Releases)
    78  	}
    79  
    80  	if len(updated.Hooks) != 2 {
    81  		t.Fatalf("Expected 2 hooks, got %d", len(updated.Hooks))
    82  	}
    83  
    84  	// if updated.Hooks[0].Manifest != manifestWithHook {
    85  	//     t.Errorf("Unexpected manifest: %v", updated.Hooks[0].Manifest)
    86  	// }
    87  
    88  	anotherUpgradedRelease := upgradeReleaseVersion(upgradedRel)
    89  	rs.env.Releases.Update(upgradedRel)
    90  	rs.env.Releases.Create(anotherUpgradedRelease)
    91  
    92  	res, err = rs.RollbackRelease(c, req)
    93  	if err != nil {
    94  		t.Fatalf("Failed rollback: %s", err)
    95  	}
    96  
    97  	updated, err = rs.env.Releases.Get(res.Release.Name, res.Release.Version)
    98  	if err != nil {
    99  		t.Errorf("Expected release for %s (%v).", res.Release.Name, rs.env.Releases)
   100  	}
   101  
   102  	if len(updated.Hooks) != 1 {
   103  		t.Fatalf("Expected 1 hook, got %d", len(updated.Hooks))
   104  	}
   105  
   106  	// if updated.Hooks[0].Manifest != manifestWithRollbackHooks {
   107  	//     t.Errorf("Unexpected manifest: %v", updated.Hooks[0].Manifest)
   108  	// }
   109  
   110  	if res.Release.Version != 4 {
   111  		t.Errorf("Expected release version to be %v, got %v", 3, res.Release.Version)
   112  	}
   113  
   114  	if updated.Hooks[0].Events[0] != release.Hook_PRE_ROLLBACK {
   115  		t.Errorf("Expected event 0 to be pre rollback")
   116  	}
   117  
   118  	if updated.Hooks[0].Events[1] != release.Hook_POST_ROLLBACK {
   119  		t.Errorf("Expected event 1 to be post rollback")
   120  	}
   121  
   122  	if len(res.Release.Manifest) == 0 {
   123  		t.Errorf("No manifest returned: %v", res.Release)
   124  	}
   125  
   126  	if len(updated.Manifest) == 0 {
   127  		t.Errorf("Expected manifest in %v", res)
   128  	}
   129  
   130  	if !strings.Contains(updated.Manifest, "hello world") {
   131  		t.Errorf("unexpected output: %s", rel.Manifest)
   132  	}
   133  
   134  	if res.Release.Info.Description != "Rollback to 2" {
   135  		t.Errorf("Expected rollback to 2, got %q", res.Release.Info.Description)
   136  	}
   137  }
   138  
   139  func TestRollbackWithReleaseVersion(t *testing.T) {
   140  	c := helm.NewContext()
   141  	rs := rsFixture()
   142  	rel := releaseStub()
   143  	rs.env.Releases.Create(rel)
   144  	upgradedRel := upgradeReleaseVersion(rel)
   145  	rs.env.Releases.Update(rel)
   146  	rs.env.Releases.Create(upgradedRel)
   147  
   148  	req := &services.RollbackReleaseRequest{
   149  		Name:         rel.Name,
   150  		DisableHooks: true,
   151  		Version:      1,
   152  	}
   153  
   154  	_, err := rs.RollbackRelease(c, req)
   155  	if err != nil {
   156  		t.Fatalf("Failed rollback: %s", err)
   157  	}
   158  }
   159  
   160  func TestRollbackReleaseNoHooks(t *testing.T) {
   161  	c := helm.NewContext()
   162  	rs := rsFixture()
   163  	rel := releaseStub()
   164  	rel.Hooks = []*release.Hook{
   165  		{
   166  			Name:     "test-cm",
   167  			Kind:     "ConfigMap",
   168  			Path:     "test-cm",
   169  			Manifest: manifestWithRollbackHooks,
   170  			Events: []release.Hook_Event{
   171  				release.Hook_PRE_ROLLBACK,
   172  				release.Hook_POST_ROLLBACK,
   173  			},
   174  		},
   175  	}
   176  	rs.env.Releases.Create(rel)
   177  	upgradedRel := upgradeReleaseVersion(rel)
   178  	rs.env.Releases.Update(rel)
   179  	rs.env.Releases.Create(upgradedRel)
   180  
   181  	req := &services.RollbackReleaseRequest{
   182  		Name:         rel.Name,
   183  		DisableHooks: true,
   184  	}
   185  
   186  	res, err := rs.RollbackRelease(c, req)
   187  	if err != nil {
   188  		t.Fatalf("Failed rollback: %s", err)
   189  	}
   190  
   191  	if hl := res.Release.Hooks[0].LastRun; hl != nil {
   192  		t.Errorf("Expected that no hooks were run. Got %d", hl)
   193  	}
   194  }
   195  
   196  func TestRollbackReleaseFailure(t *testing.T) {
   197  	c := helm.NewContext()
   198  	rs := rsFixture()
   199  	rel := releaseStub()
   200  	rs.env.Releases.Create(rel)
   201  	upgradedRel := upgradeReleaseVersion(rel)
   202  	rs.env.Releases.Update(rel)
   203  	rs.env.Releases.Create(upgradedRel)
   204  
   205  	req := &services.RollbackReleaseRequest{
   206  		Name:         rel.Name,
   207  		DisableHooks: true,
   208  	}
   209  
   210  	rs.env.KubeClient = newUpdateFailingKubeClient()
   211  	res, err := rs.RollbackRelease(c, req)
   212  	if err == nil {
   213  		t.Error("Expected failed rollback")
   214  	}
   215  
   216  	if targetStatus := res.Release.Info.Status.Code; targetStatus != release.Status_FAILED {
   217  		t.Errorf("Expected FAILED release. Got %v", targetStatus)
   218  	}
   219  
   220  	oldRelease, err := rs.env.Releases.Get(rel.Name, rel.Version)
   221  	if err != nil {
   222  		t.Errorf("Expected to be able to get previous release")
   223  	}
   224  	if oldStatus := oldRelease.Info.Status.Code; oldStatus != release.Status_SUPERSEDED {
   225  		t.Errorf("Expected SUPERSEDED status on previous Release version. Got %v", oldStatus)
   226  	}
   227  }