Commit Graph

275 Commits

Author SHA1 Message Date
Patrick Ohly
43539c855f e2e framework: unify logging, support skipping helpers
ginkgo.GinkgoHelper is a recent addition to ginkgo which allows functions to
mark themselves as helper. This then changes which callstack gets reported for
failures. It makes sense to support the same mechanism also for logging.

There's also no reason why framework.Logf should produce output that is in a
different format than klog log entries. Having time stamps formatted
differently makes it hard to read test output which uses a mixture of both.
Another user-visible advantage is that the error log entry from
framework.ExpectNoError now references the test source code.

With textlogger there is a simple replacement for klog that can be reconfigured
to let the caller handle stack unwinding. klog itself doesn't support that
and should be modified to support it (feature freeze).

Emitting printf-style output via that logger would work, but become less
readable because the message string would get quoted instead of printing it
verbatim as before. So instead, the traditional klog header gets reproduced
in the framework code. In this example, the first line is from klog, the second
from Logf:

    I0111 11:00:54.088957  332873 factory.go:193] Registered Plugin "containerd"
    ...
      I0111 11:00:54.987534 332873 util.go:506] >>> kubeConfig: /var/run/kubernetes/admin.kubeconfig

Indention is a bit different because the initial output is printed before
installing the logger which writes through ginkgo.GinkgoWriter.

One welcome side effect is that now "go vet" detects mismatched parameters for
framework.Logf because fmt.Sprintf is called without mangling the format
string. Some of the calls were incorrect.
2024-01-20 18:23:31 +01:00
Patrick Ohly
dd0cee4895 e2e node runner: remove dependency on e2e/framework
A stand-alone binary shouldn't import the test/e2e/framework, which is targeted
towards usage in a Ginkgo test suite. This currently works, but will break once
test/e2e/framework becomes more opinionated about how to configure logging.

The simplest solution is to duplicate the one short function that the binary
was calling in the framework.
2024-01-20 18:23:31 +01:00
Patrick Ohly
e3ee4e3585 e2e: replace klog.Fatal with assertion
Using klog.Fatal to abort a test leads to a poor user experience because the
output is buffered in ginkgo.GinkgoWriter and not flushed before killing the
process. The output is also different from other failures. Using the normal
error checking is better.

Before:

    $ KUBECONFIG=/no/such/config go test -v ./test/e2e/
      Jan 19 10:06:58.475: INFO: The --provider flag is not set. Continuing as if --provider=skeleton had been used.
    === RUN   TestE2E
      I0119 10:06:58.475844   99472 e2e.go:109] Starting e2e run "5303f626-ae0e-44d7-abf1-b4956d910ef4" on Ginkgo node 1
    Running Suite: Kubernetes e2e suite - /nvme/gopath/src/k8s.io/kubernetes/test/e2e
    =================================================================================
    Random Seed: 1705655217 - will randomize all specs

    Will run 4678 of 7421 specs
    goroutine 817 [running]:
    k8s.io/klog/v2/internal/dbg.Stacks(0x0)
    	/nvme/gopath/src/k8s.io/kubernetes/vendor/k8s.io/klog/v2/internal/dbg/dbg.go:35 +0x85
    k8s.io/klog/v2.(*loggingT).output(0x9d92b20, 0x3, 0x0, 0xc00069d7a0, 0x2, {0x834c6e8?, 0x9d91c80?}, 0x300000060?, 0x0)
    ...
    k8s.io/klog/v2.Fatal(...)
    	/nvme/gopath/src/k8s.io/kubernetes/vendor/k8s.io/klog/v2/klog.go:1652
    k8s.io/kubernetes/test/e2e.setupSuite({0x7fb49064c078, 0xc003072360})
    	/nvme/gopath/src/k8s.io/kubernetes/test/e2e/e2e.go:187 +0x125
    ...
    FAIL	k8s.io/kubernetes/test/e2e	0.759s
    FAIL

