Skip to content

Commit dd62e8f

Browse files
Cherry pick #875 to release-1.2 (#883)
Signed-off-by: ashnamehrotra <[email protected]> Signed-off-by: Peter Engelbert <[email protected]> Co-authored-by: ashnamehrotra <[email protected]>
1 parent 1881b8e commit dd62e8f

File tree

6 files changed

+179
-12
lines changed

6 files changed

+179
-12
lines changed

Makefile

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ REMOVER_TAG ?= ${VERSION}
99
TRIVY_SCANNER_REPO ?= ghcr.io/eraser-dev/eraser-trivy-scanner
1010
TRIVY_SCANNER_IMG ?= ${TRIVY_SCANNER_REPO}:${TRIVY_SCANNER_TAG}
1111
TRIVY_BINARY_REPO ?= ghcr.io/aquasecurity/trivy
12-
TRIVY_BINARY_TAG ?= 0.43.0
12+
TRIVY_BINARY_TAG ?= 0.45.1
1313
TRIVY_BINARY_IMG ?= ${TRIVY_BINARY_REPO}:${TRIVY_BINARY_TAG}
1414
MANAGER_REPO ?= ghcr.io/eraser-dev/eraser-manager
1515
MANAGER_IMG ?= ${MANAGER_REPO}:${MANAGER_TAG}
@@ -156,6 +156,13 @@ busybox-img:
156156
--build-arg IMG=$(BUSYBOX_BASE_IMG) test/e2e/test-data
157157
BUSYBOX_IMG=busybox-e2e-test:latest
158158

159+
collector-dummy-img:
160+
docker build -t $(COLLECTOR_REPO):dummy \
161+
-f test/e2e/test-data/Dockerfile.dummyCollector \
162+
test/e2e/test-data
163+
COLLECTOR_IMAGE_DUMMY=$(COLLECTOR_REPO):dummy
164+
165+
159166
vulnerable-img:
160167
docker pull $(VULNERABLE_IMG)
161168

@@ -171,7 +178,7 @@ non-vulnerable-img:
171178
-t ${NON_VULNERABLE_IMG} \
172179
--target non-vulnerable .
173180

174-
e2e-test: vulnerable-img eol-img non-vulnerable-img busybox-img
181+
e2e-test: vulnerable-img eol-img non-vulnerable-img busybox-img collector-dummy-img
175182
for test in $(E2E_TESTS); do \
176183
CGO_ENABLED=0 \
177184
PROJECT_ABSOLUTE_PATH=$(CURDIR) \
@@ -185,6 +192,7 @@ e2e-test: vulnerable-img eol-img non-vulnerable-img busybox-img
185192
COLLECTOR_IMAGE=${COLLECTOR_IMG} \
186193
SCANNER_IMAGE=${TRIVY_SCANNER_IMG} \
187194
BUSYBOX_IMAGE=${BUSYBOX_IMG} \
195+
COLLECTOR_IMAGE_DUMMY=${COLLECTOR_IMAGE_DUMMY} \
188196
VULNERABLE_IMAGE=${VULNERABLE_IMG} \
189197
NON_VULNERABLE_IMAGE=${NON_VULNERABLE_IMG} \
190198
EOL_IMAGE=${EOL_IMG} \

controllers/imagejob/imagejob_controller.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,11 @@ func (r *Reconciler) handleRunningJob(ctx context.Context, imageJob *eraserv1.Im
255255
Namespace: namespace,
256256
}, &template)
257257
if err != nil {
258-
return err
258+
imageJob.Status = eraserv1.ImageJobStatus{
259+
Phase: eraserv1.PhaseFailed,
260+
DeleteAfter: controllerUtils.After(time.Now(), 1),
261+
}
262+
return r.updateJobStatus(ctx, imageJob)
259263
}
260264

