Skip to content

Commit c831c83

Browse files
committed
added bash script to update data.yaml
1 parent 905d50c commit c831c83

File tree

1 file changed

+125
-0
lines changed

1 file changed

+125
-0
lines changed

scripts/update-data-yaml.sh

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
#!/bin/bash
2+
set -euo pipefail
3+
4+
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
5+
REPO_ROOT=$( cd -- "${SCRIPT_DIR}/.." &> /dev/null && pwd )
6+
DATA_FILE="${REPO_ROOT}/data.yaml"
7+
NUM_RELEASES_TO_KEEP=5
8+
9+
check_command() {
10+
if ! command -v "$1" &> /dev/null; then
11+
echo "Error: Required command '$1' not found. Please install it to continue." >&2
12+
exit 1
13+
fi
14+
}
15+
16+
check_command "go"
17+
check_command "gojq"
18+
check_command "sort"
19+
20+
if [ -z "$1" ]; then
21+
echo "Usage: $0 <new_version>"
22+
echo "Example: $0 v2.17.0"
23+
exit 1
24+
fi
25+
26+
if [ ! -f "${DATA_FILE}" ]; then
27+
echo "Error: Data file not found at ${DATA_FILE}" >&2
28+
exit 1
29+
fi
30+
31+
NEW_VERSION_WITH_V=$1
32+
CLEAN_NEW_VERSION=${NEW_VERSION_WITH_V#v}
33+
34+
echo "Starting update process for version ${NEW_VERSION_WITH_V}..."
35+
36+
echo "Checking k8s.io/client-go version from go.mod..."
37+
GO_MOD_FILE="${REPO_ROOT}/go.mod"
38+
39+
if [ ! -f "${GO_MOD_FILE}" ]; then
40+
echo "Error: go.mod file not found at ${GO_MOD_FILE}" >&2
41+
exit 1
42+
fi
43+
44+
CLIENT_GO_FULL_VERSION=$(go list -m -f '{{.Version}}' k8s.io/client-go)
45+
46+
if [ -z "$CLIENT_GO_FULL_VERSION" ]; then
47+
echo "Error: Could not find k8s.io/client-go version in go.mod." >&2
48+
exit 1
49+
fi
50+
51+
K8S_MINOR=$(echo "${CLIENT_GO_FULL_VERSION}" | cut -d. -f2)
52+
53+
K8S_VERSION_FOR_NEW_RELEASE="1.${K8S_MINOR}"
54+
echo "New release ${NEW_VERSION_WITH_V} will be mapped to Kubernetes (N-1): ${K8S_VERSION_FOR_NEW_RELEASE}"
55+
56+
57+
JSON_DATA=$(cat "${DATA_FILE}" | gojq -r --yaml-input '.')
58+
59+
EXISTING_EXACT_MATCH=$(echo "${JSON_DATA}" | gojq -r --arg version "${NEW_VERSION_WITH_V}" --arg k8s "${K8S_VERSION_FOR_NEW_RELEASE}" '.compat[] | select(.version == $version and .kubernetes == $k8s) | .version // empty')
60+
61+
if [ -n "${EXISTING_EXACT_MATCH}" ]; then
62+
echo "Entry for ${NEW_VERSION_WITH_V} with Kubernetes ${K8S_VERSION_FOR_NEW_RELEASE} already exists. No changes needed."
63+
exit 0
64+
fi
65+
66+
EXISTING_KSM_VERSION_ENTRY=$(echo "${JSON_DATA}" | gojq -r --arg version "${NEW_VERSION_WITH_V}" '.compat[] | select(.version == $version) | .version // empty')
67+
68+
if [ -n "${EXISTING_KSM_VERSION_ENTRY}" ]; then
69+
echo "Version ${NEW_VERSION_WITH_V} found with a different K8s mapping. Updating..."
70+
cat > "${DATA_FILE}" << EOF
71+
# The purpose of this config is to keep all versions in a single place.
72+
#
73+
# Marks the latest release
74+
version: "${CLEAN_NEW_VERSION}"
75+
76+
# List at max 5 releases here + the main branch
77+
compat:
78+
EOF
79+
80+
81+
echo "${JSON_DATA}" | gojq -r --arg version "${NEW_VERSION_WITH_V}" --arg k8s "${K8S_VERSION_FOR_NEW_RELEASE}" '
82+
.compat[] | select(.version != $version) | " - kubernetes: \"" + .kubernetes + "\"\n version: " + .version
83+
' >> "${DATA_FILE}"
84+
85+
echo " - kubernetes: \"${K8S_VERSION_FOR_NEW_RELEASE}\"" >> "${DATA_FILE}"
86+
echo " version: ${NEW_VERSION_WITH_V}" >> "${DATA_FILE}"
87+
88+
echo "Successfully updated existing entry for ${NEW_VERSION_WITH_V}."
89+
echo "--- Final ${DATA_FILE} content ---"
90+
cat "${DATA_FILE}"
91+
exit 0
92+
fi
93+
94+
echo "Adding new version ${NEW_VERSION_WITH_V} and pruning old releases..."
95+
96+
VERSIONS_LIST=$(echo "${JSON_DATA}" | gojq -r '.compat[] | select(.version != "main") | "\(.version)|\(.kubernetes)"' 2>/dev/null || true)
97+
FULL_VERSIONS_LIST=$(printf "%s\n%s|%s" "${VERSIONS_LIST}" "${NEW_VERSION_WITH_V}" "${K8S_VERSION_FOR_NEW_RELEASE}")
98+
99+
SORTED_VERSIONS=$(echo "${FULL_VERSIONS_LIST}" | grep -v '^$' | sort -t'|' -k1,1 -Vr | head -n "${NUM_RELEASES_TO_KEEP}" | sort -t'|' -k1,1 -V)
100+
101+
cat > "${DATA_FILE}" << EOF
102+
# The purpose of this config is to keep all versions in a single place.
103+
104+
# Marks the latest release
105+
version: "${CLEAN_NEW_VERSION}"
106+
107+
# List at max 5 releases here + the main branch
108+
compat:
109+
EOF
110+
111+
while IFS='|' read -r version k8s_ver; do
112+
if [ -n "${version}" ]; then
113+
echo " - version: \"${version}\"" >> "${DATA_FILE}"
114+
echo " kubernetes: \"${k8s_ver}\"" >> "${DATA_FILE}"
115+
fi
116+
done <<< "${SORTED_VERSIONS}"
117+
118+
echo " - version: \"main\"" >> "${DATA_FILE}"
119+
echo " kubernetes: \"${K8S_VERSION_FOR_NEW_RELEASE}\"" >> "${DATA_FILE}"
120+
121+
echo "Successfully updated and pruned ${DATA_FILE}."
122+
echo "New release (${NEW_VERSION_WITH_V}) is mapped to Kubernetes: ${K8S_VERSION_FOR_NEW_RELEASE}"
123+
echo "Main branch is mapped to Kubernetes: ${K8S_VERSION_FOR_NEW_RELEASE}"
124+
echo "--- Final ${DATA_FILE} content ---"
125+
cat "${DATA_FILE}"

0 commit comments

Comments
 (0)