Skip to content

Commit 1a37fdb

Browse files
charles-edouard.bretechetekton-robot
authored andcommitted
e2e tests - use helm v3
1 parent 35fbdaa commit 1a37fdb

File tree

2 files changed

+57
-139
lines changed

2 files changed

+57
-139
lines changed

test/gohelloworld/gohelloworld-chart/values.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ image:
1010

1111
service:
1212
name: gohelloworld
13-
type: LoadBalancer
13+
type: ClusterIP
1414
externalPort: 8080
1515
internalPort: 8080
1616

test/helm_task_test.go

Lines changed: 56 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@ package test
2020

2121
import (
2222
"fmt"
23-
"net/http"
2423
"testing"
25-
"time"
2624

2725
"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1alpha1"
2826
"github.com/tektoncd/pipeline/pkg/apis/pipeline/v1beta1"
@@ -31,9 +29,7 @@ import (
3129
tb "github.com/tektoncd/pipeline/test/builder"
3230
corev1 "k8s.io/api/core/v1"
3331
rbacv1 "k8s.io/api/rbac/v1beta1"
34-
"k8s.io/apimachinery/pkg/api/errors"
3532
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
36-
"k8s.io/apimachinery/pkg/util/wait"
3733
knativetest "knative.dev/pkg/test"
3834
)
3935

@@ -42,14 +38,14 @@ const (
4238
sourceImageName = "go-helloworld-image"
4339
createImageTaskName = "create-image-task"
4440
helmDeployTaskName = "helm-deploy-task"
41+
checkServiceTaskName = "check-service-task"
4542
helmDeployPipelineName = "helm-deploy-pipeline"
4643
helmDeployPipelineRunName = "helm-deploy-pipeline-run"
4744
helmDeployServiceName = "gohelloworld-chart"
4845
)
4946

5047
var (
51-
clusterRoleBindings [3]*rbacv1.ClusterRoleBinding
52-
tillerServiceAccount *corev1.ServiceAccount
48+
clusterRoleBindings [1]*rbacv1.ClusterRoleBinding
5349
)
5450

5551
// TestHelmDeployPipelineRun is an integration test that will verify a pipeline build an image
@@ -82,6 +78,11 @@ func TestHelmDeployPipelineRun(t *testing.T) {
8278
t.Fatalf("Failed to create Task `%s`: %s", helmDeployTaskName, err)
8379
}
8480

81+
t.Logf("Creating Task %s", checkServiceTaskName)
82+
if _, err := c.TaskClient.Create(getCheckServiceTask(namespace)); err != nil {
83+
t.Fatalf("Failed to create Task `%s`: %s", checkServiceTaskName, err)
84+
}
85+
8586
t.Logf("Creating Pipeline %s", helmDeployPipelineName)
8687
if _, err := c.PipelineClient.Create(getHelmDeployPipeline(namespace)); err != nil {
8788
t.Fatalf("Failed to create Pipeline `%s`: %s", helmDeployPipelineName, err)
@@ -98,44 +99,9 @@ func TestHelmDeployPipelineRun(t *testing.T) {
9899
t.Fatalf("PipelineRun execution failed; helm may or may not have been installed :(")
99100
}
100101

101-
t.Log("Waiting for service to get external IP")
102-
var serviceIP string
103-
if err := WaitForServiceExternalIPState(c, namespace, helmDeployServiceName, func(svc *corev1.Service) (bool, error) {
104-
ingress := svc.Status.LoadBalancer.Ingress
105-
if ingress != nil {
106-
if len(ingress) > 0 {
107-
serviceIP = ingress[0].IP
108-
return true, nil
109-
}
110-
}
111-
return false, nil
112-
}, "ServiceExternalIPisReady"); err != nil {
113-
t.Errorf("Error waiting for Service %s to get an external IP: %s", helmDeployServiceName, err)
114-
}
115-
116-
// cleanup task to remove helm from cluster, will not fail the test if it fails, just log
102+
// cleanup task to remove helm releases from cluster and cluster role bindings, will not fail the test if it fails, just log
117103
knativetest.CleanupOnInterrupt(func() { helmCleanup(c, t, namespace) }, t.Logf)
118104
defer helmCleanup(c, t, namespace)
119-
120-
if serviceIP != "" {
121-
t.Log("Polling service with external IP")
122-
waitErr := wait.PollImmediate(100*time.Millisecond, 30*time.Second, func() (bool, error) {
123-
resp, err := http.Get(fmt.Sprintf("http://%s:8080", serviceIP))
124-
if err != nil {
125-
return false, nil
126-
}
127-
if resp != nil && resp.StatusCode != http.StatusOK {
128-
return true, fmt.Errorf("expected 200 but received %d response code from service at http://%s:8080", resp.StatusCode, serviceIP)
129-
}
130-
return true, nil
131-
})
132-
if waitErr != nil {
133-
t.Errorf("Error from pinging service IP %s : %s", serviceIP, waitErr)
134-
}
135-
136-
} else {
137-
t.Errorf("Service IP is empty.")
138-
}
139105
}
140106

141107
func getGoHelloworldGitResource(namespace string) *v1alpha1.PipelineResource {
@@ -197,16 +163,49 @@ func getHelmDeployTask(namespace string) *v1beta1.Task {
197163
Name: "chartname", Type: v1beta1.ParamTypeString, Default: &empty,
198164
}},
199165
Steps: []v1beta1.Step{{Container: corev1.Container{
200-
Image: "alpine/helm:2.14.0",
201-
Args: []string{"init", "--wait"},
202-
}}, {Container: corev1.Container{
203-
Image: "alpine/helm:2.14.0",
204-
Args: []string{"install",
166+
Image: "alpine/helm:3.1.2",
167+
Args: []string{
168+
"upgrade",
169+
"--wait",
205170
"--debug",
206-
"--name=$(inputs.params.chartname)",
171+
"--install",
172+
"--namespace",
173+
namespace,
174+
"$(inputs.params.chartname)",
207175
"$(inputs.params.pathToHelmCharts)",
208176
"--set",
209177
"image.repository=$(inputs.resources.image.url)",
178+
"--set",
179+
"service.type=ClusterIP",
180+
},
181+
}}, {Container: corev1.Container{
182+
Image: "lachlanevenson/k8s-kubectl",
183+
Command: []string{"kubectl"},
184+
Args: []string{
185+
"get",
186+
"all",
187+
"--namespace",
188+
namespace,
189+
},
190+
}}},
191+
},
192+
}
193+
}
194+
195+
func getCheckServiceTask(namespace string) *v1beta1.Task {
196+
return &v1beta1.Task{
197+
ObjectMeta: metav1.ObjectMeta{Name: checkServiceTaskName, Namespace: namespace},
198+
Spec: v1beta1.TaskSpec{
199+
Params: []v1beta1.ParamSpec{{
200+
Name: "serviceUrl", Type: v1beta1.ParamTypeString, Description: "Service url",
201+
}},
202+
Steps: []v1beta1.Step{{Container: corev1.Container{
203+
Image: "jwilder/dockerize",
204+
Args: []string{
205+
"-wait",
206+
"$(inputs.params.serviceUrl)",
207+
"-timeout",
208+
"1m",
210209
},
211210
}}},
212211
},
@@ -251,6 +250,13 @@ func getHelmDeployPipeline(namespace string) *v1beta1.Pipeline {
251250
}, {
252251
Name: "chartname", Value: v1beta1.NewArrayOrString("$(params.chartname)"),
253252
}},
253+
}, {
254+
Name: "check-service",
255+
TaskRef: &v1beta1.TaskRef{Name: checkServiceTaskName},
256+
Params: []v1beta1.Param{{
257+
Name: "serviceUrl", Value: v1beta1.NewArrayOrString(fmt.Sprintf("http://%s:8080", helmDeployServiceName)),
258+
}},
259+
RunAfter: []string{"helm-deploy"},
254260
}},
255261
},
256262
}
@@ -274,37 +280,7 @@ func getHelmDeployPipelineRun(namespace string) *v1beta1.PipelineRun {
274280
}
275281