261265
listOpts := podListOptions(&template)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
FROM busybox:latest
2+
3+
ENTRYPOINT ["yes"]
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
//go:build e2e
2+
// +build e2e
3+
4+
package e2e
5+
6+
import (
7+
"context"
8+
"testing"
9+
"time"
10+
11+
"github.com/eraser-dev/eraser/test/e2e/util"
12+
13+
eraserv1alpha1 "github.com/eraser-dev/eraser/api/v1alpha1"
14+
corev1 "k8s.io/api/core/v1"
15+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
16+
"k8s.io/apimachinery/pkg/labels"
17+
"sigs.k8s.io/e2e-framework/klient/wait"
18+
"sigs.k8s.io/e2e-framework/klient/wait/conditions"
19+
"sigs.k8s.io/e2e-framework/pkg/envconf"
20+
"sigs.k8s.io/e2e-framework/pkg/features"
21+
)
22+
23+
func TestDeleteManager(t *testing.T) {
24+
deleteManagerFeat := features.New("Deleting manager pod while current ImageJob is running should delete ImageJob and restart").
25+
Assess("Wait for eraser pods running", func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
26+
c, err := cfg.NewClient()
27+
if err != nil {
28+
t.Fatal("Failed to create new client", err)
29+
}
30+
31+
err = wait.For(
32+
util.NumPodsPresentForLabel(ctx, c, 3, util.ImageJobTypeLabelKey+"="+util.CollectorLabel),
33+
wait.WithTimeout(time.Minute*2),
34+
wait.WithInterval(time.Millisecond*500),
35+
)
36+
if err != nil {
37+
t.Fatal(err)
38+
}
39+
40+
return ctx
41+
}).
42+
Assess("Delete controller-manager pod", func(ctx context.Context, t *testing.T, cfg *envconf.Config) context.Context {
43+
c, err := cfg.NewClient()
44+
if err != nil {
45+
t.Fatal("Failed to create new client", err)
46+
}
47+
48+
// get manager pod
49+
var podList corev1.PodList
50+
err = c.Resources().List(ctx, &podList, func(o *metav1.ListOptions) {
51+
o.LabelSelector = labels.SelectorFromSet(map[string]string{util.ManagerLabelKey: util.ManagerLabelValue}).String()
52+
})
53+
if err != nil {
54+
t.Errorf("could not list manager pods: %v", err)
55+
}
56+
57+
if len(podList.Items) != 1 {
58+
t.Error("incorrect number of manager pods: ", len(podList.Items))
59+
}
60+
61+
// get current ImageJob before deleting manager pod
62+
var jobList eraserv1alpha1.ImageJobList
63+
err = c.Resources().List(ctx, &jobList)
64+
if err != nil {
65+
t.Errorf("could not list ImageJob: %v", err)
66+
}
67+
68+
t.Log("job", jobList.Items[0], "name", jobList.Items[0].Name)
69+
70+
if len(jobList.Items) != 1 {
71+
t.Error("incorrect number of ImageJobs: ", len(jobList.Items))
72+
}
73+
74+
// delete manager pod
75+
if err := util.KubectlDelete(cfg.KubeconfigFile(), util.TestNamespace, []string{"pod", podList.Items[0].Name}); err != nil {
76+
t.Error("unable to delete eraser-controller-manager pod")
77+
}
78+
79+
// wait for deletion of ImageJob
80+
err = wait.For(conditions.New(c.Resources()).ResourcesDeleted(&jobList), wait.WithTimeout(util.Timeout))
81+
if err != nil {
82+
t.Errorf("error waiting for ImageJob to be deleted: %v", err)
83+
}
84+
85+
return ctx
86+
}).
87+
Feature()
88+
89+
util.Testenv.Test(t, deleteManagerFeat)
90+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
//go:build e2e
2+
// +build e2e
3+
4+
package e2e
5+
6+
import (
7+
"os"
8+
"testing"
9+
10+
eraserv1alpha1 "github.com/eraser-dev/eraser/api/v1alpha1"
11+
"github.com/eraser-dev/eraser/test/e2e/util"
12+
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
13+
"k8s.io/client-go/kubernetes/scheme"
14+
"sigs.k8s.io/e2e-framework/pkg/env"
15+
"sigs.k8s.io/e2e-framework/pkg/envconf"
16+
"sigs.k8s.io/e2e-framework/pkg/envfuncs"
17+
)
18+
19+
func TestMain(m *testing.M) {
20+
utilruntime.Must(eraserv1alpha1.AddToScheme(scheme.Scheme))
21+
22+
removerImage := util.ParsedImages.RemoverImage
23+
managerImage := util.ParsedImages.ManagerImage
24+
collectorImage := util.ParsedImages.CollectorImage
25+
26+
util.Testenv = env.NewWithConfig(envconf.New())
27+
// Create KinD Cluster
28+
util.Testenv.Setup(
29+
envfuncs.CreateKindClusterWithConfig(util.KindClusterName, util.NodeVersion, util.KindConfigPath),
30+
envfuncs.CreateNamespace(util.TestNamespace),
31+
util.LoadImageToCluster(util.KindClusterName, util.ManagerImage, util.ManagerTarballPath),
32+
util.LoadImageToCluster(util.KindClusterName, util.RemoverImage, util.RemoverTarballPath),
33+
util.LoadImageToCluster(util.KindClusterName, util.RemoverImage, util.RemoverTarballPath),
34+
util.LoadImageToCluster(util.KindClusterName, util.CollectorDummyImage, ""),
35+
util.LoadImageToCluster(util.KindClusterName, util.NonVulnerableImage, ""),
36+
util.HelmDeployLatestEraserRelease(util.TestNamespace,
37+
"--set", util.ScannerEnable.Set("false"),
38+
"--set", util.CollectorEnable.Set("false"),
39+
"--set", util.RemoverImageRepo.Set(removerImage.Repo),
40+
"--set", util.RemoverImageTag.Set(removerImage.Tag),
41+
"--set", util.ManagerImageRepo.Set(managerImage.Repo),
42+
"--set", util.ManagerImageTag.Set(managerImage.Tag),
43+
),
44+
util.UpgradeEraserHelm(util.TestNamespace,
45+
"--set", util.ScannerEnable.Set("false"),
46+
"--set", util.RemoverImageRepo.Set(removerImage.Repo),
47+
"--set", util.RemoverImageTag.Set(removerImage.Tag),
48+
"--set", util.CollectorEnable.Set("true"),
49+
"--set", util.CollectorImageRepo.Set(collectorImage.Repo),
50+
"--set", util.CollectorImageTag.Set("dummy"),
51+
"--set", util.ManagerImageRepo.Set(managerImage.Repo),
52+
"--set", util.ManagerImageTag.Set(managerImage.Tag),
53+
"--set", util.CleanupOnSuccessDelay.Set("2m"),
54+
),
55+
).Finish(
56+
envfuncs.DestroyKindCluster(util.KindClusterName),
57+
)
58+
os.Exit(util.Testenv.Run(m))
59+
}

