├── .builds-darwin.goreleaser.yml ├── .builds-linux.goreleaser.yml ├── .builds-windows.goreleaser.yml ├── .codecov.yaml ├── .dockerignore ├── .env ├── .github ├── CODEOWNERS ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── enhancement.md │ ├── feature_request.md │ └── manage_tech_debt.md ├── dependabot.yml ├── pull_request_template.md ├── sandbox-comment-template.md └── workflows │ ├── agent-test-update-dispatch.yaml │ ├── codeql-analysis.yml │ ├── docker-build-api-executors-tag.yaml │ ├── lint.yaml │ ├── lint_pr.yaml │ ├── new-build.yaml │ ├── release-dev.yaml │ ├── release.yaml │ ├── sandbox-deletion.yaml │ ├── sandbox.yaml │ ├── scorecard.yml │ └── test.yaml ├── .gitignore ├── .golangci.yml ├── .goreleaser-dev.yml ├── .goreleaser.yml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── DESIGN.md ├── LICENSE ├── Makefile ├── README.md ├── api └── v1 │ └── testkube.yaml ├── assets ├── architecture.png ├── favicon.png ├── grafana-dasboard.json ├── imageFailed.png ├── imagePassed.png ├── imagePending.png ├── intro-to-testkube.jpeg ├── intro-to-testkube.jpg ├── logo-dark-text-full.png ├── logo-dark-text.png ├── logo-rect-blue.png ├── logo-rect-dark.png ├── logo-rect-white.png ├── logo-white-text-full.png ├── logo-white-text.png ├── logo.svg ├── squishies.png ├── testkube-color-dark.png ├── testkube-color-gray.png ├── testkube-color-white.png └── testkube-intro.gif ├── bin └── .gitkeep ├── build ├── _local │ ├── agent-server.Dockerfile │ ├── testworkflow-init.Dockerfile │ ├── testworkflow-toolkit.Dockerfile │ └── values.dev.tpl.yaml ├── api-server │ └── Dockerfile ├── installer │ └── windows │ │ ├── teskube.nuspec │ │ ├── testkube.bat │ │ ├── testkube.wxs │ │ └── tk.bat ├── kind │ ├── entrypoint.sh │ └── kind.Dockerfile ├── kubectl-testkube │ └── Dockerfile ├── logs-server │ └── Dockerfile ├── logs-sidecar │ └── Dockerfile ├── new │ ├── api-server.Dockerfile │ ├── tw-init.Dockerfile │ └── tw-toolkit.Dockerfile ├── testworkflow-init │ └── Dockerfile └── testworkflow-toolkit │ └── Dockerfile ├── choco ├── testkube.nuspec ├── tools │ ├── LICENSE.txt │ ├── VERIFICATION.txt │ └── chocolateyInstall.ps1 └── update.ps1 ├── cmd ├── api-server │ ├── commons │ │ ├── commons.go │ │ ├── deprecated.go │ │ ├── mock_deprecatedclients.go │ │ └── mock_deprecatedrepositories.go │ ├── main.go │ └── services │ │ ├── controlplane.go │ │ ├── deprecatedsystem.go │ │ ├── executionworker.go │ │ └── telemetry.go ├── choco-stub │ └── main.go ├── debug-server │ ├── Dockerfile │ ├── kube.yaml │ └── main.go ├── kubectl-testkube │ ├── commands │ │ ├── abort.go │ │ ├── agent.go │ │ ├── agent │ │ │ ├── debug.go │ │ │ └── migrate.go │ │ ├── agents │ │ │ ├── create.go │ │ │ ├── delete.go │ │ │ ├── enable.go │ │ │ ├── get.go │ │ │ ├── install.go │ │ │ ├── update.go │ │ │ └── utils.go │ │ ├── artifacts │ │ │ └── artifacts.go │ │ ├── cloud.go │ │ ├── common │ │ │ ├── agents.go │ │ │ ├── client.go │ │ │ ├── cloudcontext.go │ │ │ ├── content.go │ │ │ ├── crd.go │ │ │ ├── environments.go │ │ │ ├── errors.go │ │ │ ├── flags.go │ │ │ ├── helper.go │ │ │ ├── masterFlags_test.go │ │ │ ├── organizations.go │ │ │ ├── render │ │ │ │ ├── common.go │ │ │ │ ├── list.go │ │ │ │ └── obj.go │ │ │ ├── repository.go │ │ │ ├── uri.go │ │ │ ├── validator │ │ │ │ ├── cloudcontext.go │ │ │ │ ├── directory.go │ │ │ │ ├── dns1123subdomain.go │ │ │ │ ├── executionid.go │ │ │ │ ├── executionidfilename.go │ │ │ │ ├── testsuitename.go │ │ │ │ ├── version.go │ │ │ │ └── version_test.go │ │ │ ├── version.go │ │ │ └── webhook.go │ │ ├── config.go │ │ ├── config │ │ │ ├── api_server_name.go │ │ │ ├── api_server_port.go │ │ │ ├── api_uri.go │ │ │ ├── headers.go │ │ │ └── namespace.go │ │ ├── constants.go │ │ ├── context │ │ │ ├── get.go │ │ │ └── set.go │ │ ├── crds │ │ │ └── tests_crds.go │ │ ├── create.go │ │ ├── createticket.go │ │ ├── dashboard.go │ │ ├── debug.go │ │ ├── debug │ │ │ ├── agent.go │ │ │ ├── controlplane.go │ │ │ ├── features.go │ │ │ ├── oss.go │ │ │ └── utils.go │ │ ├── delete.go │ │ ├── diagnostics.go │ │ ├── diagnostics │ │ │ ├── install.go │ │ │ └── license.go │ │ ├── disable.go │ │ ├── docker.go │ │ ├── docker │ │ │ └── init.go │ │ ├── download.go │ │ ├── enable.go │ │ ├── executors │ │ │ ├── common.go │ │ │ ├── create.go │ │ │ ├── delete.go │ │ │ ├── get.go │ │ │ └── update.go │ │ ├── generate.go │ │ ├── generate │ │ │ └── docs.go │ │ ├── get.go │ │ ├── github │ │ │ ├── issue.go │ │ │ └── issue_test.go │ │ ├── help.go │ │ ├── init.go │ │ ├── install.go │ │ ├── migrate.go │ │ ├── pro.go │ │ ├── pro │ │ │ ├── connect.go │ │ │ ├── disconnect.go │ │ │ ├── init.go │ │ │ └── login.go │ │ ├── purge.go │ │ ├── renderer │ │ │ ├── labels.go │ │ │ └── variables.go │ │ ├── root.go │ │ ├── run.go │ │ ├── set.go │ │ ├── status.go │ │ ├── telemetry │ │ │ ├── disable.go │ │ │ ├── enable.go │ │ │ └── status.go │ │ ├── templates │ │ │ ├── common.go │ │ │ ├── create.go │ │ │ ├── delete.go │ │ │ ├── get.go │ │ │ └── update.go │ │ ├── tests │ │ │ ├── abort.go │ │ │ ├── common.go │ │ │ ├── common_test.go │ │ │ ├── create.go │ │ │ ├── delete.go │ │ │ ├── executions.go │ │ │ ├── get.go │ │ │ ├── migrate.go │ │ │ ├── renderer │ │ │ │ ├── execution_obj.go │ │ │ │ └── test_obj.go │ │ │ ├── run.go │ │ │ ├── update.go │ │ │ └── watch.go │ │ ├── testsources │ │ │ ├── common.go │ │ │ ├── create.go │ │ │ ├── delete.go │ │ │ ├── get.go │ │ │ ├── renderer │ │ │ │ └── testsource_obj.go │ │ │ └── update.go │ │ ├── testsuites │ │ │ ├── abort.go │ │ │ ├── common.go │ │ │ ├── create.go │ │ │ ├── delete.go │ │ │ ├── executions.go │ │ │ ├── get.go │ │ │ ├── migrate.go │ │ │ ├── renderer │ │ │ │ ├── execution_obj.go │ │ │ │ └── testsuite_obj.go │ │ │ ├── run.go │ │ │ ├── update.go │ │ │ └── watch.go │ │ ├── testworkflows │ │ │ ├── abort.go │ │ │ ├── create.go │ │ │ ├── delete.go │ │ │ ├── executions.go │ │ │ ├── get.go │ │ │ ├── renderer │ │ │ │ ├── testworkflow_obj.go │ │ │ │ └── testworkflowexecution_obj.go │ │ │ ├── rerun.go │ │ │ ├── run.go │ │ │ ├── run_test.go │ │ │ └── watch.go │ │ ├── testworkflowtemplates │ │ │ ├── create.go │ │ │ ├── delete.go │ │ │ ├── get.go │ │ │ └── renderer │ │ │ │ └── testworkflow_obj.go │ │ ├── update.go │ │ ├── upgrade.go │ │ ├── version.go │ │ ├── watch.go │ │ ├── webhooks │ │ │ ├── common.go │ │ │ ├── create.go │ │ │ ├── delete.go │ │ │ ├── get.go │ │ │ └── update.go │ │ └── webhooktemplates │ │ │ ├── common.go │ │ │ ├── create.go │ │ │ ├── delete.go │ │ │ ├── get.go │ │ │ └── update.go │ ├── config │ │ ├── config.go │ │ ├── config_test.go │ │ ├── data.go │ │ ├── master.go │ │ └── storage.go │ ├── debugger │ │ ├── debugger.go │ │ ├── events.go │ │ └── job.go │ └── main.go ├── logs-server │ └── main.go ├── logs-sidecar │ └── main.go ├── proxy │ └── main.go ├── tcl │ ├── README.md │ ├── devbox-binary-storage │ │ └── main.go │ ├── devbox-mutating-webhook │ │ └── main.go │ ├── kubectl-testkube │ │ └── devbox │ │ │ ├── README.md │ │ │ ├── command.go │ │ │ └── devutils │ │ │ ├── agent.go │ │ │ ├── binary.go │ │ │ ├── binarypatch.go │ │ │ ├── binarystorage.go │ │ │ ├── certificates.go │ │ │ ├── cloud.go │ │ │ ├── cluster.go │ │ │ ├── crdfssync.go │ │ │ ├── find.go │ │ │ ├── forwarding.go │ │ │ ├── fswatcher.go │ │ │ ├── gitopsagent.go │ │ │ ├── grafana.go │ │ │ ├── interceptor.go │ │ │ ├── minio.go │ │ │ ├── mongo.go │ │ │ ├── namespace.go │ │ │ ├── pods.go │ │ │ ├── prometheus.go │ │ │ ├── resources.go │ │ │ └── runneragent.go │ └── testworkflow-toolkit │ │ ├── commands │ │ ├── execute.go │ │ ├── kill.go │ │ ├── parallel.go │ │ └── services.go │ │ ├── common │ │ ├── combinations.go │ │ ├── combinations_test.go │ │ └── labels.go │ │ ├── execute │ │ └── execute.go │ │ └── spawn │ │ ├── constants.go │ │ ├── registry.go │ │ └── utils.go ├── testworkflow-init │ ├── commands │ │ ├── run.go │ │ └── setup.go │ ├── constants │ │ ├── addr.go │ │ ├── codes.go │ │ ├── commands.go │ │ ├── formats.go │ │ ├── instructions.go │ │ ├── names.go │ │ ├── paths.go │ │ └── statuses.go │ ├── control │ │ ├── client.go │ │ ├── options.go │ │ └── server.go │ ├── data │ │ ├── client.go │ │ ├── expressions.go │ │ ├── global.go │ │ ├── outputProcessor.go │ │ ├── state.go │ │ └── stepData.go │ ├── instructions │ │ └── emit.go │ ├── main.go │ ├── obfuscator │ │ ├── obfuscator.go │ │ ├── obfuscator_test.go │ │ ├── replacers.go │ │ ├── replacers_test.go │ │ └── searchtree.go │ ├── orchestration │ │ ├── control.go │ │ ├── executions.go │ │ ├── processes.go │ │ ├── setup.go │ │ ├── setup_test.go │ │ ├── testdata │ │ │ ├── config.json │ │ │ ├── signature.json │ │ │ └── spec.json │ │ └── timeout.go │ ├── output │ │ ├── fail.go │ │ ├── printer.go │ │ └── stream.go │ └── runtime │ │ └── machine.go ├── testworkflow-toolkit │ ├── artifacts │ │ ├── cloud_uploader.go │ │ ├── direct_processor.go │ │ ├── handler.go │ │ ├── handler_test.go │ │ ├── internalartifactstorage.go │ │ ├── junit_post_processor.go │ │ ├── junit_post_processor_test.go │ │ ├── mimetype.go │ │ ├── options.go │ │ ├── processor.go │ │ ├── tar_processor.go │ │ ├── tar_stream.go │ │ ├── tarcached_processor.go │ │ ├── uploader.go │ │ └── walker.go │ ├── commands │ │ ├── artifacts.go │ │ ├── artifacts_test.go │ │ ├── clone.go │ │ ├── root.go │ │ ├── tarball.go │ │ ├── testdata │ │ │ ├── junit.xml │ │ │ └── test.log │ │ ├── transfer.go │ │ └── utils.go │ ├── common │ │ ├── tarball.go │ │ └── testdata │ │ │ └── junit.go │ ├── env │ │ ├── client.go │ │ └── config │ │ │ └── config.go │ ├── main.go │ └── transfer │ │ ├── server.go │ │ └── utils.go └── tools │ ├── commands │ ├── common.go │ ├── release.go │ ├── root.go │ └── versions.go │ └── main.go ├── codecov.yaml ├── common.UiGetNamespace ├── config ├── executors.json ├── job-container-template.yml ├── job-scraper-template.yml ├── job-template.yml ├── pvc-template.yml ├── slack-config.json ├── slack-template.json └── slave-pod-template.yml ├── contrib ├── container │ ├── README.md │ ├── kubent │ │ └── executor.yaml │ └── pytest │ │ ├── Dockerfile │ │ ├── README.md │ │ ├── container-executor-pytest.yaml │ │ ├── failed_sample.py │ │ ├── passed_sample.py │ │ └── pytest_test.yaml ├── docker │ └── jmeter │ │ ├── Makefile │ │ ├── README.md │ │ └── jmeter5.5.ubi8.8.Dockerfile └── executor │ ├── artillery │ ├── .gitignore │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── build │ │ └── agent │ │ │ └── Dockerfile │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ ├── examples │ │ ├── artillery-executor.yaml │ │ ├── postcodes.csv │ │ ├── simple.yaml │ │ └── test.yaml │ └── pkg │ │ ├── README.md │ │ ├── artillery │ │ └── artillerydetector.go │ │ └── runner │ │ ├── artillery.go │ │ ├── artillery_helper.go │ │ └── artillery_test.go │ ├── curl │ ├── .gitignore │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── build │ │ └── agent │ │ │ └── Dockerfile │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ ├── examples │ │ ├── example_execution.json │ │ └── example_with_templates.json │ └── pkg │ │ ├── README.md │ │ ├── curl │ │ ├── curltest.go │ │ └── curltest_test.go │ │ └── runner │ │ ├── runner.go │ │ ├── runner_input.go │ │ ├── template.go │ │ └── template_test.go │ ├── cypress │ ├── .gitignore │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── build │ │ └── agent │ │ │ ├── Dockerfile.cypress10 │ │ │ ├── Dockerfile.cypress11 │ │ │ ├── Dockerfile.cypress12 │ │ │ ├── Dockerfile.cypress13 │ │ │ ├── Dockerfile.cypress8 │ │ │ ├── Dockerfile.cypress9 │ │ │ ├── Dockerfile.npm │ │ │ └── Dockerfile.yarn │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ ├── examples │ │ ├── cypress.config.js │ │ ├── cypress │ │ │ ├── e2e │ │ │ │ └── simple.cy.js │ │ │ ├── fixtures │ │ │ │ ├── example.json │ │ │ │ ├── profile.json │ │ │ │ └── users.json │ │ │ ├── plugins │ │ │ │ └── index.js │ │ │ └── support │ │ │ │ ├── commands.js │ │ │ │ └── e2e.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── test-git-dir.json │ │ └── test-string.json │ ├── pkg │ │ ├── README.md │ │ ├── cypress │ │ │ └── cypress.go │ │ └── runner │ │ │ ├── cypress.go │ │ │ └── cypress_test.go │ └── skeleton │ │ ├── .gitignore │ │ ├── README.md │ │ ├── cypress.json │ │ ├── cypress │ │ ├── integration │ │ │ └── test.js │ │ ├── plugins │ │ │ └── index.js │ │ └── support │ │ │ ├── commands.js │ │ │ └── index.js │ │ ├── package-lock.json │ │ └── package.json │ ├── example │ ├── .gitignore │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── build │ │ ├── agent │ │ │ └── Dockerfile │ │ └── kube │ │ │ └── executor.yaml │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ └── pkg │ │ ├── README.md │ │ └── runner │ │ ├── runner.go │ │ └── runner_test.go │ ├── ginkgo │ ├── .gitignore │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── build │ │ └── agent │ │ │ └── Dockerfile │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ ├── examples │ │ ├── other │ │ │ ├── other_suite_test.go │ │ │ └── url_test.go │ │ └── testkube-api │ │ │ ├── api_test.go │ │ │ ├── go.mod │ │ │ ├── go.sum │ │ │ └── testkube_api_suite_test.go │ └── pkg │ │ ├── README.md │ │ ├── ginkgo │ │ └── ginkgo.go │ │ └── runner │ │ ├── runner.go │ │ ├── runner_integration_test.go │ │ └── runner_test.go │ ├── gradle │ ├── .gitignore │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── build │ │ └── agent │ │ │ ├── Dockerfile.jdk11 │ │ │ ├── Dockerfile.jdk17 │ │ │ ├── Dockerfile.jdk18 │ │ │ ├── Dockerfile.jdk21 │ │ │ └── Dockerfile.jdk8 │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ ├── examples │ │ ├── gradle-executor.yaml │ │ ├── hello-gradle-jdk18 │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── settings.gradle │ │ │ └── src │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── hello │ │ │ │ └── gradle │ │ │ │ └── LibraryTest.java │ │ ├── hello-gradle │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── settings.gradle │ │ │ └── src │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── hello │ │ │ │ └── gradle │ │ │ │ └── LibraryTest.java │ │ ├── hello-gradlew-failing │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── gradle │ │ │ │ └── wrapper │ │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ │ └── gradle-wrapper.properties │ │ │ ├── gradlew │ │ │ ├── gradlew.bat │ │ │ ├── settings.gradle │ │ │ └── src │ │ │ │ ├── main │ │ │ │ └── java │ │ │ │ │ └── hello │ │ │ │ │ └── gradlew │ │ │ │ │ └── Library.java │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── hello │ │ │ │ └── gradlew │ │ │ │ └── LibraryTest.java │ │ ├── hello-gradlew-jdk18 │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── gradle │ │ │ │ └── wrapper │ │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ │ └── gradle-wrapper.properties │ │ │ ├── gradlew │ │ │ ├── gradlew.bat │ │ │ ├── settings.gradle │ │ │ └── src │ │ │ │ ├── main │ │ │ │ └── java │ │ │ │ │ └── hello │ │ │ │ │ └── gradlew │ │ │ │ │ └── Library.java │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── hello │ │ │ │ └── gradlew │ │ │ │ └── LibraryTest.java │ │ └── hello-gradlew │ │ │ ├── .gitattributes │ │ │ ├── .gitignore │ │ │ ├── build.gradle │ │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ ├── gradle-wrapper.jar │ │ │ │ └── gradle-wrapper.properties │ │ │ ├── gradlew │ │ │ ├── gradlew.bat │ │ │ ├── settings.gradle │ │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ ├── hello │ │ │ │ └── gradlew │ │ │ │ │ └── Library.java │ │ │ │ └── other │ │ │ │ └── Library.java │ │ │ └── test │ │ │ └── java │ │ │ ├── hello │ │ │ └── gradlew │ │ │ │ └── LibraryTest.java │ │ │ └── other │ │ │ └── LibraryTest.java │ └── pkg │ │ ├── README.md │ │ ├── gradle │ │ └── gradle.go │ │ └── runner │ │ ├── runner.go │ │ └── runner_integration_test.go │ ├── init │ ├── .gitignore │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── build │ │ └── agent │ │ │ └── Dockerfile │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ └── pkg │ │ ├── README.md │ │ └── runner │ │ ├── runner.go │ │ ├── runner_test.go │ │ └── testdir │ │ ├── .gitkeep │ │ ├── command.sh │ │ ├── entrypoint.sh │ │ ├── postrun.sh │ │ └── prerun.sh │ ├── jmeter │ ├── .dockerignore │ ├── .env.sample │ ├── .gitignore │ ├── .golangci.yml │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── build │ │ └── agent │ │ │ ├── Dockerfile │ │ │ └── local.Dockerfile │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ ├── examples │ │ ├── executor.yaml │ │ ├── jmeter.log │ │ ├── kubeshop.jmx │ │ ├── kubeshop_failed.jmx │ │ └── results.jtl │ ├── lib │ │ └── jmeter-plugins-cmn-jmeter-0.6.jar │ ├── pkg │ │ ├── README.md │ │ ├── jmeter │ │ │ └── jmeter.go │ │ ├── parser │ │ │ ├── jtl.go │ │ │ ├── jtl_test.go │ │ │ ├── xjtl.go │ │ │ ├── xjtl_test.go │ │ │ └── xunit.go │ │ └── runner │ │ │ ├── runner.go │ │ │ ├── runner_integration_test.go │ │ │ └── runner_test.go │ ├── plugins │ │ ├── jmeter-plugins-functions-2.1.jar │ │ └── jmeter-plugins-manager-1.3.jar │ └── scripts │ │ └── entrypoint.sh │ ├── jmeterd │ ├── .dockerignore │ ├── .env.sample │ ├── .gitignore │ ├── .golangci.yml │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── build │ │ ├── agent │ │ │ ├── Dockerfile │ │ │ └── local.Dockerfile │ │ └── slaves │ │ │ └── Dockerfile │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ ├── examples │ │ ├── executor.yaml │ │ ├── gitflow │ │ │ ├── README.md │ │ │ ├── csvdata │ │ │ │ └── Credentials.csv │ │ │ ├── jmeter-properties-external.jmx │ │ │ ├── plugins │ │ │ │ ├── JMeterPlugins-Extras.jar │ │ │ │ ├── jmeter-parallel-0.11.jar │ │ │ │ ├── jmeter-plugins-dummy-0.4.jar │ │ │ │ ├── jmeter-plugins-functions-2.2.jar │ │ │ │ └── jmeter-plugins-manager-1.9.jar │ │ │ └── user.properties │ │ ├── jmeter.log │ │ ├── kubeshop.jmx │ │ ├── kubeshop_failed.jmx │ │ └── results.jtl │ ├── pkg │ │ ├── README.md │ │ ├── parser │ │ │ ├── csvjtl.go │ │ │ ├── csvjtl_test.go │ │ │ ├── mapper.go │ │ │ ├── parser.go │ │ │ ├── parser_test.go │ │ │ ├── xmljtl.go │ │ │ ├── xmljtl_test.go │ │ │ └── xunit.go │ │ ├── runner │ │ │ ├── helpers.go │ │ │ ├── helpers_test.go │ │ │ ├── runner.go │ │ │ └── runner_test.go │ │ └── slaves │ │ │ ├── client.go │ │ │ ├── env.go │ │ │ ├── interface.go │ │ │ ├── meta.go │ │ │ ├── meta_test.go │ │ │ ├── utils.go │ │ │ └── utils_test.go │ └── scripts │ │ ├── entrypoint.sh │ │ ├── jmeter-master.sh │ │ └── jmeter-slaves.sh │ ├── k6 │ ├── .gitignore │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── SECURITY.md │ ├── build │ │ └── agent │ │ │ └── Dockerfile │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ ├── examples │ │ ├── k6-executor.yaml │ │ ├── k6-influxdb-grafana.yaml │ │ ├── k6-test-environment.js │ │ ├── k6-test-failing-script.js │ │ ├── k6-test-scenarios.js │ │ ├── k6-test-scenarios.txt │ │ ├── k6-test-script.js │ │ ├── k6-test-summary.js │ │ ├── k6-test-summary.txt │ │ └── k6-test-thresholds.js │ └── pkg │ │ ├── README.md │ │ ├── k6detector │ │ ├── k6.go │ │ └── k6_test.go │ │ └── runner │ │ ├── runner.go │ │ ├── runner_integration_test.go │ │ └── runner_test.go │ ├── kubepug │ ├── .gitignore │ ├── .golangci.yml │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── build │ │ └── agent │ │ │ └── Dockerfile │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ └── pkg │ │ ├── kubepug │ │ └── kubepug.go │ │ └── runner │ │ ├── result.go │ │ ├── result_test.go │ │ ├── runner.go │ │ ├── runner_test.go │ │ └── test-files │ │ ├── manifest-deprecated.yaml │ │ └── manifest-valid │ │ └── manifest.yaml │ ├── maven │ ├── .gitignore │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── build │ │ └── agent │ │ │ ├── Dockerfile.jdk11 │ │ │ ├── Dockerfile.jdk17 │ │ │ ├── Dockerfile.jdk18 │ │ │ └── Dockerfile.jdk8 │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ ├── examples │ │ ├── hello-maven-jdk18 │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── hello │ │ │ │ └── maven │ │ │ │ └── LibraryTest.java │ │ ├── hello-maven-jdk8 │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── hello │ │ │ │ └── maven │ │ │ │ └── LibraryTest.java │ │ ├── hello-maven-settings │ │ │ ├── pom.xml │ │ │ ├── settings.xml │ │ │ └── src │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── hello │ │ │ │ └── maven │ │ │ │ └── LibraryTest.java │ │ ├── hello-maven │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── hello │ │ │ │ └── maven │ │ │ │ └── LibraryTest.java │ │ ├── hello-mvnw │ │ │ ├── .mvn │ │ │ │ └── wrapper │ │ │ │ │ ├── maven-wrapper.jar │ │ │ │ │ └── maven-wrapper.properties │ │ │ ├── mvnw │ │ │ ├── mvnw.cmd │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── hello │ │ │ │ └── maven │ │ │ │ └── LibraryTest.java │ │ └── maven-executor.yaml │ └── pkg │ │ ├── README.md │ │ ├── maven │ │ └── maven.go │ │ └── runner │ │ ├── runner.go │ │ └── runner_integration_test.go │ ├── playwright │ ├── .gitignore │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── build │ │ └── agent │ │ │ ├── Dockerfile.npm │ │ │ ├── Dockerfile.pnpm │ │ │ └── Dockerfile.yarn │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ ├── examples │ │ ├── package.json │ │ ├── playwright.config.js │ │ └── tests │ │ │ └── example.spec.js │ └── pkg │ │ ├── README.md │ │ ├── playwright │ │ └── playwright.go │ │ └── runner │ │ ├── playwright.go │ │ └── playwright_test.go │ ├── postman │ ├── .gitignore │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── build │ │ └── agent │ │ │ ├── Dockerfile │ │ │ └── Dockerfile.node21 │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ ├── examples │ │ └── example_postman_collection.json │ └── pkg │ │ ├── README.md │ │ ├── postman │ │ ├── postmancollection.go │ │ └── postmancollection_test.go │ │ └── runner │ │ └── newman │ │ ├── envfile.go │ │ ├── executionresult.go │ │ ├── mapper.go │ │ ├── mapper_test.go │ │ ├── metadata.go │ │ ├── newman.go │ │ └── newman_test.go │ ├── scraper │ ├── .gitignore │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── build │ │ └── agent │ │ │ └── Dockerfile │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ └── pkg │ │ ├── README.md │ │ └── runner │ │ ├── runner.go │ │ └── runner_test.go │ ├── soapui │ ├── .gitignore │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── build │ │ └── agent │ │ │ └── Dockerfile │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ ├── executor.yaml │ └── pkg │ │ ├── mock │ │ ├── doc.go │ │ └── scraper.go │ │ ├── runner │ │ ├── doc.go │ │ ├── example │ │ │ ├── REST-Failing-Project-1-soapui-project.xml │ │ │ └── REST-Project-1-soapui-project.xml │ │ ├── runner.go │ │ └── runner_test.go │ │ └── soapui │ │ └── soapui.go │ ├── template │ ├── .gitignore │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── Makefile │ ├── README.md │ ├── build │ │ └── agent │ │ │ └── Dockerfile │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ └── pkg │ │ ├── README.md │ │ └── runner │ │ ├── runner.go │ │ └── runner_test.go │ ├── tracetest │ ├── .gitignore │ ├── Makefile │ ├── README.md │ ├── build │ │ └── agent │ │ │ ├── Dockerfile │ │ │ └── docker-bake.hcl │ ├── cmd │ │ ├── agent │ │ │ └── main.go │ │ └── tools │ │ │ └── main.go │ └── pkg │ │ ├── command │ │ └── command.go │ │ ├── model │ │ └── result.go │ │ ├── runner │ │ ├── runner.go │ │ ├── runner_integration_test.go │ │ ├── runner_test.go │ │ ├── tracetest_core_runner.go │ │ └── tracetest_runner.go │ │ └── testing │ │ ├── docker-compose-tracetest-cloud.yaml │ │ ├── docker-compose-tracetest-core.yaml │ │ ├── tracetest-config.yaml │ │ ├── tracetest-provision.yaml │ │ └── tracetest-test-script.yaml │ └── zap │ ├── Makefile │ ├── README.md │ ├── build │ └── agent │ │ └── Dockerfile │ ├── cmd │ ├── agent │ │ └── main.go │ └── tools │ │ └── main.go │ ├── examples │ ├── test-api-fail-on-warn.yaml │ ├── test-api-fail.yaml │ ├── test-api-pass.yaml │ ├── test-api-warn.yaml │ ├── test-baseline-pass.yaml │ ├── test-baseline-warn.yaml │ ├── test-full-fail.yaml │ ├── zap-api.conf │ ├── zap-api.yaml │ ├── zap-baseline.conf │ ├── zap-baseline.yaml │ ├── zap-executor.yaml │ ├── zap-full.conf │ ├── zap-full.yaml │ ├── zap-tk-api.conf │ ├── zap-tk-api.yaml │ ├── zap-tk-baseline.conf │ ├── zap-tk-baseline.yaml │ ├── zap-tk-full.conf │ └── zap-tk-full.yaml │ ├── pkg │ └── runner │ │ ├── runner.go │ │ ├── runner_test.go │ │ ├── zap.go │ │ └── zap_test.go │ └── zap │ ├── .gitignore │ ├── zap-api-scan.py │ ├── zap-baseline.py │ └── zap-full-scan.py ├── data.json ├── depot.json ├── docker-bake.hcl ├── docs └── README.md ├── go.mod ├── go.sum ├── goreleaser_files ├── .goreleaser-docker-build-api.yml ├── .goreleaser-docker-build-executor-cypress.yml ├── .goreleaser-docker-build-executor-gradle.yml ├── .goreleaser-docker-build-executor-jmeter.yml ├── .goreleaser-docker-build-executor-jmeterd.yml ├── .goreleaser-docker-build-executor-maven.yml ├── .goreleaser-docker-build-executor-playwright.yml ├── .goreleaser-docker-build-executor-postman-node21.yml ├── .goreleaser-docker-build-executor.yml ├── .goreleaser-docker-build-logs-services.yml ├── .goreleaser-docker-build-testworkflow-init.yml └── .goreleaser-docker-build-testworkflow-toolkit.yml ├── gqlgen.yml ├── install.sh ├── internal ├── app │ └── api │ │ ├── apiutils │ │ └── utils.go │ │ ├── debug │ │ └── server.go │ │ ├── deprecatedv1 │ │ ├── executions.go │ │ ├── executions_test.go │ │ ├── executor.go │ │ ├── graphql.go │ │ ├── handlers.go │ │ ├── server.go │ │ ├── slack_oauth.go │ │ ├── template.go │ │ ├── tests.go │ │ ├── tests_test.go │ │ ├── testsource.go │ │ ├── testsuites.go │ │ ├── uploads.go │ │ └── uploads_test.go │ │ ├── metrics │ │ └── metrics.go │ │ └── v1 │ │ ├── configs.go │ │ ├── debug.go │ │ ├── events.go │ │ ├── events_test.go │ │ ├── handlers.go │ │ ├── labels_tags.go │ │ ├── repository.go │ │ ├── secret.go │ │ ├── server.go │ │ ├── testtriggers.go │ │ ├── testworkflowexecutions.go │ │ ├── testworkflowmetrics.go │ │ ├── testworkflows.go │ │ ├── testworkflowtemplates.go │ │ ├── testworkflowwithexecutions.go │ │ ├── utils.go │ │ ├── webhook.go │ │ └── webhooktemplate.go ├── common │ ├── common.go │ └── mode.go ├── config │ ├── config.go │ ├── config_test.go │ └── procontext.go ├── crdcommon │ ├── crd.go │ └── crd_test.go ├── db-migrations │ ├── 01_create_indexes.down.json │ ├── 01_create_indexes.up.json │ ├── 02_execution_search_indexes.down.json │ ├── 02_execution_search_indexes.up.json │ ├── 03_testworkflow_indexes.down.json │ ├── 03_testworkflow_indexes.up.json │ └── fs.go ├── graphql │ ├── gen │ │ └── generated.go │ ├── resolvers │ │ ├── executors_resolver.go │ │ ├── executors_resolver_test.go │ │ ├── resolver.go │ │ ├── root_resolver.go │ │ └── test_client.go │ ├── scalars │ │ └── maps.go │ ├── schemas │ │ ├── executors.graphqls │ │ └── root.graphqls │ ├── server.go │ ├── services │ │ ├── common.go │ │ ├── executors.go │ │ ├── executors_test.go │ │ ├── mock_executors.go │ │ ├── mock_service.go │ │ ├── service.go │ │ └── service_base.go │ └── tools.go └── template │ ├── parser.go │ └── parser_test.go ├── licenses ├── MIT.txt └── TCL.txt ├── package-lock.json ├── pkg ├── README.md ├── agent │ ├── agent.go │ ├── agent_test.go │ ├── client │ │ └── client.go │ ├── events.go │ ├── events_test.go │ ├── logs.go │ ├── logs_test.go │ └── utils.go ├── api │ ├── README.md │ └── v1 │ │ ├── client │ │ ├── api.go │ │ ├── api_test.go │ │ ├── apiconfig.go │ │ ├── cloud_client.go │ │ ├── common.go │ │ ├── common_test.go │ │ ├── config.go │ │ ├── direct_client.go │ │ ├── executor.go │ │ ├── factory.go │ │ ├── factory_test.go │ │ ├── interface.go │ │ ├── mock_client.go │ │ ├── proxy_client.go │ │ ├── shared.go │ │ ├── template.go │ │ ├── test.go │ │ ├── testsource.go │ │ ├── testsuite.go │ │ ├── testtriggers.go │ │ ├── testworkflow.go │ │ ├── testworkflowtemplate.go │ │ ├── uploads.go │ │ ├── webhook.go │ │ └── webhooktemplate.go │ │ └── testkube │ │ ├── common.go │ │ ├── model_affinity.go │ │ ├── model_app_armor_profile.go │ │ ├── model_artifact.go │ │ ├── model_artifact_extended.go │ │ ├── model_artifact_request.go │ │ ├── model_artifact_update_request.go │ │ ├── model_artifact_updt_request_extended.go │ │ ├── model_assertion_result.go │ │ ├── model_aws_elastic_block_store_volume_source.go │ │ ├── model_azure_disk_volume_source.go │ │ ├── model_azure_file_volume_source.go │ │ ├── model_boxed_boolean.go │ │ ├── model_boxed_integer.go │ │ ├── model_boxed_string.go │ │ ├── model_boxed_string_list.go │ │ ├── model_ceph_fs_volume_source.go │ │ ├── model_claim_source.go │ │ ├── model_config.go │ │ ├── model_config_map_env_source.go │ │ ├── model_config_map_ref.go │ │ ├── model_config_map_volume_source.go │ │ ├── model_config_map_volume_source_items.go │ │ ├── model_content_git_auth_type.go │ │ ├── model_csi_volume_source.go │ │ ├── model_debug_info.go │ │ ├── model_debug_info_execution_logs.go │ │ ├── model_debug_info_extended.go │ │ ├── model_download_artifact_options.go │ │ ├── model_empty_dir_volume_source.go │ │ ├── model_env_from_source.go │ │ ├── model_env_reference.go │ │ ├── model_env_var.go │ │ ├── model_env_var_source.go │ │ ├── model_env_var_source_config_map_key_ref.go │ │ ├── model_env_var_source_field_ref.go │ │ ├── model_env_var_source_resource_field_ref.go │ │ ├── model_env_var_source_secret_key_ref.go │ │ ├── model_event.go │ │ ├── model_event_extended.go │ │ ├── model_event_extended_test.go │ │ ├── model_event_resource.go │ │ ├── model_event_resource_extended.go │ │ ├── model_event_result.go │ │ ├── model_event_result_extended.go │ │ ├── model_event_type.go │ │ ├── model_event_type_extended.go │ │ ├── model_event_type_extended_test.go │ │ ├── model_exec_action.go │ │ ├── model_execution.go │ │ ├── model_execution_core.go │ │ ├── model_execution_extended.go │ │ ├── model_execution_request.go │ │ ├── model_execution_result.go │ │ ├── model_execution_result_extended.go │ │ ├── model_execution_result_reports.go │ │ ├── model_execution_result_step.go │ │ ├── model_execution_result_step_assertion.go │ │ ├── model_execution_status.go │ │ ├── model_execution_status_extended.go │ │ ├── model_execution_step_result.go │ │ ├── model_execution_summary.go │ │ ├── model_execution_target.go │ │ ├── model_execution_update_request.go │ │ ├── model_executions_metrics.go │ │ ├── model_executions_metrics_executions.go │ │ ├── model_executions_result.go │ │ ├── model_executions_result_extended.go │ │ ├── model_executions_totals.go │ │ ├── model_executor.go │ │ ├── model_executor_details.go │ │ ├── model_executor_details_extended.go │ │ ├── model_executor_extended.go │ │ ├── model_executor_meta.go │ │ ├── model_executor_meta_update.go │ │ ├── model_executor_meta_updt_extended.go │ │ ├── model_executor_output.go │ │ ├── model_executor_update_request.go │ │ ├── model_executor_upsert_request.go │ │ ├── model_executor_upsert_request_extended.go │ │ ├── model_features.go │ │ ├── model_field_ref.go │ │ ├── model_gce_persistent_disk_volume_source.go │ │ ├── model_grpc_action.go │ │ ├── model_host_alias.go │ │ ├── model_host_path_volume_source.go │ │ ├── model_http_get_action.go │ │ ├── model_http_header.go │ │ ├── model_image_pull_policy.go │ │ ├── model_io_k8s_apimachinery_pkg_apis_meta_v1_label_selector.go │ │ ├── model_io_k8s_apimachinery_pkg_apis_meta_v1_label_selector_requirement.go │ │ ├── model_key_value.go │ │ ├── model_label_selector.go │ │ ├── model_label_selector_requirement.go │ │ ├── model_local_object_reference.go │ │ ├── model_log_v1.go │ │ ├── model_log_v2.go │ │ ├── model_nfs_volume_source.go │ │ ├── model_node_affinity.go │ │ ├── model_node_selector.go │ │ ├── model_node_selector_requirement.go │ │ ├── model_node_selector_term.go │ │ ├── model_object_ref.go │ │ ├── model_persistent_volume_claim_volume_source.go │ │ ├── model_pod_affinity.go │ │ ├── model_pod_affinity_term.go │ │ ├── model_pod_dns_config.go │ │ ├── model_pod_dns_config_option.go │ │ ├── model_pod_request.go │ │ ├── model_pod_resource_claim.go │ │ ├── model_pod_resources_request.go │ │ ├── model_pod_resources_update_request.go │ │ ├── model_pod_scheduling_gate.go │ │ ├── model_pod_security_context.go │ │ ├── model_pod_update_request.go │ │ ├── model_pod_updt_request_extended.go │ │ ├── model_preferred_scheduling_term.go │ │ ├── model_probe.go │ │ ├── model_problem.go │ │ ├── model_projected_volume_source.go │ │ ├── model_projected_volume_source_cluster_trust_bundle.go │ │ ├── model_projected_volume_source_config_map.go │ │ ├── model_projected_volume_source_downward_api.go │ │ ├── model_projected_volume_source_downward_api_items.go │ │ ├── model_projected_volume_source_secret.go │ │ ├── model_projected_volume_source_service_account_token.go │ │ ├── model_projected_volume_source_sources.go │ │ ├── model_repository.go │ │ ├── model_repository_extended.go │ │ ├── model_repository_parameters.go │ │ ├── model_repository_update.go │ │ ├── model_repository_update_parameters.go │ │ ├── model_repository_updt_exetended.go │ │ ├── model_resource_field_ref.go │ │ ├── model_resource_request.go │ │ ├── model_resource_update_request.go │ │ ├── model_running_context.go │ │ ├── model_running_context_extended.go │ │ ├── model_se_linux_options.go │ │ ├── model_seccomp_profile.go │ │ ├── model_secret.go │ │ ├── model_secret_config.go │ │ ├── model_secret_env_source.go │ │ ├── model_secret_input.go │ │ ├── model_secret_owner.go │ │ ├── model_secret_ref.go │ │ ├── model_secret_ref_extended.go │ │ ├── model_secret_update.go │ │ ├── model_secret_volume_source.go │ │ ├── model_secret_volume_source_items.go │ │ ├── model_security_context.go │ │ ├── model_server_info.go │ │ ├── model_server_info_extended.go │ │ ├── model_slaves_meta.go │ │ ├── model_sysctl.go │ │ ├── model_tcp_socket_action.go │ │ ├── model_template.go │ │ ├── model_template_create_request.go │ │ ├── model_template_extended.go │ │ ├── model_template_type.go │ │ ├── model_template_update_request.go │ │ ├── model_test+workflow_spec_extended.go │ │ ├── model_test_base.go │ │ ├── model_test_base_extended.go │ │ ├── model_test_content.go │ │ ├── model_test_content_extended.go │ │ ├── model_test_content_request.go │ │ ├── model_test_content_update.go │ │ ├── model_test_content_update_request.go │ │ ├── model_test_execution_cr.go │ │ ├── model_test_execution_status_cr.go │ │ ├── model_test_source.go │ │ ├── model_test_source_batch_request.go │ │ ├── model_test_source_batch_result.go │ │ ├── model_test_source_extended.go │ │ ├── model_test_source_update.go │ │ ├── model_test_source_update_request.go │ │ ├── model_test_source_upsert_request.go │ │ ├── model_test_status.go │ │ ├── model_test_suite.go │ │ ├── model_test_suite_base_extended.go │ │ ├── model_test_suite_batch_step.go │ │ ├── model_test_suite_batch_step_execution_result.go │ │ ├── model_test_suite_batch_step_execution_result_extended.go │ │ ├── model_test_suite_batch_step_execution_summary.go │ │ ├── model_test_suite_execution.go │ │ ├── model_test_suite_execution_core.go │ │ ├── model_test_suite_execution_cr.go │ │ ├── model_test_suite_execution_extended.go │ │ ├── model_test_suite_execution_request.go │ │ ├── model_test_suite_execution_status.go │ │ ├── model_test_suite_execution_status_cr.go │ │ ├── model_test_suite_execution_summary.go │ │ ├── model_test_suite_execution_update_request.go │ │ ├── model_test_suite_executions_result.go │ │ ├── model_test_suite_executions_result_extended.go │ │ ├── model_test_suite_status.go │ │ ├── model_test_suite_status_extended.go │ │ ├── model_test_suite_step.go │ │ ├── model_test_suite_step_delay_v2.go │ │ ├── model_test_suite_step_delay_v2_extended.go │ │ ├── model_test_suite_step_execute_test_v2.go │ │ ├── model_test_suite_step_execute_test_v2_extended.go │ │ ├── model_test_suite_step_execution_request.go │ │ ├── model_test_suite_step_execution_result.go │ │ ├── model_test_suite_step_execution_result_extended.go │ │ ├── model_test_suite_step_execution_result_v2.go │ │ ├── model_test_suite_step_execution_summary.go │ │ ├── model_test_suite_step_extended.go │ │ ├── model_test_suite_step_type.go │ │ ├── model_test_suite_step_type_extended.go │ │ ├── model_test_suite_step_v2.go │ │ ├── model_test_suite_step_v2_extended.go │ │ ├── model_test_suite_update_request.go │ │ ├── model_test_suite_update_request_v2.go │ │ ├── model_test_suite_update_request_v2_extended.go │ │ ├── model_test_suite_upsert_request.go │ │ ├── model_test_suite_upsert_request_extended.go │ │ ├── model_test_suite_upsert_request_v2.go │ │ ├── model_test_suite_upsert_request_v2_exetended.go │ │ ├── model_test_suite_v2.go │ │ ├── model_test_suite_with_execution.go │ │ ├── model_test_suite_with_execution_summary.go │ │ ├── model_test_suite_with_execution_summary_base_extended.go │ │ ├── model_test_trigger.go │ │ ├── model_test_trigger_action_parameters.go │ │ ├── model_test_trigger_actions.go │ │ ├── model_test_trigger_concurrency_policies.go │ │ ├── model_test_trigger_condition.go │ │ ├── model_test_trigger_condition_spec.go │ │ ├── model_test_trigger_condition_statuses.go │ │ ├── model_test_trigger_executions.go │ │ ├── model_test_trigger_extended.go │ │ ├── model_test_trigger_key_map.go │ │ ├── model_test_trigger_probe.go │ │ ├── model_test_trigger_probe_spec.go │ │ ├── model_test_trigger_resources.go │ │ ├── model_test_trigger_selector.go │ │ ├── model_test_trigger_upsert_request.go │ │ ├── model_test_update_request.go │ │ ├── model_test_update_request_extended.go │ │ ├── model_test_upsert_request.go │ │ ├── model_test_upsert_request_extended.go │ │ ├── model_test_with_execution.go │ │ ├── model_test_with_execution_summary.go │ │ ├── model_test_with_execution_summary_base_extended.go │ │ ├── model_test_workflow.go │ │ ├── model_test_workflow_container_config.go │ │ ├── model_test_workflow_content.go │ │ ├── model_test_workflow_content_file.go │ │ ├── model_test_workflow_content_git.go │ │ ├── model_test_workflow_content_tarball.go │ │ ├── model_test_workflow_cron_job_config.go │ │ ├── model_test_workflow_event.go │ │ ├── model_test_workflow_execution.go │ │ ├── model_test_workflow_execution_config.go │ │ ├── model_test_workflow_execution_config_value.go │ │ ├── model_test_workflow_execution_cr.go │ │ ├── model_test_workflow_execution_extended.go │ │ ├── model_test_workflow_execution_notification.go │ │ ├── model_test_workflow_execution_request.go │ │ ├── model_test_workflow_execution_request_target.go │ │ ├── model_test_workflow_execution_resource_aggregations.go │ │ ├── model_test_workflow_execution_resource_aggregations_report.go │ │ ├── model_test_workflow_execution_resource_aggregations_scope.go │ │ ├── model_test_workflow_execution_status_cr.go │ │ ├── model_test_workflow_execution_step_resource_aggregations.go │ │ ├── model_test_workflow_execution_summary.go │ │ ├── model_test_workflow_execution_summary_extended.go │ │ ├── model_test_workflow_execution_tags.go │ │ ├── model_test_workflow_execution_tags_extended.go │ │ ├── model_test_workflow_executions_result.go │ │ ├── model_test_workflow_extended.go │ │ ├── model_test_workflow_extended_test.go │ │ ├── model_test_workflow_independent_service_spec.go │ │ ├── model_test_workflow_independent_step.go │ │ ├── model_test_workflow_independent_step_parallel.go │ │ ├── model_test_workflow_job_config.go │ │ ├── model_test_workflow_output.go │ │ ├── model_test_workflow_parameter_schema.go │ │ ├── model_test_workflow_parameter_type.go │ │ ├── model_test_workflow_pause.go │ │ ├── model_test_workflow_pod_config.go │ │ ├── model_test_workflow_pvc_config.go │ │ ├── model_test_workflow_ref.go │ │ ├── model_test_workflow_report.go │ │ ├── model_test_workflow_report_summary.go │ │ ├── model_test_workflow_resources.go │ │ ├── model_test_workflow_resources_list.go │ │ ├── model_test_workflow_result.go │ │ ├── model_test_workflow_result_extended.go │ │ ├── model_test_workflow_result_summary.go │ │ ├── model_test_workflow_retry_policy.go │ │ ├── model_test_workflow_running_context.go │ │ ├── model_test_workflow_running_context_actor.go │ │ ├── model_test_workflow_running_context_actor_type.go │ │ ├── model_test_workflow_running_context_interface.go │ │ ├── model_test_workflow_running_context_interface_type.go │ │ ├── model_test_workflow_service_spec.go │ │ ├── model_test_workflow_signature.go │ │ ├── model_test_workflow_signature_extended.go │ │ ├── model_test_workflow_spec.go │ │ ├── model_test_workflow_status.go │ │ ├── model_test_workflow_status_extended.go │ │ ├── model_test_workflow_status_summary.go │ │ ├── model_test_workflow_step.go │ │ ├── model_test_workflow_step_artifacts.go │ │ ├── model_test_workflow_step_artifacts_compression.go │ │ ├── model_test_workflow_step_control.go │ │ ├── model_test_workflow_step_execute.go │ │ ├── model_test_workflow_step_execute_strategy.go │ │ ├── model_test_workflow_step_execute_test_execution_request.go │ │ ├── model_test_workflow_step_execute_test_ref.go │ │ ├── model_test_workflow_step_execute_test_workflow_ref.go │ │ ├── model_test_workflow_step_extended.go │ │ ├── model_test_workflow_step_operations.go │ │ ├── model_test_workflow_step_parallel.go │ │ ├── model_test_workflow_step_parallel_extended.go │ │ ├── model_test_workflow_step_parallel_fetch.go │ │ ├── model_test_workflow_step_parallel_transfer.go │ │ ├── model_test_workflow_step_result.go │ │ ├── model_test_workflow_step_result_extended.go │ │ ├── model_test_workflow_step_run.go │ │ ├── model_test_workflow_step_status.go │ │ ├── model_test_workflow_step_status_extended.go │ │ ├── model_test_workflow_summary.go │ │ ├── model_test_workflow_summary_extended.go │ │ ├── model_test_workflow_system.go │ │ ├── model_test_workflow_tag_schema.go │ │ ├── model_test_workflow_tarball_file_pattern.go │ │ ├── model_test_workflow_tarball_request.go │ │ ├── model_test_workflow_target.go │ │ ├── model_test_workflow_template.go │ │ ├── model_test_workflow_template_extended.go │ │ ├── model_test_workflow_template_ref.go │ │ ├── model_test_workflow_template_spec.go │ │ ├── model_test_workflow_with_execution.go │ │ ├── model_test_workflow_with_execution_extended.go │ │ ├── model_test_workflow_with_execution_summary.go │ │ ├── model_test_workflow_with_execution_summary_extended.go │ │ ├── model_toleration.go │ │ ├── model_topology_spread_constraint.go │ │ ├── model_typed_local_object_reference.go │ │ ├── model_typed_object_reference.go │ │ ├── model_variable.go │ │ ├── model_variable_extended.go │ │ ├── model_variable_type.go │ │ ├── model_variable_type_extended.go │ │ ├── model_variables_extended.go │ │ ├── model_volume.go │ │ ├── model_volume_mount.go │ │ ├── model_volume_source.go │ │ ├── model_webhook.go │ │ ├── model_webhook_config_value.go │ │ ├── model_webhook_create_request.go │ │ ├── model_webhook_create_request_extended.go │ │ ├── model_webhook_extended.go │ │ ├── model_webhook_parameter_schema.go │ │ ├── model_webhook_template.go │ │ ├── model_webhook_template_create_request.go │ │ ├── model_webhook_template_create_request_extended.go │ │ ├── model_webhook_template_extended.go │ │ ├── model_webhook_template_ref.go │ │ ├── model_webhook_template_update_request.go │ │ ├── model_webhook_update_request.go │ │ ├── model_weighted_pod_affinity_term.go │ │ └── model_windows_security_context_options.go ├── archive │ ├── archive.go │ ├── tarball.go │ └── tarball_test.go ├── bufferedstream │ ├── bufferedstream.go │ └── bufferedstream_test.go ├── cache │ ├── cache.go │ ├── inmem.go │ └── inmem_test.go ├── capabilities │ └── capabilities.go ├── cloud │ ├── client │ │ ├── agents.go │ │ ├── client_mock_test.go │ │ ├── environments.go │ │ ├── environments_test.go │ │ ├── organizations.go │ │ ├── organizations_test.go │ │ └── rest.go │ ├── data │ │ ├── artifact │ │ │ ├── artifacts_storage.go │ │ │ ├── artifacts_storage_models.go │ │ │ ├── commands.go │ │ │ ├── scraper_integration_test.go │ │ │ ├── scraper_model.go │ │ │ ├── uploader.go │ │ │ ├── uploader_int_test.go │ │ │ └── uploader_test.go │ │ ├── config │ │ │ ├── commands.go │ │ │ └── config_models.go │ │ ├── executor │ │ │ ├── executor.go │ │ │ └── mock_executor.go │ │ ├── result │ │ │ ├── commands.go │ │ │ ├── result.go │ │ │ ├── result_models.go │ │ │ └── result_test.go │ │ ├── testresult │ │ │ ├── commands.go │ │ │ ├── testresult.go │ │ │ ├── testresult_models.go │ │ │ └── testresult_test.go │ │ ├── testworkflow │ │ │ ├── commands.go │ │ │ ├── execution.go │ │ │ ├── execution_models.go │ │ │ ├── output.go │ │ │ ├── output_models.go │ │ │ └── utils.go │ │ └── webhook │ │ │ ├── commands.go │ │ │ ├── mock_webhook.go │ │ │ ├── models.go │ │ │ ├── webhook.go │ │ │ └── webhook_test.go │ ├── service.pb.go │ └── service_grpc.pb.go ├── cloudlogin │ └── login.go ├── configmap │ ├── client.go │ └── mock_client.go ├── controller │ ├── testexecutionexecutor.go │ ├── testsuiteexecutionexecutor.go │ ├── testworkflowexecutionexecutor.go │ └── testworkflowexecutionexecutor_test.go ├── controlplane │ ├── errors.go │ ├── server.go │ └── utils.go ├── controlplaneclient │ ├── client.go │ ├── errors.go │ ├── execution.go │ ├── execution_self.go │ ├── metadata.go │ ├── mock_client.go │ ├── mock_runnerrequest.go │ ├── runner.go │ ├── runnerrequest.go │ ├── testworkflows.go │ ├── testworkflowtemplates.go │ └── utils.go ├── crd │ ├── crd.go │ ├── crd_test.go │ └── templates │ │ ├── executor.tmpl │ │ ├── template.tmpl │ │ ├── test.tmpl │ │ ├── testsource.tmpl │ │ ├── testsuite.tmpl │ │ ├── testtrigger.tmpl │ │ ├── webhook.tmpl │ │ └── webhooktemplate.tmpl ├── crdstorage │ ├── interface.go │ ├── testworkflows.go │ └── testworkflowtemplates.go ├── credentials │ ├── expressions.go │ ├── mock_repository.go │ └── repository.go ├── cronjob │ ├── executor.go │ ├── executor_test.go │ ├── mock_scheduler.go │ ├── scheduler.go │ ├── test.go │ ├── test_test.go │ ├── testsuite.go │ ├── testsuite_test.go │ ├── testworkflow.go │ └── testworkflow_test.go ├── data │ └── set │ │ ├── set.go │ │ └── set_test.go ├── datefilter │ ├── filter.go │ └── filter_test.go ├── dbmigrator │ ├── database.go │ ├── dbmigrator.go │ ├── dbmigrator_test.go │ └── mock_database.go ├── diagnostics │ ├── diagnostics.go │ ├── loader │ │ └── license_loader.go │ ├── renderer │ │ ├── cli.go │ │ ├── interface.go │ │ └── json.go │ └── validators │ │ ├── deps │ │ ├── errors.go │ │ ├── helm_binary.go │ │ ├── kuebctl_binary.go │ │ └── utils.go │ │ ├── error.go │ │ ├── group.go │ │ ├── interface.go │ │ ├── kinds.go │ │ ├── license │ │ ├── client.go │ │ ├── client_test.go │ │ ├── errors.go │ │ ├── file_validator.go │ │ ├── keygensh_validator.go │ │ ├── offline_key_validator.go │ │ ├── offline_license_validator.go │ │ ├── offline_license_validator_test.go │ │ ├── online_key_validator.go │ │ └── validator_test.go │ │ ├── mock │ │ ├── invalid.go │ │ ├── invalid_multi.go │ │ └── valid.go │ │ ├── requirements.go │ │ └── result.go ├── envs │ └── variables.go ├── event │ ├── bus │ │ ├── interface.go │ │ ├── mock_bus.go │ │ ├── nats.go │ │ ├── nats_integration_test.go │ │ ├── testserver.go │ │ └── testserver_test.go │ ├── emitter.go │ ├── emitter_integration_test.go │ ├── emitter_test.go │ ├── kind │ │ ├── cdevent │ │ │ ├── listener.go │ │ │ ├── listener_test.go │ │ │ ├── loader.go │ │ │ └── loader_test.go │ │ ├── common │ │ │ ├── interface_test.go │ │ │ ├── interfaces.go │ │ │ ├── name.go │ │ │ └── name_test.go │ │ ├── dummy │ │ │ ├── listener.go │ │ │ └── loader.go │ │ ├── k8sevent │ │ │ ├── listener.go │ │ │ ├── listener_test.go │ │ │ ├── loader.go │ │ │ └── loader_test.go │ │ ├── slack │ │ │ ├── listener.go │ │ │ ├── loader.go │ │ │ └── loader_test.go │ │ ├── testworkflowexecutionmetrics │ │ │ ├── listener.go │ │ │ └── loader.go │ │ ├── testworkflowexecutions │ │ │ ├── listener.go │ │ │ └── loader.go │ │ ├── testworkflowexecutiontelemetry │ │ │ ├── listener.go │ │ │ ├── loader.go │ │ │ ├── testworkflowtelemetry.go │ │ │ ├── utils.go │ │ │ └── utils_test.go │ │ ├── webhook │ │ │ ├── listener.go │ │ │ ├── listener_test.go │ │ │ ├── loader.go │ │ │ ├── loader_test.go │ │ │ └── templatevars.go │ │ └── websocket │ │ │ ├── listener.go │ │ │ ├── listener_test.go │ │ │ ├── loader.go │ │ │ ├── loader_test.go │ │ │ └── websocket.go │ ├── lazy.go │ ├── loader.go │ ├── loader_test.go │ ├── server.go │ └── server_test.go ├── executor │ ├── agent │ │ └── agent.go │ ├── client │ │ ├── .keep │ │ ├── common.go │ │ ├── interface.go │ │ ├── job.go │ │ └── mock_executor.go │ ├── common.go │ ├── common_test.go │ ├── containerexecutor │ │ ├── containerexecutor.go │ │ ├── containerexecutor_test.go │ │ ├── logs.go │ │ ├── templates │ │ │ └── job.tmpl │ │ └── tmpl.go │ ├── content │ │ ├── fetcher.go │ │ ├── fetcher_test.go │ │ ├── interface.go │ │ └── uploads.go │ ├── env │ │ └── manager.go │ ├── output │ │ ├── output.go │ │ ├── parser.go │ │ ├── parser_test.go │ │ ├── writer.go │ │ └── writer_test.go │ ├── process.go │ ├── runner │ │ └── interface.go │ └── scraper │ │ ├── factory │ │ └── factory.go │ │ ├── filesystem_extractor.go │ │ ├── filesystem_extractor_integration_test.go │ │ ├── filesystem_extractor_test.go │ │ ├── minio_scraper_integration_test.go │ │ ├── minio_uploader.go │ │ ├── minio_uploader_integration_test.go │ │ ├── mock_scraper.go │ │ ├── scraper.go │ │ └── scrapertypes │ │ ├── extractor.go │ │ ├── mock_extractor.go │ │ ├── mock_uploader.go │ │ └── uploader.go ├── expressions │ ├── README.md │ ├── accessor.go │ ├── call.go │ ├── conditional.go │ ├── convert.go │ ├── expression.go │ ├── finalizer.go │ ├── generic.go │ ├── generic_test.go │ ├── intstr.go │ ├── libs │ │ ├── fs.go │ │ └── fs_test.go │ ├── machine.go │ ├── machineutils.go │ ├── math.go │ ├── mock_expression.go │ ├── mock_machine.go │ ├── mock_staticvalue.go │ ├── negative.go │ ├── parse.go │ ├── parse_test.go │ ├── propertyaccessor.go │ ├── static.go │ ├── static_test.go │ ├── stdlib.go │ ├── tokenize.go │ ├── tokenize_test.go │ ├── tokens.go │ ├── typechecking.go │ └── utils.go ├── featureflags │ ├── featureflags.go │ └── featureflags_test.go ├── filesystem │ ├── filesystem.go │ ├── mock_file.go │ ├── mock_fileinfo.go │ ├── mock_filesystem.go │ ├── os_filesystem.go │ └── os_filesystem_test.go ├── git │ ├── checkout.go │ └── checkout_test.go ├── helm │ ├── chart.go │ └── chart_test.go ├── http │ ├── client.go │ ├── client_test.go │ └── interface.go ├── imageinspector │ ├── configmapstorage.go │ ├── configmapstorage_test.go │ ├── cranefetcher.go │ ├── cranefetcher_test.go │ ├── inspector.go │ ├── inspector_test.go │ ├── memorystorage.go │ ├── memorystorage_test.go │ ├── mock_infofetcher.go │ ├── mock_inspector.go │ ├── mock_secretfetcher.go │ ├── mock_storage.go │ ├── secretfetcher.go │ ├── secretfetcher_test.go │ ├── serialization.go │ └── types.go ├── k8sclient │ ├── k8sclient.go │ └── k8sclient_test.go ├── keymap │ └── triggers │ │ └── triggers.go ├── log │ ├── log.go │ └── trace.go ├── logs │ ├── adapter │ │ ├── cloud.go │ │ ├── cloud_test.go │ │ ├── debug.go │ │ ├── interface.go │ │ ├── minio.go │ │ ├── minio_test.go │ │ ├── minio_v2.go │ │ ├── minio_v2_test.go │ │ └── test-bla │ ├── client │ │ ├── client.go │ │ ├── interface.go │ │ ├── mock_client.go │ │ ├── mock_initializedstreamgetter.go │ │ ├── mock_initializedstreampusher.go │ │ ├── mock_namer.go │ │ ├── mock_stream.go │ │ ├── mock_streamgetter.go │ │ ├── stream.go │ │ └── stream_test.go │ ├── config │ │ ├── logs_config.go │ │ └── logs_config_test.go │ ├── events.go │ ├── events │ │ ├── events.go │ │ └── events_test.go │ ├── events_test.go │ ├── healthcheck.go │ ├── healthcheck_test.go │ ├── logsserver.go │ ├── logsserver_test.go │ ├── pb │ │ ├── logs.pb.go │ │ ├── logs.proto │ │ ├── logs_grpc.pb.go │ │ └── mapper.go │ ├── repository │ │ ├── factory.go │ │ ├── interface.go │ │ ├── jetstream.go │ │ ├── minio.go │ │ └── minio_test.go │ ├── service.go │ ├── service_test.go │ ├── sidecar │ │ └── proxy.go │ └── state │ │ ├── interface.go │ │ ├── nats.go │ │ ├── state.go │ │ └── state_test.go ├── mapper │ ├── cdevents │ │ ├── mapper.go │ │ └── mapper_test.go │ ├── common │ │ ├── grpc.go │ │ ├── kube_openapi.go │ │ └── openapi_kube.go │ ├── daemonsets │ │ └── mapper.go │ ├── deployments │ │ └── mapper.go │ ├── executions │ │ ├── summary.go │ │ └── summary_test.go │ ├── executors │ │ └── mapper.go │ ├── k8sevents │ │ └── mapper.go │ ├── keymap │ │ └── triggers │ │ │ └── kube_openapi.go │ ├── pods │ │ └── mapper.go │ ├── secrets │ │ └── mapper.go │ ├── services │ │ └── mapper.go │ ├── statefulsets │ │ └── mapper.go │ ├── templates │ │ └── mapper.go │ ├── testexecutions │ │ └── mapper.go │ ├── tests │ │ ├── kube_openapi.go │ │ ├── kube_openapi_test.go │ │ └── openapi_kube.go │ ├── testsources │ │ └── mapper.go │ ├── testsuiteexecutions │ │ ├── mapper.go │ │ ├── summary.go │ │ └── summary_test.go │ ├── testsuites │ │ ├── kube_openapi.go │ │ ├── kube_openapi_test.go │ │ └── openapi_kube.go │ ├── testtriggers │ │ ├── kube_openapi.go │ │ └── openapi_kube.go │ ├── testworkflows │ │ ├── kube.go │ │ ├── kube_openapi.go │ │ ├── mappers_test.go │ │ └── openapi_kube.go │ ├── webhooks │ │ └── mapper.go │ └── webhooktemplates │ │ └── mapper.go ├── newclients │ ├── testworkflowclient │ │ ├── cloud.go │ │ ├── interface.go │ │ ├── kubernetes.go │ │ └── mock_interface.go │ └── testworkflowtemplateclient │ │ ├── cloud.go │ │ ├── interface.go │ │ ├── kubernetes.go │ │ └── mock_interface.go ├── oauth │ ├── github.go │ ├── interface.go │ └── oauth.go ├── problem │ └── problem.go ├── process │ └── exec.go ├── rand │ ├── names.go │ └── string.go ├── reconciler │ └── reconciler.go ├── repository │ ├── channels │ │ └── channels.go │ ├── common │ │ ├── metrics.go │ │ └── metrics_test.go │ ├── config │ │ ├── configmap.go │ │ ├── interface.go │ │ ├── mock_repository.go │ │ ├── mongo.go │ │ └── mongo_test.go │ ├── result │ │ ├── filter.go │ │ ├── interface.go │ │ ├── minio_output.go │ │ ├── minio_output_test.go │ │ ├── mock_output_repository.go │ │ ├── mock_repository.go │ │ ├── mongo.go │ │ ├── mongo_integration_test.go │ │ └── mongo_output.go │ ├── sequence │ │ ├── interface.go │ │ ├── mock_repository.go │ │ ├── mongo.go │ │ └── mongo_integration_test.go │ ├── storage │ │ └── mongo.go │ ├── testresult │ │ ├── filter.go │ │ ├── interface.go │ │ ├── mock_repository.go │ │ ├── mongo.go │ │ └── mongo_test.go │ └── testworkflow │ │ ├── filter.go │ │ ├── interface.go │ │ ├── minio_output_repository.go │ │ ├── mock_output_repository.go │ │ ├── mock_repository.go │ │ ├── mongo.go │ │ └── mongo_integration_test.go ├── resourcepattern │ ├── resourcepattern.go │ └── resourcepattern_test.go ├── runner │ ├── agent.go │ ├── executionlogswriter.go │ ├── executionsaver.go │ ├── globaltemplate.go │ ├── lazy.go │ ├── mock_executionsaver.go │ ├── mock_runner.go │ ├── runner.go │ ├── service.go │ └── utils.go ├── scheduler │ ├── service.go │ ├── test_scheduler.go │ ├── test_scheduler_test.go │ └── testsuite_scheduler.go ├── secret │ ├── client.go │ └── mock_client.go ├── secretmanager │ ├── batch.go │ └── manager.go ├── semver │ ├── version.go │ └── version_test.go ├── server │ ├── config.go │ ├── endpoints.go │ ├── httpserver.go │ └── pager.go ├── slack │ ├── config.go │ ├── config_test.go │ ├── set.go │ └── slack.go ├── storage │ ├── artifacts.go │ ├── artifacts_mock.go │ ├── minio │ │ ├── artifacts_storage.go │ │ ├── artifacts_storage_integration_test.go │ │ ├── helpers.go │ │ ├── minio.go │ │ ├── minio_connecter.go │ │ └── minio_test.go │ ├── storage.go │ └── storage_mock.go ├── tcl │ ├── README.md │ ├── checktcl │ │ └── organization_plan.go │ ├── mappertcl │ │ ├── testexecutions │ │ │ └── mapper.go │ │ ├── tests │ │ │ ├── kube_openapi.go │ │ │ └── openapi_kube.go │ │ ├── testsuiteexecutions │ │ │ └── mapper.go │ │ └── testworkflows │ │ │ └── openapi_kube.go │ ├── schedulertcl │ │ └── test_scheduler.go │ └── testworkflowstcl │ │ ├── cmd │ │ ├── cmd.go │ │ └── cmd_test.go │ │ ├── cronjob │ │ └── executor.go │ │ ├── mapper │ │ └── cdevents.go │ │ ├── testworkflowprocessor │ │ └── operations.go │ │ └── triggers │ │ └── executor.go ├── telemetry │ ├── generators.go │ ├── license.go │ ├── payload.go │ ├── payload_test.go │ ├── sender_ga4.go │ ├── sender_sio.go │ ├── sender_sio_test.go │ ├── sender_tka.go │ ├── telemetry.go │ └── telemetry_test.go ├── test │ └── detector │ │ ├── detector.go │ │ ├── detector_test.go │ │ ├── detector_test_examples.go │ │ └── interface.go ├── testworkflows │ ├── executionworker │ │ ├── controller │ │ │ ├── channel.go │ │ │ ├── cleanup.go │ │ │ ├── control.go │ │ │ ├── controller.go │ │ │ ├── logs.go │ │ │ ├── logs_test.go │ │ │ ├── notification.go │ │ │ ├── notifier.go │ │ │ ├── store │ │ │ │ ├── list.go │ │ │ │ ├── update.go │ │ │ │ └── value.go │ │ │ ├── utils.go │ │ │ ├── watchers │ │ │ │ ├── commons.go │ │ │ │ ├── containerevents.go │ │ │ │ ├── events_watcher.go │ │ │ │ ├── executionstate.go │ │ │ │ ├── executionwatcher.go │ │ │ │ ├── job.go │ │ │ │ ├── job_watcher.go │ │ │ │ ├── jobevents.go │ │ │ │ ├── pod.go │ │ │ │ ├── pod_watcher.go │ │ │ │ └── podevents.go │ │ │ └── watchinstrumentedpod.go │ │ ├── engines.go │ │ ├── executionworkertypes │ │ │ ├── interface.go │ │ │ ├── mock_worker.go │ │ │ └── notificationswatcher.go │ │ ├── kubernetesworker │ │ │ ├── interface.go │ │ │ └── worker.go │ │ ├── registry │ │ │ ├── controllers.go │ │ │ ├── errors.go │ │ │ ├── ips.go │ │ │ └── namespaces.go │ │ └── utils │ │ │ └── logsreader.go │ ├── testworkflowconfig │ │ ├── config.go │ │ └── expressions.go │ ├── testworkflowexecutor │ │ ├── executor.go │ │ ├── mock_executor.go │ │ ├── mock_scheduler.go │ │ ├── prepared.go │ │ ├── scheduler.go │ │ ├── secrethandler.go │ │ ├── testworkflowfetcher.go │ │ ├── testworkflowtemplatefetcher.go │ │ ├── testworkflowtemplatefetcher_test.go │ │ └── utils.go │ ├── testworkflowprocessor │ │ ├── action │ │ │ ├── actiontypes │ │ │ │ ├── action.go │ │ │ │ ├── analysis.go │ │ │ │ ├── lite │ │ │ │ │ ├── action.go │ │ │ │ │ └── utils.go │ │ │ │ ├── mutations.go │ │ │ │ └── utils.go │ │ │ ├── containerize.go │ │ │ ├── containerize_test.go │ │ │ ├── finalize.go │ │ │ ├── group.go │ │ │ ├── group_test.go │ │ │ ├── optimize.go │ │ │ ├── process.go │ │ │ ├── process_test.go │ │ │ └── sort.go │ │ ├── bundle.go │ │ ├── configmapfiles.go │ │ ├── constants │ │ │ └── constants.go │ │ ├── intermediate.go │ │ ├── mock_intermediate.go │ │ ├── mock_internalprocessor.go │ │ ├── mock_processor.go │ │ ├── operations.go │ │ ├── presets │ │ │ ├── presets.go │ │ │ └── processor_test.go │ │ ├── processor.go │ │ ├── refcounter.go │ │ ├── secretmachine.go │ │ ├── secretmachine_test.go │ │ ├── stage │ │ │ ├── container.go │ │ │ ├── containerstage.go │ │ │ ├── groupstage.go │ │ │ ├── mock_container.go │ │ │ ├── mock_stage.go │ │ │ ├── signature.go │ │ │ ├── stage.go │ │ │ ├── stagelifecycle.go │ │ │ ├── stagemetadata.go │ │ │ └── utils.go │ │ └── utils.go │ ├── testworkflowresolver │ │ ├── analyze.go │ │ ├── analyze_test.go │ │ ├── apply.go │ │ ├── apply_test.go │ │ ├── config.go │ │ ├── config_test.go │ │ ├── dedupe.go │ │ ├── merge.go │ │ ├── secrets.go │ │ └── secrets_test.go │ └── utils.go ├── tmp │ ├── files.go │ └── files_test.go ├── triggers │ ├── diff.go │ ├── event.go │ ├── executor.go │ ├── executor_test.go │ ├── lease.go │ ├── lease_backend.go │ ├── lease_backend_test.go │ ├── lease_test.go │ ├── matcher.go │ ├── matcher_test.go │ ├── mock_lease_backend.go │ ├── scraper.go │ ├── scraper_test.go │ ├── service.go │ ├── service_test.go │ ├── status.go │ ├── status_test.go │ ├── util.go │ ├── watcher.go │ └── watcher_test.go ├── types │ ├── duration.go │ └── duration_test.go ├── ui │ ├── colors.go │ ├── config.go │ ├── confirm.go │ ├── errors.go │ ├── icons.go │ ├── logo.go │ ├── printers.go │ ├── select.go │ ├── specifics.go │ ├── spinner.go │ ├── table.go │ ├── textinput.go │ ├── ui.go │ └── uicrd │ │ └── crd.go ├── utilization │ ├── core │ │ ├── aggregations.go │ │ ├── aggregations_test.go │ │ ├── formatters.go │ │ ├── formatters_test.go │ │ ├── group.go │ │ ├── group_test.go │ │ ├── metadata.go │ │ ├── metadata_test.go │ │ ├── parsers.go │ │ ├── parsers_test.go │ │ ├── testdata │ │ │ ├── metrics_no_metadata.influx │ │ │ └── metrics_valid_metadata.influx │ │ ├── utils.go │ │ ├── utils_test.go │ │ ├── writers.go │ │ └── writers_test.go │ ├── format.go │ ├── instrument.go │ ├── instrument_test.go │ └── utilisation.go ├── utils │ ├── consts.go │ ├── test │ │ └── integration.go │ ├── text │ │ ├── obfuscate.go │ │ ├── obfuscate_test.go │ │ ├── slug.go │ │ ├── slug_test.go │ │ ├── tostr.go │ │ └── tostr_test.go │ ├── utils.go │ └── utils_test.go ├── version │ └── version.go └── workerpool │ ├── service.go │ └── service_test.go ├── proto └── service.proto ├── skaffold.yaml └── test ├── artillery └── executor-smoke │ ├── artillery-smoke-test-negative.yaml │ ├── artillery-smoke-test.yaml │ ├── crd-workflow │ └── smoke.yaml │ └── crd │ └── crd.yaml ├── cli-tests ├── .babelrc ├── .env ├── .gitignore ├── helpers │ ├── api-helpers.js │ ├── output-validators.js │ └── test-data-handlers.js ├── package-lock.json ├── package.json ├── test-data │ └── tests.json └── tests │ ├── create-test.js │ ├── run-test.js │ └── test-results.js ├── container-executor └── executor-smoke │ └── crd │ ├── curl.yaml │ ├── cypress.yaml │ ├── gradle.yaml │ ├── jmeter.yaml │ ├── k6.yaml │ ├── maven.yaml │ ├── playwright.yaml │ ├── postman.yaml │ └── soapui.yaml ├── curl ├── curl.json └── executor-tests │ ├── crd-workflow │ └── smoke.yaml │ ├── crd │ └── smoke.yaml │ ├── curl-smoke-test-negative.json │ └── curl-smoke-test.json ├── cypress └── executor-tests │ ├── crd-workflow │ └── smoke.yaml │ ├── crd │ ├── crd.yaml │ └── other.yaml │ ├── cypress-12 │ ├── .gitignore │ ├── cypress.config.js │ ├── cypress │ │ ├── e2e │ │ │ ├── smoke.cy.js │ │ │ └── smoke2.cy.js │ │ ├── fixtures │ │ │ └── .gitkeep │ │ └── support │ │ │ ├── .gitkeep │ │ │ └── e2e.js │ ├── package-lock.json │ └── package.json │ ├── cypress-13 │ ├── .gitignore │ ├── cypress.config.js │ ├── cypress │ │ ├── e2e │ │ │ ├── demo-page.cy.js │ │ │ ├── smoke.cy.js │ │ │ └── smoke2.cy.js │ │ ├── fixtures │ │ │ └── .gitkeep │ │ └── support │ │ │ ├── .gitkeep │ │ │ └── e2e.js │ ├── package-lock.json │ └── package.json │ ├── cypress-14 │ ├── .gitignore │ ├── cypress.config.js │ ├── cypress │ │ ├── e2e │ │ │ ├── demo-page.cy.js │ │ │ ├── smoke.cy.js │ │ │ └── smoke2.cy.js │ │ ├── fixtures │ │ │ └── .gitkeep │ │ └── support │ │ │ ├── .gitkeep │ │ │ └── e2e.js │ ├── package-lock.json │ └── package.json │ ├── cypress-9 │ ├── .gitignore │ ├── cypress.json │ ├── cypress │ │ ├── fixtures │ │ │ └── .gitkeep │ │ ├── integration │ │ │ └── dummy_test.spec.js │ │ ├── plugins │ │ │ └── .gitkeep │ │ └── support │ │ │ └── .gitkeep │ ├── package-lock.json │ └── package.json │ └── cypress-without-envs │ ├── .gitignore │ ├── cypress.config.js │ ├── cypress │ ├── e2e │ │ ├── smoke-without-envs-2.cy.js │ │ └── smoke-without-envs.cy.js │ ├── fixtures │ │ └── .gitkeep │ └── support │ │ ├── .gitkeep │ │ └── e2e.js │ ├── package-lock.json │ └── package.json ├── examples ├── cloud-demo │ ├── test-workflows │ │ ├── cypress.yaml │ │ ├── gradle.yaml │ │ ├── jmeter.yaml │ │ ├── k6.yaml │ │ ├── playwright.yaml │ │ └── postman.yaml │ └── tests │ │ ├── cypress.yaml │ │ ├── gradle.yaml │ │ ├── jmeter.yaml │ │ ├── k6.yaml │ │ ├── playwright.yaml │ │ ├── postman.yaml │ │ └── testsuites │ │ └── k6.yaml ├── example-demo-page │ ├── testkube-test-page-login │ │ ├── demo.html │ │ └── index.html │ └── testkube-test-page │ │ └── index.html ├── k6-perf │ ├── k6-crd.yaml │ └── prometheus-grafana │ │ ├── values-grafana.yaml │ │ └── values-prometheus.yaml ├── kubecon │ ├── test-workflows │ │ ├── cypress.yaml │ │ ├── gradle.yaml │ │ ├── jmeter.yaml │ │ ├── k6.yaml │ │ ├── playwright.yaml │ │ └── postman.yaml │ └── tests │ │ ├── cypress.yaml │ │ ├── gradle.yaml │ │ ├── jmeter.yaml │ │ ├── k6.yaml │ │ ├── playwright.yaml │ │ ├── postman.yaml │ │ └── testsuites │ │ └── k6.yaml ├── showcase │ └── crd.yaml └── status-page │ └── crd.yaml ├── executors ├── container-executor-curl.yaml ├── container-executor-cypress.yaml ├── container-executor-gradle.yaml ├── container-executor-jmeter.yaml ├── container-executor-k6.yaml ├── container-executor-large-artifacts.yaml ├── container-executor-large-logs.yaml ├── container-executor-maven.yaml ├── container-executor-playwright.yaml ├── container-executor-postman.yaml ├── container-executor-soapui.yaml ├── cypress.yaml ├── gradle.yaml ├── local-postman.yaml └── maven.yaml ├── ginkgo └── executor-tests │ ├── crd │ └── smoke.yaml │ ├── smoke-negative │ ├── go.mod │ ├── go.sum │ ├── smoke_negative_test.go │ └── smoke_suite_negative_test.go │ └── smoke │ ├── go.mod │ ├── go.sum │ ├── smoke_suite_test.go │ └── smoke_test.go ├── gradle └── executor-smoke │ ├── crd-workflow │ └── smoke.yaml │ └── crd │ └── crd.yaml ├── integration └── crd-workflow │ └── testkube-integration-tests.yaml ├── jmeter └── executor-tests │ ├── crd-workflow │ └── smoke.yaml │ ├── crd │ ├── other.yaml │ ├── smoke.yaml │ └── special-cases.yaml │ ├── jmeter-executor-smoke-2.jmx │ ├── jmeter-executor-smoke-correct-url-failed-assertion.jmx │ ├── jmeter-executor-smoke-env-and-property.jmx │ ├── jmeter-executor-smoke-incorrect-url-2.jmx │ ├── jmeter-executor-smoke-incorrect-url.jmx │ ├── jmeter-executor-smoke-negative.jmx │ └── jmeter-executor-smoke.jmx ├── junit ├── crd-workflow │ └── smoke.yaml └── junit5-project │ ├── pom.xml │ └── src │ └── test │ └── java │ ├── TestSmoke1.java │ ├── TestSmoke2.java │ └── TestSmokeFail.java ├── k6 └── executor-tests │ ├── crd-workflow │ └── smoke.yaml │ ├── crd │ ├── other.yaml │ └── smoke.yaml │ ├── k6-perf-test-gcp-discard-response-bodies.js │ ├── k6-perf-test-gcp.js │ ├── k6-perf-test.js │ ├── k6-smoke-test-negative.js │ ├── k6-smoke-test-without-envs.js │ └── k6-smoke-test.js ├── kubepug └── executor-smoke │ ├── crd │ └── crd.yaml │ └── kubepug-smoke-test-negative.yaml ├── locust ├── crd-workflow │ └── smoke.yaml └── locust-project │ ├── locust_test.py │ └── requirements.txt ├── maven └── executor-smoke │ ├── crd-workflow │ └── smoke.yaml │ └── crd │ └── crd.yaml ├── nunit ├── crd-workflow │ └── crd.yaml └── nunit-project │ └── ExampleProject │ ├── ExampleProject.csproj │ ├── ExampleTest1.cs │ └── GlobalUsings.cs ├── pact └── pact-js-project │ ├── .gitignore │ ├── crd │ └── smoke.yaml │ ├── jest.config.js │ ├── package-lock.json │ ├── package.json │ └── pact │ ├── consumer │ └── user │ │ └── user.pact.test.js │ ├── logs │ └── .gitkeep │ └── pacts │ └── .gitkeep ├── perf ├── api-server.js └── testkube-homepage.js ├── playwright └── executor-tests │ ├── crd-workflow │ └── smoke.yaml │ ├── crd │ └── crd.yaml │ └── playwright-project │ ├── package-lock.json │ ├── package.json │ ├── playwright.config.js │ └── tests │ ├── smoke.spec.js │ └── smoke2.spec.js ├── postman ├── Health.postman_collection.json ├── Kubeshop.postman_collection.json ├── Local-API-Health.postman_collection.json ├── LocalHealth.postman_collection.json ├── LongRun.postman_collection.json ├── Params-test.postman_collection.json ├── TODO.postman_collection.json ├── TestKube-Sanity.postman_collection.json ├── Testkube-API-Failing.postman_collection.json ├── Testkube-API.postman_collection.json ├── Variables test.postman_collection.json ├── VeryLong.postman_collection.json ├── Video-Chuck-Test.postman_collection.json ├── env.postman_environment.json ├── executor-tests │ ├── crd-workflow │ │ └── smoke.yaml │ ├── crd │ │ └── crd.yaml │ ├── postman-executor-smoke-negative.postman_collection.json │ ├── postman-executor-smoke-without-envs.postman_collection.json │ └── postman-executor-smoke.postman_collection.json ├── hello-postman.postman_collection.json ├── test.postman_collection.json └── testkube-api-server-health.postman_collection.json ├── pytest ├── crd-workflow │ └── smoke.yaml └── pytest-project │ ├── pytest.ini │ ├── requirements.txt │ └── tests │ ├── fail │ └── smoke-3-fail_test.py │ └── success │ ├── smoke-2_test.py │ └── smoke_test.py ├── scripts └── executor-tests │ └── run.sh ├── soapui └── executor-smoke │ ├── crd-workflow │ └── smoke.yaml │ ├── crd │ └── crd.yaml │ ├── soapui-smoke-test-negative.xml │ └── soapui-smoke-test.xml ├── special-cases ├── edge-cases-expected-fails.yaml ├── large-artifacts.yaml ├── large-logs.yaml └── test-workflows │ ├── edge-cases-expected-fails.yaml │ ├── file-read-write.yaml │ ├── junit-reports.yaml │ ├── junit-reports │ ├── high-level-failure.xml │ ├── high-level-testcase-both-error-and-failure.xml │ └── high-level-without-testcases.xml │ └── large.yaml ├── suites ├── demo-testsuite.json ├── executor-artillery-smoke-tests.yaml ├── executor-common-smoke-tests.json ├── executor-container-curl-smoke-tests.yaml ├── executor-container-cypress-smoke-tests.yaml ├── executor-container-gradle-smoke-tests.yaml ├── executor-container-jmeter-smoke-tests.yaml ├── executor-container-k6-smoke-tests.yaml ├── executor-container-maven-smoke-tests.yaml ├── executor-container-playwright-smoke-tests.yaml ├── executor-container-postman-smoke-tests.yaml ├── executor-container-soapui-smoke-tests.yaml ├── executor-curl-smoke-tests.yaml ├── executor-cypress-smoke-tests.yaml ├── executor-ginkgo-smoke-tests.yaml ├── executor-gradle-smoke-tests.yaml ├── executor-jmeter-other-tests.yaml ├── executor-jmeter-smoke-tests.yaml ├── executor-k6-other-tests.yaml ├── executor-k6-smoke-tests.yaml ├── executor-kubepug-smoke-tests.yaml ├── executor-maven-smoke-tests.yaml ├── executor-playwright-smoke-tests.yaml ├── executor-postman-smoke-tests.yaml ├── executor-soapui-smoke-tests.yaml ├── special-cases │ ├── edge-cases-expected-fails.yaml │ ├── expected-failure-parallel-testsuite-delays.yaml │ ├── jmeter-special-cases.yaml │ ├── k6-parallel-example.yaml │ ├── large-artifacts.yaml │ ├── large-logs.yaml │ ├── parallel-testsuite-2.yaml │ ├── parallel-testsuite-delays.yaml │ ├── parallel-testsuite-downloadArtifacts.yaml │ ├── parallel-testsuite-downloadArtifacts2.yaml │ ├── parallel-testsuite-large-logs.yaml │ └── test-workflows │ │ └── edge-cases-expected-fails.yaml ├── staging-testsuite.json ├── test-workflows │ ├── artillery-workflow.yaml │ ├── combined-workflow-test.yaml │ ├── cron │ │ ├── dev │ │ │ ├── full-smoke-cron.yaml │ │ │ ├── small-smoke-cron.yaml │ │ │ └── testkube-multiagent-targets-workflow-cron.yaml │ │ └── sandbox │ │ │ └── small-smoke-cron.yaml │ ├── curl-workflow.yaml │ ├── cypress-workflow.yaml │ ├── full-smoke.yaml │ ├── gradle-workflow.yaml │ ├── jmeter-workflow.yaml │ ├── junit-workflow.yaml │ ├── k6-workflow.yaml │ ├── locust-workflow.yaml │ ├── maven-workflow.yaml │ ├── nunit-workflow.yaml │ ├── pact-workflow.yaml │ ├── playwright-workflow.yaml │ ├── postman-workflow.yaml │ ├── pytest-workflow.yaml │ ├── small-smoke.yaml │ ├── soapui-workflow.yaml │ └── testkube-multiagent-targets-workflow.yaml ├── testsuite-example-1.json ├── testsuite-example-2.json ├── testsuite-example-3.json ├── testsuite-testkube-failing-sof.json ├── testsuite-testkube-failing.json └── testsuite-testkube.json └── testkube ├── installation-tests ├── crd │ ├── enterprise-installation.yaml │ ├── oss-installation.yaml │ └── setup-dind-kind-cluster-template.yaml └── enterprise-installation-expect-file.exp └── ui-e2e └── crd └── cloud-ui-e2e.yaml /.codecov.yaml: -------------------------------------------------------------------------------- 1 | ignore: 2 | - "cmd/**" 3 | 4 | coverage: 5 | status: 6 | project: false 7 | patch: false 8 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | .gitignore 3 | .github 4 | README.md 5 | Makefile 6 | build 7 | docs 8 | assets 9 | config 10 | choco 11 | test 12 | skaffold.yaml 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/enhancement.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Enhancement 3 | about: Suggest an enhancement to existing Testkube functionality 4 | title: '' 5 | labels: 'enhancement 🚀' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the enhancement you'd like to see** 11 | A clear and concise description of what you want to happen, and why. 12 | 13 | **Additional context** 14 | Add any other context, CLI input/output, etc. about the enhancement here. 15 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/manage_tech_debt.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Tech debt manage / Refactorings 3 | about: Fix shortcuts / reorder code / introduce tests / improve stuff 4 | title: '' 5 | labels: 'tech-debt 🙈' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Why should it be implemented?** 11 | Add short and concise description why we need this improvement? 12 | 13 | **Describe the improvement** 14 | A clear and concise description of what the bug is. 15 | 16 | **Additional context** 17 | Add any other context about the problem here if needed. 18 | 19 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## Pull request description 2 | 3 | 4 | 5 | ## Checklist (choose whats happened) 6 | 7 | - [ ] breaking change! (describe) 8 | - [ ] tested locally 9 | - [ ] tested on cluster 10 | - [ ] added new dependencies 11 | - [ ] updated the docs 12 | - [ ] added a test 13 | 14 | ## Breaking changes 15 | 16 | - 17 | 18 | ## Changes 19 | 20 | - 21 | 22 | ## Fixes 23 | 24 | - -------------------------------------------------------------------------------- /.github/sandbox-comment-template.md: -------------------------------------------------------------------------------- 1 | Sandbox environment for `{{ .branch_ref }}` has been created. 2 | 3 | ## URLs 4 | 5 | - **Dashboard**: https://dashboard.{{ .branch_ref }}.testkube.dev 6 | - **API**: https://api.{{ .branch_ref }}.testkube.dev 7 | - **Agent**: https://agent.{{ .branch_ref }}.testkube.dev 8 | - **Storage**: https://storage.{{ .branch_ref }}.testkube.dev 9 | - **Websockets**: https://websockets.{{ .branch_ref }}.testkube.dev 10 | -------------------------------------------------------------------------------- /.github/workflows/agent-test-update-dispatch.yaml: -------------------------------------------------------------------------------- 1 | name: Dispatch - update tests at dev agent 2 | 3 | on: 4 | push: 5 | branches: 6 | - develop 7 | paths: 8 | - test/** 9 | 10 | jobs: 11 | dispatch: 12 | name: Dispatch - update tests at dev agent 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Update tests at dev agent 16 | uses: peter-evans/repository-dispatch@v3 17 | with: 18 | repository: kubeshop/testkube-cloud-api 19 | event-type: create_update_tests 20 | -------------------------------------------------------------------------------- /.golangci.yml: -------------------------------------------------------------------------------- 1 | # .golangci.yml 2 | 3 | run: 4 | build-tags: 5 | - integration 6 | 7 | linters: 8 | disable-all: true 9 | enable: 10 | - goimports 11 | - revive 12 | - govet 13 | - unused 14 | - staticcheck 15 | 16 | linters-settings: 17 | govet: 18 | check-shadowing: false 19 | revive: 20 | ignore-generated-header: true 21 | goimports: 22 | local-prefixes: github.com/kubeshop/testkube 23 | 24 | issues: 25 | exclude-use-default: false 26 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Source code in this repository is variously licensed under the Testkube 2 | Community License (TCL) and the MIT license. 3 | 4 | Source code in a given file is licensed under the applicable license 5 | for that source code. Source code is licensed under the MIT license 6 | unless otherwise indicated in the header referenced at the beginning 7 | of the file or specified by a LICENSE file in the same containing 8 | folder as the file. 9 | -------------------------------------------------------------------------------- /assets/architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/architecture.png -------------------------------------------------------------------------------- /assets/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/favicon.png -------------------------------------------------------------------------------- /assets/imageFailed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/imageFailed.png -------------------------------------------------------------------------------- /assets/imagePassed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/imagePassed.png -------------------------------------------------------------------------------- /assets/imagePending.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/imagePending.png -------------------------------------------------------------------------------- /assets/intro-to-testkube.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/intro-to-testkube.jpeg -------------------------------------------------------------------------------- /assets/intro-to-testkube.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/intro-to-testkube.jpg -------------------------------------------------------------------------------- /assets/logo-dark-text-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/logo-dark-text-full.png -------------------------------------------------------------------------------- /assets/logo-dark-text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/logo-dark-text.png -------------------------------------------------------------------------------- /assets/logo-rect-blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/logo-rect-blue.png -------------------------------------------------------------------------------- /assets/logo-rect-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/logo-rect-dark.png -------------------------------------------------------------------------------- /assets/logo-rect-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/logo-rect-white.png -------------------------------------------------------------------------------- /assets/logo-white-text-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/logo-white-text-full.png -------------------------------------------------------------------------------- /assets/logo-white-text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/logo-white-text.png -------------------------------------------------------------------------------- /assets/squishies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/squishies.png -------------------------------------------------------------------------------- /assets/testkube-color-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/testkube-color-dark.png -------------------------------------------------------------------------------- /assets/testkube-color-gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/testkube-color-gray.png -------------------------------------------------------------------------------- /assets/testkube-color-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/testkube-color-white.png -------------------------------------------------------------------------------- /assets/testkube-intro.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/assets/testkube-intro.gif -------------------------------------------------------------------------------- /bin/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/bin/.gitkeep -------------------------------------------------------------------------------- /build/_local/values.dev.tpl.yaml: -------------------------------------------------------------------------------- 1 | testkube-dashboard: 2 | enabled: false 3 | mongodb: 4 | enabled: false 5 | testkube-api: 6 | cloud: 7 | url: testkube-enterprise-api:8089 8 | tls: 9 | enabled: false 10 | existingSecret: 11 | name: testkube-default-agent-token 12 | key: agent-token -------------------------------------------------------------------------------- /build/api-server/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | ARG ALPINE_IMAGE 3 | FROM ${ALPINE_IMAGE} 4 | RUN apk --no-cache add ca-certificates libssl3 git 5 | WORKDIR /root/ 6 | COPY testkube-api-server /bin/app 7 | USER 1001 8 | EXPOSE 8088 9 | ENTRYPOINT ["/bin/app"] 10 | -------------------------------------------------------------------------------- /build/installer/windows/teskube.nuspec: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Testkube 5 | 0.11.0 6 | Kubernetes-native framework for test definition and execution. 7 | Kubeshop 8 | MIT 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /build/installer/windows/testkube.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | echo. 3 | kubectl-testkube.exe %* -------------------------------------------------------------------------------- /build/installer/windows/tk.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | echo. 3 | kubectl-testkube.exe %* -------------------------------------------------------------------------------- /build/logs-server/Dockerfile: -------------------------------------------------------------------------------- 1 | ARG ALPINE_IMAGE 2 | FROM ${ALPINE_IMAGE} as certs 3 | # hadolint ignore=DL3018 4 | RUN apk --no-cache --update add ca-certificates && (rm -rf /var/cache/apk/* || 0) 5 | 6 | WORKDIR /root/ 7 | 8 | COPY testkube-logs-server /bin/app 9 | USER 1001 10 | EXPOSE 8088 11 | ENTRYPOINT ["/bin/app"] 12 | -------------------------------------------------------------------------------- /build/logs-sidecar/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | ARG ALPINE_IMAGE 3 | FROM ${ALPINE_IMAGE} 4 | RUN apk --no-cache add ca-certificates 5 | WORKDIR /root/ 6 | COPY testkube-logs-sidecar /bin/app 7 | USER 1001 8 | EXPOSE 8088 9 | ENTRYPOINT ["/bin/app"] 10 | -------------------------------------------------------------------------------- /build/testworkflow-init/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | ARG BUSYBOX_IMAGE 3 | FROM ${BUSYBOX_IMAGE} 4 | RUN cp -rf /bin /.tktw-bin 5 | COPY testworkflow-init /init 6 | USER 1001 7 | ENTRYPOINT ["/init"] 8 | -------------------------------------------------------------------------------- /build/testworkflow-toolkit/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | ARG BUSYBOX_IMAGE 3 | ARG ALPINE_IMAGE 4 | 5 | FROM ${BUSYBOX_IMAGE} AS busybox 6 | FROM ${ALPINE_IMAGE} 7 | RUN apk --no-cache add ca-certificates libssl3 git openssh-client 8 | COPY --from=busybox /bin /.tktw-bin 9 | COPY testworkflow-toolkit /toolkit 10 | COPY testworkflow-init /init 11 | RUN adduser --disabled-password --home / --no-create-home --uid 1001 default 12 | USER 1001 13 | ENTRYPOINT ["/toolkit"] 14 | -------------------------------------------------------------------------------- /cmd/choco-stub/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | ) 6 | 7 | func main() { 8 | hint := ` 9 | Dear users, 10 | Please note that we moved to a new Chocolatey registry that can be found at https://chocolatey.kubeshop.io/ 11 | 12 | Please add this URL to the list of Chocolatey sources and use it to install and upgrade Testkube package. 13 | Installation instruction can be found at: https://docs.testkube.io/articles/step1-installing-cli#macos 14 | ` 15 | fmt.Println(hint) 16 | } 17 | -------------------------------------------------------------------------------- /cmd/debug-server/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM golang:1.23 3 | WORKDIR /build 4 | COPY . . 5 | ENV CGO_ENABLED=0 6 | ENV GOOS=linux 7 | 8 | RUN go build -o /app main.go 9 | 10 | ARG ALPINE_IMAGE 11 | FROM ${ALPINE_IMAGE} 12 | RUN apk --no-cache add ca-certificates libssl1.1 13 | WORKDIR /root/ 14 | COPY --from=0 /app /bin/app 15 | EXPOSE 8080 16 | CMD ["/bin/app"] 17 | -------------------------------------------------------------------------------- /cmd/kubectl-testkube/commands/agent/debug.go: -------------------------------------------------------------------------------- 1 | package agent 2 | 3 | import ( 4 | "github.com/spf13/cobra" 5 | ) 6 | 7 | func NewDebugAgentCmd() *cobra.Command { 8 | cmd := &cobra.Command{ 9 | Use: "debug", 10 | Short: "Debug Agent info", 11 | Deprecated: "use `testkube debug agent` instead", 12 | } 13 | 14 | return cmd 15 | } 16 | -------------------------------------------------------------------------------- /cmd/kubectl-testkube/commands/agent/migrate.go: -------------------------------------------------------------------------------- 1 | package agent 2 | 3 | import ( 4 | "github.com/spf13/cobra" 5 | ) 6 | 7 | func NewMigrateAgentCmd() *cobra.Command { 8 | cmd := &cobra.Command{ 9 | Use: "agent", 10 | Short: "manual migrate agent command", 11 | Long: `migrate agent command will run agent migrations greater or equals current version`, 12 | Run: func(cmd *cobra.Command, args []string) { 13 | // TODO: Delete, as we don't have any migrations 14 | }, 15 | } 16 | 17 | return cmd 18 | } 19 | -------------------------------------------------------------------------------- /cmd/kubectl-testkube/commands/common/validator/directory.go: -------------------------------------------------------------------------------- 1 | package validator 2 | 3 | import ( 4 | "errors" 5 | 6 | "github.com/spf13/cobra" 7 | ) 8 | 9 | func ManifestsDirectory(cmd *cobra.Command, args []string) error { 10 | if len(args) < 1 { 11 | return errors.New("please pass directory with manifest files as argument") 12 | } 13 | return nil 14 | } 15 | -------------------------------------------------------------------------------- /cmd/kubectl-testkube/commands/common/validator/executionid.go: -------------------------------------------------------------------------------- 1 | package validator 2 | 3 | import ( 4 | "errors" 5 | 6 | "github.com/spf13/cobra" 7 | ) 8 | 9 | func ExecutionName(cmd *cobra.Command, args []string) error { 10 | if len(args) < 1 { 11 | return errors.New("please pass execution name as argument") 12 | } 13 | return nil 14 | } 15 | -------------------------------------------------------------------------------- /cmd/kubectl-testkube/commands/common/validator/executionidfilename.go: -------------------------------------------------------------------------------- 1 | package validator 2 | 3 | import ( 4 | "errors" 5 | 6 | "github.com/spf13/cobra" 7 | ) 8 | 9 | func ExecutionIDAndFileNames(cmd *cobra.Command, args []string) error { 10 | if len(args) < 3 { 11 | return errors.New("please pass 'Execution ID' ,'Filename' and 'Destination Directory' as arguments") 12 | } 13 | return nil 14 | } 15 | -------------------------------------------------------------------------------- /cmd/kubectl-testkube/commands/common/validator/testsuitename.go: -------------------------------------------------------------------------------- 1 | package validator 2 | 3 | import ( 4 | "errors" 5 | 6 | "github.com/spf13/cobra" 7 | ) 8 | 9 | func TestSuiteName(cmd *cobra.Command, args []string) error { 10 | // TODO validate test name as valid kubernetes resource name 11 | 12 | if len(args) < 1 { 13 | return errors.New("please pass valid test suite name") 14 | } 15 | return nil 16 | } 17 | -------------------------------------------------------------------------------- /cmd/kubectl-testkube/commands/common/version.go: -------------------------------------------------------------------------------- 1 | package common 2 | 3 | var ( 4 | Commit string 5 | Version string 6 | BuiltBy string 7 | Date string 8 | ) 9 | -------------------------------------------------------------------------------- /cmd/kubectl-testkube/commands/constants.go: -------------------------------------------------------------------------------- 1 | package commands 2 | 3 | import ( 4 | apiclient "github.com/kubeshop/testkube/pkg/api/v1/client" 5 | ) 6 | 7 | const ( 8 | ApiVersion string = "v1" 9 | DashboardURI string = "http://dashboard.testkube.io" 10 | CurrentApiVersion string = apiclient.Version 11 | DashboardLocalPort int = 8080 12 | ) 13 | -------------------------------------------------------------------------------- /cmd/kubectl-testkube/commands/renderer/labels.go: -------------------------------------------------------------------------------- 1 | package renderer 2 | 3 | import ( 4 | "github.com/kubeshop/testkube/pkg/api/v1/testkube" 5 | "github.com/kubeshop/testkube/pkg/ui" 6 | ) 7 | 8 | func RenderStringArray(title string, a []string) { 9 | if len(a) > 0 { 10 | ui.Warn(title+":", a...) 11 | } 12 | } 13 | 14 | func RenderStringMap(title string, m map[string]string) { 15 | if len(m) > 0 { 16 | ui.Warn(title+":", testkube.MapToString(m)) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /cmd/kubectl-testkube/config/config.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | // defaultDirectory is the default directory for the config file 4 | var defaultDirectory = "" 5 | 6 | func Load() (Data, error) { 7 | storage, err := GetStorage(defaultDirectory) 8 | if err != nil { 9 | return Data{}, err 10 | } 11 | return storage.Load() 12 | } 13 | 14 | func Save(data Data) error { 15 | storage, err := GetStorage(defaultDirectory) 16 | if err != nil { 17 | return err 18 | } 19 | return storage.Save(data) 20 | } 21 | -------------------------------------------------------------------------------- /cmd/tcl/README.md: -------------------------------------------------------------------------------- 1 | # Testkube - TCL Package 2 | 3 | This folder contains special code with the Testkube Community license. 4 | 5 | ## License 6 | 7 | The code in this folder is licensed under the Testkube Community License. Please see the [LICENSE](../../licenses/TCL.txt) file for more information. 8 | -------------------------------------------------------------------------------- /cmd/tcl/testworkflow-toolkit/spawn/constants.go: -------------------------------------------------------------------------------- 1 | // Copyright 2024 Testkube. 2 | // 3 | // Licensed as a Testkube Pro file under the Testkube Community 4 | // License (the "License"); you may not use this file except in compliance with 5 | // the License. You may obtain a copy of the License at 6 | // 7 | // https://github.com/kubeshop/testkube/blob/main/licenses/TCL.txt 8 | 9 | package spawn 10 | 11 | const ( 12 | DefaultParallelism = 1000 13 | ) 14 | -------------------------------------------------------------------------------- /cmd/testworkflow-init/constants/addr.go: -------------------------------------------------------------------------------- 1 | package constants 2 | 3 | const ( 4 | ControlServerPort = 60434 5 | ) 6 | -------------------------------------------------------------------------------- /cmd/testworkflow-init/constants/codes.go: -------------------------------------------------------------------------------- 1 | package constants 2 | 3 | const ( 4 | CodeAborted uint8 = 137 5 | CodeInputError uint8 = 155 6 | CodeInternal uint8 = 190 7 | ) 8 | -------------------------------------------------------------------------------- /cmd/testworkflow-init/constants/formats.go: -------------------------------------------------------------------------------- 1 | package constants 2 | 3 | const ( 4 | PreciseTimeFormat = "2006-01-02T15:04:05.000000000Z" 5 | ) 6 | -------------------------------------------------------------------------------- /cmd/testworkflow-init/constants/instructions.go: -------------------------------------------------------------------------------- 1 | package constants 2 | 3 | const ( 4 | InstructionStart = "start" 5 | InstructionEnd = "end" 6 | InstructionExecution = "execution" 7 | InstructionPause = "pause" 8 | InstructionResume = "resume" 9 | InstructionIteration = "iteration" 10 | ) 11 | 12 | type ExecutionResult struct { 13 | ExitCode uint8 `json:"code"` 14 | Details string `json:"details,omitempty"` 15 | Iteration int `json:"iteration,omitempty"` 16 | } 17 | -------------------------------------------------------------------------------- /cmd/testworkflow-init/constants/names.go: -------------------------------------------------------------------------------- 1 | package constants 2 | 3 | const ( 4 | InitStepName = "tktw-init" 5 | ) 6 | -------------------------------------------------------------------------------- /cmd/testworkflow-init/constants/paths.go: -------------------------------------------------------------------------------- 1 | package constants 2 | 3 | import "path/filepath" 4 | 5 | const ( 6 | InternalPath = "/.tktw" 7 | TerminationLogPath = "/dev/termination-log" 8 | ) 9 | 10 | var ( 11 | InternalBinPath = filepath.Join(InternalPath, "bin") 12 | InitPath = filepath.Join(InternalPath, "init") 13 | ToolkitPath = filepath.Join(InternalPath, "toolkit") 14 | StatePath = filepath.Join(InternalPath, "state") 15 | ) 16 | -------------------------------------------------------------------------------- /cmd/testworkflow-init/control/options.go: -------------------------------------------------------------------------------- 1 | package control 2 | 3 | import "time" 4 | 5 | type ServerOptions struct { 6 | HandlePause func(ts time.Time) error 7 | HandleResume func(ts time.Time) error 8 | } 9 | 10 | func (p ServerOptions) Pause(ts time.Time) error { 11 | return p.HandlePause(ts) 12 | } 13 | 14 | func (p ServerOptions) Resume(ts time.Time) error { 15 | return p.HandleResume(ts) 16 | } 17 | -------------------------------------------------------------------------------- /cmd/testworkflow-init/obfuscator/replacers.go: -------------------------------------------------------------------------------- 1 | package obfuscator 2 | 3 | func FullReplace(value string) func([]byte) []byte { 4 | replacement := []byte(value) 5 | return func(_ []byte) []byte { 6 | return replacement 7 | } 8 | } 9 | 10 | func ShowLastCharacters(prefix string, visibleChars int) func([]byte) []byte { 11 | replacement := []byte(prefix) 12 | return func(v []byte) []byte { 13 | if len(v) <= visibleChars { 14 | return v 15 | } 16 | return append(replacement, v[len(v)-visibleChars:]...) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /cmd/testworkflow-init/output/fail.go: -------------------------------------------------------------------------------- 1 | package output 2 | 3 | import "os" 4 | 5 | func ExitErrorf(exitCode uint8, message string, args ...interface{}) { 6 | // Print message 7 | Std.Printf(message+"\n", args...) 8 | 9 | // Exit 10 | os.Exit(int(exitCode)) 11 | } 12 | 13 | func UnsafeExitErrorf(exitCode uint8, message string, args ...interface{}) { 14 | // Print message 15 | Std.Direct().Printf(message+"\n", args...) 16 | 17 | // Exit 18 | os.Exit(int(exitCode)) 19 | } 20 | -------------------------------------------------------------------------------- /cmd/testworkflow-toolkit/artifacts/mimetype.go: -------------------------------------------------------------------------------- 1 | package artifacts 2 | 3 | import ( 4 | "path/filepath" 5 | 6 | "github.com/h2non/filetype" 7 | ) 8 | 9 | func DetectMimetype(filePath string) string { 10 | ext := filepath.Ext(filePath) 11 | 12 | // Remove the dot from the file extension 13 | if len(ext) > 0 && ext[0] == '.' { 14 | ext = ext[1:] 15 | } 16 | t := filetype.GetType(ext) 17 | if t == filetype.Unknown { 18 | return "" 19 | } 20 | return t.MIME.Value 21 | } 22 | -------------------------------------------------------------------------------- /cmd/testworkflow-toolkit/artifacts/processor.go: -------------------------------------------------------------------------------- 1 | package artifacts 2 | 3 | import "io/fs" 4 | 5 | type Processor interface { 6 | Start() error 7 | Add(uploader Uploader, path string, file fs.File, stat fs.FileInfo) error 8 | End() error 9 | } 10 | 11 | type PostProcessor interface { 12 | Start() error 13 | Add(path string) error 14 | End() error 15 | } 16 | -------------------------------------------------------------------------------- /cmd/testworkflow-toolkit/artifacts/uploader.go: -------------------------------------------------------------------------------- 1 | package artifacts 2 | 3 | import ( 4 | "io" 5 | ) 6 | 7 | type Uploader interface { 8 | Start() error 9 | Add(path string, file io.Reader, size int64) error 10 | End() error 11 | } 12 | -------------------------------------------------------------------------------- /cmd/testworkflow-toolkit/commands/testdata/test.log: -------------------------------------------------------------------------------- 1 | some log 2 | log line 2 3 | log line 3 4 | foo -------------------------------------------------------------------------------- /cmd/testworkflow-toolkit/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "errors" 5 | 6 | "github.com/kubeshop/testkube/cmd/testworkflow-toolkit/commands" 7 | "github.com/kubeshop/testkube/cmd/testworkflow-toolkit/env/config" 8 | "github.com/kubeshop/testkube/pkg/ui" 9 | ) 10 | 11 | func main() { 12 | // Set verbosity 13 | ui.SetVerbose(config.Debug()) 14 | 15 | // Validate provided data 16 | if config.Namespace() == "" || config.Ref() == "" { 17 | ui.Fail(errors.New("environment is misconfigured")) 18 | } 19 | 20 | commands.Execute() 21 | } 22 | -------------------------------------------------------------------------------- /cmd/testworkflow-toolkit/transfer/utils.go: -------------------------------------------------------------------------------- 1 | package transfer 2 | 3 | import ( 4 | "crypto/sha256" 5 | "encoding/json" 6 | "fmt" 7 | ) 8 | 9 | func SourceID(dirPath string, files []string) string { 10 | v, err := json.Marshal(map[string]interface{}{"p": dirPath, "v": files}) 11 | if err != nil { 12 | panic(fmt.Sprintf("error while serializing data for building checksum for transfer: %s", err.Error())) 13 | } 14 | return fmt.Sprintf("%x", sha256.Sum256(v)) 15 | } 16 | -------------------------------------------------------------------------------- /cmd/tools/commands/common.go: -------------------------------------------------------------------------------- 1 | package commands 2 | 3 | var kind string 4 | var dev bool 5 | -------------------------------------------------------------------------------- /cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /codecov.yaml: -------------------------------------------------------------------------------- 1 | ignore: 2 | - "cmd/**/*" 3 | - "**/*_mock.go" 4 | - "**/mock_*.go" 5 | 6 | coverage: 7 | status: 8 | project: false 9 | patch: false 10 | -------------------------------------------------------------------------------- /common.UiGetNamespace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/common.UiGetNamespace -------------------------------------------------------------------------------- /contrib/container/README.md: -------------------------------------------------------------------------------- 1 | Container executor CRDs 2 | -------------------------------------------------------------------------------- /contrib/container/kubent/executor.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: kubent 5 | namespace: testkube 6 | spec: 7 | types: 8 | - kubent 9 | executor_type: container 10 | image: ghcr.io/doitintl/kube-no-trouble:latest 11 | -------------------------------------------------------------------------------- /contrib/container/pytest/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.8.17-alpine3.18 2 | 3 | RUN set -ex \ 4 | && python3 -m pip install --upgrade --no-cache-dir pip \ 5 | && python3 -m pip install \ 6 | --no-cache-dir \ 7 | --upgrade pipenv \ 8 | --upgrade requests \ 9 | --upgrade pytest 10 | -------------------------------------------------------------------------------- /contrib/container/pytest/container-executor-pytest.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: container-executor-pytest 5 | namespace: testkube 6 | spec: 7 | image: pytest-executor:latest 8 | executor_type: container 9 | types: 10 | - container-executor-pytest/test 11 | -------------------------------------------------------------------------------- /contrib/container/pytest/failed_sample.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | def inc(x): 4 | return x + 1 5 | 6 | def test_answer(): 7 | assert inc(3) == 5 8 | -------------------------------------------------------------------------------- /contrib/container/pytest/passed_sample.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | import requests 3 | 4 | from requests.exceptions import ConnectionError 5 | 6 | def is_responsive(): 7 | try: 8 | response = requests.get("https://testkube.io") 9 | if response.status_code == 200: 10 | return True 11 | except ConnectionError: 12 | return False 13 | 14 | def test_status(): 15 | assert is_responsive() 16 | -------------------------------------------------------------------------------- /contrib/executor/artillery/.gitignore: -------------------------------------------------------------------------------- 1 | ### Go template 2 | # Binaries for programs and plugins 3 | *.exe 4 | *.exe~ 5 | *.dll 6 | *.so 7 | *.dylib 8 | 9 | # Test binary, built with `go test -c` 10 | *.test 11 | 12 | # Output of the go coverage tool, specifically when used with LiteIDE 13 | *.out 14 | 15 | # Dependency directories (remove the comment below to include it) 16 | vendor/ 17 | 18 | ### JetBrains 19 | .idea 20 | *.iml 21 | 22 | # Helm 23 | Chart.lock 24 | 25 | .DS_Store 26 | bin/ 27 | site 28 | dist/ 29 | .vscode 30 | -------------------------------------------------------------------------------- /contrib/executor/artillery/build/agent/Dockerfile: -------------------------------------------------------------------------------- 1 | #syntax=docker/dockerfile:1 2 | FROM node:21.4.0-bookworm-slim 3 | RUN apt-get update && apt-get install -y git && \ 4 | npm install -g artillery@2.0.3 && \ 5 | useradd -m -d /home/artillery -s /bin/bash -u 1001 -r -g root artillery 6 | 7 | 8 | COPY artillery /bin/runner 9 | 10 | USER 1001 11 | 12 | EXPOSE 8082 13 | WORKDIR /home/artillery 14 | 15 | ENTRYPOINT ["/bin/runner"] 16 | -------------------------------------------------------------------------------- /contrib/executor/artillery/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/artillery/examples/artillery-executor.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: artillery-executor 5 | namespace: testkube 6 | spec: 7 | image: kubeshop/testkube-executor-artilleryr:latest 8 | types: 9 | - artillery/test 10 | content_types: 11 | - git-file 12 | - git-dir 13 | - string 14 | - uri-file 15 | -------------------------------------------------------------------------------- /contrib/executor/artillery/examples/postcodes.csv: -------------------------------------------------------------------------------- 1 | 33162 2 | 33170 3 | 33190 -------------------------------------------------------------------------------- /contrib/executor/artillery/examples/simple.yaml: -------------------------------------------------------------------------------- 1 | config: 2 | target: "http://testkube-api-server:8088" 3 | phases: 4 | - duration: 6 5 | arrivalRate: 5 6 | name: Warm up 7 | - duration: 120 8 | arrivalRate: 5 9 | rampTo: 50 10 | name: Ramp up load 11 | - duration: 60 12 | arrivalRate: 50 13 | name: Sustained load 14 | scenarios: 15 | - name: "Check health endpoint" 16 | flow: 17 | - get: 18 | url: "/health" 19 | -------------------------------------------------------------------------------- /contrib/executor/artillery/examples/test.yaml: -------------------------------------------------------------------------------- 1 | config: 2 | target: "https://api.zippopotam.us" 3 | phases: 4 | - duration: 10 5 | arrivalRate: 5 6 | name: Warm up 7 | - duration: 20 8 | arrivalRate: 5 9 | rampTo: 50 10 | name: Ramp up load 11 | payload: 12 | path: "postcodes.csv" 13 | fields: 14 | - "postcode" 15 | 16 | scenarios: 17 | - name: "Get Zip Code Info" 18 | flow: 19 | - get: 20 | url: "/us/{{ postcode }}" -------------------------------------------------------------------------------- /contrib/executor/curl/.gitignore: -------------------------------------------------------------------------------- 1 | ### Go template 2 | # Binaries for programs and plugins 3 | *.exe 4 | *.exe~ 5 | *.dll 6 | *.so 7 | *.dylib 8 | 9 | # Test binary, built with `go test -c` 10 | *.test 11 | 12 | # Output of the go coverage tool, specifically when used with LiteIDE 13 | *.out 14 | 15 | # Dependency directories (remove the comment below to include it) 16 | vendor/ 17 | 18 | ### JetBrains 19 | .idea 20 | *.iml 21 | 22 | # Helm 23 | Chart.lock 24 | 25 | .DS_Store 26 | bin/ 27 | site 28 | dist/ 29 | -------------------------------------------------------------------------------- /contrib/executor/curl/build/agent/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | 3 | # This version of curl built with the following configure options 4 | # --enable-static --disable-ldap --enable-ipv6 --enable-unix-sockets --with-ssl --with-libssh2 --with-nghttp2=/usr \ 5 | # --prefix=/usr/local --with-gssapi 6 | 7 | FROM curlimages/curl 8 | COPY curl /bin/runner 9 | WORKDIR /root/ 10 | USER 1001 11 | ENTRYPOINT ["/bin/runner"] 12 | -------------------------------------------------------------------------------- /contrib/executor/curl/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/curl/examples/example_execution.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "blablablablabla", 3 | "name": "some-testing-exec", 4 | "content": { 5 | "type": "string", 6 | "data":"{ \"command\": [ \"curl\", \"https://reqbin.com/echo/get/json\", \"-H\", \"'Accept: application/json'\" ], \"expected_status\": \"200\", \"expected_body\": \"{\\\"success\\\":\\\"true\\\"}\" }" 7 | } 8 | } -------------------------------------------------------------------------------- /contrib/executor/curl/examples/example_with_templates.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "blablablablabla", 3 | "name": "some-testing-exec", 4 | "content": { 5 | "type": "string", 6 | "data": "{ \"command\": [ \"curl\", \"{{.url}}\", \"-H\", \"'{{.header}}'\" ], \"expected_status\": {{.status}}, \"expected_body\": \"{{.body}}\" }" 7 | } 8 | } -------------------------------------------------------------------------------- /contrib/executor/cypress/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/cypress/examples/cypress.config.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require('cypress') 2 | 3 | module.exports = defineConfig({ 4 | e2e: { 5 | // We've imported your old cypress plugins here. 6 | // You may want to clean this up later by importing these. 7 | setupNodeEvents(on, config) { 8 | return require('./cypress/plugins/index.js')(on, config) 9 | }, 10 | }, 11 | }) 12 | -------------------------------------------------------------------------------- /contrib/executor/cypress/examples/cypress/e2e/simple.cy.js: -------------------------------------------------------------------------------- 1 | describe("The Home Page", () => { 2 | it("successfully loads", () => { 3 | cy.visit("https://testkube-test-page-lipsum.pages.dev/"); 4 | 5 | cy.contains("Testkube"); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /contrib/executor/cypress/examples/cypress/fixtures/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Using fixtures to represent data", 3 | "email": "hello@cypress.io", 4 | "body": "Fixtures are a great way to mock data for responses to routes" 5 | } 6 | -------------------------------------------------------------------------------- /contrib/executor/cypress/examples/cypress/fixtures/profile.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": 8739, 3 | "name": "Jane", 4 | "email": "jane@example.com" 5 | } -------------------------------------------------------------------------------- /contrib/executor/cypress/examples/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cypress-example-test", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "simple-test.js", 6 | "scripts": { 7 | "test": "cypress run simple-test.js" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "cypress": "^10.4.0" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /contrib/executor/cypress/skeleton/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /contrib/executor/cypress/skeleton/README.md: -------------------------------------------------------------------------------- 1 | # Cypress test skeleton for one file tests 2 | -------------------------------------------------------------------------------- /contrib/executor/cypress/skeleton/cypress.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /contrib/executor/cypress/skeleton/cypress/integration/test.js: -------------------------------------------------------------------------------- 1 | describe("test", () => {}); 2 | -------------------------------------------------------------------------------- /contrib/executor/cypress/skeleton/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "cypress": "^8.7.0" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /contrib/executor/example/.gitignore: -------------------------------------------------------------------------------- 1 | ### Go template 2 | # Binaries for programs and plugins 3 | *.exe 4 | *.exe~ 5 | *.dll 6 | *.so 7 | *.dylib 8 | 9 | # Test binary, built with `go test -c` 10 | *.test 11 | 12 | # Output of the go coverage tool, specifically when used with LiteIDE 13 | *.out 14 | 15 | # Dependency directories (remove the comment below to include it) 16 | vendor/ 17 | 18 | ### JetBrains 19 | .idea 20 | *.iml 21 | 22 | # Helm 23 | Chart.lock 24 | 25 | .DS_Store 26 | bin/ 27 | site 28 | dist/ 29 | -------------------------------------------------------------------------------- /contrib/executor/example/build/agent/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | ARG ALPINE_IMAGE 3 | FROM ${ALPINE_IMAGE} 4 | COPY example /bin/runner 5 | 6 | RUN apk --no-cache add ca-certificates git curl 7 | WORKDIR /root/ 8 | ENTRYPOINT ["/bin/runner"] 9 | -------------------------------------------------------------------------------- /contrib/executor/example/build/kube/executor.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: example-executor 5 | namespace: testkube 6 | spec: 7 | executor_type: job 8 | image: kubeshop/testkube-example-executor:0.0.1 # pass your repository and tag 9 | types: 10 | - example/test 11 | volume_mount_path: /mnt/artifacts-storage 12 | volume_quantity: 10Gix 13 | -------------------------------------------------------------------------------- /contrib/executor/example/cmd/agent/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "os" 6 | 7 | "github.com/kubeshop/testkube/contrib/executor/example/pkg/runner" 8 | "github.com/kubeshop/testkube/pkg/executor/agent" 9 | ) 10 | 11 | func main() { 12 | agent.Run(context.Background(), runner.NewRunner(), os.Args) 13 | } 14 | -------------------------------------------------------------------------------- /contrib/executor/example/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/ginkgo/build/agent/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM golang:1.23-alpine as base 3 | 4 | RUN apk update; 5 | RUN go install -mod=mod github.com/onsi/ginkgo/v2/ginkgo 6 | RUN cp `which ginkgo` /bin/ginkgo 7 | RUN apk --no-cache add gcc musl-dev gcompat ca-certificates git curl 8 | 9 | COPY ginkgo /bin/runner 10 | WORKDIR /root/ 11 | 12 | RUN go version && ginkgo version 13 | 14 | ENTRYPOINT ["/bin/runner"] 15 | -------------------------------------------------------------------------------- /contrib/executor/ginkgo/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/ginkgo/examples/other/url_test.go: -------------------------------------------------------------------------------- 1 | package other 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | 7 | . "github.com/onsi/ginkgo/v2" 8 | . "github.com/onsi/gomega" 9 | ) 10 | 11 | var _ = Describe("Try URL for a 200", func() { 12 | It("should return 200", func() { 13 | resp, requestErr := http.Get(fmt.Sprintf("https://%s", baseURL)) 14 | Expect(requestErr).To(BeNil()) 15 | Expect(resp.StatusCode).To(Equal(200)) 16 | }) 17 | }) 18 | -------------------------------------------------------------------------------- /contrib/executor/ginkgo/examples/testkube-api/testkube_api_suite_test.go: -------------------------------------------------------------------------------- 1 | package testkube_api_test 2 | 3 | import ( 4 | "testing" 5 | 6 | . "github.com/onsi/ginkgo/v2" 7 | . "github.com/onsi/gomega" 8 | ) 9 | 10 | func TestTestkubeApi(t *testing.T) { 11 | RegisterFailHandler(Fail) 12 | RunSpecs(t, "TestkubeApi Suite") 13 | } 14 | -------------------------------------------------------------------------------- /contrib/executor/gradle/.gitignore: -------------------------------------------------------------------------------- 1 | ### Go template 2 | # Binaries for programs and plugins 3 | *.exe 4 | *.exe~ 5 | *.dll 6 | *.so 7 | *.dylib 8 | 9 | # Test binary, built with `go test -c` 10 | *.test 11 | 12 | # Output of the go coverage tool, specifically when used with LiteIDE 13 | *.out 14 | 15 | # Dependency directories (remove the comment below to include it) 16 | vendor/ 17 | 18 | ### JetBrains 19 | .idea 20 | *.iml 21 | 22 | # Helm 23 | Chart.lock 24 | 25 | .DS_Store 26 | bin/ 27 | site 28 | dist/ 29 | 30 | .dccache 31 | .vscode/ -------------------------------------------------------------------------------- /contrib/executor/gradle/build/agent/Dockerfile.jdk11: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM gradle:8.5.0-jdk11 3 | COPY gradle /bin/runner 4 | 5 | RUN chown -R 1001:1001 /home/gradle 6 | ENV GRADLE_USER_HOME /home/gradle 7 | 8 | USER 1001 9 | 10 | ENTRYPOINT ["/bin/runner"] 11 | -------------------------------------------------------------------------------- /contrib/executor/gradle/build/agent/Dockerfile.jdk17: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM gradle:8.5.0-jdk17 3 | COPY gradle /bin/runner 4 | 5 | RUN chown -R 1001:1001 /home/gradle 6 | ENV GRADLE_USER_HOME /home/gradle 7 | 8 | USER 1001 9 | 10 | ENTRYPOINT ["/bin/runner"] 11 | -------------------------------------------------------------------------------- /contrib/executor/gradle/build/agent/Dockerfile.jdk18: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM gradle:8.5.0-jdk18 3 | COPY gradle /bin/runner 4 | 5 | RUN chown -R 1001:1001 /home/gradle 6 | ENV GRADLE_USER_HOME /home/gradle 7 | 8 | USER 1001 9 | 10 | ENTRYPOINT ["/bin/runner"] 11 | -------------------------------------------------------------------------------- /contrib/executor/gradle/build/agent/Dockerfile.jdk21: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | # alpine is without critical security issues 3 | FROM kubeshop/testkube-gradle-executor:gradle8.5.0-jk21-base 4 | COPY gradle /bin/runner 5 | 6 | RUN chown -R 1001:1001 /home/gradle 7 | ENV GRADLE_USER_HOME /home/gradle 8 | 9 | USER 1001 10 | 11 | ENTRYPOINT ["/bin/runner"] 12 | -------------------------------------------------------------------------------- /contrib/executor/gradle/build/agent/Dockerfile.jdk8: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM gradle:8.5.0-jdk8 3 | COPY gradle /bin/runner 4 | 5 | RUN chown -R 1001:1001 /home/gradle 6 | ENV GRADLE_USER_HOME /home/gradle 7 | 8 | USER 1001 9 | 10 | ENTRYPOINT ["/bin/runner"] 11 | -------------------------------------------------------------------------------- /contrib/executor/gradle/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/gradle-executor.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: gradle-executor 5 | namespace: testkube 6 | spec: 7 | executor_type: job 8 | image: testkube/testkube-gradle-executor:latest 9 | types: 10 | - gradle/project 11 | - gradle/test 12 | - gradle/integrationTest 13 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradle-jdk18/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Gradle project-specific cache directory 2 | .gradle 3 | 4 | # Ignore Gradle build output directory 5 | build 6 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradle-jdk18/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'hello-gradle' -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradle-jdk18/src/test/java/hello/gradle/LibraryTest.java: -------------------------------------------------------------------------------- 1 | package hello.gradle; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import static org.junit.jupiter.api.Assertions.*; 5 | 6 | class LibraryTest { 7 | @Test void someLibraryMethodReturnsTrue() { 8 | String env = System.getenv("TESTKUBE_GRADLE"); 9 | assertTrue(Boolean.parseBoolean(env), "TESTKUBE_GRADLE env should be true"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradle/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Gradle project-specific cache directory 2 | .gradle 3 | 4 | # Ignore Gradle build output directory 5 | build 6 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradle/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java-library' 3 | } 4 | 5 | repositories { 6 | mavenCentral() 7 | } 8 | 9 | dependencies { 10 | testImplementation 'org.junit.jupiter:junit-jupiter:5.7.2' 11 | } 12 | 13 | tasks.named('test') { 14 | useJUnitPlatform() 15 | } 16 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradle/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'hello-gradle' -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradle/src/test/java/hello/gradle/LibraryTest.java: -------------------------------------------------------------------------------- 1 | package hello.gradle; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import static org.junit.jupiter.api.Assertions.*; 5 | 6 | class LibraryTest { 7 | @Test void someLibraryMethodReturnsTrue() { 8 | String env = System.getenv("TESTKUBE_GRADLE"); 9 | assertTrue(Boolean.parseBoolean(env), "TESTKUBE_GRADLE env should be true"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew-failing/.gitattributes: -------------------------------------------------------------------------------- 1 | # 2 | # https://help.github.com/articles/dealing-with-line-endings/ 3 | # 4 | # These are explicitly windows files and should use crlf 5 | *.bat text eol=crlf 6 | 7 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew-failing/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Gradle project-specific cache directory 2 | .gradle 3 | 4 | # Ignore Gradle build output directory 5 | build 6 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew-failing/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java-library' 3 | } 4 | 5 | repositories { 6 | mavenCentral() 7 | } 8 | 9 | dependencies { 10 | testImplementation 'org.junit.jupiter:junit-jupiter:5.7.2' 11 | } 12 | 13 | tasks.named('test') { 14 | useJUnitPlatform() 15 | } 16 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew-failing/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/contrib/executor/gradle/examples/hello-gradlew-failing/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew-failing/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew-failing/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'hello-gradlew' -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew-failing/src/main/java/hello/gradlew/Library.java: -------------------------------------------------------------------------------- 1 | /* 2 | * This Java source file was generated by the Gradle 'init' task. 3 | */ 4 | package hello.gradlew; 5 | 6 | public class Library { 7 | public boolean someLibraryMethod() { 8 | return false; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew-jdk18/.gitattributes: -------------------------------------------------------------------------------- 1 | # 2 | # https://help.github.com/articles/dealing-with-line-endings/ 3 | # 4 | # These are explicitly windows files and should use crlf 5 | *.bat text eol=crlf 6 | 7 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew-jdk18/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Gradle project-specific cache directory 2 | .gradle 3 | 4 | # Ignore Gradle build output directory 5 | build 6 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew-jdk18/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/contrib/executor/gradle/examples/hello-gradlew-jdk18/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew-jdk18/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew-jdk18/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'hello-gradlew' -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew-jdk18/src/main/java/hello/gradlew/Library.java: -------------------------------------------------------------------------------- 1 | /* 2 | * This Java source file was generated by the Gradle 'init' task. 3 | */ 4 | package hello.gradlew; 5 | 6 | public class Library { 7 | public boolean someLibraryMethod() { 8 | return true; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew/.gitattributes: -------------------------------------------------------------------------------- 1 | # 2 | # https://help.github.com/articles/dealing-with-line-endings/ 3 | # 4 | # These are explicitly windows files and should use crlf 5 | *.bat text eol=crlf 6 | 7 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore Gradle project-specific cache directory 2 | .gradle 3 | 4 | # Ignore Gradle build output directory 5 | build 6 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'java-library' 3 | } 4 | 5 | repositories { 6 | mavenCentral() 7 | } 8 | 9 | dependencies { 10 | testImplementation 'org.junit.jupiter:junit-jupiter:5.7.2' 11 | } 12 | 13 | tasks.named('test') { 14 | useJUnitPlatform() 15 | } 16 | 17 | test { 18 | reports { 19 | html.required = false 20 | junitXml{ 21 | required = true 22 | outputPerTestCase = false 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/contrib/executor/gradle/examples/hello-gradlew/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'hello-gradlew' -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew/src/main/java/hello/gradlew/Library.java: -------------------------------------------------------------------------------- 1 | /* 2 | * This Java source file was generated by the Gradle 'init' task. 3 | */ 4 | package hello.gradlew; 5 | 6 | public class Library { 7 | public boolean someLibraryMethod() { 8 | return true; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew/src/main/java/other/Library.java: -------------------------------------------------------------------------------- 1 | /* 2 | * This Java source file was generated by the Gradle 'init' task. 3 | */ 4 | package other; 5 | 6 | public class Library { 7 | public boolean someLibraryMethod() { 8 | return true; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew/src/test/java/hello/gradlew/LibraryTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * This Java source file was generated by the Gradle 'init' task. 3 | */ 4 | package hello.gradlew; 5 | 6 | import org.junit.jupiter.api.Test; 7 | import static org.junit.jupiter.api.Assertions.*; 8 | 9 | class LibraryTest { 10 | @Test void someLibraryMethodReturnsTrue() { 11 | Library classUnderTest = new Library(); 12 | assertTrue(classUnderTest.someLibraryMethod(), "someLibraryMethod should return 'true'"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /contrib/executor/gradle/examples/hello-gradlew/src/test/java/other/LibraryTest.java: -------------------------------------------------------------------------------- 1 | /* 2 | * This Java source file was generated by the Gradle 'init' task. 3 | */ 4 | package other; 5 | 6 | import org.junit.jupiter.api.Test; 7 | import static org.junit.jupiter.api.Assertions.*; 8 | 9 | class LibraryTest { 10 | @Test void someLibraryMethodReturnsTrue() { 11 | Library classUnderTest = new Library(); 12 | assertTrue(classUnderTest.someLibraryMethod(), "someLibraryMethod should return 'true'"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /contrib/executor/init/build/agent/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM ubuntu 3 | COPY init /bin/runner 4 | RUN apt-get update 5 | RUN apt-get install ca-certificates git curl -y 6 | WORKDIR /root/ 7 | RUN git config --global user.name "testkube" 8 | RUN chmod a=rw /root/.gitconfig 9 | ENTRYPOINT ["/bin/runner"] 10 | -------------------------------------------------------------------------------- /contrib/executor/init/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/init/pkg/runner/testdir/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/contrib/executor/init/pkg/runner/testdir/.gitkeep -------------------------------------------------------------------------------- /contrib/executor/init/pkg/runner/testdir/command.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | command.sh "$@" 4 | -------------------------------------------------------------------------------- /contrib/executor/init/pkg/runner/testdir/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | "testdir/prerun.sh" 3 | prerun_exit_code=$? 4 | if [ $prerun_exit_code -ne 0 ]; then 5 | exit $prerun_exit_code 6 | fi 7 | "testdir/command.sh" $@ 8 | command_exit_code=$? 9 | "testdir/postrun.sh" 10 | postrun_exit_code=$? 11 | if [ $command_exit_code -ne 0 ]; then 12 | exit $command_exit_code 13 | fi 14 | exit $postrun_exit_code 15 | -------------------------------------------------------------------------------- /contrib/executor/init/pkg/runner/testdir/postrun.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | echo "===== pre-run script" -------------------------------------------------------------------------------- /contrib/executor/init/pkg/runner/testdir/prerun.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | echo "===== pre-run script" -------------------------------------------------------------------------------- /contrib/executor/jmeter/.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | .gitignore 3 | .golangci.yml 4 | CODE_OF_CONDUCT.md 5 | CONTRIBUTING.md 6 | LICENSE 7 | Makefile 8 | README.md 9 | temp 10 | data -------------------------------------------------------------------------------- /contrib/executor/jmeter/.env.sample: -------------------------------------------------------------------------------- 1 | # used if storage backend is behind HTTPS, should be set to false for local development 2 | RUNNER_SSL=false 3 | # used to enable/disable scrapper, should be set to false for local development 4 | RUNNER_SCRAPPERENABLED=false 5 | # path to the data/ directory where JMeter will run and store results 6 | RUNNER_DATADIR=./data 7 | -------------------------------------------------------------------------------- /contrib/executor/jmeter/build/agent/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM kubeshop/testkube-jmeter-executor:jmeter5.6.2-jdk21-base 3 | COPY jmeter /bin/runner 4 | 5 | ENV ENTRYPOINT_CMD="/executor_entrypoint.sh" 6 | WORKDIR /root/ 7 | 8 | COPY ./contrib/executor/jmeter/scripts/entrypoint.sh /executor_entrypoint.sh 9 | ADD ./contrib/executor/jmeter/plugins/ ${JMETER_CUSTOM_PLUGINS_FOLDER} 10 | ADD ./contrib/executor/jmeter/lib ${JMETER_HOME}/lib/ 11 | 12 | ENTRYPOINT ["/bin/runner"] 13 | -------------------------------------------------------------------------------- /contrib/executor/jmeter/build/agent/local.Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | 3 | FROM justb4/jmeter:5.5 4 | 5 | RUN apk --no-cache add ca-certificates git 6 | 7 | WORKDIR /root/ 8 | 9 | ENV ENTRYPOINT_CMD="/executor_entrypoint.sh" 10 | 11 | COPY dist/runner /bin/runner 12 | COPY scripts/entrypoint.sh /executor_entrypoint.sh 13 | ADD plugins/ ${JMETER_CUSTOM_PLUGINS_FOLDER} 14 | ADD lib/ ${JMETER_HOME}/lib/ 15 | 16 | ENTRYPOINT ["/bin/runner"] 17 | -------------------------------------------------------------------------------- /contrib/executor/jmeter/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/jmeter/examples/executor.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: jmeter-executor 5 | namespace: testkube 6 | spec: 7 | features: 8 | - artifacts 9 | image: kubeshop/testkube-jmeter-executor:dev-008 10 | types: 11 | - jmeter/test 12 | -------------------------------------------------------------------------------- /contrib/executor/jmeter/examples/results.jtl: -------------------------------------------------------------------------------- 1 | timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,IdleTime,Connect 2 | 1667463814102,382,HTTP Request,200,OK,Thread Group 1-1,text,true,,66428,109,1,1,https://testkube.io,326,0,235 3 | 1667463836936,365,HTTP Request,200,OK,Thread Group 1-1,text,true,,66428,109,1,1,https://testkube.io,309,0,222 4 | 1667463838447,362,HTTP Request,200,OK,Thread Group 1-1,text,true,,66428,109,1,1,https://testkube.io,309,0,219 5 | -------------------------------------------------------------------------------- /contrib/executor/jmeter/lib/jmeter-plugins-cmn-jmeter-0.6.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/contrib/executor/jmeter/lib/jmeter-plugins-cmn-jmeter-0.6.jar -------------------------------------------------------------------------------- /contrib/executor/jmeter/plugins/jmeter-plugins-functions-2.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/contrib/executor/jmeter/plugins/jmeter-plugins-functions-2.1.jar -------------------------------------------------------------------------------- /contrib/executor/jmeter/plugins/jmeter-plugins-manager-1.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/contrib/executor/jmeter/plugins/jmeter-plugins-manager-1.3.jar -------------------------------------------------------------------------------- /contrib/executor/jmeterd/.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | .gitignore 3 | .golangci.yml 4 | CODE_OF_CONDUCT.md 5 | CONTRIBUTING.md 6 | LICENSE 7 | Makefile 8 | README.md 9 | temp 10 | data -------------------------------------------------------------------------------- /contrib/executor/jmeterd/.env.sample: -------------------------------------------------------------------------------- 1 | # used if storage backend is behind HTTPS, should be set to false for local development 2 | RUNNER_SSL=false 3 | # used to enable/disable scrapper, should be set to false for local development 4 | RUNNER_SCRAPPERENABLED=false 5 | # path to the data/ directory where JMeter will run and store results 6 | RUNNER_DATADIR=./data 7 | -------------------------------------------------------------------------------- /contrib/executor/jmeterd/build/agent/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM kubeshop/jmeter:5.5 3 | COPY jmeterd /bin/runner 4 | 5 | RUN microdnf update -y && microdnf install -y ca-certificates git sshpass && microdnf clean all 6 | ENV ENTRYPOINT_CMD="/executor_entrypoint.sh" 7 | WORKDIR /root/ 8 | COPY ./contrib/executor/jmeterd/scripts/entrypoint.sh /executor_entrypoint.sh 9 | COPY ./contrib/executor/jmeterd/scripts/jmeter-master.sh /executor_entrypoint_master.sh 10 | 11 | ENTRYPOINT ["/bin/runner"] 12 | -------------------------------------------------------------------------------- /contrib/executor/jmeterd/build/agent/local.Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | 3 | FROM kubeshop/jmeter:5.5 4 | 5 | RUN microdnf update -y && microdnf install -y ca-certificates git && microdnf clean all 6 | 7 | WORKDIR /root/ 8 | 9 | ENV ENTRYPOINT_CMD="/executor_entrypoint.sh" 10 | 11 | COPY dist/runner /bin/runner 12 | COPY scripts/entrypoint.sh /executor_entrypoint.sh 13 | COPY scripts/jmeter-master.sh /executor_entrypoint_master.sh 14 | 15 | ENTRYPOINT ["/bin/runner"] 16 | 17 | -------------------------------------------------------------------------------- /contrib/executor/jmeterd/build/slaves/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM kubeshop/jmeter:5.5 2 | 3 | # support logs permissions 4 | RUN mkdir -p /logs 5 | RUN chmod 777 /logs 6 | 7 | EXPOSE 1099 60001 8 | ENV SSL_DISABLED true 9 | 10 | COPY ./contrib/executor/jmeterd/scripts/jmeter-slaves.sh /jmeter_slaves_entrypoint.sh 11 | RUN chmod +x /jmeter_slaves_entrypoint.sh 12 | ENTRYPOINT /jmeter_slaves_entrypoint.sh -------------------------------------------------------------------------------- /contrib/executor/jmeterd/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/jmeterd/examples/executor.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: jmeterd-executor 5 | namespace: testkube 6 | spec: 7 | features: 8 | - artifacts 9 | image: kubeshop/testkube-jmeterd-executor:dev-008 10 | types: 11 | - jmeterd/test 12 | -------------------------------------------------------------------------------- /contrib/executor/jmeterd/examples/gitflow/csvdata/Credentials.csv: -------------------------------------------------------------------------------- 1 | USER_01,PASSWORD_01 USER_02,PASSWORD_02 USER_03,PASSWORD_03 USER_04,PASSWORD_04 USER_05,PASSWORD_05 -------------------------------------------------------------------------------- /contrib/executor/jmeterd/examples/gitflow/plugins/JMeterPlugins-Extras.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/contrib/executor/jmeterd/examples/gitflow/plugins/JMeterPlugins-Extras.jar -------------------------------------------------------------------------------- /contrib/executor/jmeterd/examples/gitflow/plugins/jmeter-parallel-0.11.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/contrib/executor/jmeterd/examples/gitflow/plugins/jmeter-parallel-0.11.jar -------------------------------------------------------------------------------- /contrib/executor/jmeterd/examples/gitflow/plugins/jmeter-plugins-dummy-0.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/contrib/executor/jmeterd/examples/gitflow/plugins/jmeter-plugins-dummy-0.4.jar -------------------------------------------------------------------------------- /contrib/executor/jmeterd/examples/gitflow/plugins/jmeter-plugins-functions-2.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/contrib/executor/jmeterd/examples/gitflow/plugins/jmeter-plugins-functions-2.2.jar -------------------------------------------------------------------------------- /contrib/executor/jmeterd/examples/gitflow/plugins/jmeter-plugins-manager-1.9.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/contrib/executor/jmeterd/examples/gitflow/plugins/jmeter-plugins-manager-1.9.jar -------------------------------------------------------------------------------- /contrib/executor/jmeterd/examples/results.jtl: -------------------------------------------------------------------------------- 1 | timeStamp,elapsed,label,responseCode,responseMessage,threadName,dataType,success,failureMessage,bytes,sentBytes,grpThreads,allThreads,URL,Latency,IdleTime,Connect 2 | 1667463814102,382,HTTP Request,200,OK,Thread Group 1-1,text,true,,66428,109,1,1,https://testkube.io,326,0,235 3 | 1667463836936,365,HTTP Request,200,OK,Thread Group 1-1,text,true,,66428,109,1,1,https://testkube.io,309,0,222 4 | 1667463838447,362,HTTP Request,200,OK,Thread Group 1-1,text,true,,66428,109,1,1,https://testkube.io,309,0,219 5 | -------------------------------------------------------------------------------- /contrib/executor/jmeterd/pkg/slaves/interface.go: -------------------------------------------------------------------------------- 1 | package slaves 2 | 3 | import "context" 4 | 5 | type Interface interface { 6 | CreateSlaves(ctx context.Context, count int) (SlaveMeta, error) 7 | DeleteSlaves(ctx context.Context, meta SlaveMeta) error 8 | } 9 | -------------------------------------------------------------------------------- /contrib/executor/jmeterd/scripts/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ -f "/executor_entrypoint_master.sh" ]; 4 | then 5 | echo "Executing custom entrypoint script at /entrypoint.sh" 6 | /executor_entrypoint_master.sh $@ 7 | else 8 | echo "Executing JMeter command directly: jmeter $@" 9 | jmeter $@ 10 | fi 11 | 12 | -------------------------------------------------------------------------------- /contrib/executor/k6/SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | Currently the following versions are being supported with security updates. 6 | 7 | | Version | Supported | 8 | | ------- | ------------------ | 9 | | 0.0.4 | :white_check_mark: | 10 | 11 | ## Reporting a Vulnerability 12 | 13 | Please report any vulnerability by raising a [GitHub issue](https://github.com/kubeshop/testkube-executor-k6/issues). 14 | -------------------------------------------------------------------------------- /contrib/executor/k6/build/agent/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:1.23 as builder 2 | # # build k6 0.36.0 with prometheus support 3 | ENV K6_VERSION=v0.48.0 4 | RUN go install go.k6.io/xk6/cmd/xk6@v0.10.0 && xk6 build $K6_VERSION --with github.com/grafana/xk6-output-prometheus-remote@latest 5 | 6 | # syntax=docker/dockerfile:1 7 | FROM grafana/k6:0.48.0 8 | COPY k6 /bin/runner 9 | WORKDIR /home/k6 10 | COPY --from=builder /go/k6 /usr/bin/k6 11 | ENTRYPOINT ["/bin/runner"] 12 | -------------------------------------------------------------------------------- /contrib/executor/k6/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/k6/examples/k6-executor.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: k6-executor 5 | namespace: testkube 6 | spec: 7 | executor_type: job 8 | # not best practice but for now we use latest 9 | image: kubeshop/testkube-k6-executor:latest 10 | # image: lreimer/testkube-k6-executor:latest 11 | types: 12 | - k6/script 13 | - k6/run 14 | - k6/cloud 15 | -------------------------------------------------------------------------------- /contrib/executor/k6/examples/k6-test-environment.js: -------------------------------------------------------------------------------- 1 | import http from 'k6/http'; 2 | import { sleep } from 'k6'; 3 | 4 | export default function () { 5 | http.get(`https://${__ENV.TARGET_HOSTNAME}/testkube/`); 6 | sleep(1); 7 | } 8 | -------------------------------------------------------------------------------- /contrib/executor/k6/examples/k6-test-failing-script.js: -------------------------------------------------------------------------------- 1 | import http from 'k6/http'; 2 | import { check } from 'k6'; 3 | 4 | export let options = { 5 | thresholds: { 6 | checks: ['rate>0.5'], 7 | }, 8 | }; 9 | 10 | export default function () { 11 | const baseURI = `${__ENV.API_URI || 'http://google.pl'}`; 12 | 13 | check(http.get(`${baseURI}/joke`), { 14 | 'joke should be about Chuck': r => r.body.includes("Chuck") // this should fail 15 | }); 16 | } 17 | -------------------------------------------------------------------------------- /contrib/executor/k6/examples/k6-test-script.js: -------------------------------------------------------------------------------- 1 | import http from 'k6/http'; 2 | import { sleep } from 'k6'; 3 | 4 | export default function () { 5 | http.get('https://docs.testkube.io'); 6 | sleep(1); 7 | } 8 | -------------------------------------------------------------------------------- /contrib/executor/kubepug/.gitignore: -------------------------------------------------------------------------------- 1 | ### Go template 2 | # Binaries for programs and plugins 3 | *.exe 4 | *.exe~ 5 | *.dll 6 | *.so 7 | *.dylib 8 | 9 | # Test binary, built with `go test -c` 10 | *.test 11 | 12 | # Output of the go coverage tool, specifically when used with LiteIDE 13 | *.out 14 | 15 | # Dependency directories (remove the comment below to include it) 16 | vendor/ 17 | 18 | ### JetBrains 19 | .idea 20 | *.iml 21 | 22 | # Helm 23 | Chart.lock 24 | 25 | .DS_Store 26 | bin/ 27 | site 28 | dist/ 29 | 30 | .vscode -------------------------------------------------------------------------------- /contrib/executor/kubepug/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/kubepug/pkg/runner/result.go: -------------------------------------------------------------------------------- 1 | package runner 2 | 3 | import ( 4 | "encoding/json" 5 | 6 | kubepug "github.com/kubepug/kubepug/pkg/results" 7 | "github.com/pkg/errors" 8 | ) 9 | 10 | // GetResult parses the output of a kubepug execution into a Result 11 | func GetResult(r string) (kubepug.Result, error) { 12 | var result kubepug.Result 13 | err := json.Unmarshal([]byte(r), &result) 14 | if err != nil { 15 | return result, errors.Errorf("could not unmarshal result %s: %v", r, err) 16 | } 17 | return result, nil 18 | } 19 | -------------------------------------------------------------------------------- /contrib/executor/maven/build/agent/Dockerfile.jdk11: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM maven:3.8.6-jdk-11 3 | COPY maven /bin/runner 4 | 5 | RUN useradd -m -d /home/maven -s /bin/bash -u 1001 -r -g root maven 6 | ENV MAVEN_CONFIG "/home/maven/.m2" 7 | USER 1001 8 | 9 | # do no overwrite the entrypoint 10 | CMD ["/bin/runner"] 11 | -------------------------------------------------------------------------------- /contrib/executor/maven/build/agent/Dockerfile.jdk17: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM maven:3.8.5-openjdk-17 3 | COPY maven /bin/runner 4 | 5 | RUN useradd -m -d /home/maven -s /bin/bash -u 1001 -r -g root maven 6 | ENV MAVEN_CONFIG "/home/maven/.m2" 7 | USER 1001 8 | 9 | # do no overwrite the entrypoint 10 | CMD ["/bin/runner"] 11 | -------------------------------------------------------------------------------- /contrib/executor/maven/build/agent/Dockerfile.jdk18: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM maven:3.8.7-openjdk-18-slim 3 | COPY maven /bin/runner 4 | 5 | RUN useradd -m -d /home/maven -s /bin/bash -u 1001 -r -g root maven 6 | ENV MAVEN_CONFIG "/home/maven/.m2" 7 | USER 1001 8 | 9 | # do no overwrite the entrypoint 10 | CMD ["/bin/runner"] 11 | -------------------------------------------------------------------------------- /contrib/executor/maven/build/agent/Dockerfile.jdk8: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM maven:3.8.6-openjdk-8 3 | COPY maven /bin/runner 4 | 5 | RUN useradd -m -d /home/maven -s /bin/bash -u 1001 -r -g root maven 6 | ENV MAVEN_CONFIG "/home/maven/.m2" 7 | USER 1001 8 | 9 | # do no overwrite the entrypoint 10 | CMD ["/bin/runner"] 11 | -------------------------------------------------------------------------------- /contrib/executor/maven/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/maven/examples/hello-maven-jdk18/src/test/java/hello/maven/LibraryTest.java: -------------------------------------------------------------------------------- 1 | package hello.maven; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import static org.junit.jupiter.api.Assertions.*; 5 | 6 | class LibraryTest { 7 | @Test void runMavenTests() { 8 | String env = System.getenv("TESTKUBE_MAVEN"); 9 | assertTrue(Boolean.parseBoolean(env), "TESTKUBE_MAVEN env should be true"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /contrib/executor/maven/examples/hello-maven-jdk8/src/test/java/hello/maven/LibraryTest.java: -------------------------------------------------------------------------------- 1 | package hello.maven; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import static org.junit.jupiter.api.Assertions.*; 5 | 6 | class LibraryTest { 7 | @Test void runMavenTests() { 8 | String env = System.getenv("TESTKUBE_MAVEN"); 9 | assertTrue(Boolean.parseBoolean(env), "TESTKUBE_MAVEN env should be true"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /contrib/executor/maven/examples/hello-maven-settings/src/test/java/hello/maven/LibraryTest.java: -------------------------------------------------------------------------------- 1 | package hello.maven; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import static org.junit.jupiter.api.Assertions.*; 5 | 6 | class LibraryTest { 7 | @Test void runMavenTests() { 8 | String env = System.getenv("TESTKUBE_MAVEN"); 9 | assertTrue(Boolean.parseBoolean(env), "TESTKUBE_MAVEN env should be true"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /contrib/executor/maven/examples/hello-maven/src/test/java/hello/maven/LibraryTest.java: -------------------------------------------------------------------------------- 1 | package hello.maven; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import static org.junit.jupiter.api.Assertions.*; 5 | 6 | class LibraryTest { 7 | @Test void runMavenTests() { 8 | String env = System.getenv("TESTKUBE_MAVEN"); 9 | assertTrue(Boolean.parseBoolean(env), "TESTKUBE_MAVEN env should be true"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /contrib/executor/maven/examples/hello-mvnw/.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/contrib/executor/maven/examples/hello-mvnw/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /contrib/executor/maven/examples/hello-mvnw/src/test/java/hello/maven/LibraryTest.java: -------------------------------------------------------------------------------- 1 | package hello.maven; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import static org.junit.jupiter.api.Assertions.*; 5 | 6 | class LibraryTest { 7 | @Test void runMavenWrapperTests() { 8 | String env = System.getenv("TESTKUBE_MAVEN_WRAPPER"); 9 | assertTrue(Boolean.parseBoolean(env), "TESTKUBE_MAVEN_WRAPPER env should be true"); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /contrib/executor/maven/examples/maven-executor.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: maven-executor 5 | namespace: testkube 6 | spec: 7 | executor_type: job 8 | image: testkube/testkube-maven-executor:latest 9 | types: 10 | - maven/project 11 | - maven/test 12 | - maven/integration-test 13 | -------------------------------------------------------------------------------- /contrib/executor/playwright/.gitignore: -------------------------------------------------------------------------------- 1 | ### Go template 2 | # Binaries for programs and plugins 3 | *.exe 4 | *.exe~ 5 | *.dll 6 | *.so 7 | *.dylib 8 | 9 | # Test binary, built with `go test -c` 10 | *.test 11 | 12 | # Output of the go coverage tool, specifically when used with LiteIDE 13 | *.out 14 | 15 | # Dependency directories (remove the comment below to include it) 16 | vendor/ 17 | 18 | ### JetBrains 19 | .idea 20 | *.iml 21 | 22 | # Helm 23 | Chart.lock 24 | 25 | .DS_Store 26 | bin/ 27 | site 28 | dist/ 29 | 30 | .vscode -------------------------------------------------------------------------------- /contrib/executor/playwright/build/agent/Dockerfile.npm: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM mcr.microsoft.com/playwright:v1.40.0-jammy 3 | 4 | RUN apt-get update && apt-get install -y zip 5 | 6 | COPY playwright /bin/runner 7 | 8 | RUN mkdir /home/runner 9 | WORKDIR /home/runner/ 10 | 11 | ENV PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=true 12 | ENV DEPENDENCY_MANAGER=npm 13 | ENV CI=1 14 | ENV PWTEST_SKIP_TEST_OUTPUT=1 15 | 16 | ENTRYPOINT ["/bin/runner"] 17 | -------------------------------------------------------------------------------- /contrib/executor/playwright/build/agent/Dockerfile.pnpm: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | 3 | FROM mcr.microsoft.com/playwright:v1.40.0-jammy 4 | RUN apt-get update && apt-get install -y zip 5 | RUN npm install -g pnpm 6 | 7 | COPY playwright /bin/runner 8 | 9 | RUN mkdir /home/runner 10 | WORKDIR /home/runner/ 11 | 12 | ENV PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=true 13 | ENV DEPENDENCY_MANAGER=pnpm 14 | ENV CI=1 15 | ENV PWTEST_SKIP_TEST_OUTPUT=1 16 | 17 | ENTRYPOINT ["/bin/runner"] -------------------------------------------------------------------------------- /contrib/executor/playwright/build/agent/Dockerfile.yarn: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM mcr.microsoft.com/playwright:v1.40.0-jammy 3 | 4 | RUN apt-get update && apt-get install -y zip 5 | 6 | COPY playwright /bin/runner 7 | 8 | RUN mkdir /home/runner 9 | WORKDIR /home/runner/ 10 | 11 | ENV PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=true 12 | ENV DEPENDENCY_MANAGER=yarn 13 | ENV CI=1 14 | ENV PWTEST_SKIP_TEST_OUTPUT=1 15 | 16 | ENTRYPOINT ["/bin/runner"] -------------------------------------------------------------------------------- /contrib/executor/playwright/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/playwright/examples/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "playwright-example-test", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": {}, 7 | "author": "", 8 | "license": "ISC", 9 | "devDependencies": { 10 | "@playwright/test": "latest" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /contrib/executor/postman/.gitignore: -------------------------------------------------------------------------------- 1 | ### Go template 2 | # Binaries for programs and plugins 3 | *.exe 4 | *.exe~ 5 | *.dll 6 | *.so 7 | *.dylib 8 | 9 | # Test binary, built with `go test -c` 10 | *.test 11 | 12 | # Output of the go coverage tool, specifically when used with LiteIDE 13 | *.out 14 | 15 | # Dependency directories (remove the comment below to include it) 16 | vendor/ 17 | 18 | ### JetBrains 19 | .idea 20 | *.iml 21 | 22 | # Helm 23 | Chart.lock 24 | 25 | .DS_Store 26 | bin/ 27 | site 28 | dist/ 29 | -------------------------------------------------------------------------------- /contrib/executor/postman/build/agent/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM postman/newman:6.0.0-alpine 3 | 4 | COPY postman /bin/runner 5 | RUN npm install -g newman 6 | RUN apk --no-cache add ca-certificates git curl 7 | 8 | # support npm report permissions 9 | RUN mkdir -p /.npm 10 | RUN chmod 777 /.npm 11 | RUN chmod 777 /root/ 12 | RUN chmod 777 /usr/local/lib/node_modules 13 | RUN chmod 777 /usr/local/bin 14 | 15 | WORKDIR /root/ 16 | EXPOSE 8082 17 | 18 | USER 1001 19 | 20 | ENTRYPOINT ["/bin/runner"] 21 | -------------------------------------------------------------------------------- /contrib/executor/postman/build/agent/Dockerfile.node21: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM node:21-alpine3.19 3 | 4 | COPY postman /bin/runner 5 | RUN npm install -g newman 6 | RUN apk --no-cache add ca-certificates git curl 7 | 8 | # support npm report permissions 9 | RUN mkdir -p /.npm 10 | RUN chmod 777 /.npm 11 | RUN chmod 777 /root/ 12 | RUN chmod 777 /usr/local/lib/node_modules 13 | RUN chmod 777 /usr/local/bin 14 | 15 | WORKDIR /root/ 16 | EXPOSE 8082 17 | 18 | USER 1001 19 | 20 | ENTRYPOINT ["/bin/runner"] -------------------------------------------------------------------------------- /contrib/executor/postman/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/postman/pkg/runner/newman/executionresult.go: -------------------------------------------------------------------------------- 1 | package newman 2 | 3 | type NewmanExecutionResult struct { 4 | Output string 5 | Metadata ExecutionJSONResult 6 | } 7 | -------------------------------------------------------------------------------- /contrib/executor/scraper/.gitignore: -------------------------------------------------------------------------------- 1 | ### Go template 2 | # Binaries for programs and plugins 3 | *.exe 4 | *.exe~ 5 | *.dll 6 | *.so 7 | *.dylib 8 | 9 | # Test binary, built with `go test -c` 10 | *.test 11 | 12 | # Output of the go coverage tool, specifically when used with LiteIDE 13 | *.out 14 | 15 | # Dependency directories (remove the comment below to include it) 16 | vendor/ 17 | 18 | ### JetBrains 19 | .idea 20 | *.iml 21 | 22 | # Helm 23 | Chart.lock 24 | 25 | .DS_Store 26 | bin/ 27 | site 28 | dist/ 29 | 30 | .vscode -------------------------------------------------------------------------------- /contrib/executor/scraper/build/agent/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | ARG ALPINE_IMAGE 3 | FROM ${ALPINE_IMAGE} 4 | COPY scraper /bin/runner 5 | RUN apk --no-cache add ca-certificates git curl 6 | WORKDIR /root/ 7 | ENTRYPOINT ["/bin/runner"] 8 | -------------------------------------------------------------------------------- /contrib/executor/scraper/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/soapui/build/agent/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM smartbear/soapuios-testrunner:5.7.2 3 | RUN apt-get update && apt-get install -y git \ 4 | curl && \ 5 | chmod 777 /usr/local/SmartBear && \ 6 | useradd -m -d /home/soapui -s /bin/bash -u 1001 -r -g root soapui 7 | 8 | COPY soapui /bin/runner 9 | USER 1001 10 | 11 | ENTRYPOINT ["/bin/runner"] 12 | -------------------------------------------------------------------------------- /contrib/executor/soapui/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/soapui/executor.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: soapui-executor 5 | namespace: testkube 6 | spec: 7 | executor_type: job 8 | image: kubeshop/testkube-executor-soapui:latest 9 | types: 10 | - soapui/xml 11 | content_types: 12 | - string 13 | - file-uri 14 | features: 15 | - artifacts 16 | -------------------------------------------------------------------------------- /contrib/executor/soapui/pkg/mock/doc.go: -------------------------------------------------------------------------------- 1 | // Package mock contains all the mocks used in testing 2 | package mock 3 | -------------------------------------------------------------------------------- /contrib/executor/soapui/pkg/mock/scraper.go: -------------------------------------------------------------------------------- 1 | package mock 2 | 3 | import "log" 4 | 5 | // Scraper implements a mock for the Scraper from "github.com/kubeshop/testkube/pkg/executor/scraper" 6 | type Scraper struct { 7 | ScrapeFn func(id string, directories []string) error 8 | } 9 | 10 | func (s Scraper) Scrape(id string, directories []string) error { 11 | if s.ScrapeFn == nil { 12 | log.Fatal("not implemented") 13 | } 14 | return s.ScrapeFn(id, directories) 15 | } 16 | -------------------------------------------------------------------------------- /contrib/executor/soapui/pkg/runner/doc.go: -------------------------------------------------------------------------------- 1 | // Package runner implements the SoapUI-specific code of the executor. 2 | package runner 3 | -------------------------------------------------------------------------------- /contrib/executor/template/.gitignore: -------------------------------------------------------------------------------- 1 | ### Go template 2 | # Binaries for programs and plugins 3 | *.exe 4 | *.exe~ 5 | *.dll 6 | *.so 7 | *.dylib 8 | 9 | # Test binary, built with `go test -c` 10 | *.test 11 | 12 | # Output of the go coverage tool, specifically when used with LiteIDE 13 | *.out 14 | 15 | # Dependency directories (remove the comment below to include it) 16 | vendor/ 17 | 18 | ### JetBrains 19 | .idea 20 | *.iml 21 | 22 | # Helm 23 | Chart.lock 24 | 25 | .DS_Store 26 | bin/ 27 | site 28 | dist/ 29 | 30 | .vscode -------------------------------------------------------------------------------- /contrib/executor/template/build/agent/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | ARG ALPINE_IMAGE 3 | FROM ${ALPINE_IMAGE} 4 | COPY template /bin/runner 5 | RUN apk --no-cache add ca-certificates git curl 6 | WORKDIR /root/ 7 | ENTRYPOINT ["/bin/runner"] 8 | -------------------------------------------------------------------------------- /contrib/executor/template/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/tracetest/.gitignore: -------------------------------------------------------------------------------- 1 | ### Go template 2 | # Binaries for programs and plugins 3 | *.exe 4 | *.exe~ 5 | *.dll 6 | *.so 7 | *.dylib 8 | 9 | # Test binary, built with `go test -c` 10 | *.test 11 | 12 | # Output of the go coverage tool, specifically when used with LiteIDE 13 | *.out 14 | 15 | # Dependency directories (remove the comment below to include it) 16 | vendor/ 17 | 18 | ### JetBrains 19 | .idea 20 | *.iml 21 | 22 | # Helm 23 | Chart.lock 24 | 25 | .DS_Store 26 | bin/ 27 | site 28 | dist/ 29 | 30 | .vscode -------------------------------------------------------------------------------- /contrib/executor/tracetest/build/agent/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | ARG ALPINE_IMAGE 3 | FROM ${ALPINE_IMAGE} 4 | RUN apk --no-cache add ca-certificates git curl bash 5 | RUN curl -L https://raw.githubusercontent.com/kubeshop/tracetest/main/install-cli.sh | bash 6 | WORKDIR /root/ 7 | COPY tracetest /bin/runner 8 | ENTRYPOINT ["/bin/runner"] -------------------------------------------------------------------------------- /contrib/executor/tracetest/build/agent/docker-bake.hcl: -------------------------------------------------------------------------------- 1 | // docker-bake.hcl 2 | target "docker-metadata-action" {} 3 | 4 | target "build" { 5 | inherits = ["docker-metadata-action"] 6 | context = "./" 7 | dockerfile = "build/agent/Dockerfile" 8 | platforms = [ 9 | "linux/amd64", 10 | "linux/arm64", 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /contrib/executor/tracetest/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/tracetest/pkg/command/command.go: -------------------------------------------------------------------------------- 1 | package command 2 | 3 | import ( 4 | "bytes" 5 | "os/exec" 6 | ) 7 | 8 | func Run(command string, args ...string) ([]byte, error) { 9 | cmd := exec.Command(command, args...) 10 | 11 | var out bytes.Buffer 12 | cmd.Stdout = &out 13 | 14 | err := cmd.Run() 15 | 16 | return out.Bytes(), err 17 | } 18 | -------------------------------------------------------------------------------- /contrib/executor/tracetest/pkg/testing/tracetest-config.yaml: -------------------------------------------------------------------------------- 1 | postgres: 2 | host: postgres 3 | user: postgres 4 | password: postgres 5 | port: 5432 6 | dbname: postgres 7 | params: sslmode=disable 8 | -------------------------------------------------------------------------------- /contrib/executor/tracetest/pkg/testing/tracetest-provision.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | type: PollingProfile 3 | spec: 4 | name: Default 5 | strategy: periodic 6 | default: true 7 | periodic: 8 | retryDelay: 500ms 9 | timeout: 1m 10 | 11 | --- 12 | type: TestRunner 13 | spec: 14 | id: current 15 | name: default 16 | requiredGates: 17 | - test-specs 18 | 19 | --- 20 | type: DataStore 21 | spec: 22 | name: OpenTelemetry Collector pipeline 23 | type: otlp 24 | default: true -------------------------------------------------------------------------------- /contrib/executor/zap/build/agent/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | FROM softwaresecurityproject/zap-stable:2.14.0 3 | ENV ZAP_HOME /zap 4 | COPY zap /bin/runner 5 | ENTRYPOINT ["/bin/runner"] -------------------------------------------------------------------------------- /contrib/executor/zap/cmd/tools/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/kubeshop/testkube/cmd/tools/commands" 4 | 5 | var ( 6 | commit string 7 | version string 8 | builtBy string 9 | date string 10 | ) 11 | 12 | func init() { 13 | // pass data from goreleaser to commands package 14 | commands.Version = version 15 | commands.BuiltBy = builtBy 16 | commands.Commit = commit 17 | commands.Date = date 18 | } 19 | 20 | func main() { 21 | commands.Execute() 22 | } 23 | -------------------------------------------------------------------------------- /contrib/executor/zap/examples/zap-executor.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: zap-executor 5 | namespace: testkube 6 | spec: 7 | executor_type: job 8 | image: kubeshop/testkube-zap-executor:latest 9 | types: 10 | - zap/api 11 | - zap/baseline 12 | - zap/full 13 | features: 14 | - artifacts 15 | -------------------------------------------------------------------------------- /contrib/executor/zap/zap/.gitignore: -------------------------------------------------------------------------------- 1 | wrk 2 | wrk/ -------------------------------------------------------------------------------- /depot.json: -------------------------------------------------------------------------------- 1 | {"id":"3cp8bwpbj0"} -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Testkube docs 2 | 3 | You can find the docs here: https://docs.testkube.io 4 | 5 | ## Documentation has been moved 6 | 7 | **The documentation has been moved to [kubeshop/testkube-docs](https://github.com/kubeshop/testkube-docs) repository.** 8 | -------------------------------------------------------------------------------- /internal/app/api/v1/debug.go: -------------------------------------------------------------------------------- 1 | package v1 2 | 3 | import ( 4 | "github.com/gofiber/fiber/v2" 5 | ) 6 | 7 | // GetDebugListenersHandler returns event logs 8 | func (s *TestkubeAPI) GetDebugListenersHandler() fiber.Handler { 9 | return func(c *fiber.Ctx) error { 10 | return c.JSON(s.Events.Listeners.Log()) 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /internal/common/mode.go: -------------------------------------------------------------------------------- 1 | package common 2 | 3 | import "errors" 4 | 5 | const ( 6 | ModeStandalone = "standalone" 7 | ModeAgent = "agent" 8 | ) 9 | 10 | var ErrNotSupported = errors.New("Feature is not supported in standalone mode") 11 | -------------------------------------------------------------------------------- /internal/config/config_test.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/stretchr/testify/require" 7 | ) 8 | 9 | func TestGet(t *testing.T) { 10 | assertion := require.New(t) 11 | 12 | cfg, err := Get() 13 | if err != nil { 14 | t.Errorf("Get() failed, expected nil, got %v", err) 15 | } 16 | 17 | assertion.NoError(err) 18 | assertion.IsType(&Config{}, cfg) 19 | } 20 | -------------------------------------------------------------------------------- /internal/db-migrations/01_create_indexes.down.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "dropIndexes": "testresults", 4 | "index": ["id_1", "testsuite.name_1", "name_1", "status_1", "starttime_-1", "endtime_-1"] 5 | }, 6 | { 7 | "dropIndexes": "results", 8 | "index": ["id_1", "testname_1", "name_1", "executionresult.status_1", "starttime_-1", "endtime_-1"] 9 | } 10 | ] 11 | -------------------------------------------------------------------------------- /internal/db-migrations/02_execution_search_indexes.down.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "dropIndexes": "testresults", 4 | "index": ["testsuite.name_1_starttime-1", "testsuite.name_1_endtime-1"] 5 | }, 6 | { 7 | "dropIndexes": "results", 8 | "index": ["testname_1_starttime-1", "testname_1_endtime-1"] 9 | } 10 | ] 11 | -------------------------------------------------------------------------------- /internal/db-migrations/03_testworkflow_indexes.down.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "dropIndexes": "workflowresults", 4 | "index": [ 5 | "workflow.name_1_statusat-1", 6 | "workflow.name_1_scheduledat-1", 7 | "id_1", 8 | "name_1", 9 | "result.status_1", 10 | "statusat_-1", 11 | "scheduledat_-1" 12 | ] 13 | } 14 | ] -------------------------------------------------------------------------------- /internal/db-migrations/fs.go: -------------------------------------------------------------------------------- 1 | package db_migrations 2 | 3 | import "embed" 4 | 5 | //go:embed *.up.json *.down.json 6 | var MongoMigrationsFs embed.FS 7 | -------------------------------------------------------------------------------- /internal/graphql/resolvers/resolver.go: -------------------------------------------------------------------------------- 1 | //go:generate go run github.com/99designs/gqlgen generate 2 | 3 | package resolvers 4 | 5 | import ( 6 | "github.com/kubeshop/testkube/internal/graphql/services" 7 | ) 8 | 9 | // This file will not be regenerated automatically. 10 | // 11 | // It serves as dependency injection for your app, add any dependencies you require here. 12 | 13 | type Resolver struct { 14 | ExecutorsService services.ExecutorsService 15 | } 16 | -------------------------------------------------------------------------------- /internal/graphql/schemas/root.graphqls: -------------------------------------------------------------------------------- 1 | scalar Map 2 | scalar StringMap 3 | 4 | directive @goModel(model: String, models: [String!]) on OBJECT | INPUT_OBJECT | SCALAR | ENUM | INTERFACE | UNION 5 | directive @goField(forceResolver: Boolean, name: String) on INPUT_FIELD_DEFINITION | FIELD_DEFINITION 6 | directive @goTag(key: String!, value: String) on INPUT_FIELD_DEFINITION | FIELD_DEFINITION 7 | 8 | type Subscription 9 | type Query 10 | -------------------------------------------------------------------------------- /internal/graphql/services/service_base.go: -------------------------------------------------------------------------------- 1 | package services 2 | 3 | import ( 4 | "github.com/kubeshop/testkube/pkg/event/bus" 5 | 6 | "go.uber.org/zap" 7 | ) 8 | 9 | type ServiceBase struct { 10 | Service 11 | } 12 | 13 | func (s *ServiceBase) Bus() bus.Bus { 14 | return s.Service.Bus() 15 | } 16 | 17 | func (s *ServiceBase) Logger() *zap.SugaredLogger { 18 | return s.Service.Logger() 19 | } 20 | -------------------------------------------------------------------------------- /internal/graphql/tools.go: -------------------------------------------------------------------------------- 1 | //go:build tools 2 | // +build tools 3 | 4 | package graphql 5 | 6 | import ( 7 | _ "github.com/99designs/gqlgen" 8 | _ "github.com/99designs/gqlgen/graphql/introspection" 9 | ) 10 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "testkube", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": {} 6 | } 7 | -------------------------------------------------------------------------------- /pkg/agent/utils.go: -------------------------------------------------------------------------------- 1 | package agent 2 | 3 | import ( 4 | "context" 5 | "errors" 6 | 7 | "github.com/kubeshop/testkube/pkg/executor/output" 8 | ) 9 | 10 | func GetDeprecatedLogStream(ctx context.Context, executionID string) (chan output.Output, error) { 11 | return nil, errors.New("deprecated features have been disabled") 12 | } 13 | -------------------------------------------------------------------------------- /pkg/api/README.md: -------------------------------------------------------------------------------- 1 | # API models autogenerated from openapi spec -------------------------------------------------------------------------------- /pkg/api/v1/client/apiconfig.go: -------------------------------------------------------------------------------- 1 | package client 2 | 3 | func NewAPIConfig(namespace, serviceName string, servicePort int) APIConfig { 4 | return APIConfig{ 5 | Namespace: namespace, 6 | ServiceName: serviceName, 7 | ServicePort: servicePort, 8 | } 9 | } 10 | 11 | type APIConfig struct { 12 | // Namespace where testkube is installed 13 | Namespace string 14 | // API Server service name 15 | ServiceName string 16 | // API Server service port 17 | ServicePort int 18 | } 19 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/common.go: -------------------------------------------------------------------------------- 1 | package testkube 2 | 3 | import ( 4 | "fmt" 5 | "strings" 6 | ) 7 | 8 | func MapToString(m map[string]string) string { 9 | labels := []string{} 10 | for k, v := range m { 11 | labels = append(labels, fmt.Sprintf("%s=%s", k, v)) 12 | } 13 | 14 | return strings.Join(labels, ", ") 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_app_armor_profile.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type AppArmorProfile struct { 13 | Type_ string `json:"type,omitempty"` 14 | LocalhostProfile *BoxedString `json:"localhostProfile,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_artifact_extended.go: -------------------------------------------------------------------------------- 1 | package testkube 2 | 3 | import ( 4 | "strconv" 5 | ) 6 | 7 | type Artifacts []Artifact 8 | 9 | func (artifacts Artifacts) Table() (header []string, output [][]string) { 10 | header = []string{"Execution", "Name", "Size (KB)"} 11 | for _, e := range artifacts { 12 | output = append(output, []string{ 13 | e.ExecutionName, 14 | e.Name, 15 | strconv.FormatInt(int64(e.Size), 10), 16 | }) 17 | } 18 | 19 | return 20 | } 21 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_artifact_updt_request_extended.go: -------------------------------------------------------------------------------- 1 | package testkube 2 | 3 | // IsEmpty check if request is empty 4 | func (a *ArtifactUpdateRequest) IsEmpty() bool { 5 | if a.StorageClassName != nil || a.VolumeMountPath != nil || a.Dirs != nil || a.Masks != nil || 6 | a.StorageBucket != nil || a.OmitFolderPerExecution != nil || a.SharedBetweenPods != nil || 7 | a.UseDefaultStorageClassName != nil || a.SidecarScraper != nil { 8 | return false 9 | } 10 | 11 | return true 12 | } 13 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_boxed_boolean.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type BoxedBoolean struct { 13 | Value bool `json:"value"` 14 | } 15 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_boxed_integer.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type BoxedInteger struct { 13 | Value int32 `json:"value"` 14 | } 15 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_boxed_string.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type BoxedString struct { 13 | Value string `json:"value"` 14 | } 15 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_boxed_string_list.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type BoxedStringList struct { 13 | Value []string `json:"value"` 14 | } 15 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_config_map_env_source.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type ConfigMapEnvSource struct { 13 | Name string `json:"name"` 14 | Optional bool `json:"optional,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_debug_info_execution_logs.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type DebugInfoExecutionLogs struct { 13 | Items string `json:"items,omitempty"` 14 | } 15 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_debug_info_extended.go: -------------------------------------------------------------------------------- 1 | package testkube 2 | 3 | // Table builds up a table from parts of the DebugInfo that are short and easy to read - no logs 4 | func (d DebugInfo) Table() (header []string, output [][]string) { 5 | header = []string{"Client Version", "Server Version", "Cluster Version"} 6 | output = make([][]string, 0) 7 | 8 | row := []string{d.ClientVersion, d.ServerVersion, d.ClusterVersion} 9 | output = append(output, row) 10 | 11 | return header, output 12 | } 13 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_execution_result_reports.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type ExecutionResultReports struct { 13 | Junit string `json:"junit,omitempty"` 14 | } 15 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_executor_details_extended.go: -------------------------------------------------------------------------------- 1 | package testkube 2 | 3 | type ExecutorsDetails []ExecutorDetails 4 | 5 | func (list ExecutorsDetails) Table() (header []string, output [][]string) { 6 | header = []string{"Name", "URI", "Labels"} 7 | 8 | for _, e := range list { 9 | output = append(output, []string{ 10 | e.Name, 11 | e.Executor.Uri, 12 | MapToString(e.Executor.Labels), 13 | }) 14 | } 15 | 16 | return 17 | } 18 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_executor_extended.go: -------------------------------------------------------------------------------- 1 | package testkube 2 | 3 | import "fmt" 4 | 5 | func (e *Executor) QuoteExecutorTextFields() { 6 | if e.JobTemplate != "" { 7 | e.JobTemplate = fmt.Sprintf("%q", e.JobTemplate) 8 | } 9 | 10 | for i := range e.Command { 11 | if e.Command[i] != "" { 12 | e.Command[i] = fmt.Sprintf("%q", e.Command[i]) 13 | } 14 | } 15 | 16 | for i := range e.Args { 17 | if e.Args[i] != "" { 18 | e.Args[i] = fmt.Sprintf("%q", e.Args[i]) 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_executor_meta_updt_extended.go: -------------------------------------------------------------------------------- 1 | package testkube 2 | 3 | // IsEmpty check if request is empty 4 | func (e *ExecutorMetaUpdate) IsEmpty() bool { 5 | if e.IconURI != nil || e.DocsURI != nil || e.Tooltips != nil { 6 | return false 7 | } 8 | 9 | return true 10 | } 11 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_features.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type Features struct { 13 | // Log processing version 2 14 | LogsV2 bool `json:"logsV2"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_grpc_action.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type GrpcAction struct { 13 | Port int32 `json:"port,omitempty"` 14 | Service *BoxedString `json:"service,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_host_alias.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type HostAlias struct { 13 | Ip string `json:"ip,omitempty"` 14 | Hostnames []string `json:"hostnames,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_http_header.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type HttpHeader struct { 13 | Name string `json:"name,omitempty"` 14 | Value string `json:"value,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_local_object_reference.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | // Reference to Kubernetes object 13 | type LocalObjectReference struct { 14 | Name string `json:"name,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_log_v1.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | // Log format version 1 13 | type LogV1 struct { 14 | Result *ExecutionResult `json:"result,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_node_selector.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type NodeSelector struct { 13 | NodeSelectorTerms []NodeSelectorTerm `json:"nodeSelectorTerms,omitempty"` 14 | } 15 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_object_ref.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type ObjectRef struct { 13 | // object kubernetes namespace 14 | Namespace string `json:"namespace,omitempty"` 15 | // object name 16 | Name string `json:"name"` 17 | } 18 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_pod_dns_config_option.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type PodDnsConfigOption struct { 13 | Name string `json:"name,omitempty"` 14 | Value *BoxedString `json:"value,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_pod_resource_claim.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type PodResourceClaim struct { 13 | Name string `json:"name,omitempty"` 14 | Source *ClaimSource `json:"source,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_pod_scheduling_gate.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type PodSchedulingGate struct { 13 | Name string `json:"name,omitempty"` 14 | } 15 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_preferred_scheduling_term.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type PreferredSchedulingTerm struct { 13 | Weight int32 `json:"weight,omitempty"` 14 | Preference *NodeSelectorTerm `json:"preference"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_seccomp_profile.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type SeccompProfile struct { 13 | Type_ string `json:"type,omitempty"` 14 | LocalhostProfile *BoxedString `json:"localhostProfile,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_secret_env_source.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type SecretEnvSource struct { 13 | Name string `json:"name"` 14 | Optional bool `json:"optional,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_secret_ref_extended.go: -------------------------------------------------------------------------------- 1 | package testkube 2 | 3 | // IsEmpty check if secret ref is empty 4 | func (s *SecretRef) IsEmpty() bool { 5 | if s.Namespace != "" || s.Name != "" || s.Key != "" { 6 | return false 7 | } 8 | 9 | return true 10 | } 11 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_slaves_meta.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | // Slave data for executing tests in distributed environment 13 | type SlavesMeta struct { 14 | // slave image 15 | Image string `json:"image"` 16 | } 17 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_sysctl.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type Sysctl struct { 13 | Name string `json:"name,omitempty"` 14 | Value string `json:"value,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_tcp_socket_action.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type TcpSocketAction struct { 13 | Port string `json:"port,omitempty"` 14 | Host string `json:"host,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_test+workflow_spec_extended.go: -------------------------------------------------------------------------------- 1 | package testkube 2 | 3 | func (t TestWorkflowSpec) GetRequiredParameters() []string { 4 | keys := make([]string, 0) 5 | 6 | for key, value := range t.Config { 7 | if value.Default_ == nil { 8 | keys = append(keys, key) 9 | } 10 | } 11 | 12 | return keys 13 | } 14 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_test_content_request.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | // test content request body 13 | type TestContentRequest struct { 14 | Repository *RepositoryParameters `json:"repository,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_test_content_update_request.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | // test content update request body 13 | type TestContentUpdateRequest struct { 14 | Repository **RepositoryUpdateParameters `json:"repository,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_test_source_batch_request.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | // Test source batch request 13 | type TestSourceBatchRequest struct { 14 | Batch []TestSourceUpsertRequest `json:"batch"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_test_status.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | // test status 13 | type TestStatus struct { 14 | LatestExecution *ExecutionCore `json:"latestExecution,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_test_suite_status.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | // test suite status 13 | type TestSuiteStatus struct { 14 | LatestExecution *TestSuiteExecutionCore `json:"latestExecution,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_test_suite_step_delay_v2.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type TestSuiteStepDelayV2 struct { 13 | // delay duration in milliseconds 14 | Duration int32 `json:"duration"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_test_suite_step_delay_v2_extended.go: -------------------------------------------------------------------------------- 1 | package testkube 2 | 3 | import "fmt" 4 | 5 | func (s TestSuiteStepDelayV2) FullName() string { 6 | return fmt.Sprintf("delay %dms", s.Duration) 7 | } 8 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_test_suite_step_execute_test_v2_extended.go: -------------------------------------------------------------------------------- 1 | package testkube 2 | 3 | import "fmt" 4 | 5 | func (s TestSuiteStepExecuteTestV2) FullName() string { 6 | return fmt.Sprintf("run:%s", s.Name) 7 | } 8 | 9 | func (s TestSuiteStepExecuteTestV2) GetObjectRef() *ObjectRef { 10 | return &ObjectRef{ 11 | Name: s.Name, 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_test_suite_step_extended.go: -------------------------------------------------------------------------------- 1 | package testkube 2 | 3 | func (s TestSuiteStep) Type() *TestSuiteStepType { 4 | if s.Test != "" { 5 | return TestSuiteStepTypeExecuteTest 6 | } 7 | if s.Delay != "" { 8 | return TestSuiteStepTypeDelay 9 | } 10 | return nil 11 | } 12 | 13 | func (s TestSuiteStep) FullName() string { 14 | switch s.Type() { 15 | case TestSuiteStepTypeDelay: 16 | return s.Delay 17 | case TestSuiteStepTypeExecuteTest: 18 | return s.Test 19 | default: 20 | return "unknown" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_test_suite_step_type_extended.go: -------------------------------------------------------------------------------- 1 | package testkube 2 | 3 | func TestSuiteStepTypePtr(stepType TestSuiteStepType) *TestSuiteStepType { 4 | return &stepType 5 | } 6 | 7 | var ( 8 | TestSuiteStepTypeExecuteTest = TestSuiteStepTypePtr(EXECUTE_TEST_TestSuiteStepType) 9 | TestSuiteStepTypeDelay = TestSuiteStepTypePtr(DELAY_TestSuiteStepType) 10 | ) 11 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_test_workflow_event.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type TestWorkflowEvent struct { 13 | Cronjob *TestWorkflowCronJobConfig `json:"cronjob,omitempty"` 14 | } 15 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_test_workflow_execution_tags.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type TestWorkflowExecutionTags struct { 13 | Tags map[string]string `json:"tags,omitempty"` 14 | } 15 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_test_workflow_ref.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type TestWorkflowRef struct { 13 | // TestWorkflow name to include 14 | Name string `json:"name"` 15 | Config map[string]string `json:"config,omitempty"` 16 | } 17 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_test_workflow_status_summary.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | // test workflow status 13 | type TestWorkflowStatusSummary struct { 14 | LatestExecution *TestWorkflowExecutionSummary `json:"latestExecution,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_test_workflow_step_artifacts_compression.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type TestWorkflowStepArtifactsCompression struct { 13 | // artifact name 14 | Name string `json:"name,omitempty"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_variable_type.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type VariableType string 13 | 14 | // List of VariableType 15 | const ( 16 | BASIC_VariableType VariableType = "basic" 17 | SECRET_VariableType VariableType = "secret" 18 | ) 19 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_variable_type_extended.go: -------------------------------------------------------------------------------- 1 | package testkube 2 | 3 | func VariableTypePtr(stepType VariableType) *VariableType { 4 | return &stepType 5 | } 6 | 7 | var VariableTypeBasic = VariableTypePtr(BASIC_VariableType) 8 | var VariableTypeSecret = VariableTypePtr(SECRET_VariableType) 9 | 10 | func VariableTypeString(ptr *VariableType) string { 11 | return string(*ptr) 12 | } 13 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_volume_source.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type VolumeSource struct { 13 | } 14 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_webhook_config_value.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | // configuration value 13 | type WebhookConfigValue struct { 14 | Value *BoxedString `json:"value,omitempty"` 15 | Secret *SecretRef `json:"secret,omitempty"` 16 | } 17 | -------------------------------------------------------------------------------- /pkg/api/v1/testkube/model_webhook_template_ref.go: -------------------------------------------------------------------------------- 1 | /* 2 | * Testkube API 3 | * 4 | * Testkube provides a Kubernetes-native framework for test definition, execution and results 5 | * 6 | * API version: 1.0.0 7 | * Contact: testkube@kubeshop.io 8 | * Generated by: Swagger Codegen (https://github.com/swagger-api/swagger-codegen.git) 9 | */ 10 | package testkube 11 | 12 | type WebhookTemplateRef struct { 13 | // webhook template name to use 14 | Name string `json:"name"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/archive/archive.go: -------------------------------------------------------------------------------- 1 | package archive 2 | 3 | import ( 4 | "bytes" 5 | "io" 6 | "time" 7 | ) 8 | 9 | type Archive interface { 10 | Create(out io.Writer, files []*File) error 11 | Extract(in io.Reader) ([]*File, error) 12 | } 13 | 14 | type File struct { 15 | Name string 16 | Size int64 17 | Mode int64 18 | ModTime time.Time 19 | Data *bytes.Buffer 20 | } 21 | -------------------------------------------------------------------------------- /pkg/cloud/client/client_mock_test.go: -------------------------------------------------------------------------------- 1 | package client 2 | 3 | import ( 4 | "bytes" 5 | "io" 6 | "net/http" 7 | ) 8 | 9 | type ClientMock struct { 10 | body []byte 11 | err error 12 | validateRequestFunc func(req *http.Request) error 13 | } 14 | 15 | func (c ClientMock) Do(req *http.Request) (*http.Response, error) { 16 | err := c.validateRequestFunc(req) 17 | if err != nil { 18 | return nil, err 19 | } 20 | return &http.Response{ 21 | Body: io.NopCloser(bytes.NewReader(c.body)), 22 | }, c.err 23 | } 24 | -------------------------------------------------------------------------------- /pkg/cloud/data/artifact/commands.go: -------------------------------------------------------------------------------- 1 | package artifact 2 | 3 | import "github.com/kubeshop/testkube/pkg/cloud/data/executor" 4 | 5 | const ( 6 | CmdArtifactsListFiles executor.Command = "artifacts.listFiles" 7 | CmdArtifactsDownloadFile executor.Command = "artifacts.downloadFile" 8 | ) 9 | -------------------------------------------------------------------------------- /pkg/cloud/data/config/commands.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import "github.com/kubeshop/testkube/pkg/cloud/data/executor" 4 | 5 | const ( 6 | CmdConfigGetUniqueClusterId executor.Command = "get_unique_cluster_id" 7 | CmdConfigGetTelemetryEnabled executor.Command = "get_telemetry_enabled" 8 | CmdConfigGet executor.Command = "get" 9 | CmdConfigUpsert executor.Command = "upsert" 10 | CmdConfigGetOrganizationPlan executor.Command = "get_org_plan" 11 | ) 12 | -------------------------------------------------------------------------------- /pkg/cloud/data/webhook/commands.go: -------------------------------------------------------------------------------- 1 | package webhook 2 | 3 | import "github.com/kubeshop/testkube/pkg/cloud/data/executor" 4 | 5 | const ( 6 | CmdWebhookExecutionCollectResult executor.Command = "webhook_execution_collect_result" 7 | ) 8 | -------------------------------------------------------------------------------- /pkg/controlplaneclient/errors.go: -------------------------------------------------------------------------------- 1 | package controlplaneclient 2 | 3 | import "errors" 4 | 5 | var ( 6 | ErrNotSupported = errors.New("operation not supported in this version") 7 | ) 8 | -------------------------------------------------------------------------------- /pkg/crd/templates/template.tmpl: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v1 2 | kind: Template 3 | metadata: 4 | name: {{ .Name }} 5 | namespace: {{ .Namespace }} 6 | {{- if ne (len .Labels) 0 }} 7 | labels: 8 | {{- range $key, $value := .Labels }} 9 | {{ $key }}: {{ $value }} 10 | {{- end }} 11 | {{- end }} 12 | spec: 13 | {{- if .Type_ }} 14 | type: {{ .Type_ }} 15 | {{- end }} 16 | {{- if .Body }} 17 | body: {{ .Body }} 18 | {{- end }} 19 | 20 | -------------------------------------------------------------------------------- /pkg/diagnostics/renderer/interface.go: -------------------------------------------------------------------------------- 1 | package renderer 2 | 3 | import "github.com/kubeshop/testkube/pkg/diagnostics/validators" 4 | 5 | type Renderer interface { 6 | RenderGroupStart(group string) 7 | RenderResult(validators.ValidationResult) 8 | RenderProgress(message string) 9 | } 10 | -------------------------------------------------------------------------------- /pkg/diagnostics/validators/deps/utils.go: -------------------------------------------------------------------------------- 1 | package deps 2 | 3 | import ( 4 | "os" 5 | "os/exec" 6 | ) 7 | 8 | func checkFileExists(fileName string) bool { 9 | path, err := exec.LookPath(fileName) 10 | if err != nil { 11 | return false 12 | } 13 | _, err = os.Stat(path) 14 | return !os.IsNotExist(err) 15 | } 16 | -------------------------------------------------------------------------------- /pkg/diagnostics/validators/group.go: -------------------------------------------------------------------------------- 1 | package validators 2 | 3 | // ValidatorGroup to organize validators around given subject e.g. "License Key" 4 | type ValidatorGroup struct { 5 | Subject any 6 | Name string 7 | Validators []Validator 8 | } 9 | 10 | // AddValidator adds a new validator to the group 11 | func (vg *ValidatorGroup) AddValidator(v Validator) { 12 | vg.Validators = append(vg.Validators, v) 13 | } 14 | -------------------------------------------------------------------------------- /pkg/diagnostics/validators/interface.go: -------------------------------------------------------------------------------- 1 | package validators 2 | 3 | // Validator interface defines the Validate method for validation logic 4 | type Validator interface { 5 | // Validate runs validation logic against subject 6 | Validate(subject any) ValidationResult 7 | Name() string 8 | } 9 | -------------------------------------------------------------------------------- /pkg/diagnostics/validators/license/validator_test.go: -------------------------------------------------------------------------------- 1 | package license 2 | 3 | import ( 4 | "regexp" 5 | "testing" 6 | 7 | "github.com/stretchr/testify/assert" 8 | ) 9 | 10 | func TestRegexp(t *testing.T) { 11 | key := "8D9E74-444441-DEF387-31EE50-5F2A2E-V3" 12 | match, _ := regexp.MatchString(`^([^-]{6}-){5}[^-]{2}$`, key) 13 | assert.True(t, match) 14 | } 15 | -------------------------------------------------------------------------------- /pkg/diagnostics/validators/mock/invalid.go: -------------------------------------------------------------------------------- 1 | package mock 2 | 3 | import v "github.com/kubeshop/testkube/pkg/diagnostics/validators" 4 | 5 | type AlwaysInvalidValidator struct { 6 | Name string 7 | } 8 | 9 | func (val AlwaysInvalidValidator) Validate(subject any) v.ValidationResult { 10 | return v.NewResult().WithError(v.Err("Some error", v.ErrorKindCustom)).WithValidator("Always invalid " + val.Name) 11 | } 12 | -------------------------------------------------------------------------------- /pkg/diagnostics/validators/mock/valid.go: -------------------------------------------------------------------------------- 1 | package mock 2 | 3 | import v "github.com/kubeshop/testkube/pkg/diagnostics/validators" 4 | 5 | type AlwaysValidValidator struct { 6 | Name string 7 | } 8 | 9 | func (val AlwaysValidValidator) Validate(subject any) v.ValidationResult { 10 | return v.NewResult().WithValidStatus().WithValidator("Always valid " + val.Name) 11 | } 12 | -------------------------------------------------------------------------------- /pkg/diagnostics/validators/requirements.go: -------------------------------------------------------------------------------- 1 | package validators 2 | 3 | const ( 4 | // Minimal required versions 5 | RequiredHelmVersion = "3.0.0" 6 | RequiredKubectlVersion = "1.0.0" 7 | RequiredKubernetesVersion = "1.0.0" 8 | ) 9 | -------------------------------------------------------------------------------- /pkg/event/bus/interface.go: -------------------------------------------------------------------------------- 1 | package bus 2 | 3 | import "github.com/kubeshop/testkube/pkg/api/v1/testkube" 4 | 5 | type Handler func(event testkube.Event) error 6 | 7 | type Bus interface { 8 | Publish(event testkube.Event) error 9 | Subscribe(queue string, handler Handler) error 10 | Unsubscribe(queue string) error 11 | 12 | PublishTopic(topic string, event testkube.Event) error 13 | SubscribeTopic(topic string, queue string, handler Handler) error 14 | 15 | Close() error 16 | } 17 | -------------------------------------------------------------------------------- /pkg/event/kind/cdevent/loader_test.go: -------------------------------------------------------------------------------- 1 | package cdevent 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/stretchr/testify/assert" 7 | ) 8 | 9 | func TestCDEventLoader(t *testing.T) { 10 | t.Parallel() 11 | 12 | cdeventLoader, err := NewCDEventLoader("target", "", "", "", nil) 13 | assert.NoError(t, err) 14 | 15 | listeners, err := cdeventLoader.Load() 16 | 17 | assert.Equal(t, 1, len(listeners)) 18 | assert.NoError(t, err) 19 | } 20 | -------------------------------------------------------------------------------- /pkg/event/kind/common/name.go: -------------------------------------------------------------------------------- 1 | package common 2 | 3 | import ( 4 | "log" 5 | "regexp" 6 | ) 7 | 8 | // ListenerName returns name of listener which can be used by event bus to identify listener 9 | func ListenerName(in string) string { 10 | reg, err := regexp.Compile("[^A-Za-z0-9.]+") 11 | if err != nil { 12 | log.Fatal(err) 13 | } 14 | return reg.ReplaceAllString(in, "") 15 | 16 | } 17 | -------------------------------------------------------------------------------- /pkg/event/kind/common/name_test.go: -------------------------------------------------------------------------------- 1 | package common 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/stretchr/testify/assert" 7 | ) 8 | 9 | func TestListenerName(t *testing.T) { 10 | t.Parallel() 11 | // given 12 | in := "webhooks.http://localhost:8080/something/else.start-test" 13 | 14 | // when 15 | result := ListenerName(in) 16 | 17 | // then 18 | assert.Equal(t, "webhooks.httplocalhost8080somethingelse.starttest", result) 19 | 20 | } 21 | -------------------------------------------------------------------------------- /pkg/event/kind/k8sevent/loader_test.go: -------------------------------------------------------------------------------- 1 | package k8sevent 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/stretchr/testify/assert" 7 | "k8s.io/client-go/kubernetes/fake" 8 | ) 9 | 10 | func TestK8sLoader(t *testing.T) { 11 | t.Parallel() 12 | 13 | clientset := fake.NewSimpleClientset() 14 | k8seventLoader := NewK8sEventLoader(clientset, "", nil) 15 | 16 | listeners, err := k8seventLoader.Load() 17 | 18 | assert.Equal(t, 1, len(listeners)) 19 | assert.NoError(t, err) 20 | } 21 | -------------------------------------------------------------------------------- /pkg/event/kind/websocket/websocket.go: -------------------------------------------------------------------------------- 1 | package websocket 2 | 3 | import ( 4 | "github.com/gofiber/websocket/v2" 5 | 6 | "github.com/kubeshop/testkube/pkg/api/v1/testkube" 7 | ) 8 | 9 | type Websocket struct { 10 | Id string 11 | Conn *websocket.Conn 12 | Selector string 13 | Events []testkube.EventType 14 | } 15 | -------------------------------------------------------------------------------- /pkg/event/lazy.go: -------------------------------------------------------------------------------- 1 | package event 2 | 3 | import "github.com/kubeshop/testkube/pkg/api/v1/testkube" 4 | 5 | type lazyEventEmitter[T Interface] struct { 6 | accessor *T 7 | } 8 | 9 | func Lazy[T Interface](accessor *T) Interface { 10 | return &lazyEventEmitter[T]{accessor: accessor} 11 | } 12 | 13 | func (l *lazyEventEmitter[T]) Notify(event testkube.Event) { 14 | (*l.accessor).Notify(event) 15 | } 16 | -------------------------------------------------------------------------------- /pkg/executor/client/.keep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/pkg/executor/client/.keep -------------------------------------------------------------------------------- /pkg/executor/scraper/scrapertypes/uploader.go: -------------------------------------------------------------------------------- 1 | package scrapertypes 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/kubeshop/testkube/pkg/api/v1/testkube" 7 | ) 8 | 9 | //go:generate mockgen -destination=./mock_uploader.go -package=scrapertypes "github.com/kubeshop/testkube/pkg/executor/scraper/scrapertypes" Uploader 10 | type Uploader interface { 11 | Upload(ctx context.Context, object *Object, execution testkube.Execution) error 12 | Close() error 13 | } 14 | -------------------------------------------------------------------------------- /pkg/expressions/intstr.go: -------------------------------------------------------------------------------- 1 | package expressions 2 | 3 | // These functions are to avoid bundling k8s when only expressions are used. 4 | // It's to be able to work with intstr.IntOrString, without accessing its struct. 5 | 6 | type IntOrStringLike interface { 7 | OpenAPISchemaType() []string 8 | OpenAPISchemaFormat() string 9 | OpenAPIV3OneOfTypes() []string 10 | } 11 | 12 | func IsIntOrStringType(v any) bool { 13 | vv, ok := v.(IntOrStringLike) 14 | return ok && vv.OpenAPISchemaFormat() == "int-or-string" 15 | } 16 | -------------------------------------------------------------------------------- /pkg/featureflags/featureflags.go: -------------------------------------------------------------------------------- 1 | package featureflags 2 | 3 | import ( 4 | "github.com/kelseyhightower/envconfig" 5 | ) 6 | 7 | type FeatureFlags struct { 8 | LogsV2 bool `envconfig:"FF_LOGS_V2" default:"false"` 9 | } 10 | 11 | func Get() (ff FeatureFlags, err error) { 12 | if err := envconfig.Process("", &ff); err != nil { 13 | return ff, err 14 | } 15 | return 16 | } 17 | -------------------------------------------------------------------------------- /pkg/git/checkout_test.go: -------------------------------------------------------------------------------- 1 | package git 2 | 3 | import ( 4 | "testing" 5 | 6 | "github.com/stretchr/testify/assert" 7 | ) 8 | 9 | func TestCheckOut(t *testing.T) { 10 | t.Skip("TODO implement me") 11 | 12 | repo := "https://github.com/cirosantilli/test-git-partial-clone-big-small" 13 | 14 | dir, err := PartialCheckout(repo, "", "small", "master", "", "") 15 | t.Logf("partial repo checkedout to dir: %s", dir) 16 | assert.NoError(t, err) 17 | t.Fail() 18 | } 19 | -------------------------------------------------------------------------------- /pkg/http/interface.go: -------------------------------------------------------------------------------- 1 | package http 2 | 3 | import "net/http" 4 | 5 | type HttpClient interface { 6 | Do(req *http.Request) (*http.Response, error) 7 | } 8 | -------------------------------------------------------------------------------- /pkg/logs/config/logs_config_test.go: -------------------------------------------------------------------------------- 1 | package config 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | 7 | "github.com/stretchr/testify/assert" 8 | ) 9 | 10 | func TestGet(t *testing.T) { 11 | t.Parallel() 12 | 13 | os.Setenv("NATS_URI", "aaa") 14 | defer os.Unsetenv("NATS_URI") 15 | cfg, err := Get() 16 | assert.Equal(t, "aaa", cfg.NatsURI) 17 | assert.NoError(t, err, "getting config not return error") 18 | } 19 | -------------------------------------------------------------------------------- /pkg/logs/state/nats.go: -------------------------------------------------------------------------------- 1 | package state 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/nats-io/nats.go/jetstream" 7 | ) 8 | 9 | // KV is type implicitly interfaced from NATS 10 | type NatsKV interface { 11 | Get(ctx context.Context, key string) (jetstream.KeyValueEntry, error) 12 | Put(ctx context.Context, key string, value []byte) (uint64, error) 13 | } 14 | -------------------------------------------------------------------------------- /pkg/mapper/common/kube_openapi.go: -------------------------------------------------------------------------------- 1 | package commonmapper 2 | 3 | import ( 4 | commonv1 "github.com/kubeshop/testkube-operator/api/common/v1" 5 | "github.com/kubeshop/testkube/pkg/api/v1/testkube" 6 | ) 7 | 8 | func MapTargetKubeToAPI(v commonv1.Target) testkube.ExecutionTarget { 9 | return testkube.ExecutionTarget{ 10 | Match: v.Match, 11 | Not: v.Not, 12 | Replicate: v.Replicate, 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /pkg/mapper/common/openapi_kube.go: -------------------------------------------------------------------------------- 1 | package commonmapper 2 | 3 | import ( 4 | commonv1 "github.com/kubeshop/testkube-operator/api/common/v1" 5 | "github.com/kubeshop/testkube/pkg/api/v1/testkube" 6 | ) 7 | 8 | func MapTargetApiToKube(v testkube.ExecutionTarget) commonv1.Target { 9 | return commonv1.Target{ 10 | Match: v.Match, 11 | Not: v.Not, 12 | Replicate: v.Replicate, 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /pkg/oauth/interface.go: -------------------------------------------------------------------------------- 1 | package oauth 2 | 3 | import "golang.org/x/oauth2" 4 | 5 | // ProviderType is provider type 6 | type ProviderType string 7 | 8 | const ( 9 | // GithubProviderType is github provider type 10 | GithubProviderType ProviderType = "github" 11 | ) 12 | 13 | // Validator describes ouath validation methods 14 | type Validator interface { 15 | // Validate validates oauth token 16 | Validate(accessToken string) error 17 | // GetEndpoint returns oauth endpoint 18 | GetEndpoint() oauth2.Endpoint 19 | } 20 | -------------------------------------------------------------------------------- /pkg/problem/problem.go: -------------------------------------------------------------------------------- 1 | package problem 2 | 3 | import ( 4 | "github.com/moogar0880/problems" 5 | ) 6 | 7 | // Porblem is struct defining RFC7807 Problem Details 8 | type Problem problems.DefaultProblem 9 | 10 | func New(status int, details string) Problem { 11 | pr := problems.NewDetailedProblem(status, details) 12 | return Problem(*pr) 13 | } 14 | -------------------------------------------------------------------------------- /pkg/rand/names.go: -------------------------------------------------------------------------------- 1 | package rand 2 | 3 | import ( 4 | petname "github.com/dustinkirkland/golang-petname" 5 | ) 6 | 7 | // Name return random 3 part string similar to Docker image names, separated by `-` 8 | func Name() string { 9 | return petname.Generate(3, "-") 10 | } 11 | -------------------------------------------------------------------------------- /pkg/rand/string.go: -------------------------------------------------------------------------------- 1 | package rand 2 | 3 | import "math/rand" 4 | 5 | var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") 6 | 7 | // String returns random `n`-size string 8 | func String(n int) string { 9 | b := make([]rune, n) 10 | for i := range b { 11 | b[i] = letters[rand.Intn(len(letters))] 12 | } 13 | return string(b) 14 | } 15 | -------------------------------------------------------------------------------- /pkg/runner/utils.go: -------------------------------------------------------------------------------- 1 | package runner 2 | 3 | import ( 4 | "time" 5 | ) 6 | 7 | func retry(count int, delayBase time.Duration, fn func() error) (err error) { 8 | for i := 0; i < count; i++ { 9 | err = fn() 10 | if err == nil { 11 | return nil 12 | } 13 | time.Sleep(time.Duration(i) * delayBase) 14 | } 15 | return err 16 | } 17 | -------------------------------------------------------------------------------- /pkg/server/config.go: -------------------------------------------------------------------------------- 1 | package server 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/gofiber/fiber/v2" 7 | ) 8 | 9 | // Config for HTTP server 10 | type Config struct { 11 | Port int 12 | Http fiber.Config 13 | } 14 | 15 | // Addr returns port based address 16 | func (c Config) Addr() string { 17 | return fmt.Sprintf(":%d", c.Port) 18 | } 19 | -------------------------------------------------------------------------------- /pkg/server/endpoints.go: -------------------------------------------------------------------------------- 1 | package server 2 | 3 | import "github.com/gofiber/fiber/v2" 4 | 5 | // HealthEndpoint for health checks 6 | func (s HTTPServer) HealthEndpoint() fiber.Handler { 7 | return func(c *fiber.Ctx) error { 8 | return c.SendString("OK 👋!") 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /pkg/storage/minio/helpers.go: -------------------------------------------------------------------------------- 1 | package minio 2 | 3 | func GetTLSOptions(ssl, skipVerify bool, certFile, keyFile, caFile string) []Option { 4 | var opts []Option 5 | if ssl { 6 | if skipVerify { 7 | opts = append(opts, Insecure()) 8 | } else { 9 | opts = append(opts, ClientCert(certFile, keyFile)) 10 | if caFile != "" { 11 | opts = append(opts, RootCAs(caFile)) 12 | } 13 | } 14 | } 15 | return opts 16 | } 17 | -------------------------------------------------------------------------------- /pkg/tcl/README.md: -------------------------------------------------------------------------------- 1 | # Testkube - TCL Package 2 | 3 | This folder contains special code with the Testkube Community license. 4 | 5 | ## License 6 | 7 | The code in this folder is licensed under the Testkube Community License. Please see the [LICENSE](../../licenses/TCL.txt) file for more information. 8 | -------------------------------------------------------------------------------- /pkg/testworkflows/executionworker/controller/channel.go: -------------------------------------------------------------------------------- 1 | package controller 2 | 3 | type ChannelMessage[T any] struct { 4 | Error error 5 | Value T 6 | } 7 | -------------------------------------------------------------------------------- /pkg/testworkflows/executionworker/registry/errors.go: -------------------------------------------------------------------------------- 1 | package registry 2 | 3 | import "errors" 4 | 5 | var ( 6 | ErrResourceNotFound = errors.New("resource not found") 7 | ErrPodIpNotAssigned = errors.New("selected pod does not have IP assigned") 8 | ) 9 | -------------------------------------------------------------------------------- /pkg/triggers/util.go: -------------------------------------------------------------------------------- 1 | package triggers 2 | 3 | import ( 4 | "time" 5 | 6 | core_v1 "k8s.io/api/core/v1" 7 | ) 8 | 9 | func findContainer(containers []core_v1.Container, target string) *core_v1.Container { 10 | for _, c := range containers { 11 | if c.Name == target { 12 | return &c 13 | } 14 | } 15 | return nil 16 | } 17 | 18 | func inPast(t1, t2 time.Time) bool { 19 | return t1.Before(t2) 20 | } 21 | -------------------------------------------------------------------------------- /pkg/ui/config.go: -------------------------------------------------------------------------------- 1 | package ui 2 | 3 | import ( 4 | "io" 5 | "os" 6 | ) 7 | 8 | // Verbose adds additional info messages e.g. in case of checking errors 9 | var Verbose = false 10 | 11 | var Writer io.Writer = os.Stdout 12 | -------------------------------------------------------------------------------- /pkg/ui/confirm.go: -------------------------------------------------------------------------------- 1 | package ui 2 | 3 | import "github.com/pterm/pterm" 4 | 5 | func (ui *UI) Confirm(label string) bool { 6 | ok, _ := pterm.DefaultInteractiveConfirm. 7 | WithDefaultValue(true). 8 | Show(label) 9 | 10 | ui.NL() 11 | 12 | return ok 13 | } 14 | -------------------------------------------------------------------------------- /pkg/ui/select.go: -------------------------------------------------------------------------------- 1 | package ui 2 | 3 | import "github.com/pterm/pterm" 4 | 5 | func (ui *UI) Select(label string, options []string) string { 6 | val, _ := pterm.DefaultInteractiveSelect. 7 | WithOptions(options). 8 | WithDefaultText(label). 9 | Show() 10 | 11 | ui.NL() 12 | 13 | return val 14 | } 15 | -------------------------------------------------------------------------------- /pkg/ui/textinput.go: -------------------------------------------------------------------------------- 1 | package ui 2 | 3 | import "github.com/pterm/pterm" 4 | 5 | func (ui *UI) TextInput(text string, defaultValue ...string) string { 6 | t := pterm.DefaultInteractiveTextInput.WithMultiLine(false) 7 | if len(defaultValue) > 0 { 8 | t = t.WithDefaultValue(defaultValue[0]) 9 | } 10 | 11 | in, _ := t.Show(text) 12 | return in 13 | } 14 | -------------------------------------------------------------------------------- /pkg/utils/consts.go: -------------------------------------------------------------------------------- 1 | package utils 2 | 3 | import "time" 4 | 5 | const ( 6 | // DefaultDockerRegistry is the default registry used when no registry is specified in the image name. 7 | DefaultDockerRegistry = "https://index.docker.io/v1/" 8 | DefaultRetryDelay = time.Second * 3 9 | ) 10 | -------------------------------------------------------------------------------- /pkg/utils/test/integration.go: -------------------------------------------------------------------------------- 1 | package test 2 | 3 | import ( 4 | "os" 5 | "testing" 6 | ) 7 | 8 | func IntegrationTest(t *testing.T) { 9 | t.Helper() 10 | if os.Getenv("INTEGRATION") == "" { 11 | t.Skip("skipping integration tests because environment variable INTEGRATION is not set") 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /pkg/utils/text/tostr.go: -------------------------------------------------------------------------------- 1 | package text 2 | 3 | import "fmt" 4 | 5 | func ToStr(in any) string { 6 | return fmt.Sprintf("%v", in) 7 | } 8 | -------------------------------------------------------------------------------- /pkg/version/version.go: -------------------------------------------------------------------------------- 1 | package version 2 | 3 | var ( 4 | Version string = "dev" 5 | Commit string = "none" 6 | ) 7 | -------------------------------------------------------------------------------- /test/artillery/executor-smoke/artillery-smoke-test-negative.yaml: -------------------------------------------------------------------------------- 1 | config: 2 | target: "https://testkube.non.existing.url.example" 3 | phases: 4 | - duration: 1 5 | arrivalRate: 1 6 | scenarios: 7 | - flow: 8 | - get: 9 | url: "/" 10 | - think: 0.1 -------------------------------------------------------------------------------- /test/artillery/executor-smoke/artillery-smoke-test.yaml: -------------------------------------------------------------------------------- 1 | config: 2 | target: "https://testkube-test-page-lipsum.pages.dev/" 3 | phases: 4 | - duration: 1 5 | arrivalRate: 1 6 | scenarios: 7 | - flow: 8 | - get: 9 | url: "/" 10 | - think: 0.1 11 | -------------------------------------------------------------------------------- /test/cli-tests/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["@babel/preset-env"], 3 | "plugins": [ 4 | ["@babel/transform-runtime"] 5 | ] 6 | } -------------------------------------------------------------------------------- /test/cli-tests/.env: -------------------------------------------------------------------------------- 1 | API_URL=localhost:8088/v1 -------------------------------------------------------------------------------- /test/cli-tests/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /test/cli-tests/helpers/test-data-handlers.js: -------------------------------------------------------------------------------- 1 | const testsData = require('../test-data/tests.json') 2 | 3 | class TestDataHandler { 4 | getTest(testName) { 5 | return testsData[testName] 6 | } 7 | } 8 | export default TestDataHandler -------------------------------------------------------------------------------- /test/curl/curl.json: -------------------------------------------------------------------------------- 1 | { 2 | "command": [ 3 | "curl", 4 | "https://reqbin.com/echo/get/json", 5 | "-H", 6 | "'Accept: application/json'" 7 | ], 8 | "expected_status": "200", 9 | "expected_body": "{\"success\":\"true\"}" 10 | } -------------------------------------------------------------------------------- /test/curl/executor-tests/curl-smoke-test-negative.json: -------------------------------------------------------------------------------- 1 | { 2 | "command": ["curl", "https://testkube-test-page-lipsum.pages.dev/"], 3 | "expected_status": "418" 4 | } 5 | -------------------------------------------------------------------------------- /test/curl/executor-tests/curl-smoke-test.json: -------------------------------------------------------------------------------- 1 | { 2 | "command": ["curl", "https://testkube-test-page-lipsum.pages.dev/"], 3 | "expected_status": "200" 4 | } 5 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/crd/other.yaml: -------------------------------------------------------------------------------- 1 | # TODO: working-dir -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-12/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | cypress/videos/** 3 | cypress/screenshots/** -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-12/cypress.config.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require("cypress"); 2 | 3 | module.exports = defineConfig({ 4 | e2e: { 5 | baseUrl: "https://testkube-test-page-lipsum.pages.dev/", 6 | }, 7 | }); 8 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-12/cypress/e2e/smoke2.cy.js: -------------------------------------------------------------------------------- 1 | describe('Smoke test 2', () => { 2 | it(`expect 1=1`, () => { 3 | expect('1').to.equal('1') 4 | }) 5 | }) 6 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-12/cypress/fixtures/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-12/cypress/support/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-12/cypress/support/e2e.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/test/cypress/executor-tests/cypress-12/cypress/support/e2e.js -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-12/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "cypress": "^12.7.0" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-13/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | cypress/videos/** 3 | cypress/screenshots/** -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-13/cypress.config.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require("cypress"); 2 | 3 | module.exports = defineConfig({ 4 | e2e: { 5 | baseUrl: "https://testkube-test-page-lipsum.pages.dev/", 6 | }, 7 | }); 8 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-13/cypress/e2e/smoke2.cy.js: -------------------------------------------------------------------------------- 1 | describe('Smoke test 2', () => { 2 | it(`expect 1=1`, () => { 3 | expect('1').to.equal('1') 4 | }) 5 | }) 6 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-13/cypress/fixtures/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-13/cypress/support/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-13/cypress/support/e2e.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/test/cypress/executor-tests/cypress-13/cypress/support/e2e.js -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-13/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "cypress": "^13.5.0" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-14/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | cypress/videos/** 3 | cypress/screenshots/** -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-14/cypress.config.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require("cypress"); 2 | 3 | module.exports = defineConfig({ 4 | e2e: { 5 | baseUrl: "https://testkube-test-page-lipsum.pages.dev/", 6 | }, 7 | }); 8 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-14/cypress/e2e/smoke2.cy.js: -------------------------------------------------------------------------------- 1 | describe('Smoke test 2', () => { 2 | it(`expect 1=1`, () => { 3 | expect('1').to.equal('1') 4 | }) 5 | }) 6 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-14/cypress/fixtures/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-14/cypress/support/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-14/cypress/support/e2e.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/test/cypress/executor-tests/cypress-14/cypress/support/e2e.js -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-14/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "cypress": "14.0.3" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-9/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | cypress/downloads/** 3 | cypress/screenshots/** 4 | cypress/videos/** 5 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-9/cypress.json: -------------------------------------------------------------------------------- 1 | { 2 | "baseUrl": "https://testkube-test-page-lipsum.pages.dev/" 3 | } 4 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-9/cypress/fixtures/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/test/cypress/executor-tests/cypress-9/cypress/fixtures/.gitkeep -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-9/cypress/integration/dummy_test.spec.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | describe('Testkube website', () => { 4 | it('Open Testkube website', () => { 5 | cy.visit('/') 6 | }) 7 | }) 8 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-9/cypress/plugins/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/test/cypress/executor-tests/cypress-9/cypress/plugins/.gitkeep -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-9/cypress/support/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/test/cypress/executor-tests/cypress-9/cypress/support/.gitkeep -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-9/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "cypress": "^9.7.0" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-without-envs/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | cypress/downloads/** 3 | cypress/screenshots/** 4 | cypress/videos/** 5 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-without-envs/cypress.config.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require("cypress"); 2 | 3 | module.exports = defineConfig({ 4 | e2e: { 5 | baseUrl: "https://testkube-test-page-lipsum.pages.dev/", 6 | video: false, 7 | }, 8 | }); 9 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-without-envs/cypress/e2e/smoke-without-envs-2.cy.js: -------------------------------------------------------------------------------- 1 | describe('Smoke test 2', () => { 2 | it(`expect 2=2`, () => { 3 | expect('2').to.equal('2') 4 | }) 5 | }) 6 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-without-envs/cypress/e2e/smoke-without-envs.cy.js: -------------------------------------------------------------------------------- 1 | describe('Smoke test 1', () => { 2 | it(`expect 1=1`, () => { 3 | expect('1').to.equal('1') 4 | }) 5 | }) 6 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-without-envs/cypress/fixtures/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-without-envs/cypress/support/.gitkeep: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-without-envs/cypress/support/e2e.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/test/cypress/executor-tests/cypress-without-envs/cypress/support/e2e.js -------------------------------------------------------------------------------- /test/cypress/executor-tests/cypress-without-envs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "cypress": "^10.7.0" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /test/examples/cloud-demo/tests/testsuites/k6.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v3 2 | kind: TestSuite 3 | metadata: 4 | name: k6-parallel 5 | spec: 6 | description: "k6 parallel testsuite" 7 | steps: 8 | - stopOnFailure: false 9 | execute: 10 | - test: k6-loadtest 11 | executionRequest: 12 | args: 13 | - "-vu" 14 | - "1" 15 | - test: k6-loadtest 16 | executionRequest: 17 | args: 18 | - "-vu" 19 | - "2" 20 | schedule: "52 */4 * * *" 21 | -------------------------------------------------------------------------------- /test/examples/kubecon/tests/testsuites/k6.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v3 2 | kind: TestSuite 3 | metadata: 4 | name: k6-parallel 5 | spec: 6 | description: "k6 parallel testsuite" 7 | steps: 8 | - stopOnFailure: false 9 | execute: 10 | - test: k6-loadtest 11 | executionRequest: 12 | args: 13 | - "-vu" 14 | - "1" 15 | - test: k6-loadtest 16 | executionRequest: 17 | args: 18 | - "-vu" 19 | - "2" 20 | -------------------------------------------------------------------------------- /test/executors/container-executor-curl.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: container-executor-curl 5 | spec: 6 | image: curlimages/curl:latest 7 | command: ["curl"] 8 | executor_type: container 9 | types: 10 | - container-executor-curl/test -------------------------------------------------------------------------------- /test/executors/container-executor-cypress.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: container-executor-cypress-v12.7.0 5 | spec: 6 | image: cypress/included:12.7.0 7 | executor_type: container 8 | types: 9 | - container-executor-cypress-v12.7.0/test 10 | features: 11 | - artifacts -------------------------------------------------------------------------------- /test/executors/container-executor-gradle.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: container-executor-gradle-8.5-jdk11 5 | spec: 6 | image: gradle:8.5.0-jdk11 7 | executor_type: container 8 | types: 9 | - container-executor-gradle-8.5-jdk11/test 10 | -------------------------------------------------------------------------------- /test/executors/container-executor-jmeter.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: container-executor-jmeter-5.5 5 | spec: 6 | image: justb4/jmeter:5.5 7 | command: 8 | - "jmeter" 9 | executor_type: container 10 | types: 11 | - container-executor-jmeter-5.5/test 12 | features: 13 | - artifacts 14 | -------------------------------------------------------------------------------- /test/executors/container-executor-maven.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: container-executor-maven-3.9-jdk11 5 | spec: 6 | image: maven:3.9.6-eclipse-temurin-11-focal 7 | executor_type: container 8 | types: 9 | - container-executor-maven-3.9-jdk11/test 10 | command: ["mvn", "test"] 11 | -------------------------------------------------------------------------------- /test/executors/container-executor-postman.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: container-executor-postman-newman-6-alpine 5 | spec: 6 | image: postman/newman:6-alpine 7 | executor_type: container 8 | types: 9 | - container-executor-postman-newman-6-alpine/test 10 | command: ["newman"] 11 | -------------------------------------------------------------------------------- /test/executors/container-executor-soapui.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | name: container-executor-soapui-5.7 5 | spec: 6 | image: smartbear/soapuios-testrunner:5.7.2 7 | executor_type: container 8 | types: 9 | - container-executor-soapui-5.7/test 10 | features: 11 | - artifacts 12 | -------------------------------------------------------------------------------- /test/executors/local-postman.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: executor.testkube.io/v1 2 | kind: Executor 3 | metadata: 4 | annotations: 5 | meta.helm.sh/release-name: testkube 6 | meta.helm.sh/release-namespace: default 7 | labels: 8 | app.kubernetes.io/managed-by: Helm 9 | name: local-postman-executor 10 | namespace: default 11 | spec: 12 | executor_type: rest 13 | types: 14 | - local-postman/collection 15 | uri: http://localhost:8082 16 | -------------------------------------------------------------------------------- /test/ginkgo/executor-tests/smoke-negative/smoke_negative_test.go: -------------------------------------------------------------------------------- 1 | package smoke_negative_test 2 | 3 | import ( 4 | . "github.com/onsi/ginkgo/v2" 5 | . "github.com/onsi/gomega" 6 | ) 7 | 8 | var _ = Describe("Smoke", func() { 9 | Describe("Ginkgo smoke test", func() { 10 | It("Negative test - should always fail", func() { 11 | Expect(true).To(Equal(false)) 12 | }) 13 | }) 14 | }) 15 | -------------------------------------------------------------------------------- /test/ginkgo/executor-tests/smoke-negative/smoke_suite_negative_test.go: -------------------------------------------------------------------------------- 1 | package smoke_negative_test 2 | 3 | import ( 4 | "testing" 5 | 6 | . "github.com/onsi/ginkgo/v2" 7 | . "github.com/onsi/gomega" 8 | ) 9 | 10 | func TestSmoke(t *testing.T) { 11 | RegisterFailHandler(Fail) 12 | RunSpecs(t, "Smoke Suite") 13 | } 14 | -------------------------------------------------------------------------------- /test/ginkgo/executor-tests/smoke/smoke_suite_test.go: -------------------------------------------------------------------------------- 1 | package smoke_test 2 | 3 | import ( 4 | "testing" 5 | 6 | . "github.com/onsi/ginkgo/v2" 7 | . "github.com/onsi/gomega" 8 | ) 9 | 10 | func TestSmoke(t *testing.T) { 11 | RegisterFailHandler(Fail) 12 | RunSpecs(t, "Smoke Suite") 13 | } 14 | -------------------------------------------------------------------------------- /test/ginkgo/executor-tests/smoke/smoke_test.go: -------------------------------------------------------------------------------- 1 | package smoke_test 2 | 3 | import ( 4 | . "github.com/onsi/ginkgo/v2" 5 | . "github.com/onsi/gomega" 6 | ) 7 | 8 | var _ = Describe("Smoke", func() { 9 | Describe("Ginkgo smoke test", func() { 10 | It("Positive test - should always pass", func() { 11 | Expect(true).To(Equal(true)) 12 | }) 13 | }) 14 | }) 15 | -------------------------------------------------------------------------------- /test/k6/executor-tests/k6-perf-test-gcp-discard-response-bodies.js: -------------------------------------------------------------------------------- 1 | import http from 'k6/http'; 2 | import { check } from 'k6'; 3 | 4 | export const options = { 5 | discardResponseBodies: true, 6 | }; 7 | 8 | export default function () { 9 | const res = http.get('https://storage.googleapis.com/perf-test-static-page-bucket/testkube-test-page-lorem-ipsum/index.html'); 10 | check(res, { 'status was 200': (r) => r.status == 200 }); 11 | } 12 | -------------------------------------------------------------------------------- /test/k6/executor-tests/k6-perf-test-gcp.js: -------------------------------------------------------------------------------- 1 | import http from 'k6/http'; 2 | import { check } from 'k6'; 3 | 4 | export default function () { 5 | const res = http.get('https://storage.googleapis.com/perf-test-static-page-bucket/testkube-test-page-lorem-ipsum/index.html'); 6 | check(res, { 'status was 200': (r) => r.status == 200 }); 7 | check(res, { 8 | 'verify partial text': (r) => 9 | r.body.includes('Testkube test page - Lipsum'), 10 | }); 11 | } 12 | -------------------------------------------------------------------------------- /test/k6/executor-tests/k6-perf-test.js: -------------------------------------------------------------------------------- 1 | import http from 'k6/http'; 2 | import { check } from 'k6'; 3 | 4 | export default function () { 5 | const res = http.get('https://testkube-test-page-lipsum.pages.dev/'); 6 | check(res, { 'status was 200': (r) => r.status == 200 }); 7 | check(res, { 8 | 'verify partial text': (r) => 9 | r.body.includes('Testkube test page - Lipsum'), 10 | }); 11 | } 12 | -------------------------------------------------------------------------------- /test/k6/executor-tests/k6-smoke-test-negative.js: -------------------------------------------------------------------------------- 1 | import http from 'k6/http'; 2 | 3 | throw new Error("Negative test - expected to fail"); -------------------------------------------------------------------------------- /test/k6/executor-tests/k6-smoke-test-without-envs.js: -------------------------------------------------------------------------------- 1 | import http from "k6/http"; 2 | 3 | export default function () { 4 | http.get("https://testkube-test-page-lipsum.pages.dev/"); 5 | } 6 | -------------------------------------------------------------------------------- /test/k6/executor-tests/k6-smoke-test.js: -------------------------------------------------------------------------------- 1 | import http from "k6/http"; 2 | import { check } from "k6"; 3 | 4 | if (__ENV.K6_ENV_FROM_PARAM != "K6_ENV_FROM_PARAM_value") { 5 | throw new Error("Incorrect K6_ENV_FROM_PARAM ENV value"); 6 | } 7 | 8 | if (__ENV.K6_SYSTEM_ENV != "K6_SYSTEM_ENV_value") { 9 | throw new Error("Incorrect K6_SYSTEM_ENV ENV value"); 10 | } 11 | 12 | export default function () { 13 | http.get("https://testkube-test-page-lipsum.pages.dev/"); 14 | } 15 | -------------------------------------------------------------------------------- /test/kubepug/executor-smoke/kubepug-smoke-test-negative.yaml: -------------------------------------------------------------------------------- 1 | incorrect formatting 2 | kind: SomeNonEsistingKind -------------------------------------------------------------------------------- /test/locust/locust-project/locust_test.py: -------------------------------------------------------------------------------- 1 | from locust import HttpUser, task 2 | 3 | class locust_example_test(HttpUser): 4 | @task 5 | def locust_example(self): 6 | self.client.get("/") 7 | -------------------------------------------------------------------------------- /test/locust/locust-project/requirements.txt: -------------------------------------------------------------------------------- 1 | locust==2.32.3 2 | -------------------------------------------------------------------------------- /test/nunit/nunit-project/ExampleProject/GlobalUsings.cs: -------------------------------------------------------------------------------- 1 | global using NUnit.Framework; -------------------------------------------------------------------------------- /test/pact/pact-js-project/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /test/pact/pact-js-project/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | testMatch: ['**/pact/**/*.test.js'], 3 | testEnvironment: 'node', 4 | }; 5 | -------------------------------------------------------------------------------- /test/pact/pact-js-project/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "@pact-foundation/pact": "^15.0.1", 4 | "jest": "^29.7.0", 5 | "superagent": "^10.2.0" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /test/pact/pact-js-project/pact/logs/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/test/pact/pact-js-project/pact/logs/.gitkeep -------------------------------------------------------------------------------- /test/pact/pact-js-project/pact/pacts/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kubeshop/testkube/2d3b9998a5425f7dda74301a92111eb5051d9e9b/test/pact/pact-js-project/pact/pacts/.gitkeep -------------------------------------------------------------------------------- /test/perf/api-server.js: -------------------------------------------------------------------------------- 1 | import http from 'k6/http'; 2 | import { sleep,check } from 'k6'; 3 | 4 | export default function () { 5 | 6 | const baseURI = `${__ENV.TESTKUBE_API_URI || 'http://testkube-api-server:8088'}`; 7 | 8 | check(http.get(`${baseURI}/v1/info`), { 9 | 'api server should return version': r => r.json()["version"] != undefined && r.json()["version"] != "", 10 | 'api server should return commit': r => r.json()["commit"] != undefined && r.json()["commit"] != "", 11 | }); 12 | 13 | 14 | sleep(1); 15 | } 16 | 17 | -------------------------------------------------------------------------------- /test/perf/testkube-homepage.js: -------------------------------------------------------------------------------- 1 | import http from "k6/http"; 2 | import { sleep, check } from "k6"; 3 | 4 | export default function () { 5 | const baseURI = `${ 6 | __ENV.TESTKUBE_HOMEPAGE_URI || 7 | "https://testkube-test-page-lipsum.pages.dev/" 8 | }`; 9 | check(http.get(`${baseURI}/`), { 10 | "check testkube homepage home page": (r) => r.body.includes("Testkube"), 11 | }); 12 | 13 | sleep(1); 14 | } 15 | -------------------------------------------------------------------------------- /test/playwright/executor-tests/playwright-project/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "playwright", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": {}, 7 | "keywords": [], 8 | "author": "", 9 | "license": "ISC", 10 | "devDependencies": { 11 | "@playwright/test": "1.32.3" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /test/playwright/executor-tests/playwright-project/tests/smoke.spec.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | const { test, expect } = require("@playwright/test"); 3 | 4 | test("Smoke 1 - has title", async ({ page }) => { 5 | await page.goto("https://testkube-test-page-lipsum.pages.dev/"); 6 | 7 | await expect(page).toHaveTitle(/Testkube/); 8 | }); 9 | -------------------------------------------------------------------------------- /test/playwright/executor-tests/playwright-project/tests/smoke2.spec.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | const { test, expect } = require("@playwright/test"); 3 | 4 | test("Smoke 2 - has title", async ({ page }) => { 5 | await page.goto("https://testkube-test-page-lipsum.pages.dev/"); 6 | 7 | await expect(page).toHaveTitle(/Testkube/); 8 | }); 9 | -------------------------------------------------------------------------------- /test/pytest/pytest-project/pytest.ini: -------------------------------------------------------------------------------- 1 | # pytest.ini 2 | [pytest] 3 | junit_suite_name = Smoke Test Suite 4 | -------------------------------------------------------------------------------- /test/pytest/pytest-project/requirements.txt: -------------------------------------------------------------------------------- 1 | pytest==8.3.3 2 | -------------------------------------------------------------------------------- /test/pytest/pytest-project/tests/fail/smoke-3-fail_test.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | def test_AAA(): 4 | assert 1 == 2 5 | 6 | def test_BBB(): 7 | time.sleep(3) 8 | assert 1 == 1 9 | 10 | def test_CCC(): 11 | assert 1 == 2 12 | 13 | def test_DDD(): 14 | time.sleep(2) 15 | assert 1 == 1 16 | -------------------------------------------------------------------------------- /test/pytest/pytest-project/tests/success/smoke-2_test.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | def test_lorem(): 4 | time.sleep(1) 5 | assert 1 == 1 6 | 7 | def test_ipsum(): 8 | time.sleep(3) 9 | assert 1 == 1 10 | 11 | def test_dolor(): 12 | assert 1 == 1 13 | 14 | def test_sit(): 15 | time.sleep(5) 16 | assert 1 == 1 17 | 18 | def test_amet(): 19 | time.sleep(2) 20 | assert 1 == 1 21 | -------------------------------------------------------------------------------- /test/pytest/pytest-project/tests/success/smoke_test.py: -------------------------------------------------------------------------------- 1 | import time 2 | 3 | def test_1(): 4 | assert 1 == 1 5 | 6 | def test_2(): 7 | time.sleep(3) 8 | assert 1 == 1 9 | 10 | def test_3(): 11 | assert 1 == 1 12 | 13 | def test_4(): 14 | time.sleep(2) 15 | assert 1 == 1 16 | -------------------------------------------------------------------------------- /test/suites/executor-artillery-smoke-tests.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v3 2 | kind: TestSuite 3 | metadata: 4 | name: executor-artillery-smoke-tests 5 | labels: 6 | core-tests: executors 7 | spec: 8 | description: artillery executor smoke tests 9 | steps: 10 | - stopOnFailure: false 11 | execute: 12 | - test: artillery-executor-smoke 13 | - test: artillery-executor-smoke-negative -------------------------------------------------------------------------------- /test/suites/executor-common-smoke-tests.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "executor-common-smoke-tests", 3 | "description": "Reduced common test suite for executors", 4 | "steps": [ 5 | {"execute": [{"test": "cypress-default-executor-smoke-electron"}]}, 6 | {"execute": [{"test": "cypress-default-executor-smoke-electron-testsource-git-dir"}]}, 7 | {"execute": [{"test": "postman-executor-smoke"}]}, 8 | {"execute": [{"test": "postman-executor-smoke-testsource-git-file"}]}, 9 | {"execute": [{"test": "k6-executor-smoke"}]} 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /test/suites/executor-container-curl-smoke-tests.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v3 2 | kind: TestSuite 3 | metadata: 4 | name: executor-container-curl-smoke-tests 5 | labels: 6 | core-tests: executors 7 | spec: 8 | description: "container executor curl smoke tests" 9 | steps: 10 | - stopOnFailure: false 11 | execute: 12 | - test: container-executor-curl-smoke 13 | - stopOnFailure: false 14 | execute: 15 | - test: container-executor-curl-smoke-negative 16 | -------------------------------------------------------------------------------- /test/suites/executor-container-gradle-smoke-tests.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v3 2 | kind: TestSuite 3 | metadata: 4 | name: executor-container-gradle-smoke-tests 5 | labels: 6 | core-tests: executors 7 | spec: 8 | description: "container executor gradle smoke tests" 9 | steps: 10 | - stopOnFailure: false 11 | execute: 12 | - test: container-executor-gradle-jdk-11 13 | -------------------------------------------------------------------------------- /test/suites/executor-container-jmeter-smoke-tests.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v3 2 | kind: TestSuite 3 | metadata: 4 | name: executor-container-jmeter-smoke-tests 5 | labels: 6 | app: testkube 7 | spec: 8 | description: "container executor jmeter smoke tests" 9 | steps: 10 | - stopOnFailure: false 11 | execute: 12 | - test: container-executor-jmeter-smoke 13 | -------------------------------------------------------------------------------- /test/suites/executor-container-maven-smoke-tests.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v3 2 | kind: TestSuite 3 | metadata: 4 | name: executor-container-maven-smoke-tests 5 | labels: 6 | core-tests: executors 7 | spec: 8 | description: "container executor maven smoke tests" 9 | steps: 10 | - stopOnFailure: false 11 | execute: 12 | - test: container-executor-maven-jdk-11 13 | -------------------------------------------------------------------------------- /test/suites/executor-container-playwright-smoke-tests.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v3 2 | kind: TestSuite 3 | metadata: 4 | name: executor-container-playwright-smoke-tests 5 | labels: 6 | core-tests: executors 7 | spec: 8 | description: "container executor playwright smoke tests" 9 | steps: 10 | - stopOnFailure: false 11 | execute: 12 | - test: container-executor-playwright-smoke 13 | - stopOnFailure: false 14 | execute: 15 | - test: container-executor-playwright-smoke-args -------------------------------------------------------------------------------- /test/suites/executor-container-postman-smoke-tests.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v3 2 | kind: TestSuite 3 | metadata: 4 | name: executor-container-postman-smoke-tests 5 | labels: 6 | core-tests: executors 7 | spec: 8 | description: "container executor postman smoke tests" 9 | steps: 10 | - stopOnFailure: false 11 | execute: 12 | - test: container-executor-postman-smoke 13 | -------------------------------------------------------------------------------- /test/suites/executor-container-soapui-smoke-tests.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v3 2 | kind: TestSuite 3 | metadata: 4 | name: executor-container-soapui-smoke-tests 5 | labels: 6 | app: testkube 7 | spec: 8 | description: "container executor soapui smoke tests" 9 | steps: 10 | - stopOnFailure: false 11 | execute: 12 | - test: container-executor-soapui-smoke 13 | -------------------------------------------------------------------------------- /test/suites/executor-curl-smoke-tests.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v3 2 | kind: TestSuite 3 | metadata: 4 | name: executor-curl-smoke-tests 5 | labels: 6 | core-tests: executors 7 | spec: 8 | description: "curl executor smoke tests" 9 | steps: 10 | - stopOnFailure: false 11 | execute: 12 | - test: curl-executor-smoke 13 | - stopOnFailure: false 14 | execute: 15 | - test: curl-executor-smoke-directory 16 | - stopOnFailure: false 17 | execute: 18 | - test: curl-executor-smoke-negative 19 | -------------------------------------------------------------------------------- /test/suites/executor-ginkgo-smoke-tests.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v3 2 | kind: TestSuite 3 | metadata: 4 | name: executor-ginkgo-smoke-tests 5 | labels: 6 | core-tests: executors 7 | spec: 8 | description: "ginkgo executor smoke tests" 9 | steps: 10 | - stopOnFailure: false 11 | execute: 12 | - test: ginkgo-executor-smoke 13 | - stopOnFailure: false 14 | execute: 15 | - test: ginkgo-executor-smoke-negative 16 | -------------------------------------------------------------------------------- /test/suites/executor-k6-other-tests.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v3 2 | kind: TestSuite 3 | metadata: 4 | name: executor-k6-other-tests 5 | labels: 6 | core-tests: executors 7 | spec: 8 | description: "k6 executor - other tests and edge-cases" 9 | steps: 10 | - stopOnFailure: false 11 | execute: 12 | - test: k6-executor-smoke-directory 13 | -------------------------------------------------------------------------------- /test/suites/executor-k6-smoke-tests.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v3 2 | kind: TestSuite 3 | metadata: 4 | name: executor-k6-smoke-tests 5 | labels: 6 | core-tests: executors 7 | spec: 8 | description: "k6 executor smoke tests" 9 | steps: 10 | - stopOnFailure: false 11 | execute: 12 | - test: k6-executor-smoke 13 | - stopOnFailure: false 14 | execute: 15 | - test: k6-executor-smoke-git-file 16 | - stopOnFailure: false 17 | execute: 18 | - test: k6-executor-smoke-negative 19 | -------------------------------------------------------------------------------- /test/suites/executor-kubepug-smoke-tests.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v3 2 | kind: TestSuite 3 | metadata: 4 | name: executor-kubepug-smoke-tests 5 | labels: 6 | core-tests: executors 7 | spec: 8 | description: "kubepug executor smoke tests" 9 | steps: 10 | - stopOnFailure: false 11 | execute: 12 | - test: kubepug-executor-smoke 13 | - stopOnFailure: false 14 | execute: 15 | - test: kubepug-executor-smoke-negative 16 | -------------------------------------------------------------------------------- /test/suites/executor-playwright-smoke-tests.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v3 2 | kind: TestSuite 3 | metadata: 4 | name: executor-playwright-smoke-tests 5 | labels: 6 | core-tests: executors 7 | spec: 8 | description: "playwright executor smoke tests" 9 | steps: 10 | - stopOnFailure: false 11 | execute: 12 | - test: playwright-executor-smoke 13 | -------------------------------------------------------------------------------- /test/suites/executor-soapui-smoke-tests.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: tests.testkube.io/v3 2 | kind: TestSuite 3 | metadata: 4 | name: executor-soapui-smoke-tests 5 | labels: 6 | core-tests: executors 7 | spec: 8 | description: "soapui executor smoke tests" 9 | steps: 10 | - stopOnFailure: false 11 | execute: 12 | - test: soapui-executor-smoke 13 | - stopOnFailure: false 14 | execute: 15 | - test: soapui-executor-smoke-negative 16 | -------------------------------------------------------------------------------- /test/suites/test-workflows/artillery-workflow.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: testworkflows.testkube.io/v1 2 | kind: TestWorkflow 3 | metadata: 4 | name: artillery-workflow-suite 5 | labels: 6 | core-tests: workflows-suite 7 | type: suite 8 | tool: artillery 9 | spec: 10 | steps: 11 | - execute: 12 | parallelism: 2 13 | workflows: 14 | - name: artillery-workflow-smoke 15 | - name: artillery-workflow-smoke-template 16 | - name: distributed-artillery-workflow-smoke-artifacts 17 | -------------------------------------------------------------------------------- /test/suites/test-workflows/combined-workflow-test.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: testworkflows.testkube.io/v1 2 | kind: TestWorkflow 3 | metadata: 4 | name: artillery-workflow-suite-combined 5 | labels: 6 | core-tests: workflows-suite 7 | type: suite 8 | tool: artillery 9 | spec: 10 | steps: 11 | - execute: 12 | workflows: 13 | - name: artillery-workflow-smoke 14 | tests: 15 | - name: artillery-executor-smoke 16 | -------------------------------------------------------------------------------- /test/suites/test-workflows/cron/dev/full-smoke-cron.yaml: -------------------------------------------------------------------------------- 1 | kind: TestWorkflow 2 | apiVersion: testworkflows.testkube.io/v1 3 | metadata: 4 | name: tw-suite-full-smoke-cron-trigger 5 | labels: 6 | core-tests: workflows-suite-trigger 7 | type: suite-trigger 8 | spec: 9 | steps: 10 | - execute: 11 | workflows: 12 | - name: tw-suite-full-smoke 13 | events: 14 | - cronjob: 15 | cron: "30 */4 * * *" # every 4 hours 16 | -------------------------------------------------------------------------------- /test/suites/test-workflows/cron/dev/small-smoke-cron.yaml: -------------------------------------------------------------------------------- 1 | kind: TestWorkflow 2 | apiVersion: testworkflows.testkube.io/v1 3 | metadata: 4 | name: tw-suite-small-smoke-cron-trigger 5 | labels: 6 | core-tests: workflows-suite-trigger 7 | type: suite-trigger 8 | spec: 9 | steps: 10 | - execute: 11 | workflows: 12 | - name: tw-suite-small-smoke 13 | events: 14 | - cronjob: 15 | cron: "0,20,40 * * * *" # every 20 minutes 16 | -------------------------------------------------------------------------------- /test/suites/test-workflows/cron/dev/testkube-multiagent-targets-workflow-cron.yaml: -------------------------------------------------------------------------------- 1 | kind: TestWorkflow 2 | apiVersion: testworkflows.testkube.io/v1 3 | metadata: 4 | name: testkube-multiagent-targets-workflow-suite-cron-trigger 5 | labels: 6 | core-tests: workflows-suite-trigger 7 | type: suite-trigger 8 | spec: 9 | steps: 10 | - execute: 11 | workflows: 12 | - name: testkube-multiagent-targets-workflow-suite 13 | events: 14 | - cronjob: 15 | cron: "*/50 */4 * * *" # every 4 hours 16 | -------------------------------------------------------------------------------- /test/suites/test-workflows/cron/sandbox/small-smoke-cron.yaml: -------------------------------------------------------------------------------- 1 | kind: TestWorkflow 2 | apiVersion: testworkflows.testkube.io/v1 3 | metadata: 4 | name: tw-suite-small-sandbox-smoke-cron-trigger 5 | labels: 6 | core-tests: workflows-suite-trigger 7 | type: suite-trigger 8 | spec: 9 | steps: 10 | - execute: 11 | workflows: 12 | - name: tw-suite-small-smoke 13 | events: 14 | - cronjob: 15 | cron: "15 */2 * * *" # every 2 hours 16 | -------------------------------------------------------------------------------- /test/suites/test-workflows/curl-workflow.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: testworkflows.testkube.io/v1 2 | kind: TestWorkflow 3 | metadata: 4 | name: curl-workflow-suite 5 | labels: 6 | core-tests: workflows-suite 7 | type: suite 8 | tool: curl 9 | spec: 10 | steps: 11 | - execute: 12 | parallelism: 2 13 | workflows: 14 | - name: curl-workflow-smoke 15 | - name: curl-workflow-smoke-matrix 16 | 17 | -------------------------------------------------------------------------------- /test/suites/test-workflows/gradle-workflow.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: testworkflows.testkube.io/v1 2 | kind: TestWorkflow 3 | metadata: 4 | name: gradle-workflow-suite 5 | labels: 6 | core-tests: workflows-suite 7 | type: suite 8 | tool: gradle 9 | spec: 10 | steps: 11 | - execute: 12 | parallelism: 2 13 | workflows: 14 | - name: gradle-workflow-smoke-jdk11 15 | - name: gradle-workflow-smoke-jdk11-default-command 16 | - name: gradle-workflow-smoke-jdk11-from-template 17 | -------------------------------------------------------------------------------- /test/suites/test-workflows/junit-workflow.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: testworkflows.testkube.io/v1 2 | kind: TestWorkflow 3 | metadata: 4 | name: junit-workflow-suite 5 | labels: 6 | core-tests: workflows-suite 7 | type: suite 8 | tool: junit 9 | spec: 10 | steps: 11 | - execute: 12 | parallelism: 2 13 | workflows: 14 | - name: junit5-workflow-smoke 15 | -------------------------------------------------------------------------------- /test/suites/test-workflows/locust-workflow.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: testworkflows.testkube.io/v1 2 | kind: TestWorkflow 3 | metadata: 4 | name: locust-workflow-suite 5 | labels: 6 | core-tests: workflows-suite 7 | type: suite 8 | tool: locust 9 | spec: 10 | steps: 11 | - execute: 12 | parallelism: 2 13 | workflows: 14 | - name: locust-workflow-smoke 15 | - name: distributed-locust-workflow-smoke 16 | -------------------------------------------------------------------------------- /test/suites/test-workflows/maven-workflow.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: testworkflows.testkube.io/v1 2 | kind: TestWorkflow 3 | metadata: 4 | name: maven-workflow-suite 5 | labels: 6 | core-tests: workflows-suite 7 | type: suite 8 | tool: maven 9 | spec: 10 | steps: 11 | - execute: 12 | parallelism: 2 13 | workflows: 14 | - name: maven-workflow-smoke-jdk11 15 | - name: maven-workflow-smoke-jdk11-from-template 16 | -------------------------------------------------------------------------------- /test/suites/test-workflows/nunit-workflow.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: testworkflows.testkube.io/v1 2 | kind: TestWorkflow 3 | metadata: 4 | name: nunit-workflow-suite 5 | labels: 6 | core-tests: workflows-suite 7 | type: suite 8 | tool: nunit 9 | spec: 10 | steps: 11 | - execute: 12 | parallelism: 2 13 | workflows: 14 | - name: nunit-workflow-smoke-junit-report 15 | -------------------------------------------------------------------------------- /test/suites/test-workflows/pact-workflow.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: testworkflows.testkube.io/v1 2 | kind: TestWorkflow 3 | metadata: 4 | name: pact-workflow-suite 5 | labels: 6 | core-tests: workflows-suite 7 | type: suite 8 | tool: pact 9 | spec: 10 | steps: 11 | - execute: 12 | parallelism: 2 13 | workflows: 14 | - name: pact-js-workflow-smoke -------------------------------------------------------------------------------- /test/suites/test-workflows/pytest-workflow.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: testworkflows.testkube.io/v1 2 | kind: TestWorkflow 3 | metadata: 4 | name: pytest-workflow-suite 5 | labels: 6 | core-tests: workflows-suite 7 | type: suite 8 | tool: pytest 9 | spec: 10 | steps: 11 | - execute: 12 | parallelism: 2 13 | workflows: 14 | - name: pytest-workflow-smoke 15 | - name: pytest-workflow-smoke-junit-success-only 16 | -------------------------------------------------------------------------------- /test/suites/test-workflows/soapui-workflow.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: testworkflows.testkube.io/v1 2 | kind: TestWorkflow 3 | metadata: 4 | name: soapui-workflow-suite 5 | labels: 6 | core-tests: workflows-suite 7 | type: suite 8 | tool: soapui 9 | spec: 10 | steps: 11 | - execute: 12 | parallelism: 2 13 | workflows: 14 | - name: soapui-workflow-smoke 15 | -------------------------------------------------------------------------------- /test/suites/testsuite-example-1.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test-example-1", 3 | "description": "Run test several times", 4 | "steps": [ 5 | {"execute": [{"test": "testkube-dashboard"}]}, 6 | {"execute": [{"delay": "5s"}]}, 7 | {"execute": [{"test": "testkube-todo-api"}]}, 8 | {"execute": [{"delay": "5s"}]}, 9 | {"execute": [{"test": "testkube-todo-frontend"}]}, 10 | {"execute": [{"delay": "5s"}]}, 11 | {"execute": [{"test": "kubeshop-site"}]} 12 | ] 13 | } 14 | 15 | -------------------------------------------------------------------------------- /test/suites/testsuite-example-3.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test-example-3", 3 | "description": "Tests fast first", 4 | "steps": [ 5 | {"execute": [{"test": "testkube-variables-test"}]}, 6 | {"execute": [{"delay": "1s"}]}, 7 | {"execute": [{"test": "testkube-variables-test"}]} 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /test/suites/testsuite-testkube-failing-sof.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "testkube", 3 | "description": "Failing Testkube testsuite", 4 | "steps": [ 5 | {"execute": [{"test": "testkube-api-failing"}], "stopOnFailure": true}, 6 | {"execute": [{"delay": "1s"}]}, 7 | {"execute": [{"test": "testkube-dashboard"}]}, 8 | {"execute": [{"delay": "1s"}]}, 9 | {"execute": [{"test": "testkube-api-performance"}]}, 10 | {"execute": [{"delay": "1s"}]}, 11 | {"execute": [{"test": "testkube-homepage-performance"}]} 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /test/suites/testsuite-testkube-failing.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "testkube", 3 | "description": "Failing Testkube testsuite", 4 | "steps": [ 5 | {"execute": [{"test": "testkube-dashboard"}]}, 6 | {"execute": [{"delay": "1s"}]}, 7 | {"execute": [{"test": "testkube-api-performance"}]}, 8 | {"execute": [{"delay": "1s"}]}, 9 | {"execute": [{"test": "testkube-api-failing"}]}, 10 | {"execute": [{"delay": "1s"}]}, 11 | {"execute": [{"test": "testkube-homepage-performance"}]} 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /test/suites/testsuite-testkube.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "testkube", 3 | "description": "Testkube test suite, api, dashboard and performance", 4 | "steps": [ 5 | {"execute": [{"test": "testkube-api"}]}, 6 | {"execute": [{"delay": "1s"}]}, 7 | {"execute": [{"test": "testkube-dashboard"}]}, 8 | {"execute": [{"delay": "1s"}]}, 9 | {"execute": [{"test": "testkube-api-performance"}]}, 10 | {"execute": [{"delay": "1s"}]}, 11 | {"execute": [{"test": "testkube-homepage-performance"}]} 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /test/testkube/installation-tests/enterprise-installation-expect-file.exp: -------------------------------------------------------------------------------- 1 | #!/usr/bin/expect -f 2 | 3 | set timeout -1 ;# disable the default 10s timeout 4 | 5 | spawn {*}$env(TESTKUBE_INIT_COMMAND) 6 | # Confirm credentials are copied 7 | expect "Do you want to continue?" 8 | send "y" ;# No return key on choices in Testkube CLI! 9 | # Don't open the dashboard 10 | expect "Do you want to open the dashboard?" 11 | send "n" 12 | expect eof 13 | --------------------------------------------------------------------------------