diff --git a/hack/update-generated-stable-metrics.sh b/hack/update-generated-stable-metrics.sh index 6997480d71c..b71bad69bfc 100755 --- a/hack/update-generated-stable-metrics.sh +++ b/hack/update-generated-stable-metrics.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Copyright 2020 The Kubernetes Authors. +# 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. @@ -23,8 +23,7 @@ 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 index 88203775cab..f10fd76f134 100755 --- a/hack/verify-generated-stable-metrics.sh +++ b/hack/verify-generated-stable-metrics.sh @@ -23,58 +23,7 @@ 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 +source "${KUBE_ROOT}/test/instrumentation/stability-utils.sh" +kube::validate::stablemetrics diff --git a/test/instrumentation/BUILD b/test/instrumentation/BUILD index d0fa3ff18ff..c2226c69807 100644 --- a/test/instrumentation/BUILD +++ b/test/instrumentation/BUILD @@ -37,38 +37,6 @@ filegroup( visibility = ["//visibility:public"], ) -genrule( - name = "list_stable_metrics", - srcs = [ - "//:all-srcs", - ], - outs = ["stable-metrics-list.yaml"], - cmd = "for loc in $(locations //:all-srcs); do echo $$loc; done | ./$(locations :instrumentation) - > $@", - message = "Listing all stable metrics.", - tools = [":instrumentation"], -) - -sh_library( - name = "stability_utils", - srcs = [ - "stability-utils.sh", - ], -) - -sh_test( - name = "verify_stable_metric", - srcs = [ - "verify-stable-metrics.sh", - ], - data = [ - "testdata/stable-metrics-list.yaml", - ":list_stable_metrics", - ], - deps = [ - ":stability_utils", - ], -) - go_test( name = "go_default_test", srcs = ["main_test.go"], diff --git a/test/instrumentation/stability-utils.sh b/test/instrumentation/stability-utils.sh index 89571ed8145..cdf419e2bc4 100644 --- a/test/instrumentation/stability-utils.sh +++ b/test/instrumentation/stability-utils.sh @@ -1,5 +1,6 @@ #!/usr/bin/env bash -# Copyright 2019 The Kubernetes Authors. + +# 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. @@ -13,53 +14,86 @@ # See the License for the specific language governing permissions and # limitations under the License. - 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" -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 +stability_check_setup() { + kube::golang::verify_go_version + kube::util::ensure-temp-dir + cd "${KUBE_ROOT}" + export KUBE_EXTRA_GOPATH=$KUBE_TEMP + kube::golang::setup_env + pushd "${KUBE_EXTRA_GOPATH}" >/dev/null + GO111MODULE=on go get "gopkg.in/yaml.v2" + popd >/dev/null } +find_files_to_check() { + 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' \ + \) +} -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" +red=$(tput setaf 1) +green=$(tput setaf 2) +reset=$(tput sgr0) - 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" +kube::validate::stablemetrics() { + stability_check_setup + static_checked_files=$(find_files_to_check | grep -E ".*.go" | grep -v ".*_test.go") || true + temp_file=$(mktemp) + gopathfiles=$(find_files_to_check | grep -E 'test/instrumentation/.*.go' | grep -v "test/instrumentation/main.*go" | cut -c 3-) + for i in "${static_checked_files[@]}" + do + # Deliberately allow word split here + # shellcheck disable=SC2086 + stabilitycheck=$(go run "test/instrumentation/main.go" $gopathfiles -- $i 1>$temp_file) + if $stabilitycheck; then + echo -e "${green}Diffing test/instrumentation/testdata/stable-metrics-list.yaml\n${reset}" + if diff -u "$KUBE_ROOT/test/instrumentation/testdata/stable-metrics-list.yaml" "$temp_file"; then + echo -e "${green}\nPASS metrics stability verification ${reset}" + return 0 + fi 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"' + echo "${red}!!! Metrics Stability static analysis has failed!${reset}" >&2 + echo "${red}!!! Please run ./hack/update-generated-stable-metrics.sh to update the golden list.${reset}" >&2 exit 1 - fi + done } + +kube::update::stablemetrics() { + stability_check_setup + static_checked_files=$(find_files_to_check | grep -E ".*.go" | grep -v ".*_test.go") || true + temp_file=$(mktemp) + gopathfiles=$(find_files_to_check | grep -E 'test/instrumentation/.*.go' | grep -v "test/instrumentation/main.*go" | cut -c 3-) + for i in "${static_checked_files[@]}" + do + # Deliberately allow word split here + # shellcheck disable=SC2086 + stabilitycheck=$(go run "test/instrumentation/main.go" $gopathfiles -- $i 1>$temp_file) + if ! $stabilitycheck; then + echo "${red}!!! updating golden list of metrics has failed! ${reset}" >&2 + exit 1 + fi + mv -f "$temp_file" "${KUBE_ROOT}/test/instrumentation/testdata/stable-metrics-list.yaml" + echo "${green}Updated golden list of stable metrics.${reset}" + done +} + diff --git a/test/instrumentation/update-stable-metrics.sh b/test/instrumentation/update-stable-metrics.sh deleted file mode 100755 index 82918a886b2..00000000000 --- a/test/instrumentation/update-stable-metrics.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/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 - -KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/../.. -export KUBE_ROOT -source "${KUBE_ROOT}/test/instrumentation/stability-utils.sh" - -kube::update::stablemetrics diff --git a/test/instrumentation/verify-stable-metrics.sh b/test/instrumentation/verify-stable-metrics.sh deleted file mode 100755 index b8366707a18..00000000000 --- a/test/instrumentation/verify-stable-metrics.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/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 pipefail - -KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/../.. -export KUBE_ROOT - -source "${KUBE_ROOT}/test/instrumentation/stability-utils.sh" - -kube::verify::metrics