test/e2e/util/utils.go

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,18 +82,21 @@ const (
8282
CollectorLabel = "collector"
8383
ManualLabel = "manual"
8484
ImageJobTypeLabelKey = "eraser.sh/type"
85+
ManagerLabelKey = "control-plane"
86+
ManagerLabelValue = "controller-manager"
8587
)
8688

8789
var (
88-
Testenv env.Environment
89-
RemoverImage = os.Getenv("REMOVER_IMAGE")
90-
ManagerImage = os.Getenv("MANAGER_IMAGE")
91-
CollectorImage = os.Getenv("COLLECTOR_IMAGE")
92-
ScannerImage = os.Getenv("SCANNER_IMAGE")
93-
VulnerableImage = os.Getenv("VULNERABLE_IMAGE")
94-
NonVulnerableImage = os.Getenv("NON_VULNERABLE_IMAGE")
95-
EOLImage = os.Getenv("EOL_IMAGE")
96-
BusyboxImage = os.Getenv("BUSYBOX_IMAGE")
90+
Testenv env.Environment
91+
RemoverImage = os.Getenv("REMOVER_IMAGE")
92+
ManagerImage = os.Getenv("MANAGER_IMAGE")
93+
CollectorImage = os.Getenv("COLLECTOR_IMAGE")
94+
ScannerImage = os.Getenv("SCANNER_IMAGE")
95+
VulnerableImage = os.Getenv("VULNERABLE_IMAGE")
96+
NonVulnerableImage = os.Getenv("NON_VULNERABLE_IMAGE")
97+
EOLImage = os.Getenv("EOL_IMAGE")
98+
BusyboxImage = os.Getenv("BUSYBOX_IMAGE")
99+
CollectorDummyImage = os.Getenv("COLLECTOR_IMAGE_DUMMY")
97100

98101
RemoverTarballPath = os.Getenv("REMOVER_TARBALL_PATH")
99102
ManagerTarballPath = os.Getenv("MANAGER_TARBALL_PATH")

0 commit comments

Comments
 (0)