frisbee

Kubernetes-native framework for declarative testing of distributed systems.

https://github.com/carv-ics-forth/frisbee

Science Score: 44.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
    Found CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
    Found .zenodo.json file
  • DOI references
  • Academic publication links
  • Academic email domains
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (15.4%) to scientific vocabulary

Keywords

benchmarking-suite chaos-engineering e2e-testing fault-detection-and-diagnosis kubernetes load-testing scalability-analysis testing
Last synced: 6 months ago · JSON representation ·

Repository

Kubernetes-native framework for declarative testing of distributed systems.

Basic Info
  • Host: GitHub
  • Owner: CARV-ICS-FORTH
  • License: apache-2.0
  • Language: Go
  • Default Branch: main
  • Homepage: https://frisbee.dev
  • Size: 128 MB
Statistics
  • Stars: 51
  • Watchers: 5
  • Forks: 5
  • Open Issues: 26
  • Releases: 41
Topics
benchmarking-suite chaos-engineering e2e-testing fault-detection-and-diagnosis kubernetes load-testing scalability-analysis testing
Created over 4 years ago · Last pushed 6 months ago
Metadata Files
Readme Changelog Contributing License Citation

README.md

Frisbee - A Test Automation Framework For Kubernetes

Website | Blog | Docs | Contact

What is Frisbee ?

Frisbee is the first Kubernetes framework designed to support declarative end-to-end system testing of containerized applications.

:heavycheckmark: Design end-to-end testing scenarios in an intuitive language!

:heavycheckmark: Run the actual production software - no mocks!

:heavycheckmark: Replay complex workloads through automated workflows!

:heavycheckmark: Combine Chaos Engineering with large-scale performance testing!

:heavycheckmark: Verify program behavior through programmable assertions!

To learn more about Frisbee, check the Walkthrough tutorial or visit our Website.

Testing Patterns

In declarative testing, a test scenario focuses on what to accomplish rather than on the imperative details of how to manipulate the state of an application under test and verify the final application state against an expected state.

This approach not make tests more readable, maintainable, and reproducible, but it also help devops in identifying testing patterns.

Here, you can see some testing patterns we have identified across different application domains.

👉 Databases

👉 Federated Learning

👉 HPC

👉 CI

Getting Started

Step 1 – Prerequsities:

To run Frisbee you must have access to a running Kubernetes cluster and ensure that kubectl and Helm are installed on your system.

For quick testing, you can use microk8s to deploy a local Kubernetes cluster on your machine.

shell sudo microk8s config > ~/.kube/config sudo microk8s enable dns sudo microk8s enable ingress sudo microk8s enable helm3 sudo snap alias microk8s.kubectl kubectl sudo snap alias microk8s.helm3 helm

Step 2 – Install Frisbee on K8s cluster:

Firstly, we need to download the Frisbee CLI:

shell curl -sSLf https://frisbee.dev/install.sh | sudo bash export PATH=$PATH:/usr/local/bin

Since the majority of Frisbee operations happens through this CLI, it is suggested to enable the autocompletion.

shell source <(kubectl-frisbee completion bash)

As usual, use tab twice to get the CLI fields auto-completed.

The next step is to install Frisbee in your Kubernetes cluster.

shell kubectl-frisbee install production kubectl logs -l control-plane=frisbee-operator -n frisbee --follow

Finally, you can download the Frisbee project to get access to the ready-to-use examples.

shell git clone git@github.com:CARV-ICS-FORTH/frisbee.git cd frisbee

Step 3 – Submit a testing job:

To submit a testing job, the general syntax is:

shell kubectl-frisbee submit test <testName> <scenario.yaml> <path to dependent charts>

Conventionally, we separate the test-cases from the templates of the system under evaluation.

  • examples: contains a list of test-cases.
  • charts: contains Helm charts that provide templates used in the test-cases.

Let's try to run a scenario from the tutorial.

