Skip to content

Commit 695354f

Browse files
authored
Print logs and events on test failure (#2347)
Problem: When the tests fail we don't have any outputs from the containers or the k8s events. Solution: Print logs and outputs on failure.
1 parent 6e26763 commit 695354f

File tree

6 files changed

+94
-6
lines changed

6 files changed

+94
-6
lines changed

tests/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ stop-longevity-test: nfr-test ## Stop the longevity test and collects results
109109

110110
.PHONY: .vm-nfr-test
111111
.vm-nfr-test: ## Runs the NFR tests on the GCP VM (called by `nfr-test`)
112-
go run github.com/onsi/ginkgo/v2/ginkgo --randomize-all --randomize-suites --keep-going --fail-on-pending --trace -r -v \
112+
go run github.com/onsi/ginkgo/v2/ginkgo --randomize-all --randomize-suites --keep-going --fail-on-pending --trace -r -v --force-newlines $(ifeq $(CI),true,--github-output) \
113113
--label-filter "nfr" $(GINKGO_FLAGS) --timeout 3h ./suite -- --gateway-api-version=$(GW_API_VERSION) \
114114
--gateway-api-prev-version=$(GW_API_PREV_VERSION) --image-tag=$(TAG) --version-under-test=$(NGF_VERSION) \
115115
--plus-enabled=$(PLUS_ENABLED) --ngf-image-repo=$(PREFIX) --nginx-image-repo=$(NGINX_PREFIX) --nginx-plus-image-repo=$(NGINX_PLUS_PREFIX) \
@@ -118,7 +118,7 @@ stop-longevity-test: nfr-test ## Stop the longevity test and collects results
118118

119119
.PHONY: test
120120
test: ## Runs the functional tests on your default k8s cluster
121-
go run github.com/onsi/ginkgo/v2/ginkgo --randomize-all --randomize-suites --keep-going --fail-on-pending --trace -r -v \
121+
go run github.com/onsi/ginkgo/v2/ginkgo --randomize-all --randomize-suites --keep-going --fail-on-pending --trace -r -v --force-newlines \
122122
--label-filter "functional" $(GINKGO_FLAGS) ./suite -- \
123123
--gateway-api-version=$(GW_API_VERSION) --gateway-api-prev-version=$(GW_API_PREV_VERSION) \
124124
--image-tag=$(TAG) --version-under-test=$(NGF_VERSION) \

tests/framework/info.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package framework
2+
3+
import (
4+
"fmt"
5+
6+
core "k8s.io/api/core/v1"
7+
"sigs.k8s.io/controller-runtime/pkg/client"
8+
)
9+
10+
func GetLogs(rm ResourceManager, namespace string, releaseName string) string {
11+
var returnLogs string
12+
pods, err := rm.GetPods(namespace, client.MatchingLabels{
13+
"app.kubernetes.io/instance": releaseName,
14+
})
15+
if err != nil {
16+
return fmt.Sprintf("failed to get pods: %v", err)
17+
}
18+
19+
for _, pod := range pods {
20+
for _, container := range pod.Spec.Containers {
21+
returnLogs += fmt.Sprintf("Logs for container %s:\n", container.Name)
22+
logs, err := rm.GetPodLogs(pod.Namespace, pod.Name, &core.PodLogOptions{
23+
Container: container.Name,
24+
})
25+
if err != nil {
26+
returnLogs += fmt.Sprintf(" failed to get logs: %v\n", err)
27+
continue
28+
}
29+
returnLogs += fmt.Sprintf(" %s\n", logs)
30+
}
31+
}
32+
return returnLogs
33+
}
34+
35+
func GetEvents(rm ResourceManager, namespace string) string {
36+
var returnEvents string
37+
events, err := rm.GetEvents(namespace)
38+
if err != nil {
39+
return fmt.Sprintf("failed to get events: %v", err)
40+
}
41+
42+
eventGroups := make(map[string][]core.Event)
43+
for _, event := range events.Items {
44+
eventGroups[event.InvolvedObject.Name] = append(eventGroups[event.InvolvedObject.Name], event)
45+
}
46+
47+
for name, events := range eventGroups {
48+
returnEvents += fmt.Sprintf("Events for %s:\n", name)
49+
for _, event := range events {
50+
returnEvents += fmt.Sprintf(" %s\n", event.Message)
51+
}
52+
returnEvents += "\n"
53+
}
54+
return returnEvents
55+
}

tests/framework/resourcemanager.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,23 @@ func (rm *ResourceManager) GetNGFDeployment(namespace, releaseName string) (*app
622622
return &deployment, nil
623623
}
624624

625+
// GetEvents returns all Events in the specified namespace.
626+
func (rm *ResourceManager) GetEvents(namespace string) (*core.EventList, error) {
627+
ctx, cancel := context.WithTimeout(context.Background(), rm.TimeoutConfig.GetTimeout)
628+
defer cancel()
629+
630+
var eventList core.EventList
631+
if err := rm.K8sClient.List(
632+
ctx,
633+
&eventList,
634+
client.InNamespace(namespace),
635+
); err != nil {
636+
return &core.EventList{}, fmt.Errorf("error getting list of Events: %w", err)
637+
}
638+
639+
return &eventList, nil
640+
}
641+
625642
// ScaleDeployment scales the Deployment to the specified number of replicas.
626643
func (rm *ResourceManager) ScaleDeployment(namespace, name string, replicas int32) error {
627644
ctx, cancel := context.WithTimeout(context.Background(), rm.TimeoutConfig.UpdateTimeout)

tests/scripts/cleanup-router.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/usr/bin/env bash
22

3-
set -eo pipefail
3+
set -o pipefail
44

55
source scripts/vars.env
66

tests/scripts/cleanup-vm.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/usr/bin/env bash
22

3-
set -eo pipefail
3+
set -o pipefail
44

55
source scripts/vars.env
66

tests/suite/system_suite_test.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121
apiext "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
2222
apierrors "k8s.io/apimachinery/pkg/api/errors"
2323
k8sRuntime "k8s.io/apimachinery/pkg/runtime"
24-
"k8s.io/apimachinery/pkg/types"
24+
k8sTypes "k8s.io/apimachinery/pkg/types"
2525
"k8s.io/apimachinery/pkg/util/wait"
2626
"k8s.io/client-go/kubernetes"
2727
ctlr "sigs.k8s.io/controller-runtime"
@@ -76,6 +76,7 @@ var (
7676
chartVersion string
7777
clusterInfo framework.ClusterInfo
7878
skipNFRTests bool
79+
logs string
7980
)
8081

8182
const (
@@ -235,7 +236,7 @@ func teardown(relName string) {
235236
500*time.Millisecond,
236237
true, /* poll immediately */
237238
func(ctx context.Context) (bool, error) {
238-
key := types.NamespacedName{Name: ngfNamespace}
239+
key := k8sTypes.NamespacedName{Name: ngfNamespace}
239240
if err := k8sClient.Get(ctx, key, &core.Namespace{}); err != nil && apierrors.IsNotFound(err) {
240241
return true, nil
241242
}
@@ -292,6 +293,11 @@ var _ = AfterSuite(func() {
292293
if skipNFRTests {
293294
Skip("")
294295
}
296+
events := framework.GetEvents(resourceManager, ngfNamespace)
297+
AddReportEntry("Events", events, ReportEntryVisibilityNever)
298+
299+
logs = framework.GetLogs(resourceManager, ngfNamespace, releaseName)
300+
AddReportEntry("Logs", logs, ReportEntryVisibilityNever)
295301

296302
labelFilter := GinkgoLabelFilter()
297303
if !strings.Contains(labelFilter, "longevity-setup") {
@@ -311,3 +317,13 @@ func isNFR(labelFilter string) bool {
311317
strings.Contains(labelFilter, "upgrade") ||
312318
strings.Contains(labelFilter, "scale")
313319
}
320+
321+
var _ = ReportAfterSuite("Print info on failure", func(report Report) {
322+
if !report.SuiteSucceeded {
323+
for _, specReport := range report.SpecReports {
324+
for _, entry := range specReport.ReportEntries {
325+
fmt.Println(entry.GetRawValue())
326+
}
327+
}
328+
}
329+
})

0 commit comments

Comments
 (0)