diff --git a/.github/workflows/checkpatch.yaml b/.github/workflows/checkpatch.yaml index 1480d725a92..27b642119b9 100644 --- a/.github/workflows/checkpatch.yaml +++ b/.github/workflows/checkpatch.yaml @@ -1,7 +1,7 @@ name: Check pull request commits on: push: - pull_request: + # pull_request: jobs: checkpatch: diff --git a/.github/workflows/gotests.yml b/.github/workflows/gotests.yml index 9ab398c04e9..143bf143c04 100644 --- a/.github/workflows/gotests.yml +++ b/.github/workflows/gotests.yml @@ -1,8 +1,8 @@ name: Tetragon Go Test on: - pull_request: - paths-ignore: - - 'docs/**' + # pull_request: + # paths-ignore: + # - 'docs/**' push: branches: - main diff --git a/.github/workflows/lint-codeql.yml b/.github/workflows/lint-codeql.yml index 54bf7448e44..97e9937f1be 100644 --- a/.github/workflows/lint-codeql.yml +++ b/.github/workflows/lint-codeql.yml @@ -1,11 +1,11 @@ name: codeql on: - pull_request: - branches: - - main - paths-ignore: - - 'docs/**' + # pull_request: + # branches: + # - main + # paths-ignore: + # - 'docs/**' push: branches: - main diff --git a/.github/workflows/packages-e2e-tests.yaml b/.github/workflows/packages-e2e-tests.yaml index 97fbc1f6ce3..c5bb06bf298 100644 --- a/.github/workflows/packages-e2e-tests.yaml +++ b/.github/workflows/packages-e2e-tests.yaml @@ -1,10 +1,13 @@ name: Packages e2e Tests on: - pull_request: - paths-ignore: - - "**.md" - - 'docs/**' + push: + branches: + - main + # pull_request: + # paths-ignore: + # - "**.md" + # - 'docs/**' jobs: standalone-tarball-builds: diff --git a/.github/workflows/podinfo-test.yaml b/.github/workflows/podinfo-test.yaml index b26bc595540..482850aaca6 100644 --- a/.github/workflows/podinfo-test.yaml +++ b/.github/workflows/podinfo-test.yaml @@ -1,12 +1,12 @@ name: PodInfo Integration Test on: - pull_request: - types: - - opened - - synchronize - - reopened - paths-ignore: - - 'docs/**' + # pull_request: + # types: + # - opened + # - synchronize + # - reopened + # paths-ignore: + # - 'docs/**' push: branches: - main diff --git a/.github/workflows/run-e2e-tests.yaml b/.github/workflows/run-e2e-tests.yaml index 917b4c51172..a3b9b42026a 100644 --- a/.github/workflows/run-e2e-tests.yaml +++ b/.github/workflows/run-e2e-tests.yaml @@ -13,9 +13,6 @@ concurrency: group: ${{ github.ref }} cancel-in-progress: true -env: - clusterName: tetragon-ci - jobs: prepare: runs-on: ubuntu-22.04 @@ -74,7 +71,7 @@ jobs: strategy: fail-fast: false matrix: - os: [ ubuntu-22.04, ubuntu-22.04-arm64 ] + os: [ ubuntu-22.04 ] package: ${{fromJson(needs.prepare.outputs.packages)}} steps: - name: Checkout Code @@ -117,8 +114,18 @@ jobs: env: GHA_OS: ${{matrix.os}} run: | + set -x cd go/src/github.com/cilium/tetragon - make e2e-test E2E_TESTS=${{matrix.package.f}} E2E_BUILD_IMAGES=0 E2E_AGENT=${{ needs.prepare.outputs.agentImage }} E2E_OPERATOR=${{ needs.prepare.outputs.operatorImage }} EXTRA_TESTFLAGS="-cluster-name=${{ env.clusterName }} -args -v=4" + make e2e-test \ + E2E_TESTS=${{matrix.package.f}} \ + E2E_BUILD_IMAGES=0 \ + E2E_AGENT=${{ needs.prepare.outputs.agentImage }} \ + E2E_OPERATOR=${{ needs.prepare.outputs.operatorImage }} + + - name: ls logs + if: failure() || cancelled() + run: | + ls /tmp/tetragon.e2e.* - name: Upload Tetragon Logs if: failure() || cancelled() diff --git a/.github/workflows/static-checks.yaml b/.github/workflows/static-checks.yaml index d331d1300ab..7cda6d0f399 100644 --- a/.github/workflows/static-checks.yaml +++ b/.github/workflows/static-checks.yaml @@ -10,10 +10,10 @@ on: paths-ignore: - 'docs/**' - '**.md' - pull_request: - paths-ignore: - - 'docs/**' - - '**.md' + # pull_request: + # paths-ignore: + # - 'docs/**' + # - '**.md' permissions: # For golangci/golangci-lint to have read access to pull request for `only-new-issues` option. diff --git a/.github/workflows/vmtests.yml b/.github/workflows/vmtests.yml index 47334f92a0c..2a6e84099d5 100644 --- a/.github/workflows/vmtests.yml +++ b/.github/workflows/vmtests.yml @@ -1,8 +1,8 @@ name: vmtests on: - pull_request: - paths-ignore: - - 'docs/**' + # pull_request: + # paths-ignore: + # - 'docs/**' push: branches: - main diff --git a/Makefile b/Makefile index 686752008c7..88f1ea70070 100644 --- a/Makefile +++ b/Makefile @@ -263,7 +263,10 @@ copy-golangci-lint: .PHONY: test test: tester-progs tetragon-bpf ## Run Go tests. - $(GO) test -exec "$(SUDO)" -p 1 -parallel 1 $(GOFLAGS) -gcflags=$(GO_BUILD_GCFLAGS) -timeout $(GO_TEST_TIMEOUT) -failfast -cover ./pkg/... ./cmd/... ./operator/... ${EXTRA_TESTFLAGS} + $(GO) test -exec "$(SUDO)" -p 1 -parallel 1 \ + $(GOFLAGS) -gcflags=$(GO_BUILD_GCFLAGS) -timeout $(GO_TEST_TIMEOUT) -failfast -cover \ + ./pkg/... ./cmd/... ./operator/... \ + ${EXTRA_TESTFLAGS} .PHONY: tester-progs tester-progs: ## Compile helper programs for unit testing. @@ -285,7 +288,10 @@ alignchecker: ## Run alignchecker. .PHONY: bench bench: ## Run Go benchmarks. - $(GO) test -exec "$(SUDO)" -p 1 -parallel 1 -run ^$$ $(GOFLAGS) -gcflags=$(GO_BUILD_GCFLAGS) -timeout $(GO_TEST_TIMEOUT) -failfast -cover ./pkg/... ./cmd/... ./operator/... -bench=. ${EXTRA_TESTFLAGS} + $(GO) test -exec "$(SUDO)" -p 1 -parallel 1 -run ^$$ \ + $(GOFLAGS) -gcflags=$(GO_BUILD_GCFLAGS) -timeout $(GO_TEST_TIMEOUT) -failfast -cover \ + ./pkg/... ./cmd/... ./operator/... \ + -bench=. ${EXTRA_TESTFLAGS} TEST_COMPILE ?= ./... .PHONY: test-compile @@ -335,7 +341,13 @@ e2e-test: image image-operator else e2e-test: endif - $(GO) list $(E2E_TESTS) | xargs -Ipkg $(GO) test $(GOFLAGS) -gcflags=$(GO_BUILD_GCFLAGS) -timeout $(E2E_TEST_TIMEOUT) -failfast -cover pkg ${EXTRA_TESTFLAGS} -fail-fast -tetragon.helm.set tetragon.image.override="$(E2E_AGENT)" -tetragon.helm.set tetragonOperator.image.override="$(E2E_OPERATOR)" -tetragon.helm.url="" -tetragon.helm.chart="$(realpath ./install/kubernetes/tetragon)" $(E2E_BTF_FLAGS) + $(GO) list $(E2E_TESTS) | xargs -Ipkg \ + $(GO) test $(GOFLAGS) -gcflags=$(GO_BUILD_GCFLAGS) -timeout $(E2E_TEST_TIMEOUT) -failfast -cover pkg \ + ${EXTRA_TESTFLAGS} \ + -tetragon.helm.set tetragon.image.override="$(E2E_AGENT)" \ + -tetragon.helm.set tetragonOperator.image.override="$(E2E_OPERATOR)" \ + -tetragon.helm.url="" -tetragon.helm.chart="$(realpath ./install/kubernetes/tetragon)" \ + $(E2E_BTF_FLAGS) ##@ Development diff --git a/tests/e2e/checker/rpcchecker.go b/tests/e2e/checker/rpcchecker.go index 13abddab52d..d79ee233538 100644 --- a/tests/e2e/checker/rpcchecker.go +++ b/tests/e2e/checker/rpcchecker.go @@ -334,7 +334,7 @@ func (rc *RPCChecker) updateContextEventCheckers(ctx context.Context) context.Co func getExportDir(ctx context.Context) (string, error) { exportDir, ok := ctx.Value(state.ExportDir).(string) if !ok { - return "", fmt.Errorf("export dir has not been created. Call helpers.CreateExportDir() first") + return "", fmt.Errorf("export dir has not been created. Call runner.SetupExport() first") } return exportDir, nil } diff --git a/tests/e2e/helpers/cluster.go b/tests/e2e/helpers/cluster.go index 3cd26cbce10..88eba1f64be 100644 --- a/tests/e2e/helpers/cluster.go +++ b/tests/e2e/helpers/cluster.go @@ -42,22 +42,14 @@ nodes: ` var ( - clusterName string clusterImage string ) func init() { - flag.StringVar(&clusterName, "cluster-name", "tetragon-ci", "Set the name of the k8s cluster being used") // renovate: datasource=docker flag.StringVar(&clusterImage, "cluster-image", "kindest/node:v1.32.3", "Set the node image for the kind cluster") } -// GetClusterName fetches the cluster name configured with -cluster-name or the temporary -// kind cluster name. -func GetClusterName() string { - return clusterName -} - func SetMinKernelVersion() env.Func { return func(ctx context.Context, cfg *envconf.Config) (context.Context, error) { client, err := cfg.NewClient() @@ -141,7 +133,6 @@ func MaybeCreateTempKindCluster(testenv env.Environment, namePrefix string) env. return func(ctx context.Context, cfg *envconf.Config) (context.Context, error) { if cfg.KubeconfigFile() == "" { name := envconf.RandomName(namePrefix, 16) - clusterName = name klog.Infof("No kubeconfig specified, creating temporary kind cluster %s", name) var err error err = writeKindConfig() diff --git a/tests/e2e/helpers/dumpinfo.go b/tests/e2e/helpers/dumpinfo.go index 1d84c6e7506..8c2afbd2200 100644 --- a/tests/e2e/helpers/dumpinfo.go +++ b/tests/e2e/helpers/dumpinfo.go @@ -29,6 +29,7 @@ import ( var ( TetragonContainerName = "tetragon" + OperatorContainerName = "tetragon-operator" TetragonJsonPathname = "/var/run/cilium/tetragon/tetragon.log" ) @@ -52,63 +53,86 @@ func DumpInfo(ctx context.Context, cfg *envconf.Config) (context.Context, error) if err != nil { return ctx, err } - r := client.Resources(opts.Namespace) - podList := &corev1.PodList{} - if err = r.List( - ctx, - podList, - resources.WithLabelSelector(fmt.Sprintf("app.kubernetes.io/instance=%s", opts.DaemonSetName)), - ); err != nil { + if err := dumpPodSummary("pods.txt", exportDir); err != nil { + klog.ErrorS(err, "Failed to dump pod summary") + } + err = dumpAgentInfo(ctx, exportDir, opts, client) + if err != nil { + return ctx, err + } + err = dumpOperatorInfo(ctx, exportDir, opts, client) + if err != nil { return ctx, err } + return ctx, nil +} + +func GetExportDir(ctx context.Context) (string, error) { + exportDir, ok := ctx.Value(state.ExportDir).(string) + if !ok { + return "", fmt.Errorf("export dir has not been created. Call runner.SetupExport() first") + } + + return exportDir, nil +} + +func dumpAgentInfo(ctx context.Context, exportDir string, opts *flags.HelmOptions, client klient.Client) error { + podList, err := getPods(ctx, opts.DaemonSetName, opts, client) + if err != nil { + return err + } + for _, pod := range podList.Items { if err := extractJson(&pod, exportDir); err != nil { klog.ErrorS(err, "Failed to extract json events") } - if err := extractLogs(&pod, exportDir, true); err != nil { + if err := extractLogs(&pod, exportDir, TetragonContainerName, true); err != nil { klog.ErrorS(err, "Failed to extract previous tetragon logs") } - if err := extractLogs(&pod, exportDir, false); err != nil { + if err := extractLogs(&pod, exportDir, TetragonContainerName, false); err != nil { klog.ErrorS(err, "Failed to extract tetragon logs") } - if err := describeTetragonPod(&pod, exportDir); err != nil { + if err := describePod(&pod, opts.DaemonSetName, exportDir); err != nil { klog.ErrorS(err, "Failed to describe tetragon pods") } - if err := dumpPodSummary("pods.txt", exportDir); err != nil { - klog.ErrorS(err, "Failed to dump pod summary") - } dumpBpftool(ctx, client, exportDir, pod.Namespace, pod.Name, TetragonContainerName) } - - return ctx, nil + return nil } -func CreateExportDir(ctx context.Context, t *testing.T) (context.Context, error) { - dir, err := GetExportDir(ctx) - if err == nil { - klog.V(2).InfoS("export dir already exists, skipping creation", "test", t.Name(), "dir", dir) - return ctx, nil - } - - dir, err = os.MkdirTemp("", fmt.Sprintf("tetragon.e2e.%s.*", t.Name())) +func dumpOperatorInfo(ctx context.Context, exportDir string, opts *flags.HelmOptions, client klient.Client) error { + name := opts.DaemonSetName + "-operator" + podList, err := getPods(ctx, name, opts, client) if err != nil { - return ctx, err + return err } - klog.InfoS("created export dir for test", "test", t.Name(), "dir", dir) - - return context.WithValue(ctx, state.ExportDir, dir), nil + for _, pod := range podList.Items { + if err := extractLogs(&pod, exportDir, OperatorContainerName, true); err != nil { + klog.ErrorS(err, "Failed to extract previous operator logs") + } + if err := extractLogs(&pod, exportDir, OperatorContainerName, false); err != nil { + klog.ErrorS(err, "Failed to extract operator logs") + } + if err := describePod(&pod, name, exportDir); err != nil { + klog.ErrorS(err, "Failed to describe operator pods") + } + } + return nil } -func GetExportDir(ctx context.Context) (string, error) { - exportDir, ok := ctx.Value(state.ExportDir).(string) - if !ok { - return "", fmt.Errorf("export dir has not been created. Call runner.CreateExportDir() first") +func getPods(ctx context.Context, nameLabel string, opts *flags.HelmOptions, client klient.Client) (*corev1.PodList, error) { + r := client.Resources(opts.Namespace) + podList := &corev1.PodList{} + if err := r.List( + ctx, podList, + resources.WithLabelSelector(fmt.Sprintf("app.kubernetes.io/name=%s", nameLabel)), + ); err != nil { + return nil, err } - - return exportDir, nil + return podList, nil } func extractJson(pod *corev1.Pod, exportDir string) error { @@ -119,22 +143,21 @@ func extractJson(pod *corev1.Pod, exportDir string) error { filepath.Join(exportDir, fmt.Sprintf("tetragon.%s.json", pod.Name))) } -func extractLogs(pod *corev1.Pod, exportDir string, prev bool) error { +func extractLogs(pod *corev1.Pod, exportDir string, container string, prev bool) error { var fname string if prev { - fname = fmt.Sprintf("tetragon.%s.prev.log", pod.Name) + fname = fmt.Sprintf("%s.%s.prev.log", container, pod.Name) } else { - fname = fmt.Sprintf("tetragon.%s.log", pod.Name) + fname = fmt.Sprintf("%s.%s.log", container, pod.Name) } - return kubectlLogs(filepath.Join(exportDir, fname), - pod.Namespace, - pod.Name, - TetragonContainerName, - prev) + return kubectlLogs( + filepath.Join(exportDir, fname), + pod.Namespace, pod.Name, container, prev, + ) } -func describeTetragonPod(pod *corev1.Pod, exportDir string) error { - fname := fmt.Sprintf("tetragon.%s.describe", pod.Name) +func describePod(pod *corev1.Pod, workload string, exportDir string) error { + fname := fmt.Sprintf("%s.%s.describe", workload, pod.Name) return kubectlDescribe(filepath.Join(exportDir, fname), pod.Namespace, pod.Name) diff --git a/tests/e2e/install/tetragon/tetragon.go b/tests/e2e/install/tetragon/tetragon.go index 77425b9aec3..12c2ba0d034 100644 --- a/tests/e2e/install/tetragon/tetragon.go +++ b/tests/e2e/install/tetragon/tetragon.go @@ -90,12 +90,10 @@ func processOpts(opts ...Option) *flags.HelmOptions { func Uninstall(opts ...Option) env.Func { return func(ctx context.Context, cfg *envconf.Config) (context.Context, error) { o := processOpts(opts...) - klog.InfoS("Uninstalling Tetragon...", "opts", o) + klog.InfoS("Uninstalling Tetragon...", "opts", o, "namespace", o.Namespace, "daemonset", o.DaemonSetName) manager := helm.New(cfg.KubeconfigFile()) - klog.InfoS("Uninstalling Tetragon...", "namespace", o.Namespace, "daemonset", o.DaemonSetName) - helmOpts := []helm.Option{ helm.WithName(o.DaemonSetName), helm.WithNamespace(o.Namespace), @@ -133,7 +131,7 @@ func Uninstall(opts ...Option) env.Func { func Install(opts ...Option) env.Func { return func(ctx context.Context, cfg *envconf.Config) (context.Context, error) { o := processOpts(opts...) - klog.InfoS("Installing Tetragon...", "opts", o) + klog.InfoS("Installing Tetragon...", "opts", o, "namespace", o.Namespace, "daemonset", o.DaemonSetName) manager := helm.New(cfg.KubeconfigFile()) @@ -213,8 +211,6 @@ func Install(opts ...Option) env.Func { helmArgs.WriteString(" --install") - klog.InfoS("Installing Tetragon...", "namespace", o.Namespace, "daemonset", o.DaemonSetName) - helmOpts := []helm.Option{ helm.WithName(o.DaemonSetName), helm.WithNamespace(o.Namespace), diff --git a/tests/e2e/runners/runners.go b/tests/e2e/runners/runners.go index 1a2c77e3f8f..f41ecad768a 100644 --- a/tests/e2e/runners/runners.go +++ b/tests/e2e/runners/runners.go @@ -5,6 +5,7 @@ package runners import ( "context" + "fmt" "os" "testing" "time" @@ -235,7 +236,7 @@ func (r *Runner) cancelContext() { // Must be called at the beinning of every test. func (r *Runner) SetupExport(t *testing.T) { setup := features.New("Setup Export").Assess("Setup Export", func(ctx context.Context, _ *testing.T, _ *envconf.Config) context.Context { - ctx, err := helpers.CreateExportDir(ctx, t) + ctx, err := createExportDir(ctx, t) if err != nil { t.Fatalf("failed to create export dir: %s", err) } @@ -254,3 +255,20 @@ func (r *Runner) SetupExport(t *testing.T) { r.Test(t, setup) } + +func createExportDir(ctx context.Context, t *testing.T) (context.Context, error) { + dir, err := helpers.GetExportDir(ctx) + if err == nil { + klog.V(2).InfoS("export dir already exists, skipping creation", "test", t.Name(), "dir", dir) + return ctx, nil + } + + dir, err = os.MkdirTemp("", fmt.Sprintf("tetragon.e2e.%s.*", t.Name())) + if err != nil { + return ctx, err + } + + klog.InfoS("created export dir for test", "test", t.Name(), "dir", dir) + + return context.WithValue(ctx, state.ExportDir, dir), nil +} diff --git a/tests/e2e/tests/policyfilter/policyfilter_test.go b/tests/e2e/tests/policyfilter/policyfilter_test.go index 39bac70ea07..b1432bc0b56 100644 --- a/tests/e2e/tests/policyfilter/policyfilter_test.go +++ b/tests/e2e/tests/policyfilter/policyfilter_test.go @@ -131,6 +131,7 @@ func TestNamespacedPolicy(t *testing.T) { klog.ErrorS(err, "failed to uninstall policy") t.Fail() } + t.Fail() return ctx }). Feature()