github.com/zoumo/helm@v2.5.0+incompatible/pkg/tiller/release_list_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  	"fmt"
    21  	"testing"
    22  
    23  	"k8s.io/helm/pkg/proto/hapi/release"
    24  	"k8s.io/helm/pkg/proto/hapi/services"
    25  )
    26  
    27  func TestListReleases(t *testing.T) {
    28  	rs := rsFixture()
    29  	num := 7
    30  	for i := 0; i < num; i++ {
    31  		rel := releaseStub()
    32  		rel.Name = fmt.Sprintf("rel-%d", i)
    33  		if err := rs.env.Releases.Create(rel); err != nil {
    34  			t.Fatalf("Could not store mock release: %s", err)
    35  		}
    36  	}
    37  
    38  	mrs := &mockListServer{}
    39  	if err := rs.ListReleases(&services.ListReleasesRequest{Offset: "", Limit: 64}, mrs); err != nil {
    40  		t.Fatalf("Failed listing: %s", err)
    41  	}
    42  
    43  	if len(mrs.val.Releases) != num {
    44  		t.Errorf("Expected %d releases, got %d", num, len(mrs.val.Releases))
    45  	}
    46  }
    47  
    48  func TestListReleasesByStatus(t *testing.T) {
    49  	rs := rsFixture()
    50  	stubs := []*release.Release{
    51  		namedReleaseStub("kamal", release.Status_DEPLOYED),
    52  		namedReleaseStub("astrolabe", release.Status_DELETED),
    53  		namedReleaseStub("octant", release.Status_FAILED),
    54  		namedReleaseStub("sextant", release.Status_UNKNOWN),
    55  	}
    56  	for _, stub := range stubs {
    57  		if err := rs.env.Releases.Create(stub); err != nil {
    58  			t.Fatalf("Could not create stub: %s", err)
    59  		}
    60  	}
    61  
    62  	tests := []struct {
    63  		statusCodes []release.Status_Code
    64  		names       []string
    65  	}{
    66  		{
    67  			names:       []string{"kamal"},
    68  			statusCodes: []release.Status_Code{release.Status_DEPLOYED},
    69  		},
    70  		{
    71  			names:       []string{"astrolabe"},
    72  			statusCodes: []release.Status_Code{release.Status_DELETED},
    73  		},
    74  		{
    75  			names:       []string{"kamal", "octant"},
    76  			statusCodes: []release.Status_Code{release.Status_DEPLOYED, release.Status_FAILED},
    77  		},
    78  		{
    79  			names: []string{"kamal", "astrolabe", "octant", "sextant"},
    80  			statusCodes: []release.Status_Code{
    81  				release.Status_DEPLOYED,
    82  				release.Status_DELETED,
    83  				release.Status_FAILED,
    84  				release.Status_UNKNOWN,
    85  			},
    86  		},
    87  	}
    88  
    89  	for i, tt := range tests {
    90  		mrs := &mockListServer{}
    91  		if err := rs.ListReleases(&services.ListReleasesRequest{StatusCodes: tt.statusCodes, Offset: "", Limit: 64}, mrs); err != nil {
    92  			t.Fatalf("Failed listing %d: %s", i, err)
    93  		}
    94  
    95  		if len(tt.names) != len(mrs.val.Releases) {
    96  			t.Fatalf("Expected %d releases, got %d", len(tt.names), len(mrs.val.Releases))
    97  		}
    98  
    99  		for _, name := range tt.names {
   100  			found := false
   101  			for _, rel := range mrs.val.Releases {
   102  				if rel.Name == name {
   103  					found = true
   104  				}
   105  			}
   106  			if !found {
   107  				t.Errorf("%d: Did not find name %q", i, name)
   108  			}
   109  		}
   110  	}
   111  }
   112  
   113  func TestListReleasesSort(t *testing.T) {
   114  	rs := rsFixture()
   115  
   116  	// Put them in by reverse order so that the mock doesn't "accidentally"
   117  	// sort.
   118  	num := 7
   119  	for i := num; i > 0; i-- {
   120  		rel := releaseStub()
   121  		rel.Name = fmt.Sprintf("rel-%d", i)
   122  		if err := rs.env.Releases.Create(rel); err != nil {
   123  			t.Fatalf("Could not store mock release: %s", err)
   124  		}
   125  	}
   126  
   127  	limit := 6
   128  	mrs := &mockListServer{}
   129  	req := &services.ListReleasesRequest{
   130  		Offset: "",
   131  		Limit:  int64(limit),
   132  		SortBy: services.ListSort_NAME,
   133  	}
   134  	if err := rs.ListReleases(req, mrs); err != nil {
   135  		t.Fatalf("Failed listing: %s", err)
   136  	}
   137  
   138  	if len(mrs.val.Releases) != limit {
   139  		t.Errorf("Expected %d releases, got %d", limit, len(mrs.val.Releases))
   140  	}
   141  
   142  	for i := 0; i < limit; i++ {
   143  		n := fmt.Sprintf("rel-%d", i+1)
   144  		if mrs.val.Releases[i].Name != n {
   145  			t.Errorf("Expected %q, got %q", n, mrs.val.Releases[i].Name)
   146  		}
   147  	}
   148  }
   149  
   150  func TestListReleasesFilter(t *testing.T) {
   151  	rs := rsFixture()
   152  	names := []string{
   153  		"axon",
   154  		"dendrite",
   155  		"neuron",
   156  		"neuroglia",
   157  		"synapse",
   158  		"nucleus",
   159  		"organelles",
   160  	}
   161  	num := 7
   162  	for i := 0; i < num; i++ {
   163  		rel := releaseStub()
   164  		rel.Name = names[i]
   165  		if err := rs.env.Releases.Create(rel); err != nil {
   166  			t.Fatalf("Could not store mock release: %s", err)
   167  		}
   168  	}
   169  
   170  	mrs := &mockListServer{}
   171  	req := &services.ListReleasesRequest{
   172  		Offset: "",
   173  		Limit:  64,
   174  		Filter: "neuro[a-z]+",
   175  		SortBy: services.ListSort_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) != 2 {
   182  		t.Errorf("Expected 2 releases, got %d", len(mrs.val.Releases))
   183  	}
   184  
   185  	if mrs.val.Releases[0].Name != "neuroglia" {
   186  		t.Errorf("Unexpected sort order: %v.", mrs.val.Releases)
   187  	}
   188  	if mrs.val.Releases[1].Name != "neuron" {
   189  		t.Errorf("Unexpected sort order: %v.", mrs.val.Releases)
   190  	}
   191  }
   192  
   193  func TestReleasesNamespace(t *testing.T) {
   194  	rs := rsFixture()
   195  
   196  	names := []string{
   197  		"axon",
   198  		"dendrite",
   199  		"neuron",
   200  		"ribosome",
   201  	}
   202  
   203  	namespaces := []string{
   204  		"default",
   205  		"test123",
   206  		"test123",
   207  		"cerebellum",
   208  	}
   209  	num := 4
   210  	for i := 0; i < num; i++ {
   211  		rel := releaseStub()
   212  		rel.Name = names[i]
   213  		rel.Namespace = namespaces[i]
   214  		if err := rs.env.Releases.Create(rel); err != nil {
   215  			t.Fatalf("Could not store mock release: %s", err)
   216  		}
   217  	}
   218  
   219  	mrs := &mockListServer{}
   220  	req := &services.ListReleasesRequest{
   221  		Offset:    "",
   222  		Limit:     64,
   223  		Namespace: "test123",
   224  	}
   225  
   226  	if err := rs.ListReleases(req, mrs); err != nil {
   227  		t.Fatalf("Failed listing: %s", err)
   228  	}
   229  
   230  	if len(mrs.val.Releases) != 2 {
   231  		t.Errorf("Expected 2 releases, got %d", len(mrs.val.Releases))
   232  	}
   233  }