After:

    $ KUBECONFIG=/no/such/config go test -v ./test/e2e/
      Jan 19 10:12:58.889: INFO: The --provider flag is not set. Continuing as if --provider=skeleton had been used.
    === RUN   TestE2E
      I0119 10:12:58.889224  106019 e2e.go:109] Starting e2e run "bed5a77a-f595-42d0-b512-5f601067444b" on Ginkgo node 1
    Running Suite: Kubernetes e2e suite - /nvme/gopath/src/k8s.io/kubernetes/test/e2e
    =================================================================================
    Random Seed: 1705655578 - will randomize all specs

    Will run 4678 of 7421 specs
    ------------------------------
    [SynchronizedBeforeSuite] [FAILED] [0.001 seconds]
    [SynchronizedBeforeSuite]
    /nvme/gopath/src/k8s.io/kubernetes/test/e2e/e2e.go:69

      Timeline >>
      Jan 19 10:12:59.063: INFO: >>> kubeConfig: /no/such/config
      Jan 19 10:12:59.063: INFO: Unexpected error: Error loading client:
          <*errors.errorString | 0xc00182c130>:
          error creating client: error loading KubeConfig: open /no/such/config: no such file or directory
          {
              s: "error creating client: error loading KubeConfig: open /no/such/config: no such file or directory",
          }
      [FAILED] in [SynchronizedBeforeSuite] - /nvme/gopath/src/k8s.io/kubernetes/test/e2e/e2e.go:186 @ 01/19/24 10:12:59.064
      << Timeline

      [FAILED] Error loading client: error creating client: error loading KubeConfig: open /no/such/config: no such file or directory
      In [SynchronizedBeforeSuite] at: /nvme/gopath/src/k8s.io/kubernetes/test/e2e/e2e.go:186 @ 01/19/24 10:12:59.064
    ------------------------------

    Summarizing 1 Failure:
      [FAIL] [SynchronizedBeforeSuite]
      /nvme/gopath/src/k8s.io/kubernetes/test/e2e/e2e.go:186

    Ran 0 of 7421 Specs in 0.001 seconds
    FAIL! -- A BeforeSuite node failed so all tests were skipped.
    --- FAIL: TestE2E (0.18s)
    FAIL
    FAIL	k8s.io/kubernetes/test/e2e	0.769s
    FAIL
2024-01-19 10:14:07 +01:00
Jongwoo Han
725b107f49
Correct typo from 'gingko' to 'ginkgo'
Signed-off-by: Jongwoo Han <jongwooo.han@gmail.com>
2023-12-20 10:31:53 +09:00
Kubernetes Prow Robot
953afbb328
Merge pull request #121193 from sohankunkerkar/kubelet-config-dir
Retarget drop-in kubelet configuration dir feature to Alpha
2023-11-03 23:59:29 +01:00
Sohan Kunkerkar
ad7b9b56f5 test/e2e_node: add e2e test for Kubeletconfig drop-in dir
Signed-off-by: Sohan Kunkerkar <sohank2602@gmail.com>
Co-authored-by: Peter Hunt <pehunt@redhat.com>
2023-11-03 17:49:22 -04:00
Patrick Ohly
338fe7ad55 e2e framework: validate test definitions
This checks that the With* label functions are used instead of the previous
inline tags. To catch strings passed to Ginkgo directly instead of the
framework wrapper functions, the final test specs are checked.
2023-11-01 15:17:34 +01:00
Patrick Ohly
39b6916cbc e2e: add wrapper functions to annotate tests
These wrapper functions set labels in addition to injecting the annotation into
the test text. It then becomes possible to select tests in different ways:

    ginkgo -v --focus="should respect internalTrafficPolicy.*\[FeatureGate:ServiceInternalTrafficPolicy\]"

    ginkgo -v --label-filter="FeatureGate:ServiceInternalTrafficPolicy"

    ginkgo -v --label-filter="Beta"

