diff --git a/deploy/addons/helm-tiller/helm-tiller-dp.tmpl b/deploy/addons/helm-tiller/helm-tiller-dp.tmpl index 49ae46166e2174ddaedf6087bee01df73efe4e05..deccc348a3a8f0897615f207d44975613df50916 100644 --- a/deploy/addons/helm-tiller/helm-tiller-dp.tmpl +++ b/deploy/addons/helm-tiller/helm-tiller-dp.tmpl @@ -46,7 +46,7 @@ spec: value: kube-system - name: TILLER_HISTORY_MAX value: "0" - image: gcr.io/kubernetes-helm/tiller:v2.16.1 + image: gcr.io/kubernetes-helm/tiller:v2.16.3 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 3 diff --git a/test/integration/addons_test.go b/test/integration/addons_test.go index 2120ca4060a32e351e119816bbc6e91e12aa7328..313fa01d15f38da207bd883ad6a52ccea9911581 100644 --- a/test/integration/addons_test.go +++ b/test/integration/addons_test.go @@ -40,7 +40,7 @@ func TestAddons(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), Minutes(40)) defer CleanupWithLogs(t, profile, cancel) - args := append([]string{"start", "-p", profile, "--wait=false", "--memory=2600", "--alsologtostderr", "-v=1", "--addons=ingress", "--addons=registry", "--addons=metrics-server"}, StartArgs()...) + args := append([]string{"start", "-p", profile, "--wait=false", "--memory=2600", "--alsologtostderr", "-v=1", "--addons=ingress", "--addons=registry", "--addons=metrics-server", "--addons=helm-tiller"}, StartArgs()...) rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { t.Fatalf("%s failed: %v", rr.Args, err) @@ -55,6 +55,7 @@ func TestAddons(t *testing.T) { {"Registry", validateRegistryAddon}, {"Ingress", validateIngressAddon}, {"MetricsServer", validateMetricsServerAddon}, + {"HelmTiller", validateHelmTillerAddon}, } for _, tc := range tests { tc := tc @@ -249,3 +250,45 @@ func validateMetricsServerAddon(ctx context.Context, t *testing.T, profile strin t.Errorf("%s failed: %v", rr.Args, err) } } + +func validateHelmTillerAddon(ctx context.Context, t *testing.T, profile string) { + client, err := kapi.Client(profile) + if err != nil { + t.Fatalf("kubernetes client: %v", client) + } + + start := time.Now() + if err := kapi.WaitForDeploymentToStabilize(client, "kube-system", "tiller-deploy", Minutes(6)); err != nil { + t.Errorf("waiting for tiller-deploy deployment to stabilize: %v", err) + } + t.Logf("tiller-deploy stabilized in %s", time.Since(start)) + + if _, err := PodWait(ctx, t, profile, "kube-system", "app=helm", Minutes(6)); err != nil { + t.Fatalf("wait: %v", err) + } + + want := "Server: &version.Version" + // Test from inside the cluster (`helm version` use pod.list permission. we use tiller serviceaccount in kube-system to list pod) + checkHelmTiller := func() error { + rr, err := Run(t, exec.CommandContext(ctx, "kubectl", "--context", profile, "run", "--rm", "helm-test", "--restart=Never", "--image=alpine/helm:2.16.3", "-it", "--namespace=kube-system", "--serviceaccount=tiller", "--", "version")) + if err != nil { + return err + } + if rr.Stderr.String() != "" { + t.Logf("%v: unexpected stderr: %s", rr.Args, rr.Stderr) + } + if !strings.Contains(rr.Stdout.String(), want) { + return fmt.Errorf("%v stdout = %q, want %q", rr.Args, rr.Stdout, want) + } + return nil + } + + if err := retry.Expo(checkHelmTiller, 500*time.Millisecond, Minutes(2)); err != nil { + t.Errorf(err.Error()) + } + + rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "addons", "disable", "helm-tiller", "--alsologtostderr", "-v=1")) + if err != nil { + t.Errorf("%s failed: %v", rr.Args, err) + } +}