verify-generated-files-remake.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. #!/usr/bin/env bash
  2. # Copyright 2017 The Kubernetes Authors.
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. # This script verifies that the expected results are obtained when creating each
  16. # type of file(e.g. codegen tool itself, a file in a package that needs codegen,
  17. # and etc.) for verification and then generating the code(executes
  18. # `make generated_files`).
  19. # Usage: `hack/verify-generated-files-remake.sh`.
  20. set -o errexit
  21. set -o nounset
  22. set -o pipefail
  23. KUBE_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
  24. source "${KUBE_ROOT}/hack/lib/init.sh"
  25. kube::util::ensure_clean_working_dir
  26. _tmpdir="$(kube::realpath "$(mktemp -d -t verify-generated-files.XXXXXX)")"
  27. kube::util::trap_add "rm -rf ${_tmpdir}" EXIT
  28. _tmp_gopath="${_tmpdir}/go"
  29. _tmp_kuberoot="${_tmp_gopath}/src/k8s.io/kubernetes"
  30. mkdir -p "${_tmp_kuberoot}/.."
  31. cp -a "${KUBE_ROOT}" "${_tmp_kuberoot}/.."
  32. cd "${_tmp_kuberoot}"
  33. # clean out anything from the temp dir that's not checked in
  34. git clean -ffxd
  35. # $1 = filename pattern as in "zz_generated.$1.go"
  36. function find_genfiles() {
  37. find . \
  38. \( \
  39. -not \( \
  40. \( \
  41. -path ./_\* -o \
  42. -path ./.\* \
  43. \) -prune \
  44. \) \
  45. \) -name "zz_generated.$1.go"
  46. }
  47. # $1 = filename pattern as in "zz_generated.$1.go"
  48. # $2 timestamp file
  49. function newer() {
  50. find_genfiles "$1" | while read -r F; do
  51. if [[ "${F}" -nt "$2" ]]; then
  52. echo "${F}"
  53. fi
  54. done | LC_ALL=C sort
  55. }
  56. # $1 = filename pattern as in "zz_generated.$1.go"
  57. # $2 timestamp file
  58. function older() {
  59. find_genfiles "$1" | while read -r F; do
  60. if [[ "$2" -nt "${F}" ]]; then
  61. echo "${F}"
  62. fi
  63. done | LC_ALL=C sort
  64. }
  65. function assert_clean() {
  66. make generated_files >/dev/null
  67. touch "${STAMP}"
  68. make generated_files >/dev/null
  69. X="$(newer deepcopy "${STAMP}")"
  70. if [[ -n "${X}" ]]; then
  71. echo "Generated files changed on back-to-back 'make' runs:"
  72. echo " ${X}" | tr '\n' ' '
  73. echo ""
  74. return 1
  75. fi
  76. true
  77. }
  78. STAMP=/tmp/stamp.$RANDOM
  79. #
  80. # Test when we touch a file in a package that needs codegen.
  81. #
  82. assert_clean
  83. DIR=staging/src/k8s.io/sample-apiserver/pkg/apis/wardle/v1alpha1
  84. touch "${DIR}/types.go"
  85. touch "${STAMP}"
  86. make generated_files >/dev/null
  87. X="$(newer deepcopy "${STAMP}")"
  88. if [[ -z "${X}" || ${X} != "./${DIR}/zz_generated.deepcopy.go" ]]; then
  89. echo "Wrong generated deepcopy files changed after touching src file:"
  90. echo " ${X:-(none)}" | tr '\n' ' '
  91. echo ""
  92. exit 1
  93. fi
  94. X="$(newer defaults "${STAMP}")"
  95. if [[ -z "${X}" || ${X} != "./${DIR}/zz_generated.defaults.go" ]]; then
  96. echo "Wrong generated defaults files changed after touching src file:"
  97. echo " ${X:-(none)}" | tr '\n' ' '
  98. echo ""
  99. exit 1
  100. fi
  101. X="$(newer conversion "${STAMP}")"
  102. if [[ -z "${X}" || ${X} != "./${DIR}/zz_generated.conversion.go" ]]; then
  103. echo "Wrong generated conversion files changed after touching src file:"
  104. echo " ${X:-(none)}" | tr '\n' ' '
  105. echo ""
  106. exit 1
  107. fi
  108. #
  109. # Test when the codegen tool itself changes: deepcopy
  110. #
  111. assert_clean
  112. touch staging/src/k8s.io/code-generator/cmd/deepcopy-gen/main.go
  113. touch "${STAMP}"
  114. make generated_files >/dev/null
  115. X="$(older deepcopy "${STAMP}")"
  116. if [[ -n "${X}" ]]; then
  117. echo "Generated deepcopy files did not change after touching code-generator file:"
  118. echo " ${X}" | tr '\n' ' '
  119. echo ""
  120. exit 1
  121. fi
  122. assert_clean
  123. touch staging/src/k8s.io/code-generator/cmd/deepcopy-gen/
  124. touch "${STAMP}"
  125. make generated_files >/dev/null
  126. X="$(older deepcopy "${STAMP}")"
  127. if [[ -n "${X}" ]]; then
  128. echo "Generated deepcopy files did not change after touching code-generator dir:"
  129. echo " ${X}" | tr '\n' ' '
  130. echo ""
  131. exit 1
  132. fi
  133. assert_clean
  134. touch vendor/k8s.io/gengo/examples/deepcopy-gen/generators/deepcopy.go
  135. touch "${STAMP}"
  136. make generated_files >/dev/null
  137. X="$(older deepcopy "${STAMP}")"
  138. if [[ -n "${X}" ]]; then
  139. echo "Generated deepcopy files did not change after touching code-generator dep file:"
  140. echo " ${X}" | tr '\n' ' '
  141. echo ""
  142. exit 1
  143. fi
  144. assert_clean
  145. touch vendor/k8s.io/gengo/examples/deepcopy-gen/generators/
  146. touch "${STAMP}"
  147. make generated_files >/dev/null
  148. X="$(older deepcopy "${STAMP}")"
  149. if [[ -n "${X}" ]]; then
  150. echo "Generated deepcopy files did not change after touching code-generator dep dir:"
  151. echo " ${X}" | tr '\n' ' '
  152. echo ""
  153. exit 1
  154. fi
  155. #
  156. # Test when the codegen tool itself changes: defaults
  157. #
  158. assert_clean
  159. touch staging/src/k8s.io/code-generator/cmd/defaulter-gen/main.go
  160. touch "${STAMP}"
  161. make generated_files >/dev/null
  162. X="$(older defaults "${STAMP}")"
  163. if [[ -n "${X}" ]]; then
  164. echo "Generated defaults files did not change after touching code-generator file:"
  165. echo " ${X}" | tr '\n' ' '
  166. echo ""
  167. exit 1
  168. fi
  169. assert_clean
  170. touch staging/src/k8s.io/code-generator/cmd/defaulter-gen/
  171. touch "${STAMP}"
  172. make generated_files >/dev/null
  173. X="$(older defaults "${STAMP}")"
  174. if [[ -n "${X}" ]]; then
  175. echo "Generated defaults files did not change after touching code-generator dir:"
  176. echo " ${X}" | tr '\n' ' '
  177. echo ""
  178. exit 1
  179. fi
  180. assert_clean
  181. touch vendor/k8s.io/gengo/examples/defaulter-gen/generators/defaulter.go
  182. touch "${STAMP}"
  183. make generated_files >/dev/null
  184. X="$(older defaults "${STAMP}")"
  185. if [[ -n "${X}" ]]; then
  186. echo "Generated defaults files did not change after touching code-generator dep file:"
  187. echo " ${X}" | tr '\n' ' '
  188. echo ""
  189. exit 1
  190. fi
  191. assert_clean
  192. touch vendor/k8s.io/gengo/examples/defaulter-gen/generators/
  193. touch "${STAMP}"
  194. make generated_files >/dev/null
  195. X="$(older defaults "${STAMP}")"
  196. if [[ -n "${X}" ]]; then
  197. echo "Generated defaults files did not change after touching code-generator dep dir:"
  198. echo " ${X}" | tr '\n' ' '
  199. echo ""
  200. exit 1
  201. fi
  202. #
  203. # Test when the codegen tool itself changes: conversion
  204. #
  205. assert_clean
  206. touch staging/src/k8s.io/code-generator/cmd/conversion-gen/main.go
  207. touch "${STAMP}"
  208. make generated_files >/dev/null
  209. X="$(older conversion "${STAMP}")"
  210. if [[ -n "${X}" ]]; then
  211. echo "Generated conversion files did not change after touching code-generator file:"
  212. echo " ${X}" | tr '\n' ' '
  213. echo ""
  214. exit 1
  215. fi
  216. assert_clean
  217. touch staging/src/k8s.io/code-generator/cmd/conversion-gen/
  218. touch "${STAMP}"
  219. make generated_files >/dev/null
  220. X="$(older conversion "${STAMP}")"
  221. if [[ -n "${X}" ]]; then
  222. echo "Generated conversion files did not change after touching code-generator dir:"
  223. echo " ${X}" | tr '\n' ' '
  224. echo ""
  225. exit 1
  226. fi
  227. assert_clean
  228. touch vendor/k8s.io/code-generator/cmd/conversion-gen/generators/conversion.go
  229. touch "${STAMP}"
  230. make generated_files >/dev/null
  231. X="$(older conversion "${STAMP}")"
  232. if [[ -n "${X}" ]]; then
  233. echo "Generated conversion files did not change after touching code-generator dep file:"
  234. echo " ${X}" | tr '\n' ' '
  235. echo ""
  236. exit 1
  237. fi
  238. assert_clean
  239. touch vendor/k8s.io/code-generator/cmd/conversion-gen/generators/
  240. touch "${STAMP}"
  241. make generated_files >/dev/null
  242. X="$(older conversion "${STAMP}")"
  243. if [[ -n "${X}" ]]; then
  244. echo "Generated conversion files did not change after touching code-generator dep dir:"
  245. echo " ${X}" | tr '\n' ' '
  246. echo ""
  247. exit 1
  248. fi
  249. #
  250. # Test when we touch a file in a package that needs codegen for all openapi specs.
  251. #
  252. assert_clean
  253. touch "staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go"
  254. touch "${STAMP}"
  255. make generated_files >/dev/null
  256. X="$(newer openapi "${STAMP}")"
  257. if [[ -z "${X}" || ${X} != "./pkg/generated/openapi/zz_generated.openapi.go
  258. ./staging/src/k8s.io/apiextensions-apiserver/pkg/generated/openapi/zz_generated.openapi.go
  259. ./staging/src/k8s.io/code-generator/_examples/apiserver/openapi/zz_generated.openapi.go
  260. ./staging/src/k8s.io/sample-apiserver/pkg/generated/openapi/zz_generated.openapi.go" ]]; then
  261. echo "Wrong generated openapi files changed after touching src file:"
  262. echo " ${X:-(none)}" | tr '\n' ' '
  263. echo ""
  264. exit 1
  265. fi
  266. #
  267. # Test when we touch a file in a package that needs codegen for only the main openapi spec.
  268. #
  269. assert_clean
  270. touch "staging/src/k8s.io/api/apps/v1/types.go"
  271. touch "${STAMP}"
  272. make generated_files >/dev/null
  273. X="$(newer openapi "${STAMP}")"
  274. if [[ -z "${X}" || ${X} != "./pkg/generated/openapi/zz_generated.openapi.go" ]]; then
  275. echo "Wrong generated openapi files changed after touching src file:"
  276. echo " ${X:-(none)}" | tr '\n' ' '
  277. echo ""
  278. exit 1
  279. fi
  280. #
  281. # Test when we touch a file, modify the violation file it should fail, and UPDATE_API_KNOWN_VIOLATIONS=true updates it.
  282. #
  283. assert_clean
  284. touch "staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go"
  285. echo > api/api-rules/violation_exceptions.list
  286. echo > api/api-rules/codegen_violation_exceptions.list
  287. if make generated_files >/dev/null; then
  288. echo "Expected make generated_files to fail with API violations."
  289. echo ""
  290. exit 1
  291. fi
  292. touch "${STAMP}"
  293. make generated_files UPDATE_API_KNOWN_VIOLATIONS=true >/dev/null
  294. X="$(newer openapi "${STAMP}")"
  295. if [[ -z "${X}" || ${X} != "./pkg/generated/openapi/zz_generated.openapi.go
  296. ./staging/src/k8s.io/apiextensions-apiserver/pkg/generated/openapi/zz_generated.openapi.go
  297. ./staging/src/k8s.io/code-generator/_examples/apiserver/openapi/zz_generated.openapi.go
  298. ./staging/src/k8s.io/sample-apiserver/pkg/generated/openapi/zz_generated.openapi.go" ]]; then
  299. echo "Wrong generated openapi files changed after updating violation files:"
  300. echo " ${X:-(none)}" | tr '\n' ' '
  301. echo ""
  302. exit 1
  303. fi
  304. for f in api/api-rules/violation_exceptions.list api/api-rules/codegen_violation_exceptions.list; do
  305. if ! git diff --quiet "$f"; then
  306. echo "Violation file \"$f\" was not updated with UPDATE_API_KNOWN_VIOLATIONS=true."
  307. echo ""
  308. exit 1
  309. fi
  310. done
  311. #
  312. # Test when the codegen tool itself changes: openapi
  313. #
  314. assert_clean
  315. touch vendor/k8s.io/kube-openapi/cmd/openapi-gen/openapi-gen.go
  316. touch "${STAMP}"
  317. make generated_files >/dev/null
  318. X="$(older openapi "${STAMP}")"
  319. if [[ -n "${X}" ]]; then
  320. echo "Generated openapi files did not change after touching code-generator file:"
  321. echo " ${X}" | tr '\n' ' '
  322. echo ""
  323. exit 1
  324. fi
  325. assert_clean
  326. touch vendor/k8s.io/kube-openapi/cmd/openapi-gen/
  327. touch "${STAMP}"
  328. make generated_files >/dev/null
  329. X="$(older openapi "${STAMP}")"
  330. if [[ -n "${X}" ]]; then
  331. echo "Generated openapi files did not change after touching code-generator dir:"
  332. echo " ${X}" | tr '\n' ' '
  333. echo ""
  334. exit 1
  335. fi
  336. assert_clean
  337. touch vendor/k8s.io/kube-openapi/pkg/generators/openapi.go
  338. touch "${STAMP}"
  339. make generated_files >/dev/null
  340. X="$(older openapi "${STAMP}")"
  341. if [[ -n "${X}" ]]; then
  342. echo "Generated openapi files did not change after touching code-generator dep file:"
  343. echo " ${X}" | tr '\n' ' '
  344. echo ""
  345. exit 1
  346. fi
  347. assert_clean
  348. touch vendor/k8s.io/kube-openapi/pkg/generators
  349. touch "${STAMP}"
  350. make generated_files >/dev/null
  351. X="$(older openapi "${STAMP}")"
  352. if [[ -n "${X}" ]]; then
  353. echo "Generated openapi files did not change after touching code-generator dep dir:"
  354. echo " ${X}" | tr '\n' ' '
  355. echo ""
  356. exit 1
  357. fi