276282
func setupClusterBindingForHelm(c *clients, t *testing.T, namespace string) {
277-
tillerServiceAccount = &corev1.ServiceAccount{
278-
ObjectMeta: metav1.ObjectMeta{
279-
Name: "tiller",
280-
Namespace: "kube-system",
281-
},
282-
}
283-
284-
t.Logf("Creating tiller service account")
285-
if _, err := c.KubeClient.Kube.CoreV1().ServiceAccounts("kube-system").Create(tillerServiceAccount); err != nil {
286-
if !errors.IsAlreadyExists(err) {
287-
t.Fatalf("Failed to create default Service account for Helm %s", err)
288-
}
289-
}
290-
291283
clusterRoleBindings[0] = &rbacv1.ClusterRoleBinding{
292-
ObjectMeta: metav1.ObjectMeta{
293-
Name: names.SimpleNameGenerator.RestrictLengthWithRandomSuffix("tiller"),
294-
},
295-
RoleRef: rbacv1.RoleRef{
296-
APIGroup: "rbac.authorization.k8s.io",
297-
Kind: "ClusterRole",
298-
Name: "cluster-admin",
299-
},
300-
Subjects: []rbacv1.Subject{{
301-
Kind: "ServiceAccount",
302-
Name: "tiller",
303-
Namespace: "kube-system",
304-
}},
305-
}
306-
307-
clusterRoleBindings[1] = &rbacv1.ClusterRoleBinding{
308284
ObjectMeta: metav1.ObjectMeta{
309285
Name: names.SimpleNameGenerator.RestrictLengthWithRandomSuffix("default-tiller"),
310286
},
@@ -320,22 +296,6 @@ func setupClusterBindingForHelm(c *clients, t *testing.T, namespace string) {
320296
}},
321297
}
322298

