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 }