shell kubectl-frisbee submit test demo- ./examples/tutorial/15.performance-monitoring.yml ./examples/apps/iperf2/ ./charts/system/ * demo-: demo is the naming prefix, and the - indicate an autogenerated postfix (e.g, demo-326) * ./examples/tutorial/15.performance-monitoring.yml: the scenario executes the iperf benchmark and the monitoring stack for observing its execution. * ./examples/apps/iperf2: provides the application templates used within the scenario. * ./charts/system: provides system-wide templates for the telemetry stack, chaos injection, etc.

Inspect Submitted Jobs:

To get a list of submitted tests, use:

shell kubectl frisbee get tests

Note that every test-case runs on a dedicated namespace (named after the test). To further dive into execution details use:

shell kubectl frisbee inspect tests demo-326

Step 4 – Live Progress Monitoring:

The last section of inspect provides the URLs for accessing Prometheus/Grafana.

Note that every scenario has its own monitoring stack in order to avoid interfering metrics.

shell firefox $(kubectl frisbee inspect tests demo-326 | grep grafana- | awk '{print $3'})

In contrast to the vanilla Grafana which plots only the performance metrics, Frisbee provides Contextualized Visualizations that contain information for:

  • Joining nodes (blue vertical lines)
  • Exiting nodes (orange vertical lines)
  • Fault-Injection (red ranges)

Information like that helps in root-cause analysis, as it makes it easy to correlate an observed behavior back to a testing event.

For example, in the next figure, it fairly easy to understand that INSERT_ERROR messages (yellow line) are triggered by a fault-injection event.

Step 5 – Auto-generate test reports:

Finally, Frisbee provides an advanced functionality for auto-generating reports for the tests.

shell kubectl-frisbee report test demo-326 ~/frisbee-reports --pdf --force

This will create report on ~/frisbee-reports directory including the pdf from Grafana.

Features

👉 Workflow templating to store commonly used workflows in the cluster.

👉 DAG based declaration of testing workflows.

👉 Step level input & outputs (template parameterization).

👉 Conditional Execution (Time-Driven, Status-Driven, Performance-Driven).

👉 Live Progress monitoring via Prometheus/Grafana.

👉 Assertions and alerting of SLA violations.

👉 Placement Policies (affinity/tolerations/node selectors).

👉 Archiving Test results after executing for later access.

👉 Garbage collection of completed resources.

👉 Chaos-Engineering and Fault-Injection via Chaos-Mesh.

👉 On-Demand reliable container attached storage.

👉 CLI applications to test management and test inspection.

Citation

If you publish work that uses Frisbee, please cite Frisbee as follows:

bibtex @article{nikolaidis2021frisbee, title={Frisbee: automated testing of Cloud-native applications in Kubernetes}, author={Nikolaidis, Fotis and Chazapis, Antony and Marazakis, Manolis and Bilas, Angelos}, journal={arXiv preprint arXiv:2109.10727}, year={2021} }

Contributing to Frisbee

We welcome contributions. Please see CONTRIBUTING.md to get started!

Acknowledgements

This project has received funding from the European Union's Horizon 2020 research and innovation programme under grant agreement No. 894204 (Ether, H2020-MSCA-IF-2019).

Owner

  • Name: Computer Architecture and VLSI Systems (CARV) Laboratory
  • Login: CARV-ICS-FORTH
  • Kind: organization
  • Location: Heraklion, Greece

Citation (CITATION.cff)

cff-version: 1.1.0
message: "If you use this software, please cite it as below."
authors:
- family-names: "Nikolaidis"
  given-names: "Fotis"
  orcid: "https://orcid.org/0000-0002-9379-6233"
title: "frisbee: a Kubernetes-native platform for exploring, testing, and benchmarking distributed applications"
version: 1.0.0
doi: 10.5281/zenodo.5566624
date-released: 2021-11-08
url: "https://github.com/CARV-ICS-FORTH/frisbee"

GitHub Events

Total
  • Watch event: 4
  • Push event: 293
Last Year
  • Watch event: 4
  • Push event: 293

Issues and Pull Requests

Last synced: 6 months ago

All Time
  • Total issues: 56
  • Total pull requests: 96
  • Average time to close issues: 2 months
  • Average time to close pull requests: about 5 hours
  • Total issue authors: 2
  • Total pull request authors: 2
  • Average comments per issue: 0.18
  • Average comments per pull request: 0.01
  • Merged pull requests: 95
  • Bot issues: 0
  • Bot pull requests: 0
