|
1 | 1 | package integration_test
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "archive/tar" |
| 5 | + "compress/gzip" |
4 | 6 | "context"
|
5 | 7 | "fmt"
|
| 8 | + "io" |
6 | 9 | "os"
|
7 | 10 | "path/filepath"
|
| 11 | + "runtime" |
8 | 12 | "strings"
|
9 | 13 | "time"
|
10 | 14 |
|
@@ -330,3 +334,112 @@ func ensureTrafficManager(ctx context.Context, kc *k8s.Cluster) error {
|
330 | 334 | k8s.GetManagerNamespace(ctx),
|
331 | 335 | &helm.Request{Type: helm.Install})
|
332 | 336 | }
|
| 337 | + |
| 338 | +func unTgz(ctx context.Context, srcTgz, dstPath string) error { |
| 339 | + rd, err := os.Open(srcTgz) |
| 340 | + if err != nil { |
| 341 | + return err |
| 342 | + } |
| 343 | + defer rd.Close() |
| 344 | + |
| 345 | + err = dos.MkdirAll(ctx, dstPath, 0o755) |
| 346 | + if err != nil { |
| 347 | + return err |
| 348 | + } |
| 349 | + |
| 350 | + zrd, err := gzip.NewReader(rd) |
| 351 | + if err != nil { |
| 352 | + return err |
| 353 | + } |
| 354 | + src := tar.NewReader(zrd) |
| 355 | + for { |
| 356 | + header, err := src.Next() |
| 357 | + if err != nil { |
| 358 | + if err == io.EOF { |
| 359 | + break |
| 360 | + } |
| 361 | + return err |
| 362 | + } |
| 363 | + |
| 364 | + dst := dstPath + "/" + header.Name |
| 365 | + mode := os.FileMode(header.Mode) |
| 366 | + switch header.Typeflag { |
| 367 | + case tar.TypeDir: |
| 368 | + err = dos.MkdirAll(ctx, dst, mode) |
| 369 | + if err != nil { |
| 370 | + return err |
| 371 | + } |
| 372 | + case tar.TypeReg: |
| 373 | + err = dos.MkdirAll(ctx, filepath.Dir(dst), 0o755) |
| 374 | + if err != nil { |
| 375 | + return err |
| 376 | + } |
| 377 | + w, err := dos.OpenFile(ctx, dst, os.O_CREATE|os.O_WRONLY, mode) |
| 378 | + if err != nil { |
| 379 | + return err |
| 380 | + } |
| 381 | + _, err = io.Copy(w, src) |
| 382 | + _ = w.Close() |
| 383 | + if err != nil { |
| 384 | + return err |
| 385 | + } |
| 386 | + default: |
| 387 | + return fmt.Errorf("unable to untar type : %c in file %s", header.Typeflag, header.Name) |
| 388 | + } |
| 389 | + } |
| 390 | + return nil |
| 391 | +} |
| 392 | + |
| 393 | +func (is *installSuite) Test_HelmSubChart() { |
| 394 | + if runtime.GOOS == "windows" || !(is.ManagerVersion().EQ(version.Structured) && is.ClientVersion().EQ(version.Structured)) { |
| 395 | + is.T().Skip("Not part of compatibility tests. Need forward slashes in path, and PackageHelmChart assumes current version.") |
| 396 | + } |
| 397 | + ctx := is.Context() |
| 398 | + require := is.Require() |
| 399 | + |
| 400 | + t := is.T() |
| 401 | + subChart, err := is.PackageHelmChart(ctx) |
| 402 | + require.NoError(err) |
| 403 | + |
| 404 | + base := t.TempDir() |
| 405 | + require.NoError(unTgz(ctx, subChart, filepath.Join(base, "charts"))) |
| 406 | + |
| 407 | + chart := fmt.Sprintf(`apiVersion: v2 |
| 408 | +dependencies: |
| 409 | + - name: telepresence-oss |
| 410 | + registry: ../charts/telepresence-oss |
| 411 | + version: %s |
| 412 | + condition: enabled |
| 413 | +description: Helm chart to deploy telepresence |
| 414 | +name: parent |
| 415 | +version: 1.0.0`, is.ClientVersion()) |
| 416 | + |
| 417 | + vals := is.GetSetArgsForHelm(ctx, map[string]any{ |
| 418 | + "global": map[string]any{ |
| 419 | + "some-string": "value", |
| 420 | + "some-obj": map[string]any{ |
| 421 | + "foo": "bar", |
| 422 | + }, |
| 423 | + "some-bool": true, |
| 424 | + }, |
| 425 | + "telepresence-oss": map[string]any{ |
| 426 | + "clientRbac": map[string]any{ |
| 427 | + "create": true, |
| 428 | + "subjects": []rbac.Subject{ |
| 429 | + { |
| 430 | + Kind: "ServiceAccount", |
| 431 | + Name: itest.TestUser, |
| 432 | + Namespace: is.ManagerNamespace(), |
| 433 | + }, |
| 434 | + }, |
| 435 | + }, |
| 436 | + }, |
| 437 | + }, false) |
| 438 | + require.NoError(dos.WriteFile(ctx, filepath.Join(base, "Chart.yaml"), []byte(chart), 0o644)) |
| 439 | + |
| 440 | + vals = append([]string{"template", "parent", base, "-n", is.ManagerNamespace()}, vals...) |
| 441 | + so, err := itest.Output(ctx, "helm", vals...) |
| 442 | + require.NoError(err) |
| 443 | + require.Contains(so, "# Source: parent/charts/telepresence-oss/templates/clientRbac/connect.yaml") |
| 444 | + require.Contains(so, "name: "+itest.TestUser) |
| 445 | +} |
0 commit comments