323-
clusterRoleBindings[2] = &rbacv1.ClusterRoleBinding{
324-
ObjectMeta: metav1.ObjectMeta{
325-
Name: names.SimpleNameGenerator.RestrictLengthWithRandomSuffix("default-tiller"),
326-
},
327-
RoleRef: rbacv1.RoleRef{
328-
APIGroup: "rbac.authorization.k8s.io",
329-
Kind: "ClusterRole",
330-
Name: "cluster-admin",
331-
},
332-
Subjects: []rbacv1.Subject{{
333-
Kind: "ServiceAccount",
334-
Name: "default",
335-
Namespace: "kube-system",
336-
}},
337-
}
338-
339299
for _, crb := range clusterRoleBindings {
340300
t.Logf("Creating Cluster Role binding %s for helm", crb.Name)
341301
if _, err := c.KubeClient.Kube.RbacV1beta1().ClusterRoleBindings().Create(crb); err != nil {
@@ -348,12 +308,6 @@ func helmCleanup(c *clients, t *testing.T, namespace string) {
348308
t.Logf("Cleaning up helm from cluster...")
349309

350310
removeAllHelmReleases(c, t, namespace)
351-
removeHelmFromCluster(c, t, namespace)
352-
353-
t.Logf("Deleting tiller service account")
354-
if err := c.KubeClient.Kube.CoreV1().ServiceAccounts("kube-system").Delete("tiller", &metav1.DeleteOptions{}); err != nil {
355-
t.Fatalf("Failed to delete default Service account for Helm %s", err)
356-
}
357311

358312
for _, crb := range clusterRoleBindings {
359313
t.Logf("Deleting Cluster Role binding %s for helm", crb.Name)
@@ -370,9 +324,9 @@ func removeAllHelmReleases(c *clients, t *testing.T, namespace string) {
370324
Spec: v1beta1.TaskSpec{
371325
Steps: []v1beta1.Step{{Container: corev1.Container{
372326
Name: "helm-remove-all",
373-
Image: "alpine/helm:2.14.0",
327+
Image: "alpine/helm:3.1.2",
374328
Command: []string{"/bin/sh"},
375-
Args: []string{"-c", "helm ls --short --all | xargs -n1 helm del --purge"},
329+
Args: []string{"-c", fmt.Sprintf("helm ls --short --all --namespace %s | xargs -n1 helm delete --namespace %s", namespace, namespace)},
376330
}}},
377331
},
378332
}
@@ -400,39 +354,3 @@ func removeAllHelmReleases(c *clients, t *testing.T, namespace string) {
400354
t.Logf("TaskRun %s failed to finish: %s", helmRemoveAllTaskRunName, err)
401355
}
402356
}
403-
404-
func removeHelmFromCluster(c *clients, t *testing.T, namespace string) {
405-
helmResetTaskName := "helm-reset-task"
406-
helmResetTask := &v1beta1.Task{
407-
ObjectMeta: metav1.ObjectMeta{Name: helmResetTaskName, Namespace: namespace},
408-
Spec: v1beta1.TaskSpec{
409-
Steps: []v1beta1.Step{{Container: corev1.Container{
410-
Image: "alpine/helm:2.14.0",
411-
Args: []string{"reset", "--force"},
412-
}}},
413-
},
414-
}
415-
416-
helmResetTaskRunName := "helm-reset-taskrun"
417-
helmResetTaskRun := &v1beta1.TaskRun{
418-
ObjectMeta: metav1.ObjectMeta{Name: helmResetTaskRunName, Namespace: namespace},
419-
Spec: v1beta1.TaskRunSpec{
420-
TaskRef: &v1beta1.TaskRef{Name: helmResetTaskName},
421-
},
422-
}
423-
424-
t.Logf("Creating Task %s", helmResetTaskName)
425-
if _, err := c.TaskClient.Create(helmResetTask); err != nil {
426-
t.Fatalf("Failed to create Task `%s`: %s", helmResetTaskName, err)
427-
}
428-
429-
t.Logf("Creating TaskRun %s", helmResetTaskRunName)
430-
if _, err := c.TaskRunClient.Create(helmResetTaskRun); err != nil {
431-
t.Fatalf("Failed to create TaskRun `%s`: %s", helmResetTaskRunName, err)
432-
}
433-
434-
t.Logf("Waiting for TaskRun %s in namespace %s to complete", helmResetTaskRunName, namespace)
435-
if err := WaitForTaskRunState(c, helmResetTaskRunName, TaskRunSucceed(helmResetTaskRunName), "TaskRunSuccess"); err != nil {
436-
t.Logf("TaskRun %s failed to finish: %s", helmResetTaskRunName, err)
437-
}
438-
}

0 commit comments

Comments
 (0)