diff --git a/hack/update-generated-stable-metrics.sh b/hack/update-generated-stable-metrics.sh new file mode 100755 index 00000000000..6997480d71c --- /dev/null +++ b/hack/update-generated-stable-metrics.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +# Copyright 2020 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This file is not intended to be run automatically. It is meant to be run +# immediately before exporting docs. We do not want to check these documents in +# by default. + +set -o errexit +set -o nounset +set -o pipefail + +KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. +export KUBE_ROOT + +source "${KUBE_ROOT}/test/instrumentation/stability-utils.sh" + +kube::update::stablemetrics diff --git a/hack/verify-generated-stable-metrics.sh b/hack/verify-generated-stable-metrics.sh new file mode 100755 index 00000000000..88203775cab --- /dev/null +++ b/hack/verify-generated-stable-metrics.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash + +# Copyright 2021 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This script runs to ensure that we do not violate metric stability +# policies. +# Usage: `hack/verify-generated-stable-metrics.sh`. + +set -o errexit +set -o nounset +set -o pipefail + +KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. +source "${KUBE_ROOT}/hack/lib/init.sh" +source "${KUBE_ROOT}/hack/lib/util.sh" + +kube::golang::verify_go_version +extra_gopath=$(mktemp -d) +cd "${KUBE_ROOT}" +export KUBE_EXTRA_GOPATH=$extra_gopath +kube::golang::setup_env + +find_files() { + find . -not \( \ + \( \ + -wholename './output' \ + -o -wholename './_output' \ + -o -wholename './_gopath' \ + -o -wholename './release' \ + -o -wholename './target' \ + -o -wholename '*/third_party/*' \ + -o -wholename '*/vendor/*' \ + -o -wholename '*/hack/*' \ + -o -wholename '**/*_test.go' \ + \) -prune \ + \) \ + \( -wholename '**/*.go' \ + \) +} + +static_checked_files=$(find_files | grep -E ".*.go" | grep -v ".*_test.go") || true +pushd "${KUBE_EXTRA_GOPATH}" >/dev/null + GO111MODULE=on go get "gopkg.in/yaml.v2" +popd >/dev/null + +for i in "${static_checked_files[@]}" +do + temp_file=$(mktemp) + gopathfiles=$(find_files | grep -E 'test/instrumentation/.*.go' | grep -v "test/instrumentation/main.*go" | cut -c 3-) + # Deliberately allow word split here + # shellcheck disable=SC2086 + stabilitycheck=$(go run "test/instrumentation/main.go" $gopathfiles -- $i 1>$temp_file) + if ! $stabilitycheck; then + echo "!!! Metrics Stability static analysis has failed!" >&2 + echo "!!! Please run ./hack/update-generated-stable-metrics.sh to update the golden list." >&2 + exit 1 + fi + if diff -u "$KUBE_ROOT/test/instrumentation/testdata/stable-metrics-list.yaml" "$temp_file"; then + echo "PASS metrics stability verification" + else + echo "!!! Metrics Stability static analysis has failed!" >&2 + echo "!!! Please run ./hack/update-generated-stable-metrics.sh to update the golden list." >&2 + echo "!!! $temp_file" >&2 + exit 1 + fi +done + + diff --git a/test/instrumentation/BUILD b/test/instrumentation/BUILD index 75a6b7831c2..d0fa3ff18ff 100644 --- a/test/instrumentation/BUILD +++ b/test/instrumentation/BUILD @@ -48,13 +48,25 @@ genrule( tools = [":instrumentation"], ) +sh_library( + name = "stability_utils", + srcs = [ + "stability-utils.sh", + ], +) + sh_test( name = "verify_stable_metric", - srcs = ["verify-stable-metrics.sh"], + srcs = [ + "verify-stable-metrics.sh", + ], data = [ "testdata/stable-metrics-list.yaml", ":list_stable_metrics", ], + deps = [ + ":stability_utils", + ], ) go_test( diff --git a/test/instrumentation/stability-utils.sh b/test/instrumentation/stability-utils.sh new file mode 100644 index 00000000000..89571ed8145 --- /dev/null +++ b/test/instrumentation/stability-utils.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +# Copyright 2019 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +set -o errexit +set -o nounset +set -o pipefail + + +function kube::update::stablemetrics { + BAZEL_OUT_DIR="$KUBE_ROOT/bazel-bin" + BAZEL_GEN_DIR="$KUBE_ROOT/bazel-genfiles" + METRICS_LIST_PATH="test/instrumentation/stable-metrics-list.yaml" + + bazel build //test/instrumentation:list_stable_metrics + if [ -d "$BAZEL_OUT_DIR" ]; then + cp "$BAZEL_OUT_DIR/$METRICS_LIST_PATH" "$KUBE_ROOT/test/instrumentation/testdata/stable-metrics-list.yaml" + else + # Handle bazel < 0.25 + # https://github.com/bazelbuild/bazel/issues/6761 + echo "$BAZEL_OUT_DIR not found trying $BAZEL_GEN_DIR" + cp "$BAZEL_GEN_DIR/$METRICS_LIST_PATH" "$KUBE_ROOT/test/instrumentation/testdata/stable-metrics-list.yaml" + fi +} + + +function kube::verify::metrics { + BAZEL_OUT_DIR="$KUBE_ROOT/bazel-bin" + BAZEL_GEN_DIR="$KUBE_ROOT/bazel-genfiles" + METRICS_LIST_PATH="test/instrumentation/stable-metrics-list.yaml" + + if [ -z "${TEST_BINARY:-}" ]; then + + bazel build //test/instrumentation:list_stable_metrics --verbose_failures + + if [ -d "$BAZEL_OUT_DIR" ]; then + OUTPUT_FILE="$BAZEL_OUT_DIR/$METRICS_LIST_PATH" + else + # Handle bazel < 0.25 + # https://github.com/bazelbuild/bazel/issues/6761 + OUTPUT_FILE="$BAZEL_GEN_DIR/$METRICS_LIST_PATH" + fi + else + OUTPUT_FILE="$KUBE_ROOT/$METRICS_LIST_PATH" + fi + + if diff -u "$KUBE_ROOT/test/instrumentation/testdata/stable-metrics-list.yaml" "$OUTPUT_FILE"; then + echo "PASS metrics stability check" + else + echo 'Diffs in stable metrics detected, please run "test/instrumentation/update-stable-metrics.sh"' + exit 1 + fi +} diff --git a/test/instrumentation/update-stable-metrics.sh b/test/instrumentation/update-stable-metrics.sh index 4cd2c7e2226..82918a886b2 100755 --- a/test/instrumentation/update-stable-metrics.sh +++ b/test/instrumentation/update-stable-metrics.sh @@ -19,16 +19,7 @@ set -o nounset set -o pipefail KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/../.. -BAZEL_OUT_DIR="$KUBE_ROOT/bazel-bin" -BAZEL_GEN_DIR="$KUBE_ROOT/bazel-genfiles" -METRICS_LIST_PATH="test/instrumentation/stable-metrics-list.yaml" +export KUBE_ROOT +source "${KUBE_ROOT}/test/instrumentation/stability-utils.sh" -bazel build //test/instrumentation:list_stable_metrics -if [ -d "$BAZEL_OUT_DIR" ]; then - cp "$BAZEL_OUT_DIR/$METRICS_LIST_PATH" "$KUBE_ROOT/test/instrumentation/testdata/stable-metrics-list.yaml" -else - # Handle bazel < 0.25 - # https://github.com/bazelbuild/bazel/issues/6761 - echo "$BAZEL_OUT_DIR not found trying $BAZEL_GEN_DIR" - cp "$BAZEL_GEN_DIR/$METRICS_LIST_PATH" "$KUBE_ROOT/test/instrumentation/testdata/stable-metrics-list.yaml" -fi +kube::update::stablemetrics diff --git a/test/instrumentation/verify-stable-metrics.sh b/test/instrumentation/verify-stable-metrics.sh index d0e4cbc26d8..b8366707a18 100755 --- a/test/instrumentation/verify-stable-metrics.sh +++ b/test/instrumentation/verify-stable-metrics.sh @@ -18,28 +18,8 @@ set -o errexit set -o pipefail KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/../.. -BAZEL_OUT_DIR="$KUBE_ROOT/bazel-bin" -BAZEL_GEN_DIR="$KUBE_ROOT/bazel-genfiles" -METRICS_LIST_PATH="test/instrumentation/stable-metrics-list.yaml" +export KUBE_ROOT -# detect if run from bazel -if [ -z "${TEST_BINARY}" ]; then - bazel build //test/instrumentation:list_stable_metrics +source "${KUBE_ROOT}/test/instrumentation/stability-utils.sh" - if [ -d "$BAZEL_OUT_DIR" ]; then - OUTPUT_FILE="$BAZEL_OUT_DIR/$METRICS_LIST_PATH" - else - # Handle bazel < 0.25 - # https://github.com/bazelbuild/bazel/issues/6761 - OUTPUT_FILE="$BAZEL_GEN_DIR/$METRICS_LIST_PATH" - fi -else - OUTPUT_FILE="$KUBE_ROOT/$METRICS_LIST_PATH" -fi - -if diff -u "$KUBE_ROOT/test/instrumentation/testdata/stable-metrics-list.yaml" "$OUTPUT_FILE"; then - echo PASS - exit 0 -fi -echo 'Diffs in stable metrics detected, please run "test/instrumentation/update-stable-metrics.sh"' -exit 1 +kube::verify::metrics