Past Year
  • Issues: 0
  • Pull requests: 1
  • Average time to close issues: N/A
  • Average time to close pull requests: about 8 hours
  • Issue authors: 0
  • Pull request authors: 1
  • Average comments per issue: 0
  • Average comments per pull request: 1.0
  • Merged pull requests: 1
  • Bot issues: 0
  • Bot pull requests: 0
Top Authors
Issue Authors
  • fnikolai (39)
  • kdamaski (8)
Pull Request Authors
  • fnikolai (82)
  • URunDEAD (2)
Top Labels
Issue Labels
Pull Request Labels

Packages

  • Total packages: 2
  • Total downloads: unknown
  • Total dependent packages: 0
    (may contain duplicates)
  • Total dependent repositories: 0
    (may contain duplicates)
  • Total versions: 83
proxy.golang.org: github.com/carv-ics-forth/frisbee

Package embed is used to embed the various required scripts into the Frisbee Terminal. This allows to execute the Terminal from any path. For more info see https://zetcode.com/golang/embed/

  • Versions: 42
  • Dependent Packages: 0
  • Dependent Repositories: 0
Rankings
Stargazers count: 3.8%
Forks count: 5.5%
Average: 6.4%
Dependent packages count: 7.0%
Dependent repos count: 9.3%
Last synced: 6 months ago
proxy.golang.org: github.com/CARV-ICS-FORTH/frisbee
  • Versions: 41
  • Dependent Packages: 0
  • Dependent Repositories: 0
Rankings
Dependent packages count: 7.0%
Average: 8.2%
Dependent repos count: 9.3%
Last synced: 6 months ago

Dependencies

go.mod go
  • cloud.google.com/go v0.81.0
  • github.com/Azure/go-autorest v14.2.0+incompatible
  • github.com/Azure/go-autorest/autorest v0.11.12
  • github.com/Azure/go-autorest/autorest/adal v0.9.5
  • github.com/Azure/go-autorest/autorest/date v0.3.0
  • github.com/Azure/go-autorest/logger v0.2.0
  • github.com/Azure/go-autorest/tracing v0.6.0
  • github.com/Knetic/govaluate v3.0.0+incompatible
  • github.com/Masterminds/goutils v1.1.1
  • github.com/Masterminds/semver/v3 v3.1.1
  • github.com/Masterminds/sprig/v3 v3.2.2
  • github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e
  • github.com/beorn7/perks v1.0.1
  • github.com/cespare/xxhash/v2 v2.1.1
  • github.com/davecgh/go-spew v1.1.1
  • github.com/evanphx/json-patch v4.11.0+incompatible
  • github.com/form3tech-oss/jwt-go v3.2.2+incompatible
  • github.com/fsnotify/fsnotify v1.4.9
  • github.com/go-logr/logr v0.4.0
  • github.com/go-logr/zapr v0.4.0
  • github.com/gogo/protobuf v1.3.2
  • github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e
  • github.com/golang/protobuf v1.5.2
  • github.com/golanghelper/grafana-webhook v0.0.0-20180512191629-e0da26114467
  • github.com/google/go-cmp v0.5.5
  • github.com/google/gofuzz v1.1.0
  • github.com/google/uuid v1.1.2
  • github.com/googleapis/gnostic v0.5.5
  • github.com/gosimple/slug v1.9.0
  • github.com/grafana-tools/sdk v0.0.0-20211015115518-56cdea6a09d6
  • github.com/hashicorp/golang-lru v0.5.4
  • github.com/huandu/xstrings v1.3.1
  • github.com/imdario/mergo v0.3.12
  • github.com/json-iterator/go v1.1.11
  • github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369
  • github.com/mitchellh/copystructure v1.0.0
  • github.com/mitchellh/mapstructure v1.4.1
  • github.com/mitchellh/reflectwalk v1.0.0
  • github.com/moby/spdystream v0.2.0
  • github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd
  • github.com/modern-go/reflect2 v1.0.1
  • github.com/nxadm/tail v1.4.8
  • github.com/onsi/ginkgo v1.16.4
  • github.com/onsi/gomega v1.13.0
  • github.com/orcaman/concurrent-map v0.0.0-20210501183033-44dafcb38ecc
  • github.com/pkg/errors v0.9.1
  • github.com/prometheus/client_golang v1.11.0
  • github.com/prometheus/client_model v0.2.0
  • github.com/prometheus/common v0.32.0
  • github.com/prometheus/procfs v0.6.0
  • github.com/rainycape/unidecode v0.0.0-20150907023854-cb7f23ec59be
  • github.com/robfig/cron/v3 v3.0.1
  • github.com/shopspring/decimal v1.2.0
  • github.com/sirupsen/logrus v1.7.0
  • github.com/spf13/cast v1.3.1
  • github.com/spf13/pflag v1.0.5
  • go.uber.org/atomic v1.7.0
  • go.uber.org/multierr v1.6.0
  • go.uber.org/zap v1.17.0
  • golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83
  • golang.org/x/lint v0.0.0-20210508222113-6edffad5e616
  • golang.org/x/net v0.0.0-20210525063256-abc453219eb5
  • golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c
  • golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c
  • golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d
  • golang.org/x/text v0.3.6
  • golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6
  • golang.org/x/tools v0.1.2
  • gomodules.xyz/jsonpatch/v2 v2.2.0
  • google.golang.org/appengine v1.6.7
  • google.golang.org/protobuf v1.26.0
  • gopkg.in/inf.v0 v0.9.1
  • gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7
  • gopkg.in/yaml.v2 v2.4.0
  • gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
  • k8s.io/api v0.21.2
  • k8s.io/apiextensions-apiserver v0.21.2
  • k8s.io/apimachinery v0.21.2
  • k8s.io/client-go v0.21.2
  • k8s.io/component-base v0.21.2
  • k8s.io/klog/v2 v2.8.0
  • k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7
  • k8s.io/utils v0.0.0-20210527160623-6fdb442a123b
  • sigs.k8s.io/controller-runtime v0.9.2
  • sigs.k8s.io/structured-merge-diff/v4 v4.1.0
  • sigs.k8s.io/yaml v1.2.0
