From 1002346ceb37f1b097d52d72823a1ab7401bfd52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6ran=20Gustafsson?= Date: Mon, 13 Feb 2023 10:59:12 +0100 Subject: [PATCH 01/20] etcd-mixin: Limit etcdDatabaseHighFragmentationRatio to 100MB+ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Göran Gustafsson --- contrib/mixin/mixin.libsonnet | 2 +- contrib/mixin/test.yaml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/contrib/mixin/mixin.libsonnet b/contrib/mixin/mixin.libsonnet index f220eab56..ddc6bf85d 100644 --- a/contrib/mixin/mixin.libsonnet +++ b/contrib/mixin/mixin.libsonnet @@ -241,7 +241,7 @@ { alert: 'etcdDatabaseHighFragmentationRatio', expr: ||| - (last_over_time(etcd_mvcc_db_total_size_in_use_in_bytes[5m]) / last_over_time(etcd_mvcc_db_total_size_in_bytes[5m])) < 0.5 + (last_over_time(etcd_mvcc_db_total_size_in_use_in_bytes[5m]) / last_over_time(etcd_mvcc_db_total_size_in_bytes[5m])) < 0.5 and etcd_mvcc_db_total_size_in_use_in_bytes > 104857600 ||| % $._config, 'for': '10m', labels: { diff --git a/contrib/mixin/test.yaml b/contrib/mixin/test.yaml index 8cf18a0e0..26dd4c3fd 100644 --- a/contrib/mixin/test.yaml +++ b/contrib/mixin/test.yaml @@ -143,13 +143,13 @@ tests: - interval: 1m input_series: - series: 'etcd_mvcc_db_total_size_in_use_in_bytes{job="etcd",instance="10.10.10.0"}' - values: '30000+0x10' + values: '300000000+0x10' - series: 'etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.0"}' - values: '100000+0x10' + values: '1000000000+0x10' - series: 'etcd_mvcc_db_total_size_in_use_in_bytes{job="etcd",instance="10.10.10.1"}' - values: '70000+0x10' + values: '700000000+0x10' - series: 'etcd_mvcc_db_total_size_in_bytes{job="etcd",instance="10.10.10.1"}' - values: '100000+0x10' + values: '1000000000+0x10' alert_rule_test: - eval_time: 11m alertname: etcdDatabaseHighFragmentationRatio From 0daf06fa832f1957dd331dd2b51890d6c69cc7db Mon Sep 17 00:00:00 2001 From: Wei Fu Date: Wed, 22 Mar 2023 13:53:09 +0800 Subject: [PATCH 02/20] CHANGELOG: add item into 3.4/3.5 Add item [server/embed: fix data race when starting both secure & insecure gRPC servers on the same address] to 3.4/3.5 changelog. REF: #15509 Signed-off-by: Wei Fu --- CHANGELOG/CHANGELOG-3.4.md | 3 +++ CHANGELOG/CHANGELOG-3.5.md | 3 +++ 2 files changed, 6 insertions(+) diff --git a/CHANGELOG/CHANGELOG-3.4.md b/CHANGELOG/CHANGELOG-3.4.md index 4e128fcd0..994772e5d 100644 --- a/CHANGELOG/CHANGELOG-3.4.md +++ b/CHANGELOG/CHANGELOG-3.4.md @@ -6,6 +6,9 @@ Previous change logs can be found at [CHANGELOG-3.3](https://github.com/etcd-io/ ## v3.4.25 (TBD) +### etcd server +- Fix [server/embed: fix data race when starting both secure & insecure gRPC servers on the same address](https://github.com/etcd-io/etcd/pull/15518) + ### Go - Require [Go 1.19+](https://github.com/etcd-io/etcd/pull/15333). - Compile with [Go 1.19+](https://go.dev/doc/devel/release#go1.19) diff --git a/CHANGELOG/CHANGELOG-3.5.md b/CHANGELOG/CHANGELOG-3.5.md index f2066c0cf..043f59350 100644 --- a/CHANGELOG/CHANGELOG-3.5.md +++ b/CHANGELOG/CHANGELOG-3.5.md @@ -6,6 +6,9 @@ Previous change logs can be found at [CHANGELOG-3.4](https://github.com/etcd-io/ ## v3.5.8 (TBD) +### etcd server +- Fix [server/embed: fix data race when starting both secure & insecure gRPC servers on the same address](https://github.com/etcd-io/etcd/pull/15517) + ### Package `client/pkg/v3` - Fix [aligning zap log timestamp resolution to microseconds](https://github.com/etcd-io/etcd/pull/15240). Etcd now uses zap timestamp format: `2006-01-02T15:04:05.999999Z0700` (microsecond instead of milliseconds precision). From 1fcb782780c92bb15411c30bcc9426e9c93fe872 Mon Sep 17 00:00:00 2001 From: Wei Fu Date: Tue, 21 Mar 2023 21:18:17 +0800 Subject: [PATCH 03/20] chore: introduce strict bash mode for scripts,.github REF: #15514 Signed-off-by: Wei Fu --- .github/workflows/build.yaml | 2 + .github/workflows/contrib.yaml | 5 +- .github/workflows/e2e-arm64.yaml | 5 +- .github/workflows/e2e.yaml | 8 ++-- .github/workflows/fuzzing.yaml | 5 +- .github/workflows/govuln.yaml | 5 +- .github/workflows/grpcproxy.yaml | 8 ++-- .github/workflows/release.yaml | 2 + .github/workflows/robustness-template.yaml | 4 ++ .github/workflows/static-analysis.yaml | 10 +++- .github/workflows/tests-arm64.yaml | 2 + .github/workflows/tests.yaml | 2 + scripts/build-binary.sh | 10 ++-- scripts/build-docker.sh | 14 ++++-- scripts/build-release.sh | 4 +- scripts/build.sh | 2 + scripts/build_lib.sh | 14 ++++-- scripts/build_tools.sh | 2 + scripts/fix.sh | 2 +- scripts/fuzzing.sh | 4 +- scripts/genproto.sh | 5 +- scripts/install-marker.sh | 6 +-- scripts/measure-test-flakiness.sh | 7 ++- scripts/release_mod.sh | 6 +-- scripts/test.sh | 55 ++++++++++++++-------- scripts/test_lib.sh | 10 ++-- scripts/update_dep.sh | 2 + scripts/updatebom.sh | 3 +- tools/mod/install_all.sh | 2 + 29 files changed, 137 insertions(+), 69 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 667adcc18..47db76404 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -26,6 +26,8 @@ jobs: - env: TARGET: ${{ matrix.target }} run: | + set -euo pipefail + echo "${TARGET}" case "${TARGET}" in linux-amd64) diff --git a/.github/workflows/contrib.yaml b/.github/workflows/contrib.yaml index debe5b529..539f47128 100644 --- a/.github/workflows/contrib.yaml +++ b/.github/workflows/contrib.yaml @@ -9,4 +9,7 @@ jobs: - uses: actions/setup-go@6edd4406fa81c3da01a34fa6f6343087c207a568 # v3.5.0 with: go-version: "1.19.7" - - run: make -C contrib/mixin tools test + - run: | + set -euo pipefail + + make -C contrib/mixin tools test diff --git a/.github/workflows/e2e-arm64.yaml b/.github/workflows/e2e-arm64.yaml index b6116a0be..85603780f 100644 --- a/.github/workflows/e2e-arm64.yaml +++ b/.github/workflows/e2e-arm64.yaml @@ -23,11 +23,12 @@ jobs: - env: TARGET: ${{ matrix.target }} run: | + set -euo pipefail + echo "${TARGET}" case "${TARGET}" in linux-arm64-e2e) - PASSES='build release e2e' CPU='4' EXPECT_DEBUG='true' COVER='false' RACE='true' ./scripts/test.sh 2>&1 | tee test.log - ! grep -E "(--- FAIL:|FAIL:|DATA RACE|panic: test timed out|appears to have leaked)" -B50 -A10 test.log + PASSES='build release e2e' CPU='4' EXPECT_DEBUG='true' COVER='false' RACE='true' ./scripts/test.sh ;; *) echo "Failed to find target" diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index 2b478501f..9a5fee210 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -19,15 +19,15 @@ jobs: - env: TARGET: ${{ matrix.target }} run: | + set -euo pipefail + echo "${TARGET}" case "${TARGET}" in linux-amd64-e2e) - PASSES='build release e2e' CPU='4' EXPECT_DEBUG='true' COVER='false' RACE='true' ./scripts/test.sh 2>&1 | tee test.log - ! grep -E "(--- FAIL:|FAIL:|DATA RACE|panic: test timed out|appears to have leaked)" -B50 -A10 test.log + PASSES='build release e2e' CPU='4' EXPECT_DEBUG='true' COVER='false' RACE='true' ./scripts/test.sh ;; linux-386-e2e) - GOARCH=386 PASSES='build e2e' CPU='4' EXPECT_DEBUG='true' COVER='false' RACE='true' ./scripts/test.sh 2>&1 | tee test.log - ! grep -E "(--- FAIL:|FAIL:|DATA RACE|panic: test timed out|appears to have leaked)" -B50 -A10 test.log + GOARCH=386 PASSES='build e2e' CPU='4' EXPECT_DEBUG='true' COVER='false' RACE='true' ./scripts/test.sh ;; *) echo "Failed to find target" diff --git a/.github/workflows/fuzzing.yaml b/.github/workflows/fuzzing.yaml index 93ae5cda0..b6f2a733f 100644 --- a/.github/workflows/fuzzing.yaml +++ b/.github/workflows/fuzzing.yaml @@ -13,7 +13,10 @@ jobs: - uses: actions/setup-go@6edd4406fa81c3da01a34fa6f6343087c207a568 # v3.5.0 with: go-version: "1.19.7" - - run: GOARCH=amd64 CPU=4 make fuzz + - run: | + set -euo pipefail + + GOARCH=amd64 CPU=4 make fuzz - uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3.1.2 if: failure() with: diff --git a/.github/workflows/govuln.yaml b/.github/workflows/govuln.yaml index b0ef74a73..270ecc7c6 100644 --- a/.github/workflows/govuln.yaml +++ b/.github/workflows/govuln.yaml @@ -10,4 +10,7 @@ jobs: with: go-version: "1.19.7" - run: date - - run: go install golang.org/x/vuln/cmd/govulncheck@latest && govulncheck ./... + - run: | + set -euo pipefail + + go install golang.org/x/vuln/cmd/govulncheck@latest && govulncheck ./... diff --git a/.github/workflows/grpcproxy.yaml b/.github/workflows/grpcproxy.yaml index 7d4d0dd3d..ff1843982 100644 --- a/.github/workflows/grpcproxy.yaml +++ b/.github/workflows/grpcproxy.yaml @@ -19,15 +19,15 @@ jobs: - env: TARGET: ${{ matrix.target }} run: | + set -euo pipefail + echo "${TARGET}" case "${TARGET}" in linux-amd64-grpcproxy-integration) - PASSES='build grpcproxy_integration' CPU='4' COVER='false' RACE='true' ./scripts/test.sh 2>&1 | tee test.log - ! grep -E "(--- FAIL:|FAIL:|DATA RACE|panic: test timed out|appears to have leaked)" -B50 -A10 test.log + PASSES='build grpcproxy_integration' CPU='4' COVER='false' RACE='true' ./scripts/test.sh ;; linux-amd64-grpcproxy-e2e) - PASSES='build grpcproxy_e2e' CPU='4' COVER='false' RACE='true' ./scripts/test.sh 2>&1 | tee test.log - ! grep -E "(--- FAIL:|FAIL:|DATA RACE|panic: test timed out|appears to have leaked)" -B50 -A10 test.log + PASSES='build grpcproxy_e2e' CPU='4' COVER='false' RACE='true' ./scripts/test.sh ;; *) echo "Failed to find target" diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 6143d36e0..45fd392db 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -10,6 +10,8 @@ jobs: with: go-version: "1.19.7" - run: | + set -euo pipefail + git config --global user.email "github-action@etcd.io" git config --global user.name "Github Action" gpg --batch --gen-key <> /dev/stderr exit 255 fi -set -u - function setup_env { local ver=${1} local proj=${2} @@ -60,7 +58,7 @@ function main { cd release setup_env "${VER}" "${proj}" - tarcmd=tar + local tarcmd=tar if [[ $(go env GOOS) == "darwin" ]]; then echo "Please use linux machine for release builds." exit 1 diff --git a/scripts/build-docker.sh b/scripts/build-docker.sh index a255dc2cb..637d1c503 100755 --- a/scripts/build-docker.sh +++ b/scripts/build-docker.sh @@ -1,17 +1,23 @@ #!/usr/bin/env bash -set -e +set -euo pipefail if [ "$#" -ne 1 ]; then echo "Usage: $0 VERSION" >&2 exit 1 fi +VERSION=${1} +if [ -z "$VERSION" ]; then + echo "Usage: ${0} VERSION" >&2 + exit 1 +fi + ARCH=$(go env GOARCH) -VERSION="${1}-${ARCH}" +VERSION="${VERSION}-${ARCH}" DOCKERFILE="Dockerfile-release.${ARCH}" -if [ -z "${BINARYDIR}" ]; then +if [ -z "${BINARYDIR:-}" ]; then RELEASE="etcd-${1}"-$(go env GOOS)-$(go env GOARCH) BINARYDIR="${RELEASE}" TARFILE="${RELEASE}.tar.gz" @@ -34,7 +40,7 @@ cp "${BINARYDIR}"/etcd "${BINARYDIR}"/etcdctl "${BINARYDIR}"/etcdutl "${IMAGEDIR cat ./"${DOCKERFILE}" > "${IMAGEDIR}"/Dockerfile -if [ -z "$TAG" ]; then +if [ -z "${TAG:-}" ]; then docker build -t "gcr.io/etcd-development/etcd:${VERSION}" "${IMAGEDIR}" docker build -t "quay.io/coreos/etcd:${VERSION}" "${IMAGEDIR}" else diff --git a/scripts/build-release.sh b/scripts/build-release.sh index e90fb3e13..4cf1116ee 100755 --- a/scripts/build-release.sh +++ b/scripts/build-release.sh @@ -3,11 +3,11 @@ # Build all release binaries and images to directory ./release. # Run from repository root. # -set -e +set -euo pipefail source ./scripts/test_lib.sh -VERSION=$1 +VERSION=${1:-} if [ -z "${VERSION}" ]; then echo "Usage: ${0} VERSION" >> /dev/stderr exit 255 diff --git a/scripts/build.sh b/scripts/build.sh index 4a588e4de..15720193a 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -3,6 +3,8 @@ # This scripts build the etcd binaries # To build the tools, run `build_tools.sh` +set -euo pipefail + source ./scripts/test_lib.sh source ./scripts/build_lib.sh diff --git a/scripts/build_lib.sh b/scripts/build_lib.sh index 5fe6dd67e..dc318c5f6 100755 --- a/scripts/build_lib.sh +++ b/scripts/build_lib.sh @@ -1,18 +1,26 @@ #!/usr/bin/env bash +set -euo pipefail + source ./scripts/test_lib.sh GIT_SHA=$(git rev-parse --short HEAD || echo "GitNotFound") VERSION_SYMBOL="${ROOT_MODULE}/api/v3/version.GitSHA" +# use go env if noset +GOOS=${GOOS:-$(go env GOOS)} +GOARCH=${GOARCH:-$(go env GOARCH)} + +GO_BUILD_FLAGS=${GO_BUILD_FLAGS:-} + # Set GO_LDFLAGS="-s" for building without symbols for debugging. # shellcheck disable=SC2206 -GO_LDFLAGS=(${GO_LDFLAGS} "-X=${VERSION_SYMBOL}=${GIT_SHA}") +GO_LDFLAGS=(${GO_LDFLAGS:-} "-X=${VERSION_SYMBOL}=${GIT_SHA}") GO_BUILD_ENV=("CGO_ENABLED=0" "GO_BUILD_FLAGS=${GO_BUILD_FLAGS}" "GOOS=${GOOS}" "GOARCH=${GOARCH}") etcd_build() { out="bin" - if [[ -n "${BINDIR}" ]]; then out="${BINDIR}"; fi + if [[ -n "${BINDIR:-}" ]]; then out="${BINDIR}"; fi run rm -f "${out}/etcd" ( @@ -62,7 +70,7 @@ etcd_build() { tools_build() { out="bin" - if [[ -n "${BINDIR}" ]]; then out="${BINDIR}"; fi + if [[ -n "${BINDIR:-}" ]]; then out="${BINDIR}"; fi tools_path="tools/benchmark tools/etcd-dump-db tools/etcd-dump-logs diff --git a/scripts/build_tools.sh b/scripts/build_tools.sh index 48fa9d6fa..7145126d8 100755 --- a/scripts/build_tools.sh +++ b/scripts/build_tools.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash +set -euo pipefail + source ./scripts/test_lib.sh source ./scripts/build_lib.sh diff --git a/scripts/fix.sh b/scripts/fix.sh index d0fc89262..45520e113 100755 --- a/scripts/fix.sh +++ b/scripts/fix.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -set -e +set -euo pipefail # Top level problems with modules can lead to test_lib being not functional go mod tidy diff --git a/scripts/fuzzing.sh b/scripts/fuzzing.sh index 5e2a9b42f..65ffaa92a 100755 --- a/scripts/fuzzing.sh +++ b/scripts/fuzzing.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash -set -e + +set -euo pipefail + source ./scripts/test_lib.sh GO_CMD="go" diff --git a/scripts/genproto.sh b/scripts/genproto.sh index 7a7232692..7103f0f01 100755 --- a/scripts/genproto.sh +++ b/scripts/genproto.sh @@ -3,7 +3,8 @@ # Generate all etcd protobuf bindings. # Run from repository root directory named etcd. # -set -e +set -euo pipefail + shopt -s globstar if ! [[ "$0" =~ scripts/genproto.sh ]]; then @@ -98,7 +99,7 @@ log_callout -e "\\nRunning swagger ..." run_go_tool github.com/hexfusion/schwag -input=Documentation/dev-guide/apispec/swagger/rpc.swagger.json -if [ "$1" != "--skip-protodoc" ]; then +if [ "${1:-}" != "--skip-protodoc" ]; then log_callout "protodoc is auto-generating grpc API reference documentation..." # API reference diff --git a/scripts/install-marker.sh b/scripts/install-marker.sh index 3da67bb10..b0f3f984d 100755 --- a/scripts/install-marker.sh +++ b/scripts/install-marker.sh @@ -1,10 +1,10 @@ #!/usr/bin/env bash -set -e +set -euo pipefail -ARCH=$1 +ARCH=${1:-} -if [ -z "$1" ]; then +if [ -z "$ARCH" ]; then echo "Usage: ${0} [amd64 or darwin], defaulting to 'amd64'" >> /dev/stderr ARCH=amd64 fi diff --git a/scripts/measure-test-flakiness.sh b/scripts/measure-test-flakiness.sh index 4ff5903c3..8fdf0b002 100755 --- a/scripts/measure-test-flakiness.sh +++ b/scripts/measure-test-flakiness.sh @@ -1,9 +1,8 @@ -#!/bin/bash +#!/usr/bin/env bash -set -e -set -o pipefail +set -euo pipefail -if [[ -z ${GITHUB_TOKEN} ]] +if [[ -z ${GITHUB_TOKEN:-} ]] then echo "Please set the \$GITHUB_TOKEN environment variable for the script to work" exit 1 diff --git a/scripts/release_mod.sh b/scripts/release_mod.sh index b0e9d253e..da6e63cc2 100755 --- a/scripts/release_mod.sh +++ b/scripts/release_mod.sh @@ -10,7 +10,7 @@ # # % DRY_RUN=false REMOTE_REPO="origin" ./scripts/release_mod.sh push_mod_tags -set -e +set -euo pipefail source ./scripts/test_lib.sh @@ -55,7 +55,7 @@ function mod_tidy_fix { function update_versions_cmd() { assert_no_git_modifications || return 2 - if [ -z "${TARGET_VERSION}" ]; then + if [ -z "${TARGET_VERSION:-}" ]; then log_error "TARGET_VERSION environment variable not set. Set it to e.g. v3.5.10-alpha.0" return 2 fi @@ -89,7 +89,7 @@ function get_gpg_key { function push_mod_tags_cmd { assert_no_git_modifications || return 2 - if [ -z "${REMOTE_REPO}" ]; then + if [ -z "${REMOTE_REPO:-}" ]; then log_error "REMOTE_REPO environment variable not set" return 2 fi diff --git a/scripts/test.sh b/scripts/test.sh index 1ad67b116..440b12039 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -36,6 +36,7 @@ set -e # Consider command as failed when any component of the pipe fails: # https://stackoverflow.com/questions/1221833/pipe-output-and-capture-exit-status-in-bash set -o pipefail +set -o nounset # The test script is not supposed to make any changes to the files # e.g. add/update missing dependencies. Such divergences should be @@ -46,6 +47,8 @@ export ETCD_VERIFY=all source ./scripts/test_lib.sh source ./scripts/build_lib.sh +OUTPUT_FILE=${OUTPUT_FILE:-""} + if [ -n "${OUTPUT_FILE}" ]; then log_callout "Dumping output to: ${OUTPUT_FILE}" exec > >(tee -a "${OUTPUT_FILE}") 2>&1 @@ -55,12 +58,12 @@ PASSES=${PASSES:-"gofmt bom dep build unit"} PKG=${PKG:-} SHELLCHECK_VERSION=${SHELLCHECK_VERSION:-"v0.8.0"} -if [ -z "$GOARCH" ]; then +if [ -z "${GOARCH:-}" ]; then GOARCH=$(go env GOARCH); fi # determine whether target supports race detection -if [ -z "${RACE}" ] ; then +if [ -z "${RACE:-}" ] ; then if [ "$GOARCH" == "amd64" ]; then RACE="--race" else @@ -72,14 +75,14 @@ fi # This options make sense for cases where SUT (System Under Test) is compiled by test. COMMON_TEST_FLAGS=("${RACE}") -if [[ -n "${CPU}" ]]; then +if [[ -n "${CPU:-}" ]]; then COMMON_TEST_FLAGS+=("--cpu=${CPU}") fi log_callout "Running with ${COMMON_TEST_FLAGS[*]}" RUN_ARG=() -if [ -n "${TESTCASE}" ]; then +if [ -n "${TESTCASE:-}" ]; then RUN_ARG=("-run=${TESTCASE}") fi @@ -120,7 +123,7 @@ function integration_pass { function e2e_pass { # e2e tests are running pre-build binary. Settings like --race,-cover,-cpu does not have any impact. - run_for_module "tests" go_test "./e2e/..." "keep_going" : -timeout="${TIMEOUT:-30m}" "${RUN_ARG[@]}" "$@" + run_for_module "tests" go_test "./e2e/..." "keep_going" : -timeout="${TIMEOUT:-30m}" "${RUN_ARG[@]}" "$@" || return $? run_for_module "tests" go_test "./common/..." "keep_going" : --tags=e2e -timeout="${TIMEOUT:-30m}" "${RUN_ARG[@]}" "$@" } @@ -170,8 +173,8 @@ function grpcproxy_e2e_pass { # Builds artifacts used by tests/e2e in coverage mode. function build_cov_pass { - run_for_module "server" run go test -tags cov -c -covermode=set -coverpkg="./..." -o "../bin/etcd_test" - run_for_module "etcdctl" run go test -tags cov -c -covermode=set -coverpkg="./..." -o "../bin/etcdctl_test" + run_for_module "server" run go test -tags cov -c -covermode=set -coverpkg="./..." -o "../bin/etcd_test" || return $? + run_for_module "etcdctl" run go test -tags cov -c -covermode=set -coverpkg="./..." -o "../bin/etcdctl_test" || return $? run_for_module "etcdutl" run go test -tags cov -c -covermode=set -coverpkg="./..." -o "../bin/etcdutl_test" } @@ -256,7 +259,7 @@ function merge_cov { function cov_pass { # shellcheck disable=SC2153 - if [ -z "$COVERDIR" ]; then + if [ -z "${COVERDIR:-}" ]; then log_error "COVERDIR undeclared" return 255 fi @@ -376,6 +379,7 @@ function markdown_you_find_eschew_you { } function markdown_you_pass { + # TODO: ./CONTRIBUTING.md:## Get your pull request reviewed generic_checker markdown_you_find_eschew_you } @@ -391,31 +395,42 @@ function govet_pass { } function govet_shadow_pass { + # TODO: we should ignore the generated packages? + # + # stderr: etcdserverpb/gw/rpc.pb.gw.go:2100:3: declaration of "ctx" shadows declaration at line 2005 local shadow shadow=$(tool_get_bin "golang.org/x/tools/go/analysis/passes/shadow/cmd/shadow") run_for_modules generic_checker run go vet -all -vettool="${shadow}" } function unparam_pass { + # TODO: transport/listener.go:129:60: newListenConfig - result 1 (error) is always nil run_for_modules generic_checker run_go_tool "mvdan.cc/unparam" } function staticcheck_pass { + # TODO: we should upgrade pb or ignore the pb package + # + # versionpb/version.pb.go:69:15: proto.RegisterFile is deprecated: Use protoregistry.GlobalFiles.RegisterFile instead. (SA1019) run_for_modules generic_checker run_go_tool "honnef.co/go/tools/cmd/staticcheck" } function revive_pass { + # TODO: etcdserverpb/raft_internal_stringer.go:15:1: should have a package comment run_for_modules generic_checker run_go_tool "github.com/mgechev/revive" -config "${ETCD_ROOT_DIR}/tests/revive.toml" -exclude "vendor/..." -exclude "out/..." } function unconvert_pass { + # TODO: pb package should be filtered out. run_for_modules generic_checker run_go_tool "github.com/mdempsky/unconvert" unconvert -v } function ineffassign_per_package { - # bash 3.x compatible replacement of: mapfile -t gofiles < <(go_srcs_in_module "$1") + # bash 3.x compatible replacement of: mapfile -t gofiles < <(go_srcs_in_module) local gofiles=() - while IFS= read -r line; do gofiles+=("$line"); done < <(go_srcs_in_module "$1") + while IFS= read -r line; do gofiles+=("$line"); done < <(go_srcs_in_module) + + # TODO: ineffassign should work with package instead of files run_go_tool github.com/gordonklaus/ineffassign "${gofiles[@]}" } @@ -424,13 +439,14 @@ function ineffassign_pass { } function nakedret_pass { + # TODO: nakedret should work with -set_exit_status run_for_modules generic_checker run_go_tool "github.com/alexkohler/nakedret" } function license_header_per_module { - # bash 3.x compatible replacement of: mapfile -t gofiles < <(go_srcs_in_module "$1") + # bash 3.x compatible replacement of: mapfile -t gofiles < <(go_srcs_in_module) local gofiles=() - while IFS= read -r line; do gofiles+=("$line"); done < <(go_srcs_in_module "$1") + while IFS= read -r line; do gofiles+=("$line"); done < <(go_srcs_in_module) run_go_tool "github.com/google/addlicense" --check "${gofiles[@]}" } @@ -439,9 +455,9 @@ function license_header_pass { } function receiver_name_for_package { - # bash 3.x compatible replacement of: mapfile -t gofiles < <(go_srcs_in_module "$1") + # bash 3.x compatible replacement of: mapfile -t gofiles < <(go_srcs_in_module) local gofiles=() - while IFS= read -r line; do gofiles+=("$line"); done < <(go_srcs_in_module "$1") + while IFS= read -r line; do gofiles+=("$line"); done < <(go_srcs_in_module) recvs=$(grep 'func ([^*]' "${gofiles[@]}" | tr ':' ' ' | \ awk ' { print $2" "$3" "$4" "$1 }' | sed "s/[a-zA-Z\\.]*go//g" | sort | uniq | \ @@ -465,9 +481,9 @@ function receiver_name_pass { # checks spelling and comments in the 'package' in the current module # function goword_for_package { - # bash 3.x compatible replacement of: mapfile -t gofiles < <(go_srcs_in_module "$1") + # bash 3.x compatible replacement of: mapfile -t gofiles < <(go_srcs_in_module) local gofiles=() - while IFS= read -r line; do gofiles+=("$line"); done < <(go_srcs_in_module "$1") + while IFS= read -r line; do gofiles+=("$line"); done < <(go_srcs_in_module) local gowordRes @@ -566,7 +582,7 @@ function release_pass { rm -f ./bin/etcd-last-release # to grab latest patch release; bump this up for every minor release UPGRADE_VER=$(git tag -l --sort=-version:refname "v3.5.*" | head -1 | cut -d- -f1) - if [ -n "$MANUAL_VER" ]; then + if [ -n "${MANUAL_VER:-}" ]; then # in case, we need to test against different version UPGRADE_VER=$MANUAL_VER fi @@ -618,6 +634,7 @@ function mod_tidy_for_module { log_error "${PWD}/go.mod is not in sync with 'go mod tidy'" return 255 fi + set -e } function mod_tidy_pass { @@ -633,8 +650,8 @@ function genproto_pass { } function goimport_for_module { - GOFILES=$(run go list --f "{{with \$d:=.}}{{range .GoFiles}}{{\$d.Dir}}/{{.}}{{\"\n\"}}{{end}}{{end}}" ./...) - TESTGOFILES=$(run go list --f "{{with \$d:=.}}{{range .TestGoFiles}}{{\$d.Dir}}/{{.}}{{\"\n\"}}{{end}}{{end}}" ./...) + GOFILES=$(run go list --f "{{with \$d:=.}}{{range .GoFiles}}{{\$d.Dir}}/{{.}}{{\"\n\"}}{{end}}{{end}}" ./...) || return 2 + TESTGOFILES=$(run go list --f "{{with \$d:=.}}{{range .TestGoFiles}}{{\$d.Dir}}/{{.}}{{\"\n\"}}{{end}}{{end}}" ./...) || return 2 cd "${ETCD_ROOT_DIR}/tools/mod" FILESNEEDSFIX=$(echo "${GOFILES}" "${TESTGOFILES}" | grep -v '.gw.go' | grep -v '.pb.go' | xargs -n 100 go run golang.org/x/tools/cmd/goimports -l -local go.etcd.io) if [ -n "$FILESNEEDSFIX" ]; then diff --git a/scripts/test_lib.sh b/scripts/test_lib.sh index 1199b4110..46e582f1c 100644 --- a/scripts/test_lib.sh +++ b/scripts/test_lib.sh @@ -105,7 +105,7 @@ function relativePath { #### Discovery of files/packages within a go module ##### -# go_srcs_in_module [package] +# go_srcs_in_module # returns list of all not-generated go sources in the current (dir) module. function go_srcs_in_module { go list -f "{{with \$c:=.}}{{range \$f:=\$c.GoFiles }}{{\$c.Dir}}/{{\$f}}{{\"\n\"}}{{end}}{{range \$f:=\$c.TestGoFiles }}{{\$c.Dir}}/{{\$f}}{{\"\n\"}}{{end}}{{range \$f:=\$c.XTestGoFiles }}{{\$c.Dir}}/{{\$f}}{{\"\n\"}}{{end}}{{end}}" ./... | grep -vE "(\\.pb\\.go|\\.pb\\.gw.go)" @@ -212,7 +212,7 @@ function run_for_modules { } junitFilenamePrefix() { - if [[ -z "${JUNIT_REPORT_DIR}" ]]; then + if [[ -z "${JUNIT_REPORT_DIR:-}" ]]; then echo "" return fi @@ -222,7 +222,7 @@ junitFilenamePrefix() { } function produce_junit_xmlreport { - local -r junit_filename_prefix=$1 + local -r junit_filename_prefix=${1:-} if [[ -z "${junit_filename_prefix}" ]]; then return fi @@ -232,7 +232,7 @@ function produce_junit_xmlreport { # Ensure that gotestsum is run without cross-compiling run_go_tool gotest.tools/gotestsum --junitfile "${junit_xml_filename}" --raw-command cat "${junit_filename_prefix}"*.stdout || exit 1 - if [ "${VERBOSE}" != "1" ]; then + if [ "${VERBOSE:-}" != "1" ]; then rm "${junit_filename_prefix}"*.stdout fi @@ -290,7 +290,7 @@ function go_test { junit_filename_prefix=$(junitFilenamePrefix) - if [ "${VERBOSE}" == "1" ]; then + if [ "${VERBOSE:-}" == "1" ]; then goTestFlags="-v" fi diff --git a/scripts/update_dep.sh b/scripts/update_dep.sh index e0c79b4a3..e76ecaff5 100755 --- a/scripts/update_dep.sh +++ b/scripts/update_dep.sh @@ -9,6 +9,8 @@ # # Updates version of given dependency in all the modules that depend on the mod. +set -euo pipefail + source ./scripts/test_lib.sh mod="$1" diff --git a/scripts/updatebom.sh b/scripts/updatebom.sh index e879aace9..784c65fc3 100755 --- a/scripts/updatebom.sh +++ b/scripts/updatebom.sh @@ -1,6 +1,7 @@ #!/usr/bin/env bash -set -e +set -euo pipefail + source ./scripts/test_lib.sh function bom_fixlet { diff --git a/tools/mod/install_all.sh b/tools/mod/install_all.sh index 2f099b5ea..c32d6cb6f 100755 --- a/tools/mod/install_all.sh +++ b/tools/mod/install_all.sh @@ -1,4 +1,6 @@ #!/usr/bin/env bash +set -euo pipefail + cd ./tools/mod || exit 2 go list --tags tools -f '{{ join .Imports "\n" }}' | xargs go install From 2d491356ecf3d557cb0b5d50f8bac7b8c1979f30 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Mar 2023 22:28:33 +0000 Subject: [PATCH 04/20] build(deps): bump github/codeql-action from 2.2.7 to 2.2.8 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.2.7 to 2.2.8. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/168b99b3c22180941ae7dbdd5f5c9678ede476ba...67a35a08586135a9573f4327e904ecbf517a882d) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yml | 6 +++--- .github/workflows/scorecards.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index afe4728af..f223322ce 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -45,7 +45,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@168b99b3c22180941ae7dbdd5f5c9678ede476ba # v2.2.7 + uses: github/codeql-action/init@67a35a08586135a9573f4327e904ecbf517a882d # v2.2.8 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -56,7 +56,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@168b99b3c22180941ae7dbdd5f5c9678ede476ba # v2.2.7 + uses: github/codeql-action/autobuild@67a35a08586135a9573f4327e904ecbf517a882d # v2.2.8 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -70,4 +70,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@168b99b3c22180941ae7dbdd5f5c9678ede476ba # v2.2.7 + uses: github/codeql-action/analyze@67a35a08586135a9573f4327e904ecbf517a882d # v2.2.8 diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 27043ba16..8482f34ad 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -49,6 +49,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@168b99b3c22180941ae7dbdd5f5c9678ede476ba # tag=v1.0.26 + uses: github/codeql-action/upload-sarif@67a35a08586135a9573f4327e904ecbf517a882d # tag=v1.0.26 with: sarif_file: results.sarif From 00c789f5bca9df193763681407035d3ffbb0688e Mon Sep 17 00:00:00 2001 From: Marek Siarkowicz Date: Thu, 23 Mar 2023 11:29:46 +0100 Subject: [PATCH 05/20] docs: Update status of postmortem action items Signed-off-by: Marek Siarkowicz --- .../postmortems/v3.5-data-inconsistency.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Documentation/postmortems/v3.5-data-inconsistency.md b/Documentation/postmortems/v3.5-data-inconsistency.md index 718097657..27e15500e 100644 --- a/Documentation/postmortems/v3.5-data-inconsistency.md +++ b/Documentation/postmortems/v3.5-data-inconsistency.md @@ -115,18 +115,18 @@ To reflect this action items should have assigned priority: * P1 - Important for long term success of the project. Blocks v3.6 release. * P2 - Stretch goals that would be nice to have for v3.6, however should not be blocking. -| Action Item | Type | Priority | Bug | -|-------------------------------------------------------------------------------------|----------|----------|----------------------------------------------| -| etcd testing can reproduce historical data inconsistency issues | Prevent | P0 | https://github.com/etcd-io/etcd/issues/14045 | -| etcd detects data corruption by default | Detect | P0 | https://github.com/etcd-io/etcd/issues/14039 | -| etcd testing is high quality, easy to maintain and expand | Prevent | P1 | https://github.com/etcd-io/etcd/issues/13637 | -| etcd apply code should be easy to understand and validate correctness | Prevent | P1 | | -| Critical etcd features are not abandoned when contributors move on | Prevent | P1 | https://github.com/etcd-io/etcd/issues/13775 | -| etcd is continuously qualified with failure injection | Prevent | P1 | | -| etcd can reliably detect data corruption (hash is linearizable) | Detect | P1 | | -| etcd checks consistency of snapshots sent between leader and followers | Detect | P1 | https://github.com/etcd-io/etcd/issues/13973 | -| etcd recovery from data inconsistency procedures are documented and tested | Mitigate | P1 | | -| etcd can imminently detect and recover from data corruption (implement Merkle root) | Mitigate | P2 | https://github.com/etcd-io/etcd/issues/13839 | +| Action Item | Type | Priority | Bug | Status | +|-------------------------------------------------------------------------------------|----------|----------|----------------------------------------------|--------| +| etcd testing can reproduce historical data inconsistency issues | Prevent | P0 | https://github.com/etcd-io/etcd/issues/14045 | DONE | +| etcd detects data corruption by default | Detect | P0 | https://github.com/etcd-io/etcd/issues/14039 | DONE | +| etcd testing is high quality, easy to maintain and expand | Prevent | P1 | https://github.com/etcd-io/etcd/issues/13637 | | +| etcd apply code should be easy to understand and validate correctness | Prevent | P1 | | | +| Critical etcd features are not abandoned when contributors move on | Prevent | P1 | https://github.com/etcd-io/etcd/issues/13775 | DONE | +| etcd is continuously qualified with failure injection | Prevent | P1 | https://github.com/etcd-io/etcd/pull/14911 | DONE | +| etcd can reliably detect data corruption (hash is linearizable) | Detect | P1 | | | +| etcd checks consistency of snapshots sent between leader and followers | Detect | P1 | https://github.com/etcd-io/etcd/issues/13973 | DONE | +| etcd recovery from data inconsistency procedures are documented and tested | Mitigate | P1 | | | +| etcd can imminently detect and recover from data corruption (implement Merkle root) | Mitigate | P2 | https://github.com/etcd-io/etcd/issues/13839 | | ## Timeline From 8b9fc9ee4dffe88a13edc1f95df050b694122c4a Mon Sep 17 00:00:00 2001 From: James Blair Date: Thu, 23 Mar 2023 20:37:30 +0000 Subject: [PATCH 06/20] Add new tls configuration options to CHANGELOG. Signed-off-by: James Blair --- CHANGELOG/CHANGELOG-3.4.md | 1 + CHANGELOG/CHANGELOG-3.5.md | 1 + CHANGELOG/CHANGELOG-3.6.md | 1 + 3 files changed, 3 insertions(+) diff --git a/CHANGELOG/CHANGELOG-3.4.md b/CHANGELOG/CHANGELOG-3.4.md index 994772e5d..3408338c0 100644 --- a/CHANGELOG/CHANGELOG-3.4.md +++ b/CHANGELOG/CHANGELOG-3.4.md @@ -8,6 +8,7 @@ Previous change logs can be found at [CHANGELOG-3.3](https://github.com/etcd-io/ ### etcd server - Fix [server/embed: fix data race when starting both secure & insecure gRPC servers on the same address](https://github.com/etcd-io/etcd/pull/15518) +- Add [`etcd --tls-min-version --tls-max-version`](https://github.com/etcd-io/etcd/pull/15486) to enable support for TLS 1.3. ### Go - Require [Go 1.19+](https://github.com/etcd-io/etcd/pull/15333). diff --git a/CHANGELOG/CHANGELOG-3.5.md b/CHANGELOG/CHANGELOG-3.5.md index 043f59350..937e967cf 100644 --- a/CHANGELOG/CHANGELOG-3.5.md +++ b/CHANGELOG/CHANGELOG-3.5.md @@ -8,6 +8,7 @@ Previous change logs can be found at [CHANGELOG-3.4](https://github.com/etcd-io/ ### etcd server - Fix [server/embed: fix data race when starting both secure & insecure gRPC servers on the same address](https://github.com/etcd-io/etcd/pull/15517) +- Add [`etcd --tls-min-version --tls-max-version`](https://github.com/etcd-io/etcd/pull/15483) to enable support for TLS 1.3. ### Package `client/pkg/v3` - Fix [aligning zap log timestamp resolution to microseconds](https://github.com/etcd-io/etcd/pull/15240). Etcd now uses zap timestamp format: `2006-01-02T15:04:05.999999Z0700` (microsecond instead of milliseconds precision). diff --git a/CHANGELOG/CHANGELOG-3.6.md b/CHANGELOG/CHANGELOG-3.6.md index edd0ca37b..399f67555 100644 --- a/CHANGELOG/CHANGELOG-3.6.md +++ b/CHANGELOG/CHANGELOG-3.6.md @@ -74,6 +74,7 @@ See [code changes](https://github.com/etcd-io/etcd/compare/v3.5.0...v3.6.0). - Add [field `hash_revision` into `HashKVResponse`](https://github.com/etcd-io/etcd/pull/14537). - Add [`etcd --experimental-snapshot-catch-up-entries`](https://github.com/etcd-io/etcd/pull/15033) flag to configure number of entries for a slow follower to catch up after compacting the the raft storage entries and defaults to 5k. - Decreased [`--snapshot-count` default value from 100,000 to 10,000](https://github.com/etcd-io/etcd/pull/15408) +- Add [`etcd --tls-min-version --tls-max-version`](https://github.com/etcd-io/etcd/pull/15156) to enable support for TLS 1.3. ### etcd grpc-proxy From d5e5f1b54273a901c190be32b28c14d82d4d1a3f Mon Sep 17 00:00:00 2001 From: Prasad Chandrasekaran Date: Sat, 18 Mar 2023 12:08:49 +0530 Subject: [PATCH 07/20] scripts: Add testing of etcd in local image in release workflow. Signed-off-by: Prasad Chandrasekaran --- .github/workflows/release.yaml | 6 ++- scripts/test_images.sh | 87 ++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 1 deletion(-) create mode 100755 scripts/test_images.sh diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 766401338..7ed16b0df 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -9,7 +9,8 @@ jobs: - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: go-version: "1.19.7" - - run: | + - name: release + run: | set -euo pipefail git config --global user.email "github-action@etcd.io" @@ -25,3 +26,6 @@ jobs: Expire-Date: 0 EOF DRY_RUN=true ./scripts/release.sh --no-upload --no-docker-push --in-place 3.6.99 + - name: test-image + run: | + VERSION=3.6.99 ./scripts/test_images.sh diff --git a/scripts/test_images.sh b/scripts/test_images.sh new file mode 100755 index 000000000..7980ef732 --- /dev/null +++ b/scripts/test_images.sh @@ -0,0 +1,87 @@ +#!/usr/bin/env bash + +# http://redsymbol.net/articles/unofficial-bash-strict-mode/ +set -euo pipefail +IFS=$'\n\t' + +source ./scripts/test_lib.sh +source ./scripts/build_lib.sh + +function startContainer { + # run docker in the background + docker run -d --rm --name "${RUN_NAME}" "${IMAGE}" + + # wait for etcd daemon to bootstrap + sleep 5 +} + +# stop container +trap 'docker stop "${RUN_NAME}"' EXIT + +function runVersionCheck { + binary="/usr/local/bin/""$1" + versionString="$2" + Out=$(docker exec "${RUN_NAME}" "${binary}" "${versionString}") + foundVersion=$(echo "$Out" | head -1 | rev | cut -d" " -f 1 | rev ) + if [[ "${foundVersion}" != "${VERSION}" ]]; then + echo "error: Invalid Version. Got $foundVersion, expected $VERSION. Error: $Out" + exit 1 + fi +} + +# Can't proceed without docker +if ! command -v docker >/dev/null; then + log_error "cannot find docker" + exit 1 +fi + +# You can't run darwin binaries in linux containers +if [[ $(go env GOOS) == "darwin" ]]; then + echo "Please use linux machine for release builds." + exit 1 +fi + +# Pick defaults based on release workflow +ARCH=$(go env GOARCH) +REPOSITARY=${REPOSITARY:-"gcr.io/etcd-development/etcd"} +if [ -n "$VERSION" ]; then + # Expected Format: v3.6.99-amd64 + TAG=v"${VERSION}"-"${ARCH}" +else + echo "Terminating test, VERSION not supplied" + exit 1 +fi +IMAGE=${IMAGE:-"${REPOSITARY}:${TAG}"} + +# ETCD related values +RUN_NAME="test_etcd" +KEY="foo" +VALUE="bar" + +if [[ "$(docker images -q "${IMAGE}" 2> /dev/null)" == "" ]]; then + echo "${IMAGE} not present locally" + exit 1 +fi + +startContainer + +# Version check +runVersionCheck "etcd" "--version" +runVersionCheck "etcdctl" "version" +runVersionCheck "etcdutl" "version" + +# Put/Get check +PUT=$(docker exec "${RUN_NAME}" /usr/local/bin/etcdctl put "${KEY}" "${VALUE}") +if [ "${PUT}" != "OK" ]; then + echo "Problem with Putting in etcd" + exit 1 +fi + +GET=$(docker exec "${RUN_NAME}" /usr/local/bin/etcdctl get "$KEY" --print-value-only) +if [ "${GET}" != "${VALUE}" ]; then + echo "Problem with getting foo bar in etcd. Got ${GET}" + exit 1 +fi + +echo "Succesfully tested etcd local image ${TAG}" + From ab2a1b7ad65ff8d91ece9d4409e4bff7cb5753e9 Mon Sep 17 00:00:00 2001 From: Prasad Chandrasekaran Date: Fri, 24 Mar 2023 14:32:23 +0530 Subject: [PATCH 08/20] Incorporate review comments Signed-off-by: Prasad Chandrasekaran --- scripts/test_images.sh | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/scripts/test_images.sh b/scripts/test_images.sh index 7980ef732..e4600c1f1 100755 --- a/scripts/test_images.sh +++ b/scripts/test_images.sh @@ -15,13 +15,8 @@ function startContainer { sleep 5 } -# stop container -trap 'docker stop "${RUN_NAME}"' EXIT - function runVersionCheck { - binary="/usr/local/bin/""$1" - versionString="$2" - Out=$(docker exec "${RUN_NAME}" "${binary}" "${versionString}") + Out=$(docker exec "${RUN_NAME}" "${@}") foundVersion=$(echo "$Out" | head -1 | rev | cut -d" " -f 1 | rev ) if [[ "${foundVersion}" != "${VERSION}" ]]; then echo "error: Invalid Version. Got $foundVersion, expected $VERSION. Error: $Out" @@ -65,10 +60,13 @@ fi startContainer +# stop container +trap 'docker stop "${RUN_NAME}"' EXIT + # Version check -runVersionCheck "etcd" "--version" -runVersionCheck "etcdctl" "version" -runVersionCheck "etcdutl" "version" +runVersionCheck "/usr/local/bin/etcd" "--version" +runVersionCheck "/usr/local/bin/etcdctl" "version" +runVersionCheck "/usr/local/bin/etcdutl" "version" # Put/Get check PUT=$(docker exec "${RUN_NAME}" /usr/local/bin/etcdctl put "${KEY}" "${VALUE}") From 0a94133089248684503c10fc2e2b9229a2d81415 Mon Sep 17 00:00:00 2001 From: Prasad Chandrasekaran Date: Fri, 24 Mar 2023 15:27:06 +0530 Subject: [PATCH 09/20] Use run --rm for version checks Signed-off-by: Prasad Chandrasekaran --- scripts/test_images.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/test_images.sh b/scripts/test_images.sh index e4600c1f1..d9e75ba75 100755 --- a/scripts/test_images.sh +++ b/scripts/test_images.sh @@ -16,7 +16,7 @@ function startContainer { } function runVersionCheck { - Out=$(docker exec "${RUN_NAME}" "${@}") + Out=$(docker run --rm "${IMAGE}" "${@}") foundVersion=$(echo "$Out" | head -1 | rev | cut -d" " -f 1 | rev ) if [[ "${foundVersion}" != "${VERSION}" ]]; then echo "error: Invalid Version. Got $foundVersion, expected $VERSION. Error: $Out" From 14fbc98b20a9ee0dfa7fa8d8ad8b25e357969a52 Mon Sep 17 00:00:00 2001 From: Prasad Chandrasekaran Date: Fri, 24 Mar 2023 15:29:34 +0530 Subject: [PATCH 10/20] Make version check independent from put/get checks Signed-off-by: Prasad Chandrasekaran --- scripts/test_images.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/test_images.sh b/scripts/test_images.sh index d9e75ba75..d79733f5a 100755 --- a/scripts/test_images.sh +++ b/scripts/test_images.sh @@ -58,16 +58,16 @@ if [[ "$(docker images -q "${IMAGE}" 2> /dev/null)" == "" ]]; then exit 1 fi -startContainer - -# stop container -trap 'docker stop "${RUN_NAME}"' EXIT - # Version check runVersionCheck "/usr/local/bin/etcd" "--version" runVersionCheck "/usr/local/bin/etcdctl" "version" runVersionCheck "/usr/local/bin/etcdutl" "version" +startContainer +# stop container +trap 'docker stop "${RUN_NAME}"' EXIT + + # Put/Get check PUT=$(docker exec "${RUN_NAME}" /usr/local/bin/etcdctl put "${KEY}" "${VALUE}") if [ "${PUT}" != "OK" ]; then From 5f6dab41496c0c49468530bd2a5188202b6e953f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 24 Mar 2023 10:36:27 +0000 Subject: [PATCH 11/20] build(deps): bump actions/checkout from 3.4.0 to 3.5.0 Bumps [actions/checkout](https://github.com/actions/checkout) from 3.4.0 to 3.5.0. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/24cb9080177205b6e8c946b17badbe402adc938f...8f4b7f84864484a7bf31766abe9204da3cbe65b3) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/build.yaml | 2 +- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/contrib.yaml | 2 +- .github/workflows/coverage.yaml | 2 +- .github/workflows/e2e-arm64.yaml | 2 +- .github/workflows/e2e.yaml | 2 +- .github/workflows/fuzzing.yaml | 2 +- .github/workflows/govuln.yaml | 2 +- .github/workflows/grpcproxy.yaml | 2 +- .github/workflows/measure-test-flakiness.yaml | 2 +- .github/workflows/release.yaml | 2 +- .github/workflows/robustness-template.yaml | 2 +- .github/workflows/scorecards.yml | 2 +- .github/workflows/static-analysis.yaml | 2 +- .github/workflows/tests-arm64.yaml | 2 +- .github/workflows/tests.yaml | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 016ee682e..2e20a235c 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -19,7 +19,7 @@ jobs: - linux-ppc64le - linux-s390x steps: - - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: go-version: "1.19.7" diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index f223322ce..1d7a39a00 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -41,7 +41,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/contrib.yaml b/.github/workflows/contrib.yaml index 4bbceaf95..185fac591 100644 --- a/.github/workflows/contrib.yaml +++ b/.github/workflows/contrib.yaml @@ -5,7 +5,7 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: go-version: "1.19.7" diff --git a/.github/workflows/coverage.yaml b/.github/workflows/coverage.yaml index fb96ffffb..78eb6cca8 100644 --- a/.github/workflows/coverage.yaml +++ b/.github/workflows/coverage.yaml @@ -10,7 +10,7 @@ jobs: target: - linux-amd64-coverage steps: - - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: go-version: "1.19.7" diff --git a/.github/workflows/e2e-arm64.yaml b/.github/workflows/e2e-arm64.yaml index 39810050d..99a744fde 100644 --- a/.github/workflows/e2e-arm64.yaml +++ b/.github/workflows/e2e-arm64.yaml @@ -14,7 +14,7 @@ jobs: target: - linux-arm64-e2e steps: - - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: ref: main diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index c5e843bf0..b3414f989 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -11,7 +11,7 @@ jobs: - linux-amd64-e2e - linux-386-e2e steps: - - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: go-version: "1.19.7" diff --git a/.github/workflows/fuzzing.yaml b/.github/workflows/fuzzing.yaml index 7dd217259..6ff076a03 100644 --- a/.github/workflows/fuzzing.yaml +++ b/.github/workflows/fuzzing.yaml @@ -9,7 +9,7 @@ jobs: env: TARGET_PATH: ./server/etcdserver/api/v3rpc steps: - - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: go-version: "1.19.7" diff --git a/.github/workflows/govuln.yaml b/.github/workflows/govuln.yaml index cca636c7e..59b526d9a 100644 --- a/.github/workflows/govuln.yaml +++ b/.github/workflows/govuln.yaml @@ -5,7 +5,7 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: go-version: "1.19.7" diff --git a/.github/workflows/grpcproxy.yaml b/.github/workflows/grpcproxy.yaml index 23f975469..9a26783c5 100644 --- a/.github/workflows/grpcproxy.yaml +++ b/.github/workflows/grpcproxy.yaml @@ -11,7 +11,7 @@ jobs: - linux-amd64-grpcproxy-integration - linux-amd64-grpcproxy-e2e steps: - - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: go-version: "1.19.7" diff --git a/.github/workflows/measure-test-flakiness.yaml b/.github/workflows/measure-test-flakiness.yaml index 5430a70f8..ad9a0ccb9 100644 --- a/.github/workflows/measure-test-flakiness.yaml +++ b/.github/workflows/measure-test-flakiness.yaml @@ -11,7 +11,7 @@ jobs: name: Measure Test Flakiness runs-on: ubuntu-latest steps: - - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - run: "./scripts/measure-test-flakiness.sh" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 7ed16b0df..639f7e222 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -5,7 +5,7 @@ jobs: main: runs-on: ubuntu-latest steps: - - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: go-version: "1.19.7" diff --git a/.github/workflows/robustness-template.yaml b/.github/workflows/robustness-template.yaml index c52254098..a5fe1fe2b 100644 --- a/.github/workflows/robustness-template.yaml +++ b/.github/workflows/robustness-template.yaml @@ -21,7 +21,7 @@ jobs: timeout-minutes: 210 runs-on: ubuntu-latest steps: - - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: go-version: '1.19.7' diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 8482f34ad..8fed0cd73 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -22,7 +22,7 @@ jobs: steps: - name: "Checkout code" - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # tag=v3.0.0 + uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # tag=v3.0.0 with: persist-credentials: false diff --git a/.github/workflows/static-analysis.yaml b/.github/workflows/static-analysis.yaml index 0a2c6b80c..ae912fbed 100644 --- a/.github/workflows/static-analysis.yaml +++ b/.github/workflows/static-analysis.yaml @@ -5,7 +5,7 @@ jobs: run: runs-on: ubuntu-latest steps: - - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: go-version: "1.19.7" diff --git a/.github/workflows/tests-arm64.yaml b/.github/workflows/tests-arm64.yaml index ebdbfa4a9..4a625e4e0 100644 --- a/.github/workflows/tests-arm64.yaml +++ b/.github/workflows/tests-arm64.yaml @@ -16,7 +16,7 @@ jobs: - linux-arm64-integration-4-cpu - linux-arm64-unit-4-cpu-race steps: - - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: ref: main diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 952b9fa28..abd41230e 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -14,7 +14,7 @@ jobs: - linux-amd64-unit-4-cpu-race - linux-386-unit-1-cpu steps: - - uses: actions/checkout@24cb9080177205b6e8c946b17badbe402adc938f # v3.4.0 + - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - uses: actions/setup-go@4d34df0c2316fe8122ab82dc22947d607c0c91f9 # v4.0.0 with: go-version: "1.19.7" From cd240a9a29260d582b6b6d7a8e00d4e9babfaff3 Mon Sep 17 00:00:00 2001 From: Hitoshi Mitake Date: Sun, 26 Mar 2023 18:21:01 +0900 Subject: [PATCH 12/20] changelog: added item to cover reverting 14548 in release-3.4 Signed-off-by: Hitoshi Mitake --- CHANGELOG/CHANGELOG-3.4.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG/CHANGELOG-3.4.md b/CHANGELOG/CHANGELOG-3.4.md index 994772e5d..a1514d76a 100644 --- a/CHANGELOG/CHANGELOG-3.4.md +++ b/CHANGELOG/CHANGELOG-3.4.md @@ -13,6 +13,9 @@ Previous change logs can be found at [CHANGELOG-3.3](https://github.com/etcd-io/ - Require [Go 1.19+](https://github.com/etcd-io/etcd/pull/15333). - Compile with [Go 1.19+](https://go.dev/doc/devel/release#go1.19) +### Package `clientv3` +- Reverted the fix to [auth invalid token and old revision errors in watch](https://github.com/etcd-io/etcd/pull/15542). +
## v3.4.24 (2023-02-16) From 2ca482a7612029f297cd474c27116bf918dd1aa8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 17:58:43 +0000 Subject: [PATCH 13/20] build(deps): bump github.com/mikefarah/yq/v4 in /tools/mod Bumps [github.com/mikefarah/yq/v4](https://github.com/mikefarah/yq) from 4.31.2 to 4.33.1. - [Release notes](https://github.com/mikefarah/yq/releases) - [Changelog](https://github.com/mikefarah/yq/blob/master/release_notes.txt) - [Commits](https://github.com/mikefarah/yq/compare/v4.31.2...v4.33.1) --- updated-dependencies: - dependency-name: github.com/mikefarah/yq/v4 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- tools/mod/go.mod | 7 ++++--- tools/mod/go.sum | 18 +++++++++++------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/tools/mod/go.mod b/tools/mod/go.mod index 09f4c9e32..f2fcfca86 100644 --- a/tools/mod/go.mod +++ b/tools/mod/go.mod @@ -14,7 +14,7 @@ require ( github.com/hexfusion/schwag v0.0.0-20211117114134-3ceb0191ccbf github.com/mdempsky/unconvert v0.0.0-20200228143138-95ecdbfc0b5f github.com/mgechev/revive v1.3.1 - github.com/mikefarah/yq/v4 v4.31.2 + github.com/mikefarah/yq/v4 v4.33.1 go.etcd.io/gofail v0.1.0 go.etcd.io/protodoc v0.0.0-20180829002748-484ab544e116 go.etcd.io/raft/v3 v3.0.0-20221201111702-eaa6808e1f7a @@ -50,8 +50,8 @@ require ( github.com/go-openapi/strfmt v0.21.0 // indirect github.com/go-openapi/swag v0.19.15 // indirect github.com/go-stack/stack v1.8.0 // indirect - github.com/goccy/go-json v0.10.0 // indirect - github.com/goccy/go-yaml v1.9.8 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-yaml v1.10.0 // indirect github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect @@ -68,6 +68,7 @@ require ( github.com/mitchellh/mapstructure v1.4.1 // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/spf13/cobra v1.6.1 // indirect github.com/spf13/pflag v1.0.5 // indirect diff --git a/tools/mod/go.sum b/tools/mod/go.sum index 62cbd6010..ce70ed2a1 100644 --- a/tools/mod/go.sum +++ b/tools/mod/go.sum @@ -110,10 +110,10 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA= -github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-yaml v1.9.8 h1:5gMyLUeU1/6zl+WFfR1hN7D2kf+1/eRGa7DFtToiBvQ= -github.com/goccy/go-yaml v1.9.8/go.mod h1:JubOolP3gh0HpiBc4BLRD4YmjEjHAmIIB2aaXKkTfoE= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-yaml v1.10.0 h1:rBi+5HGuznOxx0JZ+60LDY85gc0dyIJCIMvsMJTKSKQ= +github.com/goccy/go-yaml v1.10.0/go.mod h1:h/18Lr6oSQ3mvmqFoWmQ47KChOgpfHpTyIHl3yVmpiY= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= @@ -132,8 +132,9 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -195,8 +196,8 @@ github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517 h1:zpIH83+oKzcpryru8c github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= github.com/mgechev/revive v1.3.1 h1:OlQkcH40IB2cGuprTPcjB0iIUddgVZgGmDX3IAMR8D4= github.com/mgechev/revive v1.3.1/go.mod h1:YlD6TTWl2B8A103R9KWJSPVI9DrEf+oqr15q21Ld+5I= -github.com/mikefarah/yq/v4 v4.31.2 h1:uOAj+ymBvvta+nOI56Z+v4Z3AUI4a6LXUf+8klVkLV4= -github.com/mikefarah/yq/v4 v4.31.2/go.mod h1:0grgy4sm131n6gj9LSY2Qo3vHdmOlBeEJXiy3wwdcIs= +github.com/mikefarah/yq/v4 v4.33.1 h1:lqdWrUrNRpcsZkhBefh8fwjWG81i56pKvl8SRVE65JI= +github.com/mikefarah/yq/v4 v4.33.1/go.mod h1:7jHWghYUFVJAtUzz/E/gPNMarI+LPsqC6pJfeouINLk= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -210,6 +211,8 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= +github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= +github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -244,6 +247,7 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= From f9b08e5fdc16625d38d4c88a27f4a6fa1b677c18 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 18:02:38 +0000 Subject: [PATCH 14/20] build(deps): bump github/codeql-action from 2.2.8 to 2.2.9 Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.2.8 to 2.2.9. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/67a35a08586135a9573f4327e904ecbf517a882d...04df1262e6247151b5ac09cd2c303ac36ad3f62b) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/codeql-analysis.yml | 6 +++--- .github/workflows/scorecards.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 1d7a39a00..067a7a427 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -45,7 +45,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@67a35a08586135a9573f4327e904ecbf517a882d # v2.2.8 + uses: github/codeql-action/init@04df1262e6247151b5ac09cd2c303ac36ad3f62b # v2.2.9 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -56,7 +56,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@67a35a08586135a9573f4327e904ecbf517a882d # v2.2.8 + uses: github/codeql-action/autobuild@04df1262e6247151b5ac09cd2c303ac36ad3f62b # v2.2.9 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -70,4 +70,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@67a35a08586135a9573f4327e904ecbf517a882d # v2.2.8 + uses: github/codeql-action/analyze@04df1262e6247151b5ac09cd2c303ac36ad3f62b # v2.2.9 diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 8fed0cd73..3c1f03939 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -49,6 +49,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@67a35a08586135a9573f4327e904ecbf517a882d # tag=v1.0.26 + uses: github/codeql-action/upload-sarif@04df1262e6247151b5ac09cd2c303ac36ad3f62b # tag=v1.0.26 with: sarif_file: results.sarif From 9a2553fe2f3d9a851b591f4ac871368b7cef689b Mon Sep 17 00:00:00 2001 From: Chao Chen Date: Mon, 27 Mar 2023 17:35:07 -0700 Subject: [PATCH 15/20] migrate auth tests to common #7 Signed-off-by: Chao Chen --- bill-of-materials.json | 2 +- tests/common/auth_test.go | 93 ++++++++++++++++++++++++++ tests/common/auth_util.go | 16 +++++ tests/e2e/ctl_v3_auth_test.go | 119 +--------------------------------- 4 files changed, 113 insertions(+), 117 deletions(-) diff --git a/bill-of-materials.json b/bill-of-materials.json index bf9574041..db45756dc 100644 --- a/bill-of-materials.json +++ b/bill-of-materials.json @@ -396,7 +396,7 @@ ] }, { - "project": "github.com/stretchr/testify/assert", + "project": "github.com/stretchr/testify", "licenses": [ { "type": "MIT License", diff --git a/tests/common/auth_test.go b/tests/common/auth_test.go index 78b97fc9c..6b54ca296 100644 --- a/tests/common/auth_test.go +++ b/tests/common/auth_test.go @@ -629,6 +629,99 @@ func TestAuthTestInvalidMgmt(t *testing.T) { }) } +func TestAuthLeaseRevoke(t *testing.T) { + testRunner.BeforeTest(t) + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + clus := testRunner.NewCluster(ctx, t, config.WithClusterConfig(config.ClusterConfig{ClusterSize: 1})) + defer clus.Close() + cc := testutils.MustClient(clus.Client()) + testutils.ExecuteUntil(ctx, t, func() { + require.NoErrorf(t, setupAuth(cc, []authRole{testRole}, []authUser{rootUser, testUser}), "failed to enable auth") + rootAuthClient := testutils.MustClient(clus.Client(WithAuth(rootUserName, rootPassword))) + + lresp, err := rootAuthClient.Grant(ctx, 10) + require.NoError(t, err) + err = rootAuthClient.Put(ctx, "key", "value", config.PutOptions{LeaseID: lresp.ID}) + require.NoError(t, err) + + _, err = rootAuthClient.Revoke(ctx, lresp.ID) + require.NoError(t, err) + + _, err = rootAuthClient.Get(ctx, "key", config.GetOptions{}) + require.NoError(t, err) + }) +} + +func TestAuthRoleGet(t *testing.T) { + testRunner.BeforeTest(t) + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + clus := testRunner.NewCluster(ctx, t, config.WithClusterConfig(config.ClusterConfig{ClusterSize: 1})) + defer clus.Close() + cc := testutils.MustClient(clus.Client()) + testutils.ExecuteUntil(ctx, t, func() { + require.NoErrorf(t, setupAuth(cc, []authRole{testRole}, []authUser{rootUser, testUser}), "failed to enable auth") + rootAuthClient := testutils.MustClient(clus.Client(WithAuth(rootUserName, rootPassword))) + testUserAuthClient := testutils.MustClient(clus.Client(WithAuth(testUserName, testPassword))) + + resp, err := rootAuthClient.RoleGet(ctx, testRoleName) + require.NoError(t, err) + requireRolePermissionEqual(t, testRole, resp.Perm) + + // test-user can get the information of test-role because it belongs to the role + resp, err = testUserAuthClient.RoleGet(ctx, testRoleName) + require.NoError(t, err) + requireRolePermissionEqual(t, testRole, resp.Perm) + // test-user cannot get the information of root because it doesn't belong to the role + _, err = testUserAuthClient.RoleGet(ctx, rootRoleName) + require.ErrorContains(t, err, PermissionDenied) + }) +} + +func TestAuthUserGet(t *testing.T) { + testRunner.BeforeTest(t) + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + clus := testRunner.NewCluster(ctx, t, config.WithClusterConfig(config.ClusterConfig{ClusterSize: 1})) + defer clus.Close() + cc := testutils.MustClient(clus.Client()) + testutils.ExecuteUntil(ctx, t, func() { + require.NoErrorf(t, setupAuth(cc, []authRole{testRole}, []authUser{rootUser, testUser}), "failed to enable auth") + rootAuthClient := testutils.MustClient(clus.Client(WithAuth(rootUserName, rootPassword))) + testUserAuthClient := testutils.MustClient(clus.Client(WithAuth(testUserName, testPassword))) + + resp, err := rootAuthClient.UserGet(ctx, testUserName) + require.NoError(t, err) + requireUserRolesEqual(t, testUser, resp.Roles) + + // test-user can get the information of test-user itself + resp, err = testUserAuthClient.UserGet(ctx, testUserName) + require.NoError(t, err) + requireUserRolesEqual(t, testUser, resp.Roles) + // test-user cannot get the information of root + _, err = testUserAuthClient.UserGet(ctx, rootUserName) + require.ErrorContains(t, err, PermissionDenied) + }) +} + +func TestAuthRoleList(t *testing.T) { + testRunner.BeforeTest(t) + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + clus := testRunner.NewCluster(ctx, t, config.WithClusterConfig(config.ClusterConfig{ClusterSize: 1})) + defer clus.Close() + cc := testutils.MustClient(clus.Client()) + testutils.ExecuteUntil(ctx, t, func() { + require.NoErrorf(t, setupAuth(cc, []authRole{testRole}, []authUser{rootUser, testUser}), "failed to enable auth") + rootAuthClient := testutils.MustClient(clus.Client(WithAuth(rootUserName, rootPassword))) + + resp, err := rootAuthClient.RoleList(ctx) + require.NoError(t, err) + requireUserRolesEqual(t, testUser, resp.Roles) + }) +} + func mustAbsPath(path string) string { abs, err := filepath.Abs(path) if err != nil { diff --git a/tests/common/auth_util.go b/tests/common/auth_util.go index c75f20cd3..e70a87db8 100644 --- a/tests/common/auth_util.go +++ b/tests/common/auth_util.go @@ -17,7 +17,11 @@ package common import ( "context" "fmt" + "testing" + "github.com/stretchr/testify/require" + + "go.etcd.io/etcd/api/v3/authpb" clientv3 "go.etcd.io/etcd/client/v3" "go.etcd.io/etcd/tests/v3/framework/config" "go.etcd.io/etcd/tests/v3/framework/interfaces" @@ -106,3 +110,15 @@ func setupAuth(c interfaces.Client, roles []authRole, users []authUser) error { return nil } + +func requireRolePermissionEqual(t *testing.T, expectRole authRole, actual []*authpb.Permission) { + require.Equal(t, 1, len(actual)) + require.Equal(t, expectRole.permission, clientv3.PermissionType(actual[0].PermType)) + require.Equal(t, expectRole.key, string(actual[0].Key)) + require.Equal(t, expectRole.keyEnd, string(actual[0].RangeEnd)) +} + +func requireUserRolesEqual(t *testing.T, expectUser authUser, actual []string) { + require.Equal(t, 1, len(actual)) + require.Equal(t, expectUser.role, actual[0]) +} diff --git a/tests/e2e/ctl_v3_auth_test.go b/tests/e2e/ctl_v3_auth_test.go index d0de934df..a0a90cb0a 100644 --- a/tests/e2e/ctl_v3_auth_test.go +++ b/tests/e2e/ctl_v3_auth_test.go @@ -29,14 +29,10 @@ import ( func TestCtlV3AuthMemberUpdate(t *testing.T) { testCtl(t, authTestMemberUpdate) } func TestCtlV3AuthFromKeyPerm(t *testing.T) { testCtl(t, authTestFromKeyPerm) } -func TestCtlV3AuthAndWatch(t *testing.T) { testCtl(t, authTestWatch) } -func TestCtlV3AuthAndWatchJWT(t *testing.T) { testCtl(t, authTestWatch, withCfg(*e2e.NewConfigJWT())) } -func TestCtlV3AuthLeaseRevoke(t *testing.T) { testCtl(t, authLeaseTestLeaseRevoke) } - -func TestCtlV3AuthRoleGet(t *testing.T) { testCtl(t, authTestRoleGet) } -func TestCtlV3AuthUserGet(t *testing.T) { testCtl(t, authTestUserGet) } -func TestCtlV3AuthRoleList(t *testing.T) { testCtl(t, authTestRoleList) } +// TestCtlV3AuthAndWatch TODO https://github.com/etcd-io/etcd/issues/7988 is the blocker of migration to common/auth_test.go +func TestCtlV3AuthAndWatch(t *testing.T) { testCtl(t, authTestWatch) } +func TestCtlV3AuthAndWatchJWT(t *testing.T) { testCtl(t, authTestWatch, withCfg(*e2e.NewConfigJWT())) } func TestCtlV3AuthDefrag(t *testing.T) { testCtl(t, authTestDefrag) } func TestCtlV3AuthEndpointHealth(t *testing.T) { @@ -230,44 +226,6 @@ func authTestFromKeyPerm(cx ctlCtx) { } } -func leaseTestGrantLeasesList(cx ctlCtx) error { - id, err := ctlV3LeaseGrant(cx, 10) - if err != nil { - return fmt.Errorf("ctlV3LeaseGrant error (%v)", err) - } - - cmdArgs := append(cx.PrefixArgs(), "lease", "list") - proc, err := e2e.SpawnCmd(cmdArgs, cx.envMap) - if err != nil { - return fmt.Errorf("lease list failed (%v)", err) - } - _, err = proc.Expect(id) - if err != nil { - return fmt.Errorf("lease id not in returned list (%v)", err) - } - return proc.Close() -} - -func authLeaseTestLeaseRevoke(cx ctlCtx) { - cx.user, cx.pass = "root", "root" - authSetupTestUser(cx) - - // put with TTL 10 seconds and revoke - leaseID, err := ctlV3LeaseGrant(cx, 10) - if err != nil { - cx.t.Fatalf("ctlV3LeaseGrant error (%v)", err) - } - if err := ctlV3Put(cx, "key", "val", leaseID); err != nil { - cx.t.Fatalf("ctlV3Put error (%v)", err) - } - if err := ctlV3LeaseRevoke(cx, leaseID); err != nil { - cx.t.Fatalf("ctlV3LeaseRevoke error (%v)", err) - } - if err := ctlV3GetWithErr(cx, []string{"key"}, []string{"retrying of unary invoker failed"}); err != nil { // expect errors - cx.t.Fatalf("ctlV3GetWithErr error (%v)", err) - } -} - func authTestWatch(cx ctlCtx) { if err := authEnable(cx); err != nil { cx.t.Fatal(err) @@ -344,77 +302,6 @@ func authTestWatch(cx ctlCtx) { } -func authTestRoleGet(cx ctlCtx) { - if err := authEnable(cx); err != nil { - cx.t.Fatal(err) - } - cx.user, cx.pass = "root", "root" - authSetupTestUser(cx) - - expected := []string{ - "Role test-role", - "KV Read:", "foo", - "KV Write:", "foo", - } - if err := e2e.SpawnWithExpects(append(cx.PrefixArgs(), "role", "get", "test-role"), cx.envMap, expected...); err != nil { - cx.t.Fatal(err) - } - - // test-user can get the information of test-role because it belongs to the role - cx.user, cx.pass = "test-user", "pass" - if err := e2e.SpawnWithExpects(append(cx.PrefixArgs(), "role", "get", "test-role"), cx.envMap, expected...); err != nil { - cx.t.Fatal(err) - } - - // test-user cannot get the information of root because it doesn't belong to the role - expected = []string{ - "Error: etcdserver: permission denied", - } - err := e2e.SpawnWithExpects(append(cx.PrefixArgs(), "role", "get", "root"), cx.envMap, expected...) - require.ErrorContains(cx.t, err, "permission denied") -} - -func authTestUserGet(cx ctlCtx) { - if err := authEnable(cx); err != nil { - cx.t.Fatal(err) - } - cx.user, cx.pass = "root", "root" - authSetupTestUser(cx) - - expected := []string{ - "User: test-user", - "Roles: test-role", - } - - if err := e2e.SpawnWithExpects(append(cx.PrefixArgs(), "user", "get", "test-user"), cx.envMap, expected...); err != nil { - cx.t.Fatal(err) - } - - // test-user can get the information of test-user itself - cx.user, cx.pass = "test-user", "pass" - if err := e2e.SpawnWithExpects(append(cx.PrefixArgs(), "user", "get", "test-user"), cx.envMap, expected...); err != nil { - cx.t.Fatal(err) - } - - // test-user cannot get the information of root - expected = []string{ - "Error: etcdserver: permission denied", - } - err := e2e.SpawnWithExpects(append(cx.PrefixArgs(), "user", "get", "root"), cx.envMap, expected...) - require.ErrorContains(cx.t, err, "permission denied") -} - -func authTestRoleList(cx ctlCtx) { - if err := authEnable(cx); err != nil { - cx.t.Fatal(err) - } - cx.user, cx.pass = "root", "root" - authSetupTestUser(cx) - if err := e2e.SpawnWithExpectWithEnv(append(cx.PrefixArgs(), "role", "list"), cx.envMap, "test-role"); err != nil { - cx.t.Fatal(err) - } -} - func authTestDefrag(cx ctlCtx) { maintenanceInitKeys(cx) From d03ac88b36a76b640751ef896d6576766973c8f7 Mon Sep 17 00:00:00 2001 From: Marek Siarkowicz Date: Wed, 23 Nov 2022 16:27:36 +0100 Subject: [PATCH 16/20] tests: Document robustness tests Signed-off-by: Marek Siarkowicz --- .github/workflows/robustness-template.yaml | 9 +- Makefile | 50 +---------- scripts/test.sh | 2 +- scripts/test_lib.sh | 2 +- tests/robustness/README.md | 71 ++++++++++++++++ tests/robustness/issue14370.png | Bin 0 -> 307846 bytes tests/robustness/makefile.mk | 92 +++++++++++++++++++++ 7 files changed, 173 insertions(+), 53 deletions(-) create mode 100644 tests/robustness/README.md create mode 100644 tests/robustness/issue14370.png create mode 100644 tests/robustness/makefile.mk diff --git a/.github/workflows/robustness-template.yaml b/.github/workflows/robustness-template.yaml index 306764a69..931a9506f 100644 --- a/.github/workflows/robustness-template.yaml +++ b/.github/workflows/robustness-template.yaml @@ -31,18 +31,19 @@ jobs: run: | case "${GITHUB_REF}" in release-3.5) - make build-failpoints-release-3.5 - ./bin/etcd --version + make /tmp/etcd-release-3.5-failpoints/bin/etcd + cp /tmp/etcd-release-3.5-failpoints/bin/etcd bin/etcd ;; release-3.4) - make build-failpoints-release-3.4 - ./bin/etcd --version + make /tmp/etcd-release-3.4-failpoints/bin/etcd + cp /tmp/etcd-release-3.4-failpoints/bin/etcd bin/etcd ;; *) make gofail-enable make build ;; esac + ./bin/etcd --version - name: test-robustness run: | # Use --failfast to avoid overriding report generated by failed test diff --git a/Makefile b/Makefile index cf9d51eb8..cae7e241f 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,6 @@ +all: build +include tests/robustness/makefile.mk + .PHONY: build build: GO_BUILD_FLAGS="${GO_BUILD_FLAGS} -v" ./scripts/build.sh @@ -113,53 +116,6 @@ verify-genproto: verify-goimport: PASSES="goimport" ./scripts/test.sh -# Failpoints - -GOFAIL_VERSION = $(shell cd tools/mod && go list -m -f {{.Version}} go.etcd.io/gofail) - -.PHONY: gofail-enable -gofail-enable: install-gofail - gofail enable server/etcdserver/ server/storage/backend/ server/storage/mvcc/ server/storage/wal/ - cd ./server && go get go.etcd.io/gofail@${GOFAIL_VERSION} - cd ./etcdutl && go get go.etcd.io/gofail@${GOFAIL_VERSION} - cd ./etcdctl && go get go.etcd.io/gofail@${GOFAIL_VERSION} - cd ./tests && go get go.etcd.io/gofail@${GOFAIL_VERSION} - -.PHONY: gofail-disable -gofail-disable: install-gofail - gofail disable server/etcdserver/ server/storage/backend/ server/storage/mvcc/ server/storage/wal/ - cd ./server && go mod tidy - cd ./etcdutl && go mod tidy - cd ./etcdctl && go mod tidy - cd ./tests && go mod tidy - -.PHONY: install-gofail -install-gofail: - cd tools/mod; go install go.etcd.io/gofail@${GOFAIL_VERSION} - -build-failpoints-release-3.5: - rm -rf /tmp/etcd-release-3.5/ - mkdir -p /tmp/etcd-release-3.5/ - cd /tmp/etcd-release-3.5/; \ - git clone --depth 1 --branch release-3.5 https://github.com/etcd-io/etcd.git .; \ - go get go.etcd.io/gofail@${GOFAIL_VERSION}; \ - (cd server; go get go.etcd.io/gofail@${GOFAIL_VERSION}); \ - (cd etcdctl; go get go.etcd.io/gofail@${GOFAIL_VERSION}); \ - (cd etcdutl; go get go.etcd.io/gofail@${GOFAIL_VERSION}); \ - FAILPOINTS=true ./build; - mkdir -p ./bin - cp /tmp/etcd-release-3.5/bin/etcd ./bin/etcd - -build-failpoints-release-3.4: - rm -rf /tmp/etcd-release-3.4/ - mkdir -p /tmp/etcd-release-3.4/ - cd /tmp/etcd-release-3.4/; \ - git clone --depth 1 --branch release-3.4 https://github.com/etcd-io/etcd.git .; \ - go get go.etcd.io/gofail@${GOFAIL_VERSION}; \ - FAILPOINTS=true ./build; - mkdir -p ./bin - cp /tmp/etcd-release-3.4/bin/etcd ./bin/etcd - # Cleanup clean: diff --git a/scripts/test.sh b/scripts/test.sh index 1ad67b116..bd720b2dc 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -126,7 +126,7 @@ function e2e_pass { function robustness_pass { # e2e tests are running pre-build binary. Settings like --race,-cover,-cpu does not have any impact. - run_for_module "tests" go_test "./robustness/..." "keep_going" : -timeout="${TIMEOUT:-30m}" "${RUN_ARG[@]}" "$@" + run_for_module "tests" go_test "./robustness" "keep_going" : -timeout="${TIMEOUT:-30m}" "${RUN_ARG[@]}" "$@" } function integration_e2e_pass { diff --git a/scripts/test_lib.sh b/scripts/test_lib.sh index 1199b4110..6eb87fbfa 100644 --- a/scripts/test_lib.sh +++ b/scripts/test_lib.sh @@ -315,7 +315,7 @@ function go_test { additional_flags=$(${flags_for_package_func} ${pkg}) # shellcheck disable=SC2206 - local cmd=( go test ${goTestFlags} ${additional_flags} "$@" ${pkg} ) + local cmd=( go test ${goTestFlags} ${additional_flags} ${pkg} "$@" ) # shellcheck disable=SC2086 if ! run env ${goTestEnv} ETCD_VERIFY="${ETCD_VERIFY}" "${cmd[@]}" | tee ${junit_filename_prefix:+"${junit_filename_prefix}.stdout"} | grep --binary-files=text "${go_test_grep_pattern}" ; then diff --git a/tests/robustness/README.md b/tests/robustness/README.md new file mode 100644 index 000000000..e92b0cdfb --- /dev/null +++ b/tests/robustness/README.md @@ -0,0 +1,71 @@ +# etcd Robustness Testing + +Purpose of etcd robustness tests is to validate that etcd upholds +[API guarantees] and [watch guarantees] under any condition or failure. + +Robustness tests achieve that comparing etcd cluster behavior against a simplified model. +Multiple test encompass different etcd cluster setups, client traffic types and failures experienced by cluster. +During a single test we create a cluster and inject failures while sending and recording client traffic. +Correctness is validated by running collected history of client operations against the etcd model and a set of validators. +Upon failure tests generate a report that can be used to attribute whether failure was caused by bug in etcd or test framework. + +[API guarantees]: https://etcd.io/docs/latest/learning/api_guarantees/ +[watch guarantees]: https://etcd.io/docs/latest/learning/api/#watch-streams + +## Running locally + +1. Build etcd with failpoints + ```bash + make gofail-enable + make build + make gofail-disable + ``` +2. Run the tests + + ```bash + make test-robustness + ``` + + Optionally you can pass environment variables: + * `GO_TEST_FLAGS` - to pass additional arguments to `go test`. + It is recommended to run tests multiple times with failfast enabled. this can be done by setting `GO_TEST_FLAGS='--count=100 --failfast'`. + * `EXPECT_DEBUG=true` - to get logs from the cluster. + * `RESULTS_DIR` - to change location where results report will be saved. + +## Analysing failure + +If robustness tests fails we want to analyse the report to confirm if the issue is on etcd side. Location of this report +is included in test logs. One of log lines should look like: +``` + history.go:34: Model is not linearizable + logger.go:130: 2023-03-18T12:18:03.244+0100 INFO Saving member data dir {"member": "TestRobustnessIssue14370-test-0", "path": "/tmp/TestRobustness_Issue14370/TestRobustnessIssue14370-test-0"} + logger.go:130: 2023-03-18T12:18:03.244+0100 INFO Saving watch responses {"path": "/tmp/TestRobustness_Issue14370/TestRobustnessIssue14370-test-0/responses.json"} + logger.go:130: 2023-03-18T12:18:03.247+0100 INFO Saving watch events {"path": "/tmp/TestRobustness_Issue14370/TestRobustnessIssue14370-test-0/events.json"} + logger.go:130: 2023-03-18T12:18:03.248+0100 INFO Saving operation history {"path": "/tmp/TestRobustness_Issue14370/full-history.json"} + logger.go:130: 2023-03-18T12:18:03.252+0100 INFO Saving operation history {"path": "/tmp/TestRobustness_Issue14370/patched-history.json"} + logger.go:130: 2023-03-18T12:18:03.256+0100 INFO Saving visualization {"path": "/tmp/TestRobustness_Issue14370/history.html"} +``` + +Report includes multiple types of files: +* Member db files, can be used to verify disk/memory corruption. +* Watch responses saved as json, can be used to validate [watch guarantees]. +* Operation history saved as both html visualization and a json, can be used to validate [API guarantees]. + +### Example analysis of linearization issue + +Let's analyse issue [#14370]. +To reproduce the issue by yourself run `make test-robustness-issue14370`. +After a couple of tries robustness tests should report `Model is not linearizable` and save report locally. +Lineralization issues are easiest to analyse via history visualization. +Open `/tmp/TestRobustness_Issue14370/history.html` file in your browser. +Jump to the error in linearization by clicking `[ jump to first error ]` on the top of the page. + +You should see a graph similar to the one on the image below. +![issue14370](./issue14370.png) + +Last correct request (connected with grey line) is a `Put` request that succeeded and got revision `168`. +All following requests are invalid (connected with red line) as they have revision `167`. +Etcd guarantee that revision is non-decreasing, so this shows a bug in etcd as there is no way revision should decrease. +This is consistent with the root cause of [#14370] as it was issue with process crash causing last write to be lost. + +[#14370]: https://github.com/etcd-io/etcd/issues/14370 \ No newline at end of file diff --git a/tests/robustness/issue14370.png b/tests/robustness/issue14370.png new file mode 100644 index 0000000000000000000000000000000000000000..2b418c486af0c9f243d3f25c428ba9e169e10af1 GIT binary patch literal 307846 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

I9A~wx%NEZTVezzv4(iI4A|ledqXoi{AhK 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

_++ADhRVdvTKk_*;Yzsyu zB$P%ViAhWrRY}1<9rw8`ac|x4rQ9XDru#b0P(le&VjO+E`LK2QVMRePP#N73EiJgaf0u3?5*1CW{`C+UCiOf(=EFl|%RZKiyM$JhS-A$` zX(+9460i4CE?9hHXz@jwMZPcoWw7{WO_=#6vznmE{$ZL}_0ghKHLG|%f~5Oev2yJIb59Y{cSv%1 z6|S0{+!~gtw${-7CXbSQwmXb&e9TIX+`HuYc@o-ecTB?^3V`r$jg%nnnj5?ZdLV~fgW|eGu*^20(65kd0-|_ z#o<;f4W^+yy8Eq3(6lmOPYc;1pqUbis7@Uu=vZW%o?8-QzW*{(M9clXh=zl5AYTL~ z1S;a8dXo@~_gZ6`KxtG>Ts`?WsKJOVRrIe zWztTMt!x}{YXt zkTON9qx{grFCLIl(G*$u;2D`CfY7jaq&3$l%Ti$ubJ-nXzV|>Mfq;f7&0gl0mppw5 zhAHu<-DR-LPP?L(&7iQ0YRYcYGD|2LMBdr)CCyy#Gv3`3v1+RmTJ0?;euA4ub1!}2 zWdDUL1-7&V&kff>*_z`MqWJsI+&{T7?Tjf@h`N;JDkqdD;rNk0H@yzYX@hP^T$5Tu!j&O_KrK-H1ytFOCtAx1)AANDK7E>yNnN8?e6@fvLET1=aNn~7W z2~jLvS>BaDvF+{)?+PxGTHZ|3K0!6NX+qe`jEGy(`M%b;EjUdq8}k}T=#z|TTW zXO*eE@w&{YH>T58&E_*zd{_}W!GzcG)9U9f7j5ZGPV^DIZzCwn zEFJn@nFFw5vDOgTxYJ&8!NlCGtE-r0pu8%6Pws--W4kY9F*6gi zCA}_=hiKHUMbjw*@YUujMMUuvA*uVKDHi4GH?8YO=ZyGv;_ZOe9ZYeyt2J<4itL%s zjsW^2@AUX(|4>|^B>>U2aip{^Cd;DvDgKFzdyld=^9AI(6D&bveCFMJArY&=Q-^6| z62^@@gu}IM&c`oew2pJQ5c`?YCOJesmY#=KNbd-EAl49XQ3`@jwQ;K!$o#8!@hDb{ zS7x5~o2hzqO$Yn{KlX?~W?oK3&KN&DwFJlB6S49Y5&6pCv)WWnywOzRX$0rVF~@H7 zgy~>dSxnw?`>WMUUrdzdO^2L(jC=SxP1cP`_7-H7#$SH?P{Qnz^ zT84sq+ASTSEv;=B-@eg|Jg4tw!>wo3_GScKGL4V8OqYuHQolgn`AfJq-GVqlV;MPATI<%l$AE5dYa8d2s`eP`^XL`=Y4+~381 z=*QS2CbnmfPA*;7k=sRSz^YLZyYx3x@=xRRq#tT~=}w{Sn0M?LPG-!_UFR-vuF%W( zoUqdEmb3Ggm}if|qLa}`lNhGM98jcwyr3!gL-@4i-90=kg(qTf`L1{M4t26V12Scat>c>^{x(W&QTr@T=a+~(5cbZJ%)6yL@JHSedw8wfv zf)%RlUI$Y-DP9cZOA&W*tWOSq>ui3o7czYOO}oFRFBP9e6LfKGV~cAXATV6Z+RFv< zwq@ABxcbJ1W7i?zYWjwWsYTB?Gx>7~M;t$Y`N2%_h>4eV&ohTP8B1nCS5nk8H&KXtdGOik#7S)fBo7!M%^O0K( z@3ou_hiz_lpFtrj6e}S9W2?m6-j+-2Y-iLsaNjUUNZngEkKXA&JV~$QMA6HSiBMY& zq<0mD5E4=@_Bo_XRZo6JZ%AQ3 zL3DK49zO8){xCJ`EsWuiDuqQ>cMG0pW)mXX(u?^YBgPW}gVCMlQ2y<$jpAW@6PevC zYIl)6&aK~aBy+7JI{8skT-wIo_4^mh$F$e_!nxy>8gnKXTwTQs%LI&SthK=$s3%o( z9=Are66jjE#(HYOoT4)!w)y-k{idWN;a~NN`OB@Pj^dr(M-Kt{yM&X*!}sNJ26fg5zjzJ;bq^>d={z#AClFrhsQZ~ zYIY+phU4HeDJ)gb>hsU0FRY#Ty_m>cTiC!My}R$p0>%;Xf<9*obxPq7>CUa_DGfTFN-$)ISUx&rl zDR67b^Kj9UMQIRy?_{k3XhYJZ3mb>MhjUa zre7rY9x&4>@t?`hYI%hBBpj)9_XZTXN`J>)wV=kTZNMUSs}l71k7TqP`g;NPe_}!Z z=g-8_$|%syK7Yn5*0y*3Dx;)S#2ub_^7wYD!OKKd_F@4jROi)Ci0{? z3U}{P<=nb4r%wV^O(j;L#UvaRBl+zT(yO<_ZuO>9yyT^}4c%KNP>hGmoUj|%T?75T zT}hLQ)3e1SoeZPWELSbY)H7!1+e1AjYNHPuZ@~`^q9|b*XnNw(v8lu6v%Y;J>vqJ&-e3B>&?s)j?#mvTxAPsV|%mQC-fK&g$c{q2( z34mBtPk=mf`-@9y6>uf(a^N#S zt!1kfKc2Sqc(O6C-A_XW^$ z?>|&Q552wXx+Sc7nIVmTH~rFeH!&YmF1|Aon8)D-irr?h9a4_%AQwy5shhB~rkd!3 zZXE9~cx8P}wYR7zOQ&0@?#SyRVeLl= zI2KiHlmQg>&31lbF*o&#hVv}vO-4pK8EwB@OXK5K{&b>Wl^~$)0v<|iV zXb=jYSU~|El8ePP(vZ^1TAnNTn?LsVw~k(d)*nHRX_y(OfW+BpFmpZrhfSn1$m)og z#(Ll1AC=IvKerbOa?;o?wk>Df1sPlh7Ehqovg_1d!U9w&3!z!j+Y8I#8Vp;t@^fhd zyuexOOzsSGYbOlvYx^2VGIh3#O<3?vEVVHIK?AEqO z68<;!6CW_@Zi75}KO=+C;V`YHyYXg11#2Qc&-3ytN6*7Xwz)fr>Fe_u^HnD-l&owe zl*1_t3_2YqOlD)n`wKE8*yIEIQhh+Fv%uQ%-WLd>yuXYB1JFEG0AHGIwm2YGd4>VF z#yR&qFg%XaBNC0P_uGGR0bs$>@hspJZWb&Vgsko);St4Pw++!2EarmhkuAk9` zX`~;_C=>;7-5rnN<#$vR87#CszKhF0eGg+B7gZuG&9Y!2Xx0xS$+4Iw^RL*lp4D;+ zJ{&TjTg=a=zj4nQp|3E{s=V5t!JwBcSvt?Z+DCELSHDkIyD*-EiY$G(dCAMyNwY-rhnh;zcN=4M`?xSwX>WWD`DJv$0mINWMH$TrGq%dQYkPK$hOT0muJz{zoKH=^6SKa5tw}dT%qmuT*o8o zjGC>u&rMQAD}BA*jnDHxk9ef@I8hDP>%Nw*O3hF&*sk8R&f?mf_LZ&&D1hZMkoh zmOU>fKGA!1iy&l$;BzqLe#XgK;Om+Xoq;QtuSB4sg>E2&rOG4)b92ak`D1=<&`vgV?H-n7B^}cUF7IDt*s=t`%2m@a9E09NbGNIjy==>yPUB!PAxM^9{ zX8SEBDvj;ty{#hsN>1#)6;fBIdD1#D00!ePLt^VGpg31ObJs<%X~0ka`9HRrI@6cv zx#jPj4y+L2-vsgco_n|TgTu>e{RVhm>BVrX@lFLLK~ZyyWRQrs3yyOmFB-U30h5jd zL(6HqZ;Russc@PUyqe{xC!v{@F0~%yJx#=?Y|c(Fy!`gO6|jZ5U}kLz>Mo7ILEhqU zJk~qT@U^~IDWbzJQ5y)?9SW}DlKgQxBVa6E#jwbL5xAU-wT8Sz`^$^&drVOoD_|}z za7ZY2;u>zaNpla?cbX2?sxHUxhm?A3mL6Uq%kD;;q+CjHbT7Lzx4n*Exm^xcP>q~? zd#CSO7EJPWAg_1`rTc7cL_u4$(wL<5Sp z#O@%733S3nkA;|N~O0zOIWb2k|+##SzBmfQJ2G<8a7%S7sZ8#t`x6) zblbq+yo`;ydqc?z6_x!}Gx_T?%@|@b9)sk@4yUgr31H7auxlBj`)eee>}qd?RN3F@ zt+!1{tf-Vb7>G-1dBt?ZQ4Wz)jTU*@m0QIQ3U}utaC}Kq>*rw(Cl|-|u_ZYbhc}Of zhPMypajx>rt1>$)j+E!HDtHVw(JAk%ri)PBLLD**C!`UpoW03x^wrGA$nmT-; z+*+*m%nA45!DlIo)GDuZDZVyLzp7=`KfUj-*jYFMD-$$@K$B*?!#4KOi1FB2%$_Kc zk{4(TNkE*r!;hSwR<1q3<(W-p*_rfxUkQ*Sh>@x7H05xvyvpI+-4&I6z9=pi^`bEEu0B173qI}X3iJ3#3Rh9*TMzc^dpPu_NIT`3F@ z{-y(wdp#L})VB?eajtOX@Adh$;DBtwYK^Rl=3~OQ!hVus&q8jcv@N^UfS^u3;^KV) zkPYxSQFr7H^F!<8J12|uzzRf!E0qFw>C?x0!jF-ox`J){2CJG|0^M!-%u<~t+cOv6 zJKwrt@Nj2jvCt$hzjr2MTpkhCWLKy@z+^gFBkrUempr^9EanXC?EOQ9frnpxtHP^K zs&Up3vLB~|IcHI6QlmpQrI2H{3n==X&WD-lOJcZu%gSWd?Q2ARo%kZ#VG!}aXj$gLtCQO1|Me>tBGc4qy^;i6=mb0i+2!+?$UpylT^%7GvokLi1bWA70% z9sL=MsEsnht>Tb9myT>+mVwn5+NO<$!kc)T-_G1md@UTnI7m}vGmvwdak%!=#&r+TCGFnnea{0n9CcIPYH@Ob>0EkU1l5s+@VyG2XXt zaE8mum%bm;F|dz$y10TGb4L_8QDyHJPUP5c@!&rEMnYz@b#aOJUN`E zDejFWs%jH6-rwyy3m63vgv)`XusjLZC5yynB6oqYUaS)(lG(MrrjN~}=`4KRBhm>| zzjrp!O2~W}d?x0;NfAM*I~28uvr1AmG4OD@1`N&EAlq4fK<2&^$KqC7Wj;RU83_^? zh_AD&6^h2CT08I=J69*Wqpqsm?#t_j3^lBxY5fHE6d0j^LXO!xSQ%7lIO-uDYogxttG~NdA zqT=psS{JVfJR+cS9(rL9wnyD&0(W>bfh6=t(7-q%E`yzXz??y8+!BlyGY<<+a8>RO zF|;*s%16#=SiiD2WRdv>!(*5Vp4c^EL6llhe4TUB7l4;eg zstf_^id3nUzwE&;qHkF)iXAcL_?0~zK=(}x9_`+Vc7?%6?6^%Uk;E){yp_ir(N+2V z;b*mdwfF94BhouHvl7?8vaHMv({!wluFoWtOf`sdq6Aub+!Ep*jO{v{r77-dWPJBA z-zXgQ;GUH$lWRLmunRECS)C1bm^lcV_r~ArH`mJNw-zG0XZ5sfcgeS549q>^BNlLc zFE&@3RgX|(J(~;?DuvQ7aLBnt2&kOk;!UlU3s@NFd$Pj_{yWTA?v0hJLh`^3;_Fk4PFXV04fbZxe3 zjl~DHk**6Q-mGX-LLRTfewVWZBpQd*5Jc$(ZWD4!Jvlu7YRekU#@!s%oE#cS;PD$E*!>iCZod%(leRv{bLmi@DDz;y&E{AVmeU z9!K)=5$$cVk57nZj~>rLvtm7u}AfrE#mchrFry*3FB0B3F$XcIGq9 zKnMP_dICS*6S-a?1q0@ur6Z3V{?}lH>mr`S@>U*)vsO;lnjzIaLcMLZ-2)GztHioI zG$(aQ`N~iT8WoyH?BYE^!Z2`s0Na z{!u#t;3`7#h9dS1I(y_s^mJ|w?9J5SZM zC?EDGj9{P3E7{&D>c!K6#AebPDE;bnxd(Dk_dQ^ZuMjN4W&k2KrYq5Kme(1jBftXZ(fvt80Eo`hoTk( z$h|XW>QSQW{n{7Y4zrV7Gu(=v0Uz(q_*N`PMF_=jyLb5=sW~};n$p=R_wdH-kspW< zzSXh{OHQXuOSEcwA~XHKuE9IIO)Zgv3X#Nzp}LC=e27B_pO7~9HeK|KMea7q$&ECo zeYkrJz-@E6mJGt`aK_>imu_W-lTE(<2#el#@AG;W9(XJU8+G#ym@ZebnvBK;nk+aK zSC#m%6GM4#Fpu3wxK-<980yD+i72Yt^vO*3=;Nib4x=P>7s9jIvy#P~435>a)7&Hy z?Fm@TL*0#G7Y{~+ryy>OTh%N5OU{p5Sr!YkZ^&0gw1==YuQuiP1Ww4=X!?Katk6RU zaHo&$h)3mt2&u}d;XuZj>?aCkI_KbaelL2SX`t0HMubvhwB0p8u9hlxhIaOsss#R- zcwAoblC2c(6^|y=-k#*R!!UeO-oJ85%4Kq`DL=?-gUoffA>74II0;`wW9usgN}YCW zFZNR0%a4qd{b_s-U~#RIxUT-466r-#5FyE~eldK4q8&bM9x=&=DSeKLFkV@sjL_BzT09l;!cWz* zJ$A&6+_34lP|FD#yq{LH?wbauAmUV9?LMY{OSwMv!vOYKpimzgs`$_Hm$+bjIypO? ze5vlw7MHlEBTod7zP#+jrK>Rc4kFr2FoObQY!Tz~O#iV%8mn{W-~+e=xs7Ruth98w z(ui7x{lRCNJaVV~89CO16;Dmp5D=KF$ z5ga2juNvOcL4o1F?_I0ut$9B=X3B?&6tN@7oM28PwjCrw;WE z;;R6-!4U8FZ^9;)D)!FE-Z*Ob)DOCtPzsyW}YgIc3evX9O)=;~W^sdXZ19 zLeWL505bLzM~4t{0EeoL?`3$4e0|=$$mMd4c^XEeIi68<8Fiu1kaA(0>m-=nneT>y zM6>Gl7TfM#{|6|?g?N0?rl5`;<2#|_KHc>xHzA%03K(s$vf3@xxrDdLch?N?p5|?A zg&;gU`4(P)f)n@V9Wtl-v2^)&_U;?;O4oE#ki@N>tGsktK5lA8m1VQIRWgwd{aFm^ zn_<&yy@es6r@L|o2S*ONv;#~Bt1I-`T2(EZb0TZgYmN#~6gG_$cZA!tUSL(exyf>P ztpf}5lJJwPth~~b^bVxV_uV^_$0z7v+FS4a+;;iOKq5h>;%6EJYLoK2zwasuc>DaZ`}1~b zz@92E6>`;xQr$O_yJq@DW5V^V{mqFAbR)0uD>89NGK&Bm`H<4H|PQ)(%lNu-CYJqt8^n>Ll0e&N;fz(NHc(pLk;oX@mby7 z=h1cFfBXy#{^HzoPkhh0-vcnVb{T!!I`V zco(lmfRaj{xoXAmc+RV{Lk3OtWR#z$2!GYZ|EBOQV(i%&6q8lR99LX)?zpbyXs)Au-diUa9$ zOx`g;LoffBg{)%|deDBQ%`;3tsA>HS5_vno#35X70M0>!UfjZR=Qk^+ppP1ypz{+S z9d$JTkf(edw>xMqBPM+>;FEP1r;TOR#>PWqdCH>FST!tKmrv%5NmA-3hMCoAW049N z9v(I6bMs2;!H{Z}T5`NEw*|t2eRG>OU!*WC!#Lqiw^svL;B6pgQ}_<#T>_^fE^ZNE zC8E!;xJ7TEEz&>2eA74jhi`zUD$TgTX?H{fXvhGQn7H26jSjIegHpMUlt#Dh9S>}5 znOt=B=Sid{blEG>H+Fdn&0^&%br#(lJy#M)ZMSN}z0>X?oabV~rR|C;QrY=15q}8t zl(>;8Xeg61Zn$i+mGh{VgZq%T(yZ0V<)Af={|2Toy#g2-JCrq+QYvb_*4U`{duL>_ zJ6GSgGaVf0Mp+}uPCIv1(A-|MgRuSQMFCX{55H&%sjozR$`;d`IRjy-9CqO(@8>PYP3cZ2+4lA`%FfI+UeF>G zI8>n*-u2(R983BKuj&8$$kK0q?D!Y2-d<2wjXJ<-k-Q(lnQ=b7+oJxh0rCMjxc(#o zIuvq|2|#)Sh6N+F4nVhD8fe`Ce*iIsDeDZA;e(#tzG=ljdY6Ruxuz`YuX&WjvvhLJ zt|-@5z9xoDqdUPL#w|s>y?eRFI1DC(Nf1t#8GT4C>tzvmNJKLwqr0u~hq$+K(D1Qs zaN;{%G<@78+y4VX)9*_7RpDI2zA}!OS(%UaKL)iR!KVsp)~1M?;MfVXo?)g|P-v8r zWmv93@*x0Da(Sg@fG@+rbV>+teQx*dmXBbB zHJR97AM0K!Xd#AaX_H;xJxB6QFH*HZSXtB7VSu#@bf=vL4M=}4b^h?vN?uct5Ww4Z z>=Cs7tuhskW*e>uEt?$18T!RVfo20Wy~mG1&wZZk8jZQp3)C>^=1r+hB?Xu|pC35R z!FJTT^&}*!~jCo|bR?6MZrd+rzi390qRvef#-V1Doz}otdPV8SKwIGN*su zoZwqADa?F)a8e1-@`vKINrTfGcBDN(4bmFqI=f!u+h@YGEC5eT5a71CT{61nQ5*Dg z){Jd2u!?l9X5||dKuD9j=BDRGhp!{Z7aZ9 z4dD#`8kQ8#ZGx7D?)t5O%^yj55?zhf)+3O0`DOZ z{Fu8;TMf68cyhVjGbkxxU<_zJ{2Wm*vgb$+1~*VFyZuO>dVox`n}GfG^{P-H{mN>5 z>Tl-dr>apzs-X_J!yjn#CR}C{(27sIn)#5Y2pJs&r&kgWD>nxiI+Y}v4wRXK?1`1E zJi2@6tWolh_{3(7(0R_rU4FSD^lS@NZ@T}?{rLyOEONEjt{xl_wwgBeo_v2FgoX<- zMRj@1fTst2Xv_SLDD*s$4EofV;=mHJun^ct^T$6V&;XO&Fb(uvb1&th+tHEK!oyL;uLjvjRiBnqpxCP#g2L0lW>TLOaTXNRaG6B&(E;zybq8BbAgh2Leaek~Bf(A})U82Q{aPF4x+Itt$Z$urC@p{8ZPzebMw(Y?TPup=Q;kHa|aLF+a0#4cAR;Gk11n z9DyXD0~XkPH}gqC{57?QMgR_`8)XRQfc?({_!6Uw5p!M3D{^R>6h|eVAFa-J zk$>H=HH-=sU7*j%$nOBh`(*HwBOs6vYDV9GZT)K;P*5=n%ME!I3l2+)6+jPr)qu_y zTtxow-GQ860>&83e;$slLvr_R7Sn5u9wX_a~z=f=p}Y;R9CU!g7mjC~2s4 zBp78icfDXl8v^PWszCzZe=v$0qcdZJvS$p^U~KHXpCjl7A2GE8>GQHq0nyrE7EIgl6Xphwf&dFBrAWUv#0@@tVB>`wyK{)y3Avrk23Cm4O z%K#^ZEhC;jEr9TA0E<^RQSu|+z$OzQg@cU|2U|4Jp#ui<|FWz9&t70Zp947-VT@*i zmdA=3G~WOWVY63&8_dhei`;R@0L7@>fukpqeBH4P(FPG|X+7&cT6Q_U8XBUi#I%(& zK~|st!y9tKU+{Om`okME1!KJ#WmTN4d3bPeVAh++Pv=pJO+aD#dA<$6sbet=I_o9N zsdjzneuIyDQhUEzxY=M#k9C0WZ?IZmfxz3i!0lKZ(?FZYvcJM=V#8wZhMaOjiatsNtF>D?_eX*SQKu$>zH-Xi6g9tn zMz8RmPPp)PdngTZRNLkwila0sqvx5_|BLkj#9<`2ZW@7{fL~L|3R2zqC(nizc>=FA zcJ(0angs(52}@=Ma6z>7K(_g?dTqeCSXz`rE2KrJSON!p(wgaDK-K^56fjKOfaO6{ z#V0EiM!3KlBOvAIF(jTC988nC?4<&MKwz{nIR)hl!n>?oo7G?&3+-*L{NwzmuVNY3 zPldn(0u4q+mISVUW%)W?whMC)&$i}f6p0r9xy2gz6D6~P%Zq}ELF*=%+95&$9Gv0XqLU3SI z^GV%@^e|tI-QFZvm0dcMbFnfpoH+Q_=|j*+sQ3HEk4Wd5&imz9v5;5W7xLfW;Zf_L zTR*0)EG;WTE+yE+doXWYENnB(;=g;B4U-UT=+Q@aZ~jPk|Ngu9Vlk~CNWO+%GV)rB z$Aiz;GjcG%Gi#K9iMQ7@VM$gqn`wtKx9tX--JHTSlcKY{4i1()aRv4U{rYV&4R%+R zei#Ql!+b3`L=K&2a4@l&s2Ev{(J$n&g6+4;E%&7q0S=D@kB<{<54z^V_5!_1&TauC zzC=3~sQO3V_CI#=Ptg;SYD6*9Gf4B-LY7x4*xN#1;hZZiM79M1y18NUL1XPbjxIyQ z%?0b|Mu8yOJE>oqFfy~U^2*DHk0$14Z&_X9(cGeS%UUca`>Q|te#2Q7Og83DZr7;` zPE+M|?lLAxPSJf5jKW>J118?9DU;Nv1WR?>VoSJfg{ zn>Sb6h3QJFd-uEMyAa)k!e_X|u|6>qw^a}fNm+Hpdd#MjdGk$I^oI@Q|CG?5pL%ps zCEVg*l$)yAlU8f7afK9_ZCNiH8yn?>ktz~WQm8})BcsfQ!!?%7>}>Td$Q7=;Zo1c_ zE>EhWLVfNhafi z%4yx3}ba?rYS!mMrz9Y_$kJv5=JoP=#{swSpgQoWDQ&c7|BHI}^Vm ztfc3#fL0I&e7+s}F%{KrX3|eI8+hy7&93`@x_5y}~ z(xj{VPZj#fC*QrZmLFL&Z#+og(JHFM1hbg(uL@y01p4Q5irD2+0VT`^4HGQnR zWkJ4GPj5BF3h#`(!83M*bCqY5zKO5e^7F35#xa0d4j z$S7}C?nVI!m3c<0Ko+d@vY zDk}>2c7yJnF$mbC_lN;K>IxbT0Y1bpRlO?oeY6z{Trw(yi@m?S#ozY=c>n(lXXeTN zA$Q^5{<==@ilFub=}5Jr^68+)Mo0qS1hbgvt(n$lS;GhVXd+)2SuF#LFhM2MU>c|* zr)p(d<}<|a)vG>t`ss-aS2UXtZVCUtu$`QkZv2BgH^9^cRK=6$U`mY!>Je(KKDU$k ziW)Sg`L4E9NvV?A?4xyB|L5ZZL2a$l;^L!7l^+^l%b(e_wmvzjErZ6+>Zv0Y0K6_Fp3K_6f96H6ZCkTpDe6z zAIJ|8aWWqye`b=tKZxH=)<=%#IiDFw51t&462Qmw!9;9#NsX~X`?hyyl(d4ts%V(b z$Qk+rzolCZnInL^(n}D|P znIYJ{_W+n&kvbk`wF?JX5*Mr5nrKr4;MD#5`uzE0d0W2cE}DyCA@EJb~nQ;Ec^^6Da zDVe_9`cw7(^9#ANmeV&t{MCL63EPEd?qf0W_=RcskGy-P6n~yfCK?|f^2IVGoXUFr z{b**s7Z?NZ7a{#^ySkzolBKGDNcs1-KLiI_tTR|0;afOUN;*(Y~6GuY`L<_plF(NR15AMzXi*Hg|af!T6av~8nBWyuw)`RFiH zN#T`~mqX5Y=&4cjWQt%kwd9lW?yKfN>8 zzu%(2VFX|UdiqbloAofSzs10)2t$*p%4)B>>leCiv6;D4s3;i_1j1ovoKyk@ySh^7 zn13opVw~nDyJD6cZG7kNl-&QNc|hOW-bDtiY^TclTW@cms*`xRUd8BmUIn`~Z&yu| zX>sX(Qj7Tv8+w#7dGU`EG?G6m9|Ib9e)3R%Szlkkw7dg0sFLyq4H=CMLGTO5;-YEw zyc0T-G8iSsZI-JdKVvs=MRV{-#q$4)*hws%;L{e+R2k_~8>ZVON=JCPhB+W`Lm$7G zD7v!#;~nm23@U{MaeA&5zvPI*kk zpJu|r#4f%@X{0+5$()Gy(u(>*es}l7#pUJv^73*fxIgs!)q2#>+5NkB@77?@{A<^* zlV7|zZpk*zhgnE54z-A>u$d_Y={~KHYyZd)=Xchh*>WJ>?A41uvz^~B5909+EVaU7 z>^6G`NG090a!_#0A#r)36+ZbcPHSfu)S-h2!puIhqo)UBgD|<4;e0bYO=mDqPEM#r zJgX!_sWXXa1zcxC5-~Am$nML?C@U$wDJ?Daba=M$%^TP0fz3Upf0ySkBKeV+(7&6t z^BXY(vBc)oX!a&dH|X+J!i$!=6S3sZSgpH@i%i!IpFMaG6a^47mUPRx$~S6oRWOO% zurS%-&wTWVX;xpaF!c<|+;t!DAg`o{t9g0~fg0AVZ_{+W2XY}?)Eu$Y!z~$w4OP=r zV8Jy``#vJc7CnJ*@9>V`uUFNVgP=f{4Ir1Aaig{8)~}(F%MOh(9?2IHVyq@(>_$(X zs1&i5fsBF|c^AHMA$OiaJha51_s?Ns3ISqbMlWi%rt>xhM{`;V8>d@B>4deUF4ESOG5u7Yw zF7}3?^)3AhKozM4CTm6`$dN$4OP@^PFz84=)7q#y4Ir_XB9+_ygwOxy2`pby zOkrmm#o^9sd;yI|VaY;nrR^b93#|{&iKiamk&%(DB)Lq#{_L~xevLMN_#J5i@o$3P z0{0?x50X<%2=<=~^%qtAyJ~Q0`Vmqo*{79z6XeK;@uMC9y#xfKVEPszVb*}WEG>Np`^v+a!;nDN4SM=0V;`iUH z9vNqeHSuDH^gdo6E8^v?^lIXRtO_>s@^%*f5ui4ifIR-7JM+o)e<4p<$wxzy+6tCn z=p#KgE4CO z=Dw(45Y*C0ccwo`3)3Kh^G>PAVut+}1n)FH{iERqKjH zOk^S>MAyn|=_^(>Pnt1mRj{4}$)UeeA;2b!+Civ}3TU9*2@7v?f>V`mslF2va}|nh zpPLEdw&u!pw-S*3ri7}t9b6d(=lC77_#Gu<)n`~v(Ao{~Fy2gO# z+p5tk_~%(kUlp<`2Fu=g;;BLYV1dix7DwALaOk=o>+Vu4=4W4K(r4%7gG9Ez^(cR=lXHCo%+j5^qW9FOa~AG!h#+(6zoaeq;V z-o)=}ZFjzBn-;)0j!OOG_Y$2R`iOKeJB19g3cN~qgu~rGl+hMFHHlLE4&lGN88g6JLQXroAla9N zeh-p;RpSUPJodoGxZTln@q0|>`W9T2qt2A|qamPFx4r;= zzNwM*%};&%AOCGi(Hhybh)GXh@hbK_1&fHOu-7Su(gt3xl>9od0)JI85p<^u4BWZ>hv2F-K_rym7x!Jgzk93iEB@#0V+bOnq?vr2$yi`E!d{JxAovYhQFQ_N znuQee_rJf4){rxlui2_(!L=t$<1YTObtchMhPdBvH zOP*q`4}Do>0l|#B6rG-oST`*EJK_x>J>VIeB%Tmhqn$aA*3ECmofkln4xG1!zFXIS zSi9Nte&o`FJHIoD&Kx=dgt-bU*QT)%SOU#j#qZj&?+YY%x$33mJ1d|KlagKEFqBzi z^tQt>cK=gQKmR1e{3_Z2fMhWyUNE}zN;-99++v{X2`=#+$_2g_IMdl{rP!6|9wQny z(m!6oHvuS2HC62D&l0h}-qn=MPc;|h*m7aW)!G*_f|W8SC*0;kZrq^d|x_%6}k{B8mUzyfJqB8s6_AYASef@b?~`@kB!sk5@;zX;@geJSw^ zbm`gTBTLKH^pAp`eCU&3qho*Jblc+WOSd_s@rQ5g;rjx}Rqq1<>jB{!tiJtRj3KkW9e+d?Gg&(*UC$3k^a{Mg8cnY!m>$5GR#{ed()?zYP)x&Yoj zUw3RCVV@Lx%9EVUY`q-1Wxa)RHBCi76-B%8eG2%!#N?riX;WrZ}6F64Q$2Du$x@8UN0K{S+lALL0+y$YC#^vUO0nt?PN+>MHfQu7gUY*u-Z;`U;(&WZdY zujEZRn#`xNtH#nP!8Qtw33TNa4QYVx?ek(hw7#fH;vJd?C_&Ft?8R#Chy!#JrmR>g z`gm-ztCudlzeFm3D+C44%g*_XHF+G*CR(iT;e9GyyX={scrcS|m2wi~v&Wmwo9NkQ z*D0g(Xl!5n)UEw(QPH3BS21|iX z9X)w8;he|FqVDz?!zqX+y{gh1g7j<;okz681WE+#ztrwfAP<(O!p@l~uwj(oe7-&2 zf%X9%*wZJ|4zQy&L+ZVCoCDnQ9G8Lid%vk2qpqo{si}=QiOm1*Bnme`ENrASDvVZM z9*u2r)h8ckA2$p6a;ldP*FWmJbomaS+}X>lZrebSc%Nz^xC z@o_4h*WbTO+ad4d8WXrId#gjxet1tLt-?*`puuE8*(J}k>u_zTeDi#6j*qCNx96iF z0i&ZCA9L2XWAvP$5x@O4ToIMs1k+SE?Wnw*w`Ihc*fS>oX`>w%Un3)OE^H^tg7nKBz(FztOxZIdoTokTk5KjmHECX(K6)nT<`= zu9n0IdAU$Hsa8ED#dmxz<{F}_a^$Laopw#^u+vj|O`Uu_dxF`);rpXc z+>nM-|FxRb-K+6c{iEb!mbxuj+Rd$@m1KJ~7YZK6ePzEx)X~)_# z2JM9A!E(X*w~?{oF)A)D0$;LZ(its}R0uuh2xQKrKRWh09USeO?$4=Q&O0uC?Hu|x z#|~@qb3Au)b26eUW{L1^EoGmg#0PQc#<-@px3~FJy34aO2K2R@BMXW7YuJcAVucmO z>^!3w+uBDgM4Re^nNs<-En0~6T$H9d^R0~Zkj9zgbxSHfu;k+;ZHz zrDD5|9Mmdh{=#^=%1Gv0Tc^@a0s^u-=1P#-9Q>C~!aGl#?#DhFlN%HEu07QA29bCz z;IVHy1}^9lXYZ+DLx`AsfSnXSPcg;_s`AN7xY_j)v*Gj3ji>sqPcniW%JTaJwxgv+ z7M`wmhnF=Ri?NvKY98~a%Y2H=tW{lIULIx+y>c>$U|>AjFND>pd+FN{vmuS3ZTsqt}w$YU+{mto2xJ;{j*mRg99LL4y}5-hsNzf+Fs!;zzt-4ztYBTnMcYKb@-68F$sJHSTn_tsw3YI@I@4-D2>bb{@-Em_a${S>kUj_KpRxbsO?!)NBi-yj`)O%BTYwVAZJ(Vu2LiEQAt!r9;r;`{OJRJ7)^c@XP>fJZy^qDYY00~Pc(HJQHxmb%A_&5gLOit;d%53 z-Zz;?^lSlKlW9$8@d)pARhijk|pkBm^`e{SP zUvwCBc`heMs%1T>t{zDT#gP2N-z6TU-oXhUMwsXp&HGY>CAMW-EQf7mybre7*1&z0 z=d1Ds9DASNN!TdmP9{4>m7K}9s7XKhoBo_IZ1_FpzTc*7-PKoO^F3 zID}ny!lW_Vt}J4t)Po}c7+23=`HPm$0k^}{9#3(f#DuI3ed>;bkaPCtpSbp0g|i&h ztvVM$^Ui2)l%+5`4t{nHM=Ui*c4e8{!0sT0mdz#fyb>^<3UVF5s}{JmK}+~xoep$W zw5t6iG$Ay>K&%^2`^5WU`L*6!NkvX8UfWUUPi#ku9{^d^)xCxS>ufz!H>;@wq>-CF zK8dYD)5^w3nl7rPX0w|4N`()?onDtulkKS><8EdV%`hR?!n?RN@1;d^8sTC47(r22 zMGLwH&4mWt+)?4{Z0owJAe&Kr)4dRkHkP${xkK{G2Y#4cVfVv&v|OB2W4l&%_%_-& z;K|N#-7(V+^(~dLaFhV_(8EhpyumwRTU~w3S}G~;s(gdZ-eds9=E)ps=CpgRzwmBF zbC#SkOf;MS5(#2hD+!hwfK%Pl!VWSw5{6*C{?@iMD?6UP2t*=gGYRf8R<8B zXRNC^@XaZ63UY1<`T!84mMi2_o^R~=cpXQBkf*prLofFzxq`c@mcwVtkMc;LJoimE z7Wq{6jt_J-%`bM}{5QEsG07jr#bS9_^}Wsyin?IbLss)EIoKs(9Shu6Gik><{4>wu zg-aL!rN>@MTL+<%=731(DgQk-SitzAjS#tKZ%%I>BfshBUcGVjwd@&1;nAvhY{&27 zD#8Kpw2^d$ZqkPnZ~JuRkwJ%crkze7mYtf@*c9jTXR)`9+rB7Am90=ZcxFEj4DvV* zSW_l9Dj0ZUc6Q`)N8|Pjfv^<53=^GYM!p^&F`k!z$yxk%ISRF?Zn#d`3m*@#ck$a4^rJ?=UT%OJS$2&UUH8_@{M^%L zI1(pi+B~d?WmY{tKFk(Srlw7fNxqQHGgnWBT9RMV=>=d$iCXO(b#A{h4k6)7{^qj9 z5vlUI7bxzzu~7UqvZeR^YcT(Ytq=O211@l!tgjolT8QSfybl~f(9mw(@i}Qesxo|d z_n82TAXFSj6TgZXFx;3T*Q>ujPve_|!K{-7|vpBoha zx#=-+*ymlZ3nYkLmiLGMMq6xOh=KlH^TOu4R=QOR7;e?f#O9DUuX?$A4X|3BC1C=J zQMg#q3XSJAHbyKqUn*m+CsHfKzM$bOi8<=#lt3!x-%MU=r6Kg zQ?E-&mCkk;e-OQVhWCW=e`9e82XCB>02 zB$;TJo3`cM;4U0RkIU`i7)#}Uo5-Z5=prrDKIXLW^=U%-?D&8je1ryMech(_?BV zev#F{+X8q(N=Pg9SbyXRmWW8Xq5IUZ0u4U zf^idrSS^;(JnO6V*-k$9l6JgAGgv-IF=2a}8YLUge0;Q_XSv&_&j>fx4p3b<-deF4 zG!N1B{!9kf{2XxLvg_!Y2X95^R|$G<8tF6oITg?R6X^e@E#R{B$-LqiY}zcFkd!1f zs}&U8g5TA4kMKOh=Du|cN0X^9-BYmr!-b{n7I`80XLO!DtI#|B!kC5UUaC3`uL!4Gx(4MOM!EJ&y*w?F;}*`d z=A;AaN$s@hMAzFVoXQ>pP=MS@gQf9-wiwguPVSm_^GAG9M5jQXE)_}Y?imB>$r7g3 z$yo+8bMqDb@<6qD*>N$X2;@p`!zz?HR6h4{lg&ZF5i!XJ&O~1*qJF;~t zeuA;ECXQq2E${H+bBDYRK~j>5&(jDk)C$|ur2)=O_0~*I^8%9ryJwD99P*E}vDRK1 zRfExIwx;!}kK?VCv(4Tc+6Z!uQU-<6G~Y?C(?yLIC}daJt+@=faO)Av8ij9q_o%_k za?w=O&T;r-*=C#%8B>bAmGmt@{tc!#p<{* zynmt(lH^Hj(Y#wuabzTqoSDv1iF6i5#cWOFC(bmep6p26DU>nF9A+*Lh7n$d^hU@l zD452$FEjN{=K=uaPR$Cf`$bVHm;`au>5PEOs49n#4>XwWT4So3Go+TwC!EN7B1dh? z!@W)R4Pm_^Oia_=yZ{qcKJA(K z%%?nU8YN_&NKn@u61Y<{TG%2vmVdmiE(36icNa; z^bD74TeNSan$A#P(nZpvmTruDpuNLpEXyTXu`%C9J;h?naivW?GC7OhB>Z-VW1MY) zLGo!``#v|wPX$dHElzZsX+)Wxw7Lc?i2`6pMlMi!KX94xu&|Le@$AcL4+xP}!RsJl zquE?v4e3!LwpeNi2Cr~VGUd!{c^=F39&0Q~;hU$P*yZMi&gVqAOf`{Ls15xT$EI_q z)n_)pXeGd!juXbZTz#y)!`ETDkeXetQ=KXS&03#B9SQBxE<7UW8pT^V(s1RD&r%6f zIB;R2*wczg9}PFJ8F_dTs$W1Ir!{1TlY(wYAJ@gid}CSKe5h}iBxlJ!l45hHLjCec z^qzjCPw;QZ>Z6;;x_y1)S7l6e!*7?_bs8T~5%=Dzm85!{1~Ta3YZ=cv0e)vY9G0j9+cVVd; zHk$IeUlz7AClh8Z`|Jb}(%e_qJZGnRhRAXzLxO=wRRKjJ8{613r!d@}z1g2tnaqH_yG)Ypuh(5bL-zdg9=yWEL+A!(tORB34 zpVqVE5a)c>&Nzt-j!qS<-LF4db+Js2{ zQ`?!4gl1x@wEtP#cliV%By&R*x!&-Sa`>svT9=aN0b&$DjF`$Nq%6%57 zqsYm@^wJy{@nu~v&a`@ebnO1I(c4H}N^}8d3n;BxYn*z{DQ!g&qK3%D$LnKlV|xw@ z3v<8CLT%SWD_Z+YW>~VP=ad$Ek0n=$X9~{LR>X-0gd~{sY=wdVdwL%}cCC0clZF>% zb9IY~ z$g0^I>J)AFPFoN|~#z&xV}iP z=FzkSOrlC_lFZjx7jg|pWGUa{6@(u%O(|y=hyX{4t{ib(*nT3$ib91)IZqgk2()i8 zNZs60{;>HFQjgMtpByuAruJvaN4hPznCXSVO`fHsxF_0%rER*_jN%$z6kT4D$1B<_ zw@AFQ`%#`;V0FKxur-?UvP!!Q@$f!sdRYgOqbWb?K4R~Epu}Qb(=^8dJFY6@+J9Yn ziOyxkw@n$>)MwN=^l;k+dYNp!UuO|_*J3*Mmczp>M3L$+Bz)vz;{jBvXRoFG_S_hu z`N!&ndx)Zj#S4okClQi9NqMPq6^M%g0HARx8hIPatyGeIPKcZ&A0Np#ggoq*>F?hY zZr72fd^k8AC5<0Om-jk_6=L@S5fQ`qc`&`ZG1zTi)`|aQL((0)YPY=o49SvwDRy&6 zI>7PB?M5J-uBKVep2x`tTNvF*;26_~7{R_8;;!Y@HL3Gw*2)EyPcrFYRA$GHb4bOOo>UFv+Qz&0)h4)- zHxfM;Kj-l&WHbN`vIg{LzC1ooH&_6uPbfcQ=3f`W&aXM+o$*Gvwr5l71i*JR!YY2W zf|s4+fsY%?)8@Ec`}|9ScR;fopE^1dE9A7k+jV$iXyv^sj=%|iOI(*#oNF>%t+T*% z@?zC&gjcVyYSYn4)H%K;QE88Gshuzx9zf5v64*L1b0V54dRyl4LfAktWn=lg&;~;C zw?{p~V@!-05g;*h9$$`;mFaH?;ikTYz(Cfu3MkmFU}@`l{Z7?4ll^+DM}7O%KD7fn zOlY)9r$`|)?B(1YGBO|Xu?^+tq)W_YyIfzu9ucP8U6#Uc`S_fM{k#IX)l5cg$Bb%> zp`433k^aRej^X3Gy=Ab&c2Z^zHq{h@LgiM~N)6`)MC#Z{DGL!Z@mDo));nb&EfutrytI**>y?;)f}Hym$ldv!fM^f zN-L(qM@K219JjnHnK)QRHn&8E!-_=vSNfuv4muaQ<#^f&QSDn4s=DGKU5}r4R5YUM zD(X;)A9eY6p<5QmBDzS2&DmbIC6Ch@K+=dyp8hQCb1L3~hSxg%n)61S6HY7h0~wX# zd18m2_L9}OS`|He1w~#_t>yf-BU(0dg=Zi+w9s*%#)6toNk&k>?f0)zwa-(~4$XL8 zX>OWGQ3!V^$}O4BV}H*EDtL*09NAw}u43$d--FhO@h_^kJ;GrrGl{48AhN^(k=Ayde9DO(Dg@3Sq|9 zm4d^)nN^zdeM!1Hn-Tl6ma!n8O6M*4J5til~LOCsVqiAcsOd|H1X$Vl5t zjeKKg{}0gbcN8uDrEd~ON#4kkzds8@c|J~oOohc68bI7%;*(er;Fwq0;OX=FLLaS( z^F*K*QVfRvKj8>m{C)>F9lr{RIn>LRal;E52cfixtu@iciZ?CV{x+6 zMP5QkqFeHA2J65}UhmS48){C2)z<}?cIE++oZ>QJG;ayEM6cQ?kl^0s%D5?$OTt7O z;{~Ewp(lwTT=bQwNYmks$QEm?o}@j9S~s8i85wx`3!88yETAtFXRh!`0+D4b8gkn8ofE%1%PevQ3qNc{$u|iEv^{ zo==LlgD!LQ^}vqJM=eQ{R#29*=o0LUmCp|ML3%(}O=!!xn{x=lH}XX&kCj1d;Nz;?dq~l2SPv)ib8=>p9}(lZv*+j{(s;_d32)vTLHh2vR&LvpsY_IGiRU z>?|pKtdsYSwE(6nj_;aXD+j6qTDDUQ+U zPUg+-2?O>iylpG@O**5V(}tRsL>~niq|oABWSm`N*HeRPgpWd}Xtr4^%S;|fJ%xI1 zf@7Er%g^<0%mT>bEvqWAmMJ-GIZ@d~T>NhCD#ZB7X4wOu4W1Y6;p!U+qWn(G>B_xf z01n9sr_7g4IpJQq_0&a1E>wACKbLxEe8RcU=DBoqim0Lyihz3!(b`h@tPBJe1tXiX z+^_G-Uvvd<)e)-s>2-IOozl29hhtsB!LOPBr;noEdF9$1BmExwN@H4d))B7LSW!!x zqboK_Ms>J5(3X9dz|u1)^6`rLdA&m|ctB`@Q?Tk(G|iyV=)hL?u12i@psIgjFz}(m zXD{xHM^@MLI;<=vODlqN*#hxaMbgE1VUGRSSm@D-+|0#}EXvFM?J;yJjrrExr^kIO z=DK5wNI_5*Y_C#EB>mQr^?ghJZ>->#b#wNSn59&>_n~R?hc(Ysh3jMV7GmzDM=Vxf z^?{6ElZUN9$Lm)$FsVl1Jz zz8o5cC8-`)Lv;Ps?B$D}`X}2X-j^+VrI+YukHTo10O(Zmn>O#WPJvo1zOvDKycKXr zHgq#rusi!U4eiDFð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 Date: Mon, 13 Feb 2023 14:03:17 +0100 Subject: [PATCH 17/20] tests: Refactor watch validation Signed-off-by: Marek Siarkowicz --- tests/robustness/watch.go | 107 +++++++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 42 deletions(-) diff --git a/tests/robustness/watch.go b/tests/robustness/watch.go index 0a3910433..dd52ae5e2 100644 --- a/tests/robustness/watch.go +++ b/tests/robustness/watch.go @@ -85,61 +85,84 @@ func validateWatchResponses(t *testing.T, responses [][]watchResponse, expectPro } func validateMemberWatchResponses(t *testing.T, responses []watchResponse, expectProgressNotify bool) { - var ( - gotProgressNotify = false - lastEventModRevision int64 = 1 // The event.Kv.ModRevision in the latest event. - lastHeadRevision int64 = 1 // The resp.Header.Revision in last watch response. - lastProgressNotifyRevision int64 = 0 // The resp.Header.Revision in the last progress notify watch response. - ) + // Validate watch is correctly configured to ensure proper testing + validateGotAtLeastOneProgressNotify(t, responses, expectProgressNotify) + + // Validate etcd watch properties defined in https://etcd.io/docs/v3.6/learning/api/#watch-streams + validateOrderedAndReliable(t, responses) + validateUnique(t, responses) + validateAtomic(t, responses) + // Validate kubernetes usage of watch + validateRenewable(t, responses) +} + +func validateGotAtLeastOneProgressNotify(t *testing.T, responses []watchResponse, expectProgressNotify bool) { + var gotProgressNotify = false + var lastHeadRevision int64 = 1 + for _, resp := range responses { + if resp.IsProgressNotify() && resp.Header.Revision == lastHeadRevision { + gotProgressNotify = true + break + } + lastHeadRevision = resp.Header.Revision + } + if gotProgressNotify != expectProgressNotify { + t.Errorf("Expected at least one progress notify: %v, got: %v", expectProgressNotify, gotProgressNotify) + } +} + +func validateRenewable(t *testing.T, responses []watchResponse) { + var lastProgressNotifyRevision int64 = 0 + for _, resp := range responses { + for _, event := range resp.Events { + if event.Kv.ModRevision <= lastProgressNotifyRevision { + t.Errorf("BROKE: Renewable - watch can renewed using revision in last progress notification; Progress notification guarantees that previous events have been already delivered, eventRevision: %d, progressNotifyRevision: %d", event.Kv.ModRevision, lastProgressNotifyRevision) + } + } + if resp.IsProgressNotify() { + lastProgressNotifyRevision = resp.Header.Revision + } + } +} + +func validateOrderedAndReliable(t *testing.T, responses []watchResponse) { + var lastEventRevision int64 = 1 + for _, resp := range responses { + for _, event := range resp.Events { + if event.Kv.ModRevision != lastEventRevision && event.Kv.ModRevision != lastEventRevision+1 { + t.Errorf("BROKE: Reliable - a sequence of events will never drop any subsequence of events; if there are events ordered in time as a < b < c, then if the watch receives events a and c, it is guaranteed to receive b, lastRevision: %d, currentRevision: %d", lastEventRevision, event.Kv.ModRevision) + } + lastEventRevision = event.Kv.ModRevision + } + } +} + +func validateUnique(t *testing.T, responses []watchResponse) { type revisionKey struct { revision int64 key string } uniqueOperations := map[revisionKey]struct{}{} - for _, resp := range responses { - if resp.Header.Revision < lastHeadRevision { - t.Errorf("Server revision should never decrease, lastHeadRevision: %d, resp.Header.Revision: %d", - lastHeadRevision, resp.Header.Revision) - } - - if resp.IsProgressNotify() && resp.Header.Revision == lastHeadRevision { - gotProgressNotify = true - } - if resp.Header.Revision == lastHeadRevision && len(resp.Events) != 0 { - t.Errorf("Got two non-empty responses about same revision") - } - if len(resp.Events) > 0 && resp.Events[0].Kv.ModRevision <= lastEventModRevision { - t.Errorf("Events with same revision should not be split between multiple responses, lastResponseModRevision: %d, firstEventModRevision: %d", lastEventModRevision, resp.Events[0].Kv.ModRevision) - } - for _, event := range resp.Events { rk := revisionKey{key: string(event.Kv.Key), revision: event.Kv.ModRevision} if _, found := uniqueOperations[rk]; found { - t.Errorf("BROKE: Within the:wq same revision key can only be modified once. Suspecting duplicate watch event. key: %q, revision: %d", rk.key, rk.revision) + t.Errorf("BROKE: Unique - an event will never appear on a watch twice, key: %q, revision: %d", rk.key, rk.revision) } uniqueOperations[rk] = struct{}{} - if event.Kv.ModRevision <= lastProgressNotifyRevision { - t.Errorf("BROKE: etcd will not send progress notification to a watcher until it has synced all events. So a watcher will never receive an event with a lower `ModRevision` than the last progressNotification's revision, eventRevision: %d, progressNotifyRevision: %d", event.Kv.ModRevision, lastProgressNotifyRevision) - } - if event.Kv.ModRevision != lastEventModRevision && event.Kv.ModRevision != lastEventModRevision+1 { - t.Errorf("Event mod revision should stay the same or increment by one, last: %d, current: %d", lastEventModRevision, event.Kv.ModRevision) - } - lastEventModRevision = event.Kv.ModRevision } - - if resp.Header.Revision < lastEventModRevision { - t.Errorf("Event revision should never exceed the server's revision, lastEventRevision: %d, resp.Header.Revision: %d", - lastEventModRevision, resp.Header.Revision) - } - - if resp.IsProgressNotify() { - lastProgressNotifyRevision = resp.Header.Revision - } - lastHeadRevision = resp.Header.Revision } - if gotProgressNotify != expectProgressNotify { - t.Errorf("Expected progress notify: %v, got: %v", expectProgressNotify, gotProgressNotify) +} + +func validateAtomic(t *testing.T, responses []watchResponse) { + var lastEventRevision int64 = 1 + for _, resp := range responses { + if len(resp.Events) > 0 { + if resp.Events[0].Kv.ModRevision == lastEventRevision { + t.Errorf("BROKE: Atomic - a list of events is guaranteed to encompass complete revisions; updates in the same revision over multiple keys will not be split over several lists of events, previousListEventRevision: %d, currentListEventRevision: %d", lastEventRevision, resp.Events[0].Kv.ModRevision) + } + lastEventRevision = resp.Events[len(resp.Events)-1].Kv.ModRevision + } } } From a8c20f931ec5cc36490fb3225e49cd74d6cb78cc Mon Sep 17 00:00:00 2001 From: Chao Chen Date: Sun, 19 Mar 2023 23:02:17 -0700 Subject: [PATCH 18/20] add etcd test analyzer build and integrate into measure-test-flakiness workflow Signed-off-by: Chao Chen --- .github/workflows/measure-test-flakiness.yaml | 11 ++++++++--- Makefile | 11 +++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/.github/workflows/measure-test-flakiness.yaml b/.github/workflows/measure-test-flakiness.yaml index ad9a0ccb9..c5be20e92 100644 --- a/.github/workflows/measure-test-flakiness.yaml +++ b/.github/workflows/measure-test-flakiness.yaml @@ -2,7 +2,7 @@ name: Measure Test Flakiness on: schedule: - - cron: "0 0 * * 0" + - cron: "0 0 * * 0" # run every Sunday at midnight permissions: read-all @@ -12,6 +12,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0 - - run: "./scripts/measure-test-flakiness.sh" - env: + - env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + set -euo pipefail + + ./scripts/measure-test-flakiness.sh + make bin/etcd-test-analyzer + bin/etcd-test-analyzer run -token $GITHUB_TOKEN -max-age=168h -workflow Tests -branch main diff --git a/Makefile b/Makefile index cae7e241f..dded7e5db 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,17 @@ build: tools: GO_BUILD_FLAGS="${GO_BUILD_FLAGS} -v" ./scripts/build_tools.sh +TEMP_TEST_ANALYZER_DIR=/tmp/etcd-test-analyzer +TEST_ANALYZER_BIN=${PWD}/bin +bin/etcd-test-analyzer: $(TEMP_TEST_ANALYZER_DIR)/* + make -C ${TEMP_TEST_ANALYZER_DIR} build + mkdir -p ${TEST_ANALYZER_BIN} + install ${TEMP_TEST_ANALYZER_DIR}/bin/etcd-test-analyzer ${TEST_ANALYZER_BIN} + ${TEST_ANALYZER_BIN}/etcd-test-analyzer -h + +$(TEMP_TEST_ANALYZER_DIR)/*: + git clone "https://github.com/endocrimes/etcd-test-analyzer.git" ${TEMP_TEST_ANALYZER_DIR} + # Tests GO_TEST_FLAGS?= From 11bf7ae416aea887422632b3204bd08b885bc690 Mon Sep 17 00:00:00 2001 From: Chao Chen Date: Tue, 28 Mar 2023 18:03:05 -0700 Subject: [PATCH 19/20] skip verification if db file does not exist Signed-off-by: Chao Chen --- server/verify/verify.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/server/verify/verify.go b/server/verify/verify.go index 9783be109..024b0b4eb 100644 --- a/server/verify/verify.go +++ b/server/verify/verify.go @@ -19,13 +19,15 @@ import ( "go.uber.org/zap" + "go.etcd.io/raft/v3/raftpb" + + "go.etcd.io/etcd/client/pkg/v3/fileutil" "go.etcd.io/etcd/client/pkg/v3/verify" "go.etcd.io/etcd/server/v3/storage/backend" "go.etcd.io/etcd/server/v3/storage/datadir" "go.etcd.io/etcd/server/v3/storage/schema" wal2 "go.etcd.io/etcd/server/v3/storage/wal" "go.etcd.io/etcd/server/v3/storage/wal/walpb" - "go.etcd.io/raft/v3/raftpb" ) const ENV_VERIFY_VALUE_STORAGE_WAL verify.VerificationType = "storage_wal" @@ -53,6 +55,11 @@ func Verify(cfg Config) error { lg = zap.NewNop() } + if !fileutil.Exist(datadir.ToBackendFileName(cfg.DataDir)) { + lg.Info("verification skipped due to non exist db file") + return nil + } + var err error lg.Info("verification of persisted state", zap.String("data-dir", cfg.DataDir)) defer func() { From d9068cd817cea9af3f582f67df5d9642fbb3ebea Mon Sep 17 00:00:00 2001 From: James Blair Date: Wed, 29 Mar 2023 14:03:14 +1300 Subject: [PATCH 20/20] Document defining ciphers in example etcd config file. Signed-off-by: James Blair --- etcd.conf.yml.sample | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/etcd.conf.yml.sample b/etcd.conf.yml.sample index 38d74bcb7..f934f3059 100644 --- a/etcd.conf.yml.sample +++ b/etcd.conf.yml.sample @@ -138,3 +138,9 @@ force-new-cluster: false auto-compaction-mode: periodic auto-compaction-retention: "1" + +# Limit etcd to a specific set of tls cipher suites +cipher-suites: [ + TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 +]