From 52f8f716e170db6cb117119b59428aecde268c9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20Suszy=C5=84ski?= Date: Thu, 24 Oct 2024 15:46:58 +0200 Subject: [PATCH] Update e2e tests to refer to exec log on failure --- .github/workflows/go.yml | 1 - internal/cli/root.go | 8 +++-- test/e2e-tests.sh | 1 + test/e2e/ics_send.go | 76 ++++++++-------------------------------- 4 files changed, 22 insertions(+), 64 deletions(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 33d34fd15..631d04c19 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -18,7 +18,6 @@ jobs: matrix: go-version: - '1.22' - - '1.23' steps: diff --git a/internal/cli/root.go b/internal/cli/root.go index 00f27bd17..e9a07589a 100644 --- a/internal/cli/root.go +++ b/internal/cli/root.go @@ -84,15 +84,19 @@ func (a *App) Command() *cobra.Command { } func (a *App) setGlobalFlags(c *cobra.Command) { - c.PersistentFlags().BoolVarP( + fl := c.PersistentFlags() + fl.BoolVarP( &a.Verbose, "verbose", "v", false, "verbose output", ) - c.PersistentFlags().VarP( + fl.VarP( enumflag.New(&a.OutputMode, "output", outputModeIDs(), enumflag.EnumCaseInsensitive), "output", "o", "OutputMode format. One of: human|json|yaml.", ) + // TODO: config.BootstrapConfig should allow to add bootstrap flags to command + _ = fl.String("config", "", "") + _ = fl.MarkHidden("config") } var _ commandline.CobraProvider = new(App) diff --git a/test/e2e-tests.sh b/test/e2e-tests.sh index c589ed970..33ab5cd56 100755 --- a/test/e2e-tests.sh +++ b/test/e2e-tests.sh @@ -2,6 +2,7 @@ set -Eeo pipefail +# shellcheck disable=SC1090 source "$(go run knative.dev/hack/cmd/script e2e-tests.sh)" function start_latest_knative_serving() { diff --git a/test/e2e/ics_send.go b/test/e2e/ics_send.go index d89c4f4e2..769212077 100644 --- a/test/e2e/ics_send.go +++ b/test/e2e/ics_send.go @@ -5,27 +5,27 @@ package e2e import ( "context" "fmt" - "strings" + "os" + "path" cloudevents "github.com/cloudevents/sdk-go/v2" cetest "github.com/cloudevents/sdk-go/v2/test" "github.com/stretchr/testify/assert" "gotest.tools/v3/icmd" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + configdir "knative.dev/client/pkg/config/dir" "knative.dev/kn-plugin-event/test" - kubeclient "knative.dev/pkg/client/injection/kube/client" "knative.dev/pkg/logging" "knative.dev/reconciler-test/pkg/environment" "knative.dev/reconciler-test/pkg/eventshub" eventshubassert "knative.dev/reconciler-test/pkg/eventshub/assert" "knative.dev/reconciler-test/pkg/feature" - "sigs.k8s.io/yaml" ) const ( issue228Warn = "child pods are preserved by default when jobs are deleted; " + "set propagationPolicy=Background to remove them or set " + "propagationPolicy=Orphan to suppress this warning" + dirPerm = 0o750 ) // SendEventFeature will create a feature.Feature that will test sending an @@ -63,6 +63,15 @@ func sendEvent(ev cloudevents.Event, sink Sink) feature.StepFn { "--to", sink.String(), } cmd := test.ResolveKnEventCommand(t).ToIcmd(args...) + artifacts := os.Getenv("ARTIFACTS") + if artifacts == "" { + artifacts = os.TempDir() + } + cacheDir := path.Join(artifacts, t.Name()) + if err := os.MkdirAll(cacheDir, dirPerm); err != nil { + t.Fatal(err) + } + cmd.Env = append(os.Environ(), configdir.CacheDirEnvName+"="+cacheDir) log = log.With(json("cmd", cmd)) log.Info("Running") result := icmd.RunCmd(cmd) @@ -70,7 +79,8 @@ func sendEvent(ev cloudevents.Event, sink Sink) feature.StepFn { ExitCode: 0, Err: fmt.Sprintf("Event (ID: %s) have been sent.", ev.ID()), }); err != nil { - handleSendErr(ctx, t, err, ev) + t.Fatal(err, "\n\nExecution log: "+ + path.Join(cacheDir, "last-exec.log.jsonl")) } assert.NotContains(t, result.Stderr(), issue228Warn) log.Info("Succeeded") @@ -82,59 +92,3 @@ func receiveEvent(ev cloudevents.Event, sinkName string) feature.StepFn { MatchEvent(cetest.HasId(ev.ID())). Exact(1) } - -// handleSendErr will handle the error from sending event. -func handleSendErr(ctx context.Context, t feature.T, err error, ev cloudevents.Event) { - // TODO: most of this code should be moved to production CLI, so that in case - // of send error, a nice, report is produced. - // See: https://github.com/knative-extensions/kn-plugin-event/issues/129 - if err == nil { - return - } - kube := kubeclient.Get(ctx) - ns := environment.FromContext(ctx).Namespace() - log := logging.FromContext(ctx) - jobs := kube.BatchV1().Jobs(ns) - pods := kube.CoreV1().Pods(ns) - events := kube.CoreV1().Events(ns) - jlist, kerr := jobs.List(ctx, metav1.ListOptions{ - LabelSelector: "event-id=" + ev.ID(), - }) - if kerr != nil { - log.Error(kerr) - } - if len(jlist.Items) != 1 { - t.Fatal(err) - } - jobName := jlist.Items[0].Name - plist, kerr := pods.List(ctx, metav1.ListOptions{ - LabelSelector: "job-name=" + jobName, - }) - if kerr != nil { - log.Error(kerr) - } - podLogs := make([]string, 0, len(plist.Items)) - for _, item := range plist.Items { - var bytes []byte - bytes, kerr = pods.GetLogs(item.Name, nil).DoRaw(ctx) - if kerr != nil { - log.Error(kerr) - } - podLogs = append(podLogs, string(bytes)) - } - podsYaml, merr := yaml.Marshal(plist.Items) - if merr != nil { - log.Error(merr) - } - elist, eerr := events.List(ctx, metav1.ListOptions{}) - if eerr != nil { - log.Error(eerr) - } - eventsYaml, eerr := yaml.Marshal(elist.Items) - if eerr != nil { - log.Error(eerr) - } - t.Fatal(err, "\n\nJob logs (", len(plist.Items), "):\n", - strings.Join(podLogs, "\n---\n"), "\n\nPods:\n", - string(podsYaml), "\n\nEvents:\n", string(eventsYaml)) -}