go.sum go
  • 854 dependencies
.github/workflows/generate-api-docs.yaml actions
  • actions/checkout v3 composite
  • actions/setup-go v3 composite
.github/workflows/generate-chart-readme.yml actions
  • actions/cache v3 composite
  • actions/checkout v3 composite
  • trilom/file-changes-action v1.2.4 composite
.github/workflows/live-testbed.yml actions
  • actions/cache v3 composite
  • actions/checkout v3 composite
  • balchua/microk8s-actions v0.2.2 composite
.github/workflows/release-docker-images.yml actions
  • actions/cache v3 composite
  • actions/checkout v3 composite
  • docker/login-action v1 composite
  • docker/setup-buildx-action v1 composite
  • docker/setup-qemu-action v1 composite
.github/workflows/release-helm-charts.yml actions
  • actions/checkout v3 composite
  • actions/setup-python v3 composite
  • helm/chart-testing-action v2.0.1 composite
  • stefanprodan/helm-gh-pages master composite
.github/workflows/release-kubectl-frisbee.yml actions
  • actions/cache v3 composite
  • actions/checkout v3 composite
  • actions/setup-go v3 composite
  • goreleaser/goreleaser-action v3 composite
.github/workflows/repo-stats.yml actions
  • jgehrcke/github-repo-stats v1.4.0 composite
.github/workflows/test-unit.yml actions
  • actions/cache v3 composite
  • actions/checkout v3 composite
  • actions/setup-go v3 composite
  • balchua/microk8s-actions v0.2.2 composite
Dockerfile docker
  • alpine latest build
  • golang 1.19 build
deploy/cadvisor/Dockerfile docker
  • gcr.io/cadvisor/cadvisor v0.46.0 build
deploy/ci-environment/Dockerfile docker
  • jrei/systemd-ubuntu 22.04 build
deploy/prometheus/Dockerfile docker
  • prom/prometheus latest build