Ecosystem QE Golang Test Automation
Eco-gotests
Overview
The eco-gotests is the downstream OCP telco/Ecosystem QE framework.
The project is based on golang+ginkgo framework.
Project requirements
- golang v1.23.x
- ginkgo v2.x
eco-gotests
The eco-gotests is designed to test a pre-installed OCP cluster which meets the following requirements:
Mandatory setup requirements:
- OCP cluster installed with version >=4.13
Optional:
- PTP operator
- SR-IOV operator
- SR-IOV-fec operator
- RAN DU profile
Supported setups:
- Regular cluster 3 master nodes (VMs or BMs) 2 workers (VMs or BMs)
- Single Node Cluster (VM or BM)
- Public cloud (AWS)
WARNING!: Some test suites of the eco-gotests framework remove existing configuration such as
PtpConfig, SR-IOV, SriovFecClusterConfig configs .
General environment variables
Mandatory:
KUBECONFIG
- Path to kubeconfig file. Default: empty
Optional:
We use glog library for logging in the project. In order to enable verbose logging the following needs to be done:
- Make sure to import inittool in your go script, per this example:
import (
. "github.com/openshift-kni/eco-gotests/tests/internal/inittools"
)
- Need to export the following SHELL variable:
export ECO_VERBOSE_LEVEL=100
Notes:
- The value for the variable has to be >= 100.
- The variable can simply be exported in the shell where you run your automation.
- The go file you work on has to be in a directory under github.com/openshift-kni/eco-gotests/tests/ directory for being able to import inittools.
- Importing inittool also initializes the apiclient and it's available via "APIClient" variable.
- Collect logs from cluster with reporter
We use k8reporter library for collecting resource from cluster in case of test failure.
In order to enable k8reporter the following needs to be done:
- Export DUMP_FAILED_TESTS and set it to true. Use example below
export ECO_DUMP_FAILED_TESTS=true
- Specify absolute path for logs directory like it appears below. By default /tmp/reports directory is used.
export ECO_REPORTS_DUMP_DIR=/tmp/logs_directory
We use reportxml library for generating compatible xml reports.
The reporter is enabled by default and stores reports under REPORTS_DUMP_DIR directory.
In oder to disable reporterxml the following needs to be done:
export ECO_ENABLE_REPORT=false
How to run
The test-runner script is the recommended way for executing tests.
Parameters for the script are controlled by the following environment variables:
ECO_TEST_FEATURES
: list of features to be tested ("all" will include all tests). All subdirectories under tests that match a feature will be included (internal directories are excluded) - required
ECO_TEST_LABELS
: ginkgo query passed to the label-filter option for including/excluding tests - optional
ECO_VERBOSE_SCRIPT
: prints verbose script information when executing the script - optional
ECO_TEST_VERBOSE
: executes ginkgo with verbose test output - optional
ECO_TEST_TRACE
: includes full stack trace from ginkgo tests when a failure occurs - optional
It is recommended to execute the runner script through the make run-tests
make target.
Example:
$ export KUBECONFIG=/path/to/kubeconfig
$ export ECO_TEST_FEATURES="ztp kmm"
$ export ECO_TEST_LABELS='platform-selection || image-service-statefulset'
$ make run-tests
Executing eco-gotests test-runner script
scripts/test-runner.sh
ginkgo -timeout=24h --keep-going --require-suite -r --label-filter="platform-selection || image-service-statefulset" ./tests/assisted/ztp ./tests/hw-accel/kmm
eco-gotests - How to contribute
The project uses a development method - forking workflow
The following is a step-by-step example of forking workflow:
- A developer forks
the eco-gotests project
- A new local feature branch is created
- A developer makes changes on the new branch.
- New commits are created for the changes.
- The branch gets pushed to developer's own server-side copy.
- Changes are tested.
- A developer opens a pull request(
PR
) from the new branch to
the eco-gotests.
- The pull request gets approved from at least 2 reviewers for merge and is merged into
the eco-gotests .
Team Documentation
eco-tests - Project structure
.
├── config # config files
├── images # container images artifacts: Dockerfile ?
├── scripts # makefile scripts
├── tests # test cases directory
│ ├── internal # common packages used across framework
│ │ ├── params # common constant and parameters used across framework
│ │ └── config # common config struct used across framework
│ ├── cnf # cnf group test folder
│ │ ├── network # networking test suites directory
│ │ │ ├── cni # cni test suite directory
│ │ │ │ ├── internal # internal packages used within cni test suite
│ │ │ │ │ └── tsparams # cni test suite constants and parameters package
│ │ │ │ └── tests # cni tests directory
│ │ │ │ ├── common.go # ginkgo common cni test functions
│ │ │ │ ├── sysctl # sysctl test cases
│ │ │ │ │ ├──api.go # api test cases
│ │ │ │ │ ├──common.go # common sysctl ginkgo function
│ │ │ │ │ └──e2e.go # e2e sysctl test cases
│ │ │ │ └── vrf # vrf test cases
│ │ │ ├── dummy # dummy test suite directory
│ │ │ └── internal # networking internal packages
│ │ │ └── netparam # networking constants and parameters
│ │ ├── internal # cnf internal packages
│ │ │ └── cnfparams # cnf constants and parameters
│ │ └── compute # compute test suites folder
│ ├── external # external test cases from partners
│ └── system # system group test folder
└── vendors # Dependencies folder
Code conventions
Lint
Push requested are tested in a pipeline with golangci-lint. It is advised to add Golangci-lint integration to your development editor. It's recommended to run make lint
before uploading a PR.
Commit Message Guidelines
There are two main components of a Git commit message: the title or summary, and the description. The commit message title is limited to 72 characters, and the description has no character limit.
Commit title format has two parts:
- Team name: Example - "cnf network" or "hw-accel"
- Short summary of code changes: Example - "added deployment test".
If a PR changes multiple team's directories or common infrastructure code, then instead of the team name, simply add "infra". Follow similar naming rules when adding changes to README (readme:) or github ci (ci:) files.
Commit message examples:
infra: func defineNetwork moved to global net package"
readme: added commit message convention"
ci: added new deployment job
cnf network: added set func to cluster pkg
Please notice: Don't use internal test IDs and capital letters in commit message.
Commit description explains a changes in details if it's needed.
If the function's arguments fit in a single line - use the following format:
func Function(argInt1, argInt2 int, argString1, argString2 string) {
...
}
If the function's arguments don't fit in a single line - use the following format:
func Function(
argInt1 int,
argInt2 int,
argInt3 int,
argInt4 int,
argString1 string,
argString2 string,
argString3 string,
argString4 string) {
...
}
One more acceptable format example:
func Function(
argInt1, argInt2 int, argString1, argString2 string, argSlice1, argSlice2 []string) {
}
Common issues:
- If the automated commit check fails - make sure to pull/rebase the latest change and have a successful execution of 'make lint' locally first.
Update eco-goinfra modules - How to:
- List the existing branches here: https://github.com/openshift-kni/eco-gotests/branches
- Delete all of the merged branches named eco-goinfra-dep-bump*
- In the left pane locate the "Eco-GoInfra Module Bump" action here: https://github.com/openshift-kni/eco-gotests/actions
- Click on "Run workflow" in the right pane and run the workflow against the main branch (should take less than a minute to complete)
- Click on the last executed workflow and expand the "Push changes to new branch" step
- Copy the link to create the pull request and paste it in your browser. Complete the pull request creation from your browser
- Merge the pull request after passing the automated checks on it
Note: To start using the new package for the first time:
- Add it to the import section of your test
- Run
go mod vendor