When a test runs, ginkgo shows it as:

    [It] should respect internalTrafficPolicy=Local Pod to Pod [FeatureGate:ServiceInternalTrafficPolicy] [Beta] [FeatureGate:ServiceInternalTrafficPolicy, Beta]

The test name and the labels at the end are in different colors. Embedding the
annotations inside the text is redundant and only done because users of the e2e
suite might expect it. Also, our tooling that consumes test results currently
doesn't know about ginkgo labels.

Environments, features and node features as described by
https://github.com/kubernetes/enhancements/tree/master/keps/sig-testing/3041-node-conformance-and-features
are also supported.

The framework and thus (at the moment) test/e2e do not have any pre-defined
environments and features. Adding those and modifying tests will follow in
a separate commit.
2023-10-10 18:15:49 +02:00
Patrick Ohly
535ab74346 e2e framework: track and report internal bugs
If something goes wrong during the test registration phase, the only solution
so far was to panic. This is not user-friendly and only allows to report one
problem at a time.

If initialization can continue, then a better solution is to record a bug,
continue, and then report all bugs together.

This also works when just listing tests. The new verify-e2e-suites.sh uses that
to check all test suites (identified as "packages that call
framework.AfterReadingAllFlags", with some exceptions) as part of
pull-kubernetes-verify.

Example output for a fake

    framework.RecordBug(framework.NewBug("fake bug during SIGDescribe", 0))

in test/e2e/storage/volume_metrics.go:
```
$ hack/verify-e2e-suites.sh
go version go1.21.1 linux/amd64
ERROR: E2E test suite invocation failed for test/e2e.
   ERROR: E2E suite initialization was faulty, these errors must be fixed:
   ERROR: test/e2e/storage/volume_metrics.go:49: fake bug during SIGDescribe
E2E suite test/e2e_kubeadm passed.
E2E suite test/e2e_node passed.
```
2023-10-10 18:15:46 +02:00
Patrick Ohly
3afdcc03ea e2e framework: list specs and labels
-list-tests is a more concise alternative for `ginkgo --dry-run` with one line
per test. In contrast to `--dry-run`, it really lists all tests. `--dry-run`
without additional parameters uses the default skip expression from the E2E
context, which filters out flaky and feature-gated tests. The output includes
the source code location where each test is defined. It is sorted by test
name (not source code location) because that order is independent of
reorganizing the source code and ordering by location can be achieved with
"sort".

-list-labels has no corresponding feature in Ginkgo.

One possible usage is to figure out what values might make sense for
-focus/skip/label-filter.

Unit tests will follow in a future commit.
2023-10-10 17:15:59 +02:00
upodroid
a29be0cfb0 update container runtime flags to use containerd instead of docker 2023-06-14 19:18:39 +01:00
SataQiu
4dbece1e20 e2e-framework: remove node-role.kubernetes.io/master taint from non-blocking-taints 2023-06-06 22:19:55 +08:00
Ed Bartosh
867be8fc3e get rid of e2e/framework -> k/k/pkg/kubelet dependency
It's conceptually wrong to have dependencies to k/k/pkg in
the e2e framework code. They should be moved to corresponding
packages, in this particular case to the test/e2e_node.
2023-04-14 00:28:33 +03:00
Sergey Kanzhelev
1e6281e4a2 first iteration to add standalone mode 2023-03-14 20:46:41 +00:00
Kubernetes Prow Robot
04e7021d06
Merge pull request #114625 from Divya063/feature-private-image-registry
[E2E] Add support for pulling images from private registry
2023-02-28 06:27:17 -08:00
Divya Rani
a8b1e57246 add support for pulling images from private registry 2023-02-28 00:40:51 -08:00
Patrick Ohly
3e2b26ce52 e2e: revise complete report creation
The previous approach was based on the observation that some Prow jobs use the
--report-dir parameter instead of the E2E_REPORT_DIR env variable. Parsing the
command line was necessary to use the --json-report and --junit-report
parameters.

But that is complex and can be avoided by triggering the creation of complete
reports in the E2E test suite. The paths are hard-coded and relative to the
report directory to keep the code simple.

There was a report that k8s-triage started processing more data after
6db4b741dd was merged. It's unclear whether
that was because of the new <report-dir>/ginkgo_report.xml file. To avoid
this potential problem, the reports are now in a "ginkgo" sub-directory.

While at it, error checking gets enhanced:
- Create directories at the start of
  the suite and bail out early if that fails.
- *All* e2e suites using the framework do this, not just test/e2e.
- Added missing error checking of truncated JUnit report writing.
2023-02-10 10:20:20 +01:00
Patrick Ohly
0f9a8d38be e2e framework: configure poll interval+duration for gomega
Primarily this protects against accidentally polling with the default interval
of 10ms. Setting these defaults may also make some tests simpler because they
don't need to override the defaults.
2023-01-09 17:29:35 +01:00
Patrick Ohly
db394db398 e2e: move several timeouts from TestContext into TimeoutContext
This consolidates timeout handling. In the future, configuration of all
timeouts via a configuration file might get added. For now, the same three
legacy command line flags for the timeouts that get moved continue to be
supported.
2023-01-09 17:29:35 +01:00
Patrick Ohly
0c2c027ebc e2e: clean up listing
It doesn't make sense for the E2E framework to have command line options that
don't do anything because then all test suites built with the framework inherit
those options.

For -list-images and -list-conformance-tests the solution is to move the
implementation into the framework (-list-images) respectively move the flag
into test/e2e (-list-conformance-tests).

The placement was decided based on the observation that image patching is
common functionality while conformance testing is specific to one test suite.
2022-12-23 10:36:06 +01:00
Kubernetes Prow Robot
020fb2eb77
Merge pull request #113538 from pohly/e2e-ginkgo-timeline
e2e: ginkgo timeline
2022-12-21 13:53:28 -08:00
Patrick Ohly
f6cdd37046 e2e framework: move JUnit write function
This makes it possible to unit test it.
2022-12-21 07:55:07 +01:00
Patrick Ohly
a53753575a e2e framework: stop overriding ginkgo verbosity/progress
The default settings from Ginkgo are useful enough for Kubernetes since
timeline support was added (https://github.com/onsi/ginkgo/issues/1069).
2022-12-21 07:55:07 +01:00
Patrick Ohly
f4a837affb e2e framework: avoid storing redundant failure message string
All information that we want will be written into the failure XML element's
data. We don't need the message tag and don't want it because our
tools (kettle, testgrid, spyglass) would then just concatenate the two strings.

This gets implemented for us by Ginkgo. However, truncating the failure message
is not supported there at the moment. It's unclear how important that is,
therefore this (recently added feature) gets removed.
2022-12-21 07:55:07 +01:00
Patrick Ohly
6db4b741dd e2e: dump full report information
The Ginkgo CLI output no longer has the full output. We need the reports
generated by Ginkgo for that.
2022-12-21 07:55:07 +01:00
Patrick Ohly
2f6c4f5eab e2e: use Ginkgo context
All code must use the context from Ginkgo when doing API calls or polling for a
change, otherwise the code would not return immediately when the test gets
aborted.
2022-12-16 20:14:04 +01:00
Patrick Ohly
023baa5e45 e2e framework: truncate too long failure messages when writing JUnit
Our tooling cannot handle very long failure messages well:
- when unfolding a test in the spyglass UI, it fills the entire screen
- failure correlation for http://go.k8s.io/triage has resource constraints

We cannot enforce that all tests only produce short failure messages and even
if we could, depending on the test failure, including more information may be
useful to understand it.

To achieve both goals (summary for correlation and overview, all details
available when digging deeper), too longer failure messages now get truncated,
with the full message guaranteed to be captured in the test output.

"Too long" is arbitrarily chosen to be similar to the gomega.MaxLength because
that has been a limit for failure message size in the past.
2022-10-28 15:43:48 +02:00
Patrick Ohly
b3f4cd66cd e2e framework: add -gomega-max-length parameter
When gomega.format exceeds the default size of 4000, it truncates and prints:

  Gomega truncated this representation as it exceeds 'format.MaxLength'.
  Consider having the object provide a custom 'GomegaStringer' representation
  or adjust the parameters in Gomega's 'format' package.

  Learn more here: https://onsi.github.io/gomega/#adjusting-output

These instructions don't help the user of the e2e.test binary unless we provide
a command line flag.
2022-10-28 15:43:48 +02:00
Patrick Ohly
8af3258526 e2e framework: move NodeKiller into framework/node
This removes some more dependencies from the framework.

Removing the configuration needs to be handled as part of refactoring the
TestContext.
2022-10-06 08:16:47 +02:00
Kubernetes Prow Robot
d2e3c70f1d
Merge pull request #111961 from pohly/e2e-klog-output
e2e: klog output
2022-09-17 14:38:28 -07:00
Patrick Ohly
d33e66b81b e2e: reduce built time for framework
Pulling the CreateKubeConfig function from the expensive to build
test/utils/apiserver package had a considerable impact on the overall build
time because that package depends on a lot of other packages.

Because only that one function is needed by the framework, that extra build
time can be avoided by moving it into its own package.
2022-09-10 17:56:23 +02:00
Patrick Ohly
7eb472246f e2e framework: use new apiserver helper package 2022-09-09 13:51:07 +02:00
Davanum Srinivas
9bbf01bae9
Remove references to openstack and cinder
Signed-off-by: Davanum Srinivas <davanum@gmail.com>
2022-08-22 16:43:14 -04:00
Patrick Ohly
96e9a93a6b e2e: disable double printing of errors
We don't want klog to print to anything other than GinkgoWriter, but it still
used os.Stderr in addition to GinkgoWriter when printing log entries with
severity >= error. Changing "stderrthreshold" fixes that.

The unit test for framework output handling didn't test klog behavior. Now it
does:
- os.Stderr is redirected, should be empty
- a new test invokes klog
2022-08-22 17:04:26 +02:00
Dave Chen
c299a12cf2 e2e: trim junit report for Spyglass, avoid "open stdout"
Including the full information for successful tests makes the resulting XML
file too large for the 200GB limit in Spyglass when running large jobs (like
scale testing).

The original solution from https://github.com/kubernetes/kubernetes/pull/111627
broke JUnit reporting in other test suites, in particular
test/e2e_node. Keeping the code inside the framework ensures that all test
suites continue to have the JUnit reporting.

AfterReadingAllFlags is a good place to set this up because all test suites
using the test context are expected to call it before running tests and after
parsing flags.

Removing the ReportEntries added by ginkgo.By from all test reports usually
avoids the `system-err` part in the JUnit file, which in Spyglass avoids
the extra "open stdout" button.

Co-authored-by: Patrick Ohly <patrick.ohly@intel.com>
Co-authored-by: Dave Chen <dave.chen@arm.com>
2022-08-03 17:56:36 +02:00
Danielle
5b312246c8
Revert "e2e: Trim junit reporter to adapt with testgrid" 2022-08-03 15:45:09 +02:00
Kubernetes Prow Robot
cf777ab782
Merge pull request #111627 from chendave/trim_report
e2e: Trim junit reporter to adapt with testgrid
2022-08-03 04:51:52 -07:00
Dave Chen
5fcb8e5153 e2e: trim junit report for Spyglass
Including the full information for successful tests makes the resulting XML
file too large for the 200GB limit in Spyglass when running large jobs (like
scale testing).

Co-authored-by: Patrick Ohly <patrick.ohly@intel.com>
Co-authored-by: Dave Chen <dave.chen@arm.com>
2022-08-03 00:32:24 +08:00
Matthew Cary
738b458f8e enable gce pd driver via a flag rather than an env var
Change-Id: Ib7c99083ad334e5f6dd152e376a303de794e0bf1
2022-07-28 17:23:28 -07:00
Davanum Srinivas
a9593d634c
Generate and format files
- Run hack/update-codegen.sh
- Run hack/update-generated-device-plugin.sh
- Run hack/update-generated-protobuf.sh
- Run hack/update-generated-runtime.sh
- Run hack/update-generated-swagger-docs.sh
- Run hack/update-openapi-spec.sh
- Run hack/update-gofmt.sh

Signed-off-by: Davanum Srinivas <davanum@gmail.com>
2022-07-26 13:14:05 -04:00
Dave Chen
3833695e75 Redirect klog out to GinkgoWriter
Co-authored-by: Patrick Ohly <patrick.ohly@intel.com>
Signed-off-by: Dave Chen <dave.chen@arm.com>
2022-07-08 10:46:11 +08:00
Dave Chen
82ac6be0e9 Custom reporter of Junit report is no longer needed
Ginkgo is now writing the JUnit file itself. The -report-dir parameter is used
as fallback for enabling JUnit output in case that users haven't migrated to
the new -junit-report parameter.

Co-authored-by: Patrick Ohly <patrick.ohly@intel.com>
Signed-off-by: Dave Chen <dave.chen@arm.com>
2022-07-08 10:46:11 +08:00
Dave Chen
5ac8105b86 Set Ginkgo config by the method of GinkgoConfiguration()
Signed-off-by: Dave Chen <dave.chen@arm.com>
2022-07-08 10:46:11 +08:00
Dave Chen
857458cfa5 update ginkgo from v1 to v2 and gomega to 1.19.0
- update all the import statements
- run hack/pin-dependency.sh to change pinned dependency versions
- run hack/update-vendor.sh to update go.mod files and the vendor directory
- update the method signatures for custom reporters

Signed-off-by: Dave Chen <dave.chen@arm.com>
2022-07-08 10:44:46 +08:00
Humble Chirammal
3988ac1498 correct the e2e framework flag description typos
Signed-off-by: Humble Chirammal <hchiramm@redhat.com>
2022-06-06 19:23:28 +05:30
Patrick Ohly
2664740043 e2e: move feature gate support from test/e2e to test/e2e_node
The test/e2e suite has never supported feature gates:
- it cannot discover at runtime how the cluster is configured
- its --feature-gates parameter had no effect

Despite that, tests were written that used
e2eskipper.SkipUnlessFeatureGateEnabled even though that function then only
checked the default feature gate state.  To catch such mistakes, e2e tests
suites now must explicitly enable feature gate checking via
e2eskipper.InitFeatureGates. They also must register their own command line
flag. When that is not done, then using SkipUnlessFeatureGateEnabled or
SkipIfFeatureGateEnabled leads to a test failure.

test/e2e_node does both and therefore continues to work as before.
2022-04-25 15:41:41 +02:00
Patrick Ohly
ff5558edc3 test: support storage tests with non-standard kubelet root directory
Some storage tests deploy DaemonSets which hard-code /var/lib/kubelet as root
directory for kubelet registration and pod directory. There was already a
parameter which allowed specifying the root directory, just with a very
confusing name ("--volume-dir") and matching field name. A --kubelet-root-dir
parameters gets added because this may make it easier to find the parameter,
with the old name preserved as an alias for the same field for backwards
compatibility.
2022-03-03 12:34:18 +01:00
Ciprian Hacman
3834761187 Remove unused --dockershim-checkpoint-dir e2e.test flag
Signed-off-by: Ciprian Hacman <ciprian@hakman.dev>
2022-02-16 15:34:28 +02:00
Kubernetes Prow Robot
1fa888529e
Merge pull request #107533 from neolit123/1.24-update-master-label-taint
kubeadm: apply "master" label/taint migration for 1.24
2022-02-15 21:44:36 -08:00
Ciprian Hacman
7d5afb322d Remove unused --container-runtime e2e.test flag
Signed-off-by: Ciprian Hacman <ciprian@hakman.dev>
2022-02-14 08:49:56 +02:00