github.com/koderover/helm@v2.17.0+incompatible/pkg/tiller/release_list_test.go (about)

     1  /*
     2  Copyright The Helm Authors.
     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  	"fmt"
    21  	"testing"
    22  
    23  	"k8s.io/helm/pkg/proto/hapi/chart"
    24  	"k8s.io/helm/pkg/proto/hapi/release"
    25  	"k8s.io/helm/pkg/proto/hapi/services"
    26  )
    27  
    28  func TestListReleases(t *testing.T) {
    29  	rs := rsFixture()
    30  	num := 7
    31  	for i := 0; i < num; i++ {
    32  		rel := releaseStub()
    33  		rel.Name = fmt.Sprintf("rel-%d", i)
    34  		if err := rs.env.Releases.Create(rel); err != nil {
    35  			t.Fatalf("Could not store mock release: %s", err)
    36  		}
    37  	}
    38  
    39  	mrs := &mockListServer{}
    40  	if err := rs.ListReleases(&services.ListReleasesRequest{Offset: "", Limit: 64}, mrs); err != nil {
    41  		t.Fatalf("Failed listing: %s", err)
    42  	}
    43  
    44  	if len(mrs.val.Releases) != num {
    45  		t.Errorf("Expected %d releases, got %d", num, len(mrs.val.Releases))
    46  	}
    47  }
    48  
    49  func TestListReleasesByStatus(t *testing.T) {
    50  	rs := rsFixture()
    51  	stubs := []*release.Release{
    52  		namedReleaseStub("kamal", release.Status_DEPLOYED),
    53  		namedReleaseStub("astrolabe", release.Status_DELETED),
    54  		namedReleaseStub("octant", release.Status_FAILED),
    55  		namedReleaseStub("sextant", release.Status_UNKNOWN),
    56  	}
    57  	for _, stub := range stubs {
    58  		if err := rs.env.Releases.Create(stub); err != nil {
    59  			t.Fatalf("Could not create stub: %s", err)
    60  		}
    61  	}
    62  
    63  	tests := []struct {
    64  		statusCodes []release.Status_Code
    65  		names       []string
    66  	}{
    67  		{
    68  			names:       []string{"kamal"},
    69  			statusCodes: []release.Status_Code{release.Status_DEPLOYED},
    70  		},
    71  		{
    72  			names:       []string{"astrolabe"},
    73  			statusCodes: []release.Status_Code{release.Status_DELETED},
    74  		},
    75  		{
    76  			names:       []string{"kamal", "octant"},
    77  			statusCodes: []release.Status_Code{release.Status_DEPLOYED, release.Status_FAILED},
    78  		},
    79  		{
    80  			names: []string{"kamal", "astrolabe", "octant", "sextant"},
    81  			statusCodes: []release.Status_Code{
    82  				release.Status_DEPLOYED,
    83  				release.Status_DELETED,
    84  				release.Status_FAILED,
    85  				release.Status_UNKNOWN,
    86  			},
    87  		},
    88  	}
    89  
    90  	for i, tt := range tests {
    91  		mrs := &mockListServer{}
    92  		if err := rs.ListReleases(&services.ListReleasesRequest{StatusCodes: tt.statusCodes, Offset: "", Limit: 64}, mrs); err != nil {
    93  			t.Fatalf("Failed listing %d: %s", i, err)
    94  		}
    95  
    96  		if len(tt.names) != len(mrs.val.Releases) {
    97  			t.Fatalf("Expected %d releases, got %d", len(tt.names), len(mrs.val.Releases))
    98  		}
    99  
   100  		for _, name := range tt.names {
   101  			found := false
   102  			for _, rel := range mrs.val.Releases {
   103  				if rel.Name == name {
   104  					found = true
   105  				}
   106  			}
   107  			if !found {
   108  				t.Errorf("%d: Did not find name %q", i, name)
   109  			}
   110  		}
   111  	}
   112  }
   113  
   114  func TestListReleasesSort(t *testing.T) {
   115  	rs := rsFixture()
   116  
   117  	// Put them in by reverse order so that the mock doesn't "accidentally"
   118  	// sort.
   119  	num := 7
   120  	for i := num; i > 0; i-- {
   121  		rel := releaseStub()
   122  		rel.Name = fmt.Sprintf("rel-%d", i)
   123  		if err := rs.env.Releases.Create(rel); err != nil {
   124  			t.Fatalf("Could not store mock release: %s", err)
   125  		}
   126  	}
   127  
   128  	limit := 6
   129  	mrs := &mockListServer{}
   130  	req := &services.ListReleasesRequest{
   131  		Offset: "",
   132  		Limit:  int64(limit),
   133  		SortBy: services.ListSort_NAME,
   134  	}
   135  	if err := rs.ListReleases(req, mrs); err != nil {
   136  		t.Fatalf("Failed listing: %s", err)
   137  	}
   138  
   139  	if len(mrs.val.Releases) != limit {
   140  		t.Errorf("Expected %d releases, got %d", limit, len(mrs.val.Releases))
   141  	}
   142  
   143  	for i := 0; i < limit; i++ {
   144  		n := fmt.Sprintf("rel-%d", i+1)
   145  		if mrs.val.Releases[i].Name != n {
   146  			t.Errorf("Expected %q, got %q", n, mrs.val.Releases[i].Name)
   147  		}
   148  	}
   149  }
   150  
   151  func TestListReleasesSortByChartName(t *testing.T) {
   152  	rs := rsFixture()
   153  
   154  	// Put them in by reverse order so that the mock doesn't "accidentally"
   155  	// sort.
   156  	num := 7
   157  	for i := num; i > 0; i-- {
   158  		rel := releaseStub()
   159  		rel.Name = fmt.Sprintf("rel-%d", num-i)
   160  		rel.Chart = &chart.Chart{
   161  			Metadata: &chart.Metadata{
   162  				Name: fmt.Sprintf("chartName-%d", i),
   163  			},
   164  		}
   165  		if err := rs.env.Releases.Create(rel); err != nil {
   166  			t.Fatalf("Could not store mock release: %s", err)
   167  		}
   168  	}
   169  
   170  	limit := 6
   171  	mrs := &mockListServer{}
   172  	req := &services.ListReleasesRequest{
   173  		Offset: "",
   174  		Limit:  int64(limit),
   175  		SortBy: services.ListSort_CHART_NAME,
   176  	}
   177  	if err := rs.ListReleases(req, mrs); err != nil {
   178  		t.Fatalf("Failed listing: %s", err)
   179  	}
   180  
   181  	if len(mrs.val.Releases) != limit {
   182  		t.Errorf("Expected %d releases, got %d", limit, len(mrs.val.Releases))
   183  	}
   184  
   185  	for i := 0; i < limit; i++ {
   186  		n := fmt.Sprintf("chartName-%d", i+1)
   187  		if mrs.val.Releases[i].Chart.Metadata.Name != n {
   188  			t.Errorf("Expected %q, got %q", n, mrs.val.Releases[i].Chart.Metadata.Name)
   189  		}
   190  	}
   191  }
   192  
   193  func TestListReleasesFilter(t *testing.T) {
   194  	rs := rsFixture()
   195  	names := []string{
   196  		"axon",
   197  		"dendrite",
   198  		"neuron",
   199  		"neuroglia",
   200  		"synapse",
   201  		"nucleus",
   202  		"organelles",
   203  	}
   204  	num := 7
   205  	for i := 0; i < num; i++ {
   206  		rel := releaseStub()
   207  		rel.Name = names[i]
   208  		if err := rs.env.Releases.Create(rel); err != nil {
   209  			t.Fatalf("Could not store mock release: %s", err)
   210  		}
   211  	}
   212  
   213  	mrs := &mockListServer{}
   214  	req := &services.ListReleasesRequest{
   215  		Offset: "",
   216  		Limit:  64,
   217  		Filter: "neuro[a-z]+",
   218  		SortBy: services.ListSort_NAME,
   219  	}
   220  	if err := rs.ListReleases(req, mrs); err != nil {
   221  		t.Fatalf("Failed listing: %s", err)
   222  	}
   223  
   224  	if len(mrs.val.Releases) != 2 {
   225  		t.Errorf("Expected 2 releases, got %d", len(mrs.val.Releases))
   226  	}
   227  
   228  	if mrs.val.Releases[0].Name != "neuroglia" {
   229  		t.Errorf("Unexpected sort order: %v.", mrs.val.Releases)
   230  	}
   231  	if mrs.val.Releases[1].Name != "neuron" {
   232  		t.Errorf("Unexpected sort order: %v.", mrs.val.Releases)
   233  	}
   234  }
   235  
   236  func TestReleasesNamespace(t *testing.T) {
   237  	rs := rsFixture()
   238  
   239  	names := []string{
   240  		"axon",
   241  		"dendrite",
   242  		"neuron",
   243  		"ribosome",
   244  	}
   245  
   246  	namespaces := []string{
   247  		"default",
   248  		"test123",
   249  		"test123",
   250  		"cerebellum",
   251  	}
   252  	num := 4
   253  	for i := 0; i < num; i++ {
   254  		rel := releaseStub()
   255  		rel.Name = names[i]
   256  		rel.Namespace = namespaces[i]
   257  		if err := rs.env.Releases.Create(rel); err != nil {
   258  			t.Fatalf("Could not store mock release: %s", err)
   259  		}
   260  	}
   261  
   262  	mrs := &mockListServer{}
   263  	req := &services.ListReleasesRequest{
   264  		Offset:    "",
   265  		Limit:     64,
   266  		Namespace: "test123",
   267  	}
   268  
   269  	if err := rs.ListReleases(req, mrs); err != nil {
   270  		t.Fatalf("Failed listing: %s", err)
   271  	}
   272  
   273  	if len(mrs.val.Releases) != 2 {
   274  		t.Errorf("Expected 2 releases, got %d", len(mrs.val.Releases))
   275  	}
   276  }
   277  
   278  func TestReleasePartition(t *testing.T) {
   279  	var rl []*release.Release
   280  	rs := rsFixture()
   281  	rs.Log = t.Logf
   282  	num := 7
   283  	for i := 0; i < num; i++ {
   284  		rel := releaseStub()
   285  		rel.Name = fmt.Sprintf("rel-%d", i)
   286  		rl = append(rl, rel)
   287  	}
   288  	visited := map[string]bool{}
   289  
   290  	chunks := rs.partition(rl, 0)
   291  	for chunk := range chunks {
   292  		for _, rel := range chunk {
   293  			if visited[rel.Name] {
   294  				t.Errorf("%s was already visited", rel.Name)
   295  			}
   296  			visited[rel.Name] = true
   297  		}
   298  	}
   299  }