Compare commits
347 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 25a6340fd7 | |||
| 8e7cfecf14 | |||
| eb73c53789 | |||
| 1eb3684f89 | |||
| edecf70831 | |||
| 458f4eb972 | |||
| b0f1582140 | |||
| 1b306ef6be | |||
| bc3d294098 | |||
| cd08bafb22 | |||
| fa23921480 | |||
| 30b5632a82 | |||
| 1b72084a1a | |||
| 6297314421 | |||
| a66993bb85 | |||
| d54cd60871 | |||
| e4da589e5b | |||
| 43a4ae15f4 | |||
| 230afd92ba | |||
| 0dfe286d12 | |||
| 93bfdb3b4e | |||
| 5c4d6cde66 | |||
| 3712d63916 | |||
| 01bad1f754 | |||
|
706b8c2287
|
|||
| d9b736b43b | |||
| 96454eb4e8 | |||
| 959369e62f | |||
| ce761d0b4d | |||
| 88f56b38a4 | |||
|
b5a76e8f85
|
|||
| 2c3637dad1 | |||
| 952f8a03c2 | |||
| 2de6e2d055 | |||
| 5e80c539bb | |||
| 67292c2524 | |||
| ad42dd7921 | |||
|
9b689f90cb
|
|||
| b5206ed105 | |||
| 288527b9bd | |||
| adcd59e48f | |||
| ecd185e74e | |||
|
920500f335
|
|||
| f60ca960d6 | |||
| 69b24e9e09 | |||
| 651682092a | |||
| e982d69dd6 | |||
| 7a9b1cb675 | |||
|
9be8681761
|
|||
|
5293e94e21
|
|||
| 83cd217fb5 | |||
| 5b9dc135e3 | |||
| 8170cbaa0d | |||
| a5a8ac6090 | |||
| 9d56171a31 | |||
|
8582f07d3f
|
|||
| a257fabbc8 | |||
| d95d216e0b | |||
| ad1db6b5e3 | |||
| 85f607ac20 | |||
| ecc9e0f04f | |||
| 126bdcf632 | |||
| 95a19faf9d | |||
| 15f9e75c0f | |||
| b3a7235c2c | |||
| 9014ea22b5 | |||
| f18a949e3b | |||
| d59a5a4fd1 | |||
| 519b81b087 | |||
| b247a15ec0 | |||
| 3142630dc7 | |||
| 947b30a870 | |||
| 5a30f0da20 | |||
| 2024abc3ab | |||
| aa2ebc17c4 | |||
| d26867ac3c | |||
| 74002c4922 | |||
| 03d72c68d8 | |||
| 48c04fb564 | |||
| c507cd4e8e | |||
| 6bf96e36df | |||
| 7b0b17117b | |||
| c6ec372793 | |||
| b3d8a89c83 | |||
| 3c9582ac59 | |||
| 4299367321 | |||
| 435682696e | |||
| c1aa7d1012 | |||
| 97233ac6c7 | |||
| 8837fa3712 | |||
|
08a2b82074
|
|||
| 3edca8f39d | |||
| a85c27ba2c | |||
| 26d5195323 | |||
| 139e8a8c11 | |||
| 4966b9b538 | |||
| 76e672539e | |||
| 72196cc6f0 | |||
| 86614055ef | |||
| 945d598e22 | |||
| cf3c151168 | |||
| 4db90fe34c | |||
| 029c41635d | |||
| c5714e7e25 | |||
| 159ef96cc7 | |||
| 57aca54f59 | |||
| ccb7e24612 | |||
| 34d73db3ed | |||
| 32d4fb02bb | |||
| 3f2c48f627 | |||
| b8c4d9cbe0 | |||
| 5522f73beb | |||
| 748f685f6c | |||
| 7a201c2ff3 | |||
| ebd905a798 | |||
| be11297c11 | |||
| 67a725400b | |||
| d4b440a447 | |||
| 6f9f34236a | |||
|
4fda8b58ca
|
|||
| f16c61bbde | |||
| 7a6e0a1b0e | |||
| 6d96b15c16 | |||
| fee5dd2af9 | |||
| 587ebef743 | |||
| deceaba620 | |||
| 4d30905b4f | |||
| ec54841f75 | |||
| e188e12cce | |||
| 1ecfdcf7bd | |||
| d8f122da47 | |||
| d4e20591c6 | |||
| 3b55c2658d | |||
| e605019635 | |||
| 4c81cdba93 | |||
| 336881bdc4 | |||
| c557848ece | |||
| aedcfc4c5d | |||
| a822a58029 | |||
| ae26d0e2b4 | |||
| 40b0d61615 | |||
| 5aa0e08691 | |||
|
f4cb386e5a
|
|||
| 48d8e22cbb | |||
| e9f1170c00 | |||
| a960eea772 | |||
| 0c9ba9bd7a | |||
| e3fbfdb420 | |||
| 011ee29cff | |||
|
fd7562aa50
|
|||
| b5d8abe0fc | |||
| c24baac296 | |||
| d869940394 | |||
| 831854a218 | |||
| 1a82d78c68 | |||
| 0b76400aa6 | |||
|
de495a8c5e
|
|||
| 3ae2e157af | |||
| 70cc2fca02 | |||
| 2403c1a3df | |||
| 63a1d18e49 | |||
| d024d3e17c | |||
| c013527a02 | |||
| 0436065d4f | |||
| 82658b0432 | |||
| 4451e77a98 | |||
| 3e44f97dca | |||
| 6fb430526d | |||
| b3a26830c9 | |||
| ac3e649f0c | |||
| 356a9247e6 | |||
| 289a52df58 | |||
| 8b9a90d171 | |||
|
ad07055d45
|
|||
| a9a45eca97 | |||
| 56e83523ca | |||
| b29ce707c1 | |||
| 5811cdda1b | |||
| bd289c2b91 | |||
| ca13a1c8af | |||
| 8d1ae96549 | |||
| ad4979dc8f | |||
| 48684e7c3e | |||
| d373566a6b | |||
| 44885a1014 | |||
| 03dc28a8c9 | |||
| d1322c5034 | |||
| 92e7773837 | |||
| bc36de7160 | |||
| b65aa278a9 | |||
| 5f8ec76f40 | |||
| 6688715a0c | |||
| 39a7cba0a6 | |||
| 3146b8236e | |||
| 491b0d0732 | |||
|
faeb419889
|
|||
|
16e583fdae
|
|||
| a67e37b399 | |||
| ee8ee8be51 | |||
| 221d3ad3d5 | |||
| 8b57bcca0f | |||
| d1ae42fefb | |||
| e0df5d20c1 | |||
| f3319ffc79 | |||
| 3639476615 | |||
| 3daa8254d5 | |||
| c3031619fc | |||
| a7b264ec95 | |||
| ef1c9649ff | |||
| a3b4ae5a50 | |||
| 621e1b9775 | |||
| 5eede339d7 | |||
| 5af2fffb35 | |||
| 8870d30939 | |||
| 53f88a068c | |||
| 0a2f8d728f | |||
| 63a8221e48 | |||
| 13d4150732 | |||
| 0f97a1ec87 | |||
| 3b59c2c2be | |||
| 05c6b1c0cf | |||
| 35e4352df6 | |||
| 86667bbf22 | |||
| 550d4cd0a8 | |||
| 7dd8e80660 | |||
| 9d301bd782 | |||
| ba7273d318 | |||
| 6b618d9366 | |||
| 78cad53109 | |||
| 5cd208a23e | |||
| 40bd0bd947 | |||
| eff85192c4 | |||
| 8c2fad540c | |||
| d31e72e44f | |||
| 68fa695ca5 | |||
| 0392819c87 | |||
| a922f2da7e | |||
| 79fe54fb6c | |||
| acfaa667f8 | |||
| 5851819212 | |||
| 2e5042cfe5 | |||
| 9b257411c6 | |||
| 9890f13091 | |||
| 5cb9bb1d00 | |||
| 0ee1aea33b | |||
| 37b40df945 | |||
| 6eb98834eb | |||
| e2e1fa652a | |||
| d2c23b135f | |||
| f5d59be8ba | |||
| 19e0d275f6 | |||
| 82091f37e2 | |||
| e383623d64 | |||
| 5418ac868c | |||
| ba26533f7a | |||
| e55de68daa | |||
| 33fd2b89ec | |||
| 6729ae6a25 | |||
| 29352aa85c | |||
| 76dbbbb17c | |||
| 8038a8149e | |||
| 3bdb66901a | |||
| 1fabafddb3 | |||
| 878f6bc364 | |||
| 4c8fbf2f43 | |||
| c74ef9f122 | |||
| 68bfbb6564 | |||
| cba73097a6 | |||
| 1187bfcdeb | |||
| 715939d794 | |||
| 54722aafd9 | |||
| 665c4b7580 | |||
| 4c04849140 | |||
| 65eadcf0fd | |||
| d10914388d | |||
| f976edad86 | |||
| d4e3609860 | |||
| c81a9f0c2f | |||
| b56559402f | |||
| 1cb6156e62 | |||
| 77ea28954d | |||
| 865bfcf166 | |||
| 29b6fc9a23 | |||
| 00671b1748 | |||
| b3c200d893 | |||
| ce89be7e2a | |||
| e180fc5993 | |||
| 588f073dee | |||
| 7c1dd9f96f | |||
| fd9231361a | |||
| 63f54fd9aa | |||
| 8e33db3b41 | |||
| b4ac7f206d | |||
| 61c569bc8c | |||
| d49baffce9 | |||
| 5e5bc0cadf | |||
| 2298d17ddb | |||
| 1ccb7796fa | |||
| 17a99dcfd6 | |||
| d8d5216987 | |||
| 31a619ee08 | |||
| e893c1a218 | |||
| 1842720861 | |||
| 705b6b95e3 | |||
| 47d21f7856 | |||
| 831171e0a4 | |||
| e8d33831f2 | |||
| 71c0d185f7 | |||
| 64d73ec963 | |||
| 33e1506717 | |||
| 759b287b2c | |||
| d35ff9c497 | |||
| b76d33d5d9 | |||
| 878d0af788 | |||
| c809233a74 | |||
| 9196cc3c08 | |||
| 3594ed09ef | |||
| a8dc955d94 | |||
| 481d894f08 | |||
| e5ad0a2344 | |||
| 019e05ef99 | |||
| 9a138c7970 | |||
| bd312132cc | |||
| 3f34c8cf28 | |||
| 84f12c732f | |||
| 97894571a0 | |||
| 7cc1308746 | |||
| a8b8ef10ca | |||
| 54bf7ba846 | |||
| 83af4769be | |||
| 422ecf591c | |||
| 4a3e7c03b9 | |||
| 2186a7ac85 | |||
| e4b62f5ec1 | |||
| 6600a449bd | |||
| 49fa18605e | |||
| e1963adda0 | |||
| 31292b9ab2 | |||
| 84716ece5a | |||
| 5d4b4356f3 | |||
| 47432b2f02 | |||
| 6354eece26 | |||
| 5e7e9a8f16 | |||
| e9b92521a0 | |||
| 7110d8c14b | |||
| 1c6064ccae | |||
| 88be7ec492 |
@@ -0,0 +1,43 @@
|
||||
name: cron-checker
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
tags: ['*']
|
||||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-go@v6
|
||||
with:
|
||||
go-version: 'stable'
|
||||
- name: Run tests
|
||||
run: go test -race -coverprofile=coverage.txt ./...
|
||||
|
||||
vulnerabilities:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/setup-go@v6
|
||||
with:
|
||||
go-version: 'stable'
|
||||
- name: Check vulnerabilities
|
||||
run: |
|
||||
go install golang.org/x/vuln/cmd/govulncheck@latest
|
||||
govulncheck ./...
|
||||
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [test, vulnerabilities]
|
||||
env:
|
||||
BUILDTOOLS_CONTENT: ${{ secrets.BUILDTOOLS_CONTENT }}
|
||||
GITEA_REPOSITORY: ${{ gitea.repository }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: buildtool/setup-buildtools-action@v1
|
||||
- name: Build and push
|
||||
run: unset GITEA_TOKEN && build && push
|
||||
@@ -0,0 +1,9 @@
|
||||
name: Release
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
release:
|
||||
uses: unboundsoftware/shared-workflows/.gitea/workflows/Release.yml@main
|
||||
@@ -1,2 +1,3 @@
|
||||
.idea
|
||||
/release
|
||||
exported
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
include:
|
||||
- template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'
|
||||
|
||||
stages:
|
||||
- build
|
||||
|
||||
variables:
|
||||
DOCKER_HOST: tcp://docker:2375/
|
||||
|
||||
image: buildtool/build-tools:0.0.23
|
||||
|
||||
build:
|
||||
stage: build
|
||||
services:
|
||||
- docker:dind
|
||||
script:
|
||||
- ci_env=`bash <(curl -s https://codecov.io/env)`
|
||||
- build ${ci_env//-e /--build-arg }
|
||||
- push
|
||||
+419
@@ -0,0 +1,419 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [1.6.1] - 2026-02-11
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- Run build job on pull requests
|
||||
- *(deps)* Update golang:1.25.5 docker digest to 3a01526 (#316)
|
||||
- *(deps)* Update dependency go to v1.25.6
|
||||
- *(deps)* Update golang docker tag to v1.25.6 (#320)
|
||||
- Remove unused .gitlab-ci.yml
|
||||
- *(deps)* Update golang:1.25.6 docker digest to ceda080 (#322)
|
||||
- *(deps)* Update dependency go to v1.25.7 (#323)
|
||||
- *(deps)* Update golang docker tag to v1.25.7 (#324)
|
||||
- *(deps)* Update golang:1.25.7 docker digest to d2819ff (#326)
|
||||
- *(deps)* Update golang docker tag to v1.26.0 (#327)
|
||||
- *(deps)* Update dependency go to v1.26.0 (#325)
|
||||
|
||||
## [1.6.0] - 2026-01-10
|
||||
|
||||
### 🚀 Features
|
||||
|
||||
- Add Docker build and push to CI workflow
|
||||
|
||||
## [1.5.0] - 2026-01-10
|
||||
|
||||
### 🚀 Features
|
||||
|
||||
- Run CI workflow on tags
|
||||
|
||||
## [1.4.0] - 2026-01-09
|
||||
|
||||
### 🚀 Features
|
||||
|
||||
- Migrate from GitLab CI to Gitea Actions
|
||||
- Add release workflow using shared workflow
|
||||
|
||||
### 📚 Documentation
|
||||
|
||||
- Add CLAUDE.md for Claude Code guidance
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- *(deps)* Update golang:1.25.5 docker digest to ad03ba9
|
||||
- *(deps)* Update actions/checkout action to v6
|
||||
- *(deps)* Update actions/setup-go action to v6
|
||||
|
||||
## [1.3.18] - 2025-12-18
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deps)* Update kubernetes packages to v0.35.0
|
||||
|
||||
## [1.3.17] - 2025-12-10
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deps)* Update kubernetes packages to v0.34.3
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- *(deps)* Update golang:1.25.4 docker digest to efe81fa
|
||||
- *(deps)* Update dependency go to v1.25.5
|
||||
- *(deps)* Update golang docker tag to v1.25.5
|
||||
- *(deps)* Update golang:1.25.5 docker digest to 0c27bcf
|
||||
|
||||
## [1.3.16] - 2025-11-13
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- Update commit message patterns and comments in cliff.toml
|
||||
- *(deps)* Update kubernetes packages to v0.34.2
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- *(deps)* Update golang:1.25.1 docker digest to 12640a4
|
||||
- *(deps)* Update dependency go to v1.25.2
|
||||
- *(deps)* Update golang docker tag to v1.25.2
|
||||
- *(deps)* Update dependency go to v1.25.3
|
||||
- *(deps)* Update golang docker tag to v1.25.3
|
||||
- *(deps)* Update golang:1.25.3 docker digest to 69d1009
|
||||
- *(deps)* Update golang:1.25.3 docker digest to 9ac0edc
|
||||
- *(deps)* Update dependency go to v1.25.4
|
||||
- *(deps)* Update golang docker tag to v1.25.4
|
||||
|
||||
## [1.3.15] - 2025-09-10
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deps)* Update kubernetes packages to v0.34.1
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- *(deps)* Update dependency go to v1.25.1
|
||||
- *(deps)* Update golang docker tag to v1.25.1
|
||||
- *(deps)* Update golang:1.25.1 docker digest to 53f7808
|
||||
|
||||
## [1.3.14] - 2025-08-28
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deps)* Update kubernetes packages to v0.34.0
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- *(deps)* Update golang:1.25.0 docker digest to f6b9e1a
|
||||
|
||||
## [1.3.13] - 2025-08-14
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deps)* Update kubernetes packages to v0.33.4
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- *(deps)* Update golang:1.24.5 docker digest to 0a156a4
|
||||
- *(deps)* Update dependency go to v1.24.6
|
||||
- *(deps)* Update golang docker tag to v1.24.6
|
||||
- *(deps)* Update dependency go to v1.25.0
|
||||
- *(deps)* Update golang:1.24.6 docker digest to 958bfd1
|
||||
- *(deps)* Update golang docker tag to v1.25.0
|
||||
|
||||
## [1.3.12] - 2025-07-16
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deps)* Update kubernetes packages to v0.33.3
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- Update GitLab CI configuration with new includes
|
||||
- *(deps)* Update golang:1.24.4 docker digest to 9f820b6
|
||||
- *(deps)* Update dependency go to v1.24.5
|
||||
- *(deps)* Update golang docker tag to v1.24.5
|
||||
|
||||
## [1.3.11] - 2025-06-20
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deps)* Update kubernetes packages to v0.33.2
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- *(deps)* Update golang:1.24.3 docker digest to f255a7d
|
||||
- *(deps)* Update dependency go to v1.24.4
|
||||
- *(deps)* Update golang docker tag to v1.24.4
|
||||
- *(deps)* Update golang:1.24.4 docker digest to 3494bbe
|
||||
|
||||
## [1.3.10] - 2025-05-16
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deps)* Update kubernetes packages to v0.33.1
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- *(deps)* Update golang:1.24.2 docker digest to bf7899c
|
||||
- *(deps)* Update dependency go to v1.24.3
|
||||
- *(deps)* Update golang docker tag to v1.24.3
|
||||
|
||||
## [1.3.9] - 2025-04-24
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deps)* Update kubernetes packages to v0.33.0
|
||||
|
||||
## [1.3.8] - 2025-04-23
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deps)* Update kubernetes packages to v0.32.4
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- *(deps)* Update golang:1.24.1 docker digest to 5ecf333
|
||||
- *(deps)* Update golang docker tag to v1.24.2
|
||||
- *(deps)* Update golang:1.24.2 docker digest to aebb7df
|
||||
|
||||
## [1.3.7] - 2025-03-12
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deps)* Update kubernetes packages to v0.32.3
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- *(deps)* Update golang docker tag to v1.24.1
|
||||
|
||||
## [1.3.6] - 2025-03-03
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deps)* Update kubernetes packages to v0.32.2
|
||||
- *(deps)* Update module github.com/sanity-io/litter to v1.5.8
|
||||
- *(docker)* Update golang base image to amd64 variant
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- *(deps)* Update golang:1.23.5 docker digest to e213430
|
||||
- *(deps)* Update dependency go to v1.23.6
|
||||
- *(deps)* Update golang docker tag to v1.23.6
|
||||
- *(deps)* Update golang:1.23.6 docker digest to 958bd2e
|
||||
- *(deps)* Update golang:1.23.6 docker digest to 9271129
|
||||
- Update Go version and toolchain in go.mod
|
||||
- *(deps)* Update golang docker tag to v1.24.0
|
||||
- *(deps)* Update golang:1.24.0 docker digest to 5255fad
|
||||
- *(deps)* Update golang:1.24.0 docker digest to a14c5a6
|
||||
- *(deps)* Update golang:1.24.0 docker digest to 58cf31c
|
||||
|
||||
## [1.3.5] - 2025-01-24
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deployment)* Update label to use standardized format
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- *(deps)* Update golang:1.23.5 docker digest to 8c10f21
|
||||
|
||||
## [1.3.4] - 2025-01-17
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deps)* Update module github.com/sanity-io/litter to v1.5.6
|
||||
- *(deps)* Update kubernetes packages to v0.32.1
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- *(deps)* Update golang:1.23.4 docker digest to 3b1a7de
|
||||
- *(deps)* Update golang:1.23.4 docker digest to 08e1417
|
||||
- *(deps)* Update golang:1.23.4 docker digest to 585103a
|
||||
- *(deps)* Update golang:1.23.4 docker digest to 5305905
|
||||
- *(deps)* Update golang:1.23.4 docker digest to 9820aca
|
||||
- *(deps)* Update dependency go to v1.23.5
|
||||
- *(deps)* Update golang docker tag to v1.23.5
|
||||
|
||||
## [1.3.3] - 2024-12-28
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deps)* Update kubernetes packages to v0.31.4
|
||||
- *(deps)* Update kubernetes packages to v0.32.0
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- *(deps)* Update golang:1.23.3 docker digest to ee5f0ad
|
||||
- *(deps)* Update golang:1.23.3 docker digest to b4aabba
|
||||
- *(deps)* Update golang:1.23.3 docker digest to 2b01164
|
||||
- *(deps)* Update golang:1.23.3 docker digest to 017ec6b
|
||||
- *(deps)* Update dependency go to v1.23.4
|
||||
- *(deps)* Update golang docker tag to v1.23.4
|
||||
- *(deps)* Update golang:1.23.4 docker digest to 574185e
|
||||
- Remove unnecessary docker configuration
|
||||
- *(deps)* Update golang:1.23.4 docker digest to 7003184
|
||||
- *(deps)* Update golang:1.23.4 docker digest to 7ea4c9d
|
||||
|
||||
## [1.3.2] - 2024-11-21
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deps)* Update kubernetes packages to v0.31.3
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- *(deps)* Pin golang docker tag to ad5c126
|
||||
- *(deps)* Update dependency go to v1.23.3
|
||||
- *(deps)* Update golang docker tag to v1.23.3
|
||||
- *(deps)* Update golang:1.23.3 docker digest to 8956c08
|
||||
- *(deps)* Update golang:1.23.3 docker digest to 3694e36
|
||||
- *(deps)* Update golang:1.23.3 docker digest to b2ca381
|
||||
- *(deps)* Update golang:1.23.3 docker digest to 2660218
|
||||
- *(deps)* Update golang:1.23.3 docker digest to c2d828f
|
||||
- *(deps)* Update golang:1.23.3 docker digest to 73f06be
|
||||
|
||||
## [1.3.1] - 2024-10-24
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deps)* Update kubernetes packages to v0.31.2
|
||||
|
||||
## [1.3.0] - 2024-10-06
|
||||
|
||||
### 🚀 Features
|
||||
|
||||
- Initial commit
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- Codecov badge
|
||||
- RBAC config
|
||||
- Mocks for new version
|
||||
- *(deps)* Update github.com/multiplay/go-slack digest to 0762aee
|
||||
- *(deps)* Update kubernetes packages to v0.29.3
|
||||
- *(deps)* Update module k8s.io/client-go to v0.29.4
|
||||
- *(deps)* Update kubernetes packages to v0.30.0
|
||||
- *(deps)* Update kubernetes packages to v0.30.1
|
||||
- *(deps)* Update kubernetes packages to v0.30.2
|
||||
- *(deps)* Update kubernetes packages to v0.30.3
|
||||
- *(deps)* Update kubernetes packages to v0.31.0
|
||||
- *(deps)* Update kubernetes packages to v0.31.1
|
||||
|
||||
### 📚 Documentation
|
||||
|
||||
- Update version in example
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- Refactor and add tests
|
||||
- Update example with new version
|
||||
- Use buildtools version from env
|
||||
- Add dependabot-config
|
||||
- *(deps)* Bump github.com/sanity-io/litter from 1.3.0 to 1.5.1
|
||||
- *(deps)* Bump golang from 1.15 to 1.17.2
|
||||
- *(deps)* Bump k8s.io/client-go from 0.18.0 to 0.22.3
|
||||
- Run codecov outside docker
|
||||
- *(deps)* Bump golang from 1.17.2 to 1.17.3
|
||||
- *(deps)* Bump k8s.io/client-go from 0.22.3 to 0.22.4
|
||||
- *(deps)* Bump golang from 1.17.3 to 1.17.4
|
||||
- *(deps)* Bump k8s.io/client-go from 0.22.4 to 0.23.0
|
||||
- *(deps)* Bump k8s.io/api from 0.22.4 to 0.23.0
|
||||
- *(deps)* Bump golang from 1.17.4 to 1.17.5
|
||||
- *(deps)* Bump k8s.io/apimachinery from 0.23.0 to 0.23.1
|
||||
- *(deps)* Bump k8s.io/api from 0.23.0 to 0.23.1
|
||||
- *(deps)* Bump k8s.io/client-go from 0.23.0 to 0.23.1
|
||||
- *(deps)* Bump golang from 1.17.5 to 1.17.6
|
||||
- *(deps)* Bump github.com/sanity-io/litter from 1.5.1 to 1.5.2
|
||||
- *(deps)* Bump k8s.io/client-go from 0.23.1 to 0.23.2
|
||||
- *(deps)* Bump k8s.io/client-go from 0.23.2 to 0.23.3
|
||||
- *(deps)* Bump golang from 1.17.6 to 1.17.7
|
||||
- *(deps)* Bump k8s.io/client-go from 0.23.3 to 0.23.4
|
||||
- *(deps)* Bump golang from 1.17.7 to 1.17.8
|
||||
- *(deps)* Bump github.com/sanity-io/litter from 1.5.2 to 1.5.4
|
||||
- *(deps)* Bump golang from 1.17.8 to 1.18.0
|
||||
- *(deps)* Bump k8s.io/client-go from 0.23.4 to 0.23.5
|
||||
- *(deps)* Bump golang from 1.18.0 to 1.18.1
|
||||
- *(deps)* Bump k8s.io/client-go from 0.23.5 to 0.23.6
|
||||
- *(deps)* Bump github.com/sanity-io/litter from 1.5.4 to 1.5.5
|
||||
- *(deps)* Bump k8s.io/client-go from 0.23.6 to 0.24.0
|
||||
- *(deps)* Bump golang from 1.18.1 to 1.18.2
|
||||
- *(deps)* Bump k8s.io/client-go from 0.24.0 to 0.24.1
|
||||
- *(deps)* Bump golang from 1.18.2 to 1.18.3
|
||||
- *(deps)* Bump k8s.io/client-go from 0.24.1 to 0.24.2
|
||||
- *(deps)* Bump golang from 1.18.3 to 1.18.4
|
||||
- *(deps)* Bump k8s.io/client-go from 0.24.2 to 0.24.3
|
||||
- *(deps)* Bump golang from 1.18.4 to 1.18.5
|
||||
- *(deps)* Bump golang from 1.18.5 to 1.19.0
|
||||
- *(deps)* Bump k8s.io/client-go from 0.24.3 to 0.24.4
|
||||
- *(deps)* Bump k8s.io/client-go from 0.24.4 to 0.25.0
|
||||
- *(deps)* Bump golang from 1.19.0 to 1.19.1
|
||||
- *(deps)* Bump k8s.io/client-go from 0.25.0 to 0.25.1
|
||||
- *(deps)* Bump k8s.io/client-go from 0.25.1 to 0.25.2
|
||||
- Update to batch/v1 instead of the deprecated batch/v1beta1
|
||||
- Make sure Codecov finds all it's files
|
||||
- *(deps)* Bump golang from 1.19.1 to 1.19.2
|
||||
- *(deps)* Bump k8s.io/client-go from 0.25.2 to 0.25.3
|
||||
- *(deps)* Bump golang from 1.19.2 to 1.19.3
|
||||
- *(deps)* Bump k8s.io/client-go from 0.25.3 to 0.25.4
|
||||
- *(deps)* Bump golang from 1.19.3 to 1.19.4
|
||||
- *(deps)* Bump k8s.io/client-go from 0.25.4 to 0.26.0
|
||||
- *(deps)* Bump golang from 1.19.4 to 1.19.5
|
||||
- *(deps)* Bump k8s.io/client-go from 0.26.0 to 0.26.1
|
||||
- *(deps)* Bump golang from 1.19.5 to 1.20.0
|
||||
- Use Docker DinD version from variable
|
||||
- *(deps)* Bump golang from 1.20.0 to 1.20.1
|
||||
- *(deps)* Bump k8s.io/client-go from 0.26.1 to 0.26.2
|
||||
- *(deps)* Bump golang from 1.20.1 to 1.20.2
|
||||
- *(deps)* Bump k8s.io/client-go from 0.26.2 to 0.26.3
|
||||
- *(deps)* Bump golang from 1.20.2 to 1.20.3
|
||||
- *(deps)* Bump k8s.io/client-go from 0.26.3 to 0.27.0
|
||||
- *(deps)* Bump k8s.io/client-go from 0.27.0 to 0.27.1
|
||||
- *(deps)* Bump golang from 1.20.3 to 1.20.4
|
||||
- *(deps)* Bump k8s.io/client-go from 0.27.1 to 0.27.2
|
||||
- Update kingpin dependency
|
||||
- *(deps)* Bump golang from 1.20.4 to 1.20.5
|
||||
- *(deps)* Bump k8s.io/client-go from 0.27.2 to 0.27.3
|
||||
- *(deps)* Bump golang from 1.20.5 to 1.20.6
|
||||
- *(deps)* Bump k8s.io/client-go from 0.27.3 to 0.27.4
|
||||
- *(deps)* Bump golang from 1.20.6 to 1.20.7
|
||||
- *(deps)* Bump golang from 1.20.7 to 1.21.0
|
||||
- *(deps)* Bump k8s.io/client-go from 0.27.4 to 0.28.0
|
||||
- *(deps)* Bump k8s.io/client-go from 0.28.0 to 0.28.1
|
||||
- *(deps)* Bump golang from 1.21.0 to 1.21.1
|
||||
- *(deps)* Bump k8s.io/client-go from 0.28.1 to 0.28.2
|
||||
- *(deps)* Bump golang from 1.21.1 to 1.21.2
|
||||
- *(deps)* Bump golang from 1.21.2 to 1.21.3
|
||||
- *(deps)* Bump k8s.io/client-go from 0.28.2 to 0.28.3
|
||||
- *(deps)* Bump golang from 1.21.3 to 1.21.4
|
||||
- *(deps)* Bump k8s.io/client-go from 0.28.3 to 0.28.4
|
||||
- *(deps)* Bump github.com/alecthomas/kingpin/v2 from 2.3.2 to 2.4.0
|
||||
- *(deps)* Bump golang from 1.21.4 to 1.21.5
|
||||
- *(deps)* Bump k8s.io/client-go from 0.28.4 to 0.29.0
|
||||
- *(deps)* Bump golang from 1.21.5 to 1.21.6
|
||||
- *(deps)* Bump k8s.io/client-go from 0.29.0 to 0.29.1
|
||||
- *(deps)* Bump golang from 1.21.6 to 1.22.0
|
||||
- *(deps)* Bump k8s.io/client-go from 0.29.1 to 0.29.2
|
||||
- Remove Dependabot config
|
||||
- *(deps)* Update golang docker tag to v1.22.1
|
||||
- *(deps)* Update golang docker tag to v1.22.2
|
||||
- *(deps)* Update dependency go to v1.22.2
|
||||
- *(deps)* Update dependency go to v1.22.3
|
||||
- *(deps)* Update golang docker tag to v1.22.3
|
||||
- *(deps)* Update dependency go to v1.22.4
|
||||
- *(deps)* Update golang docker tag to v1.22.4
|
||||
- *(deps)* Update dependency go to v1.22.5
|
||||
- *(deps)* Update golang docker tag to v1.22.5
|
||||
- *(deps)* Update dependency go to v1.22.6
|
||||
- *(deps)* Update golang docker tag to v1.22.6
|
||||
- *(deps)* Update dependency go to v1.23.0
|
||||
- *(deps)* Update golang docker tag to v1.23.0
|
||||
- *(deps)* Update dependency go to v1.23.1
|
||||
- *(deps)* Update golang docker tag to v1.23.1
|
||||
- *(deps)* Update dependency go to v1.23.2
|
||||
- *(deps)* Update golang docker tag to v1.23.2
|
||||
- Add release flow
|
||||
- Add git-cliff configuration
|
||||
|
||||
<!-- generated by git-cliff -->
|
||||
@@ -0,0 +1,61 @@
|
||||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Project Overview
|
||||
|
||||
A Kubernetes monitoring tool that checks for CronJobs not running according to schedule and sends Slack notifications. It runs as a container inside a K8s cluster, polling all CronJobs every 60 seconds.
|
||||
|
||||
## Common Commands
|
||||
|
||||
```bash
|
||||
# Run tests
|
||||
go test ./...
|
||||
|
||||
# Run tests with race detection and coverage
|
||||
go test -race -coverprofile=coverage.txt ./...
|
||||
|
||||
# Build the binary
|
||||
CGO_ENABLED=0 go build -o release/cron-checker -ldflags '-w -s'
|
||||
|
||||
# Check for vulnerabilities
|
||||
govulncheck ./...
|
||||
|
||||
# Format and vet
|
||||
go fmt ./...
|
||||
go vet ./...
|
||||
|
||||
# Check for unused modules
|
||||
go mod tidy
|
||||
```
|
||||
|
||||
## Architecture
|
||||
|
||||
This is a single-file Go application (`main.go`) with comprehensive tests (`main_test.go`).
|
||||
|
||||
**Core Components:**
|
||||
- `doCheck()` - Main loop that polls K8s CronJobs, parses cron schedules, and sends Slack alerts for overdue jobs
|
||||
- `Client` / `ClientProvider` interfaces - Abstractions over K8s client for testability
|
||||
- `ConfigProvider` / `InClusterProvider` - Handles K8s in-cluster authentication
|
||||
|
||||
**Key Dependencies:**
|
||||
- `k8s.io/client-go` - Kubernetes API client
|
||||
- `github.com/robfig/cron` - Cron schedule parsing
|
||||
- `github.com/multiplay/go-slack` - Slack webhook integration
|
||||
- `github.com/alecthomas/kingpin/v2` - CLI flag parsing
|
||||
|
||||
**Configuration:**
|
||||
- `SLACK_URL` env var or `--slack-url` flag (required) - Slack webhook URL for notifications
|
||||
|
||||
## Building Docker Image
|
||||
|
||||
The Dockerfile performs a multi-stage build that runs fmt, vet, and tests before building:
|
||||
|
||||
```bash
|
||||
docker build -t cron-checker .
|
||||
```
|
||||
|
||||
To extract coverage report:
|
||||
```bash
|
||||
docker build --target export -o . .
|
||||
```
|
||||
+4
-20
@@ -1,21 +1,4 @@
|
||||
FROM golang:1.15 as build
|
||||
ARG CODECOV_ENV
|
||||
ARG CODECOV_TOKEN
|
||||
ARG CODECOV_URL
|
||||
ARG CODECOV_SLUG
|
||||
ARG VCS_COMMIT_ID
|
||||
ARG VCS_BRANCH_NAME
|
||||
ARG VCS_PULL_REQUEST
|
||||
ARG VCS_SLUG
|
||||
ARG VCS_TAG
|
||||
ARG CI_BUILD_URL
|
||||
ARG CI_BUILD_ID
|
||||
ARG CI_JOB_ID
|
||||
ARG GITLAB_CI
|
||||
ARG CI_BUILD_REF_NAME
|
||||
ARG CI_BUILD_ID
|
||||
ARG CI_BUILD_REPO
|
||||
ARG CI_BUILD_REF
|
||||
FROM amd64/golang:1.26.0@sha256:e7479dbd4918090d893b97245fd8c0bcf767677f8ede2e60e7fb2c2f38c94215 as build
|
||||
WORKDIR /build
|
||||
ENV CGO_ENABLED=0
|
||||
ADD . /build
|
||||
@@ -27,10 +10,11 @@ RUN ["/bin/bash", "-c", "cat coverage.txt.tmp | grep -v -f <(find . -type f | xa
|
||||
RUN go tool cover -html=coverage.txt -o coverage.html
|
||||
RUN go tool cover -func=coverage.txt
|
||||
RUN rm coverage.txt.tmp
|
||||
RUN curl -s https://codecov.io/bash | bash
|
||||
|
||||
RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -mod=readonly -o release/cron-checker -ldflags '-w -s'
|
||||
|
||||
FROM scratch as export
|
||||
COPY --from=build /build/coverage.txt /
|
||||
|
||||
FROM scratch
|
||||
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
|
||||
COPY --from=build /build/release/cron-checker /
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# cron-checker
|
||||
[](https://gitlab.com/unboundsoftware/cron-checker/commits/master)
|
||||
[](https://codecov.io/gl/unboundsoftware/cron-checker)
|
||||
[](https://codecov.io/gl/unboundsoftware/cron-checker)
|
||||
|
||||
A small container which periodically (every 60s) checks for a cronjobs which are not running according to schedule and sends a notification to Slack.
|
||||
|
||||
|
||||
+84
@@ -0,0 +1,84 @@
|
||||
# git-cliff ~ default configuration file
|
||||
# https://git-cliff.org/docs/configuration
|
||||
#
|
||||
# Lines starting with "#" are comments.
|
||||
# Configuration options are organized into tables and keys.
|
||||
# See documentation for more information on available options.
|
||||
|
||||
[bump]
|
||||
initial_tag = "1.3.0"
|
||||
|
||||
[changelog]
|
||||
# template for the changelog header
|
||||
header = """
|
||||
# Changelog\n
|
||||
All notable changes to this project will be documented in this file.\n
|
||||
"""
|
||||
# template for the changelog body
|
||||
# https://keats.github.io/tera/docs/#introduction
|
||||
body = """
|
||||
{% if version %}\
|
||||
## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
|
||||
{% else %}\
|
||||
## [unreleased]
|
||||
{% endif %}\
|
||||
{% for group, commits in commits | group_by(attribute="group") %}
|
||||
### {{ group | striptags | trim | upper_first }}
|
||||
{% for commit in commits %}
|
||||
- {% if commit.scope %}*({{ commit.scope }})* {% endif %}\
|
||||
{% if commit.breaking %}[**breaking**] {% endif %}\
|
||||
{{ commit.message | upper_first }}\
|
||||
{% endfor %}
|
||||
{% endfor %}\n
|
||||
"""
|
||||
# template for the changelog footer
|
||||
footer = """
|
||||
<!-- generated by git-cliff -->
|
||||
"""
|
||||
# remove the leading and trailing s
|
||||
trim = true
|
||||
# postprocessors
|
||||
postprocessors = [
|
||||
# { pattern = '<REPO>', replace = "https://github.com/orhun/git-cliff" }, # replace repository URL
|
||||
]
|
||||
# render body even when there are no releases to process
|
||||
# render_always = true
|
||||
# output file path
|
||||
# output = "test.md"
|
||||
|
||||
[git]
|
||||
# parse the commits based on https://www.conventionalcommits.org
|
||||
conventional_commits = true
|
||||
# filter out the commits that are not conventional
|
||||
filter_unconventional = true
|
||||
# process each line of a commit as an individual commit
|
||||
split_commits = false
|
||||
# regex for preprocessing the commit messages
|
||||
commit_preprocessors = [
|
||||
# Replace issue numbers
|
||||
#{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](<REPO>/issues/${2}))"},
|
||||
# Check spelling of the commit with https://github.com/crate-ci/typos
|
||||
# If the spelling is incorrect, it will be automatically fixed.
|
||||
#{ pattern = '.*', replace_command = 'typos --write-changes -' },
|
||||
]
|
||||
# regex for parsing and grouping commits
|
||||
commit_parsers = [
|
||||
{ message = "^feat", group = "<!-- 0 -->🚀 Features" },
|
||||
{ message = "^fix", group = "<!-- 1 -->🐛 Bug Fixes" },
|
||||
{ message = "^doc", group = "<!-- 3 -->📚 Documentation" },
|
||||
{ message = "^perf", group = "<!-- 4 -->⚡ Performance" },
|
||||
{ message = "^refactor", group = "<!-- 2 -->🚜 Refactor" },
|
||||
{ message = "^style", group = "<!-- 5 -->🎨 Styling" },
|
||||
{ message = "^test", group = "<!-- 6 -->🧪 Testing" },
|
||||
{ message = "^chore\\(release\\): prepare for", skip = true },
|
||||
{ message = "^chore|^ci", group = "<!-- 7 -->⚙️ Miscellaneous Tasks" },
|
||||
{ body = ".*security", group = "<!-- 8 -->🛡️ Security" },
|
||||
{ message = "^revert", group = "<!-- 9 -->◀️ Revert" },
|
||||
]
|
||||
# filter out the commits that are not matched by commit parsers
|
||||
filter_commits = false
|
||||
# sort the tags topologically
|
||||
topo_order = false
|
||||
# sort the commits inside sections by oldest/newest order
|
||||
sort_commits = "oldest"
|
||||
tag_pattern = "[0-9]+\\.[0-9]+\\.[0-9]+"
|
||||
+8
-4
@@ -2,11 +2,13 @@ apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: cron-checker
|
||||
namespace: kube-system
|
||||
---
|
||||
kind: ClusterRole
|
||||
apiVersion: rbac.authorization.k8s.io/v1
|
||||
metadata:
|
||||
name: cron-checker
|
||||
namespace: kube-system
|
||||
rules:
|
||||
- apiGroups: ["", "batch"]
|
||||
resources: ["cronjobs"]
|
||||
@@ -17,6 +19,7 @@ apiVersion: rbac.authorization.k8s.io/v1
|
||||
kind: ClusterRoleBinding
|
||||
metadata:
|
||||
name: cron-checker
|
||||
namespace: kube-system
|
||||
roleRef:
|
||||
apiGroup: rbac.authorization.k8s.io
|
||||
kind: ClusterRole
|
||||
@@ -24,18 +27,19 @@ roleRef:
|
||||
subjects:
|
||||
- kind: ServiceAccount
|
||||
name: cron-checker
|
||||
namespace: kube-system
|
||||
---
|
||||
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
labels:
|
||||
app: cron-checker
|
||||
app.kubernetes.io/name: cron-checker
|
||||
name: cron-checker
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: cron-checker
|
||||
app.kubernetes.io/name: cron-checker
|
||||
strategy:
|
||||
rollingUpdate:
|
||||
maxSurge: 1
|
||||
@@ -44,7 +48,7 @@ spec:
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: cron-checker
|
||||
app.kubernetes.io/name: cron-checker
|
||||
spec:
|
||||
serviceAccountName: cron-checker
|
||||
containers:
|
||||
@@ -55,7 +59,7 @@ spec:
|
||||
requests:
|
||||
memory: "50Mi"
|
||||
imagePullPolicy: IfNotPresent
|
||||
image: registry.gitlab.com/unboundsoftware/cron-checker:1.0
|
||||
image: registry.gitlab.com/unboundsoftware/cron-checker:1.2
|
||||
args:
|
||||
- /cron-checker
|
||||
env:
|
||||
|
||||
@@ -1,17 +1,55 @@
|
||||
module gitlab.com/unboundsoftware/cron-checker
|
||||
|
||||
go 1.15
|
||||
go 1.25.0
|
||||
|
||||
toolchain go1.26.0
|
||||
|
||||
require (
|
||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
|
||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect
|
||||
github.com/multiplay/go-slack v0.0.0-20200412115802-09e9e2b93fe2
|
||||
github.com/alecthomas/kingpin/v2 v2.4.0
|
||||
github.com/multiplay/go-slack v0.0.0-20220428123529-0762aee71fe3
|
||||
github.com/robfig/cron v1.2.0
|
||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect
|
||||
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e // indirect
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6
|
||||
k8s.io/api v0.18.8 // indirect
|
||||
k8s.io/apimachinery v0.18.8
|
||||
k8s.io/client-go v0.18.0
|
||||
k8s.io/utils v0.0.0-20200821003339-5e75c0163111 // indirect
|
||||
github.com/sanity-io/litter v1.5.8
|
||||
k8s.io/api v0.35.1
|
||||
k8s.io/apimachinery v0.35.1
|
||||
k8s.io/client-go v0.35.1
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||
github.com/emicklei/go-restful/v3 v3.12.2 // indirect
|
||||
github.com/fxamacker/cbor/v2 v2.9.0 // indirect
|
||||
github.com/go-logr/logr v1.4.3 // indirect
|
||||
github.com/go-openapi/jsonpointer v0.21.0 // indirect
|
||||
github.com/go-openapi/jsonreference v0.20.2 // indirect
|
||||
github.com/go-openapi/swag v0.23.0 // indirect
|
||||
github.com/google/gnostic-models v0.7.0 // indirect
|
||||
github.com/google/uuid v1.6.0 // indirect
|
||||
github.com/josharian/intern v1.0.0 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/mailru/easyjson v0.7.7 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||
github.com/x448/float16 v0.8.4 // indirect
|
||||
github.com/xhit/go-str2duration/v2 v2.1.0 // indirect
|
||||
go.yaml.in/yaml/v2 v2.4.3 // indirect
|
||||
go.yaml.in/yaml/v3 v3.0.4 // indirect
|
||||
golang.org/x/net v0.47.0 // indirect
|
||||
golang.org/x/oauth2 v0.30.0 // indirect
|
||||
golang.org/x/sys v0.38.0 // indirect
|
||||
golang.org/x/term v0.37.0 // indirect
|
||||
golang.org/x/text v0.31.0 // indirect
|
||||
golang.org/x/time v0.9.0 // indirect
|
||||
google.golang.org/protobuf v1.36.8 // indirect
|
||||
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
|
||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
k8s.io/klog/v2 v2.130.1 // indirect
|
||||
k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 // indirect
|
||||
k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 // indirect
|
||||
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
|
||||
sigs.k8s.io/randfill v1.0.0 // indirect
|
||||
sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect
|
||||
sigs.k8s.io/yaml v1.6.0 // indirect
|
||||
)
|
||||
|
||||
@@ -1,210 +1,147 @@
|
||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
||||
github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
|
||||
github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
|
||||
github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
|
||||
github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
|
||||
github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
|
||||
github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
|
||||
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
|
||||
github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
|
||||
github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
|
||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM=
|
||||
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E=
|
||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
|
||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
|
||||
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
|
||||
github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY=
|
||||
github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE=
|
||||
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc=
|
||||
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
|
||||
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
|
||||
github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
|
||||
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
|
||||
github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc=
|
||||
github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
|
||||
github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
|
||||
github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
|
||||
github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
|
||||
github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
|
||||
github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
|
||||
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
|
||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
|
||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU=
|
||||
github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
|
||||
github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
|
||||
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
|
||||
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
|
||||
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||
github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
|
||||
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
|
||||
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
|
||||
github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE=
|
||||
github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
|
||||
github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
|
||||
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
|
||||
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
|
||||
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
|
||||
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
||||
github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo=
|
||||
github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ=
|
||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
|
||||
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||
github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
|
||||
github.com/googleapis/gnostic v0.1.0 h1:rVsPeBmXbYv4If/cumu1AzZPwV58q433hvONV1UEZoI=
|
||||
github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
|
||||
github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
|
||||
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
|
||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
|
||||
github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok=
|
||||
github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8=
|
||||
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
|
||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
||||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
|
||||
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
|
||||
github.com/multiplay/go-slack v0.0.0-20200412115802-09e9e2b93fe2 h1:JeeenF3Ph/BhsDp2CBOuv61tYIqC7nt3irdMa7o/BDg=
|
||||
github.com/multiplay/go-slack v0.0.0-20200412115802-09e9e2b93fe2/go.mod h1:NvMi0R59yLlFQoqPIiHVWLgL2XnsGXw3MNMH65wGNew=
|
||||
github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
|
||||
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
|
||||
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8=
|
||||
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
|
||||
github.com/multiplay/go-slack v0.0.0-20220428123529-0762aee71fe3 h1:dJYuKCHHnle0EjAaD57utfBfvQ8HjteuCqS4RWVk23c=
|
||||
github.com/multiplay/go-slack v0.0.0-20220428123529-0762aee71fe3/go.mod h1:NvMi0R59yLlFQoqPIiHVWLgL2XnsGXw3MNMH65wGNew=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||
github.com/onsi/ginkgo/v2 v2.27.2 h1:LzwLj0b89qtIy6SSASkzlNvX6WktqurSHwkk2ipF/Ns=
|
||||
github.com/onsi/ginkgo/v2 v2.27.2/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo=
|
||||
github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A=
|
||||
github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k=
|
||||
github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
|
||||
github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
|
||||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
||||
github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
|
||||
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
|
||||
github.com/sanity-io/litter v1.5.8 h1:uM/2lKrWdGbRXDrIq08Lh9XtVYoeGtcQxk9rtQ7+rYg=
|
||||
github.com/sanity-io/litter v1.5.8/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U=
|
||||
github.com/spf13/pflag v1.0.9 h1:9exaQaMOCwffKiiiYk6/BndUBv+iRViNW+4lEMi0PvY=
|
||||
github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
|
||||
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
|
||||
github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||
golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo=
|
||||
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI=
|
||||
golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw=
|
||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7 h1:HmbHVPwrPEKPGLAcHSrMe6+hqSUlvZU0rab6x5EXfGU=
|
||||
golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s=
|
||||
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c=
|
||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
|
||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
|
||||
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.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
||||
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
||||
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
|
||||
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
|
||||
github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc=
|
||||
github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU=
|
||||
go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0=
|
||||
go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8=
|
||||
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
|
||||
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
|
||||
golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
|
||||
golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
|
||||
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
|
||||
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
|
||||
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
|
||||
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
|
||||
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
|
||||
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
|
||||
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
|
||||
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
|
||||
golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
|
||||
golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
|
||||
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
|
||||
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
|
||||
golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
|
||||
golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
|
||||
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
|
||||
google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
|
||||
google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo=
|
||||
gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
|
||||
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
|
||||
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
|
||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||
k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8=
|
||||
k8s.io/api v0.18.8 h1:aIKUzJPb96f3fKec2lxtY7acZC9gQNDLVhfSGpxBAC4=
|
||||
k8s.io/api v0.18.8/go.mod h1:d/CXqwWv+Z2XEG1LgceeDmHQwpUJhROPx16SlxJgERY=
|
||||
k8s.io/apimachinery v0.18.0/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA=
|
||||
k8s.io/apimachinery v0.18.8 h1:jimPrycCqgx2QPearX3to1JePz7wSbVLq+7PdBTTwQ0=
|
||||
k8s.io/apimachinery v0.18.8/go.mod h1:6sQd+iHEqmOtALqOFjSWp2KZ9F0wlU/nWm0ZgsYWMig=
|
||||
k8s.io/client-go v0.18.0 h1:yqKw4cTUQraZK3fcVCMeSa+lqKwcjZ5wtcOIPnxQno4=
|
||||
k8s.io/client-go v0.18.0/go.mod h1:uQSYDYs4WhVZ9i6AIoEZuwUggLVEF64HOD37boKAtF8=
|
||||
k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
|
||||
k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
|
||||
k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
|
||||
k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
|
||||
k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
|
||||
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
|
||||
k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
|
||||
k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
|
||||
k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
|
||||
k8s.io/utils v0.0.0-20200821003339-5e75c0163111 h1:AChSIFe1D4vQ5XkklbH491v1ONSmnt8fnb235DsAw1U=
|
||||
k8s.io/utils v0.0.0-20200821003339-5e75c0163111/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
|
||||
sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
|
||||
sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E=
|
||||
sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
|
||||
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
|
||||
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
|
||||
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
k8s.io/api v0.35.1 h1:0PO/1FhlK/EQNVK5+txc4FuhQibV25VLSdLMmGpDE/Q=
|
||||
k8s.io/api v0.35.1/go.mod h1:28uR9xlXWml9eT0uaGo6y71xK86JBELShLy4wR1XtxM=
|
||||
k8s.io/apimachinery v0.35.1 h1:yxO6gV555P1YV0SANtnTjXYfiivaTPvCTKX6w6qdDsU=
|
||||
k8s.io/apimachinery v0.35.1/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns=
|
||||
k8s.io/client-go v0.35.1 h1:+eSfZHwuo/I19PaSxqumjqZ9l5XiTEKbIaJ+j1wLcLM=
|
||||
k8s.io/client-go v0.35.1/go.mod h1:1p1KxDt3a0ruRfc/pG4qT/3oHmUj1AhSHEcxNSGg+OA=
|
||||
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
|
||||
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
|
||||
k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912 h1:Y3gxNAuB0OBLImH611+UDZcmKS3g6CthxToOb37KgwE=
|
||||
k8s.io/kube-openapi v0.0.0-20250910181357-589584f1c912/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ=
|
||||
k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck=
|
||||
k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg=
|
||||
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
|
||||
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
|
||||
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
|
||||
sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco=
|
||||
sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE=
|
||||
sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs=
|
||||
sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4=
|
||||
|
||||
@@ -3,52 +3,66 @@ package main
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/multiplay/go-slack/chat"
|
||||
"github.com/multiplay/go-slack/webhook"
|
||||
"github.com/robfig/cron"
|
||||
"gopkg.in/alecthomas/kingpin.v2"
|
||||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/client-go/kubernetes"
|
||||
"k8s.io/client-go/rest"
|
||||
"io"
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/alecthomas/kingpin/v2"
|
||||
"github.com/multiplay/go-slack/chat"
|
||||
"github.com/multiplay/go-slack/webhook"
|
||||
"github.com/robfig/cron"
|
||||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/client-go/kubernetes"
|
||||
batchv1 "k8s.io/client-go/kubernetes/typed/batch/v1"
|
||||
"k8s.io/client-go/rest"
|
||||
)
|
||||
|
||||
var checkFunc = doCheck
|
||||
var exitFunc = os.Exit
|
||||
|
||||
func main() {
|
||||
slackUrl := kingpin.Flag("slack-url", "The Slack Webhook URL").Envar("SLACK_URL").Required().String()
|
||||
kingpin.Parse()
|
||||
|
||||
config, err := rest.InClusterConfig()
|
||||
if err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
clientset, err := kubernetes.NewForConfig(config)
|
||||
if err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
exitFunc(doMain(*slackUrl, &DefaultProvider{&InClusterProvider{}}))
|
||||
}
|
||||
|
||||
slack := webhook.New(*slackUrl)
|
||||
|
||||
parser := cron.NewParser(cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow)
|
||||
func doMain(slackUrl string, provider ClientProvider) int {
|
||||
client, err := provider.Provide()
|
||||
if err != nil {
|
||||
fmt.Printf("Unable to connect to K8S: %s\n", err)
|
||||
return 1
|
||||
}
|
||||
|
||||
ic := make(chan os.Signal, 1)
|
||||
signal.Notify(ic, os.Interrupt, syscall.SIGTERM)
|
||||
|
||||
if err := checkFunc(client, slackUrl, ic, 60*time.Second, os.Stdout); err != nil {
|
||||
fmt.Printf("Error checking jobs: %s\n", err)
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func doCheck(client Client, slackUrl string, ic chan os.Signal, sleepTime time.Duration, out io.Writer) error {
|
||||
slack := webhook.New(slackUrl)
|
||||
|
||||
parser := cron.NewParser(cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow)
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-ic:
|
||||
fmt.Printf("Got SIGTERM signal, exiting\n")
|
||||
break
|
||||
_, _ = fmt.Fprintf(out, "Got SIGTERM signal, exiting\n")
|
||||
return nil
|
||||
default:
|
||||
cronjobs, err := clientset.BatchV1beta1().CronJobs("").List(context.Background(), v1.ListOptions{})
|
||||
cronJobs, err := client.BatchV1().CronJobs("").List(context.Background(), v1.ListOptions{})
|
||||
if err != nil {
|
||||
fmt.Printf("Error getting cronjobs: %s", err)
|
||||
os.Exit(1)
|
||||
return fmt.Errorf("error getting cronjobs: %w", err)
|
||||
}
|
||||
limit := time.Now().Add(-120 * time.Second)
|
||||
for _, c := range cronjobs.Items {
|
||||
for _, c := range cronJobs.Items {
|
||||
if c.Spec.Suspend == nil || !*c.Spec.Suspend {
|
||||
since := c.CreationTimestamp
|
||||
if c.Status.LastScheduleTime != nil {
|
||||
@@ -56,28 +70,58 @@ func main() {
|
||||
}
|
||||
schedule, err := parser.Parse(c.Spec.Schedule)
|
||||
if err != nil {
|
||||
fmt.Printf("Error parsing schedule of %s/%s (%s): %s", c.Namespace, c.Name, c.Spec.Schedule, err)
|
||||
os.Exit(1)
|
||||
return fmt.Errorf("error parsing schedule of %s/%s (%s): %w", c.Namespace, c.Name, c.Spec.Schedule, err)
|
||||
}
|
||||
next := schedule.Next(since.Time)
|
||||
fmt.Printf("Checking %s/%s since %s, next schedule %s, limit %s.\n", c.Namespace, c.Name, since.Format(time.RFC3339), next.Format(time.RFC3339), limit.Format(time.RFC3339))
|
||||
_, _ = fmt.Fprintf(out, "Checking %s/%s since %s, next schedule %s, limit %s.\n", c.Namespace, c.Name, since.Format(time.RFC3339), next.Format(time.RFC3339), limit.Format(time.RFC3339))
|
||||
if next.Before(limit) {
|
||||
fmt.Printf("%s was not scheduled. Sending Slack notification.\n", c.Name)
|
||||
_, _ = fmt.Fprintf(out, "%s/%s was not scheduled. Sending Slack notification.\n", c.Namespace, c.Name)
|
||||
m := &chat.Message{
|
||||
Text: fmt.Sprintf("Cronjob %s/%s is not running according to schedule (%s). Last scheduled: %s", c.Namespace, c.Name, c.Spec.Schedule, since.Format(time.RFC3339)),
|
||||
Username: "cron-checker",
|
||||
}
|
||||
resp, err := m.Send(slack)
|
||||
_, err := m.Send(slack)
|
||||
if err != nil {
|
||||
fmt.Printf("Unable to send Slack notification: %s", err)
|
||||
}
|
||||
if !resp.OK {
|
||||
fmt.Printf("Unable to send Slack notification: %s", resp.Error)
|
||||
_, _ = fmt.Fprintf(out, "Unable to send Slack notification: %s\n", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
time.Sleep(60 * time.Second)
|
||||
time.Sleep(sleepTime)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type Client interface {
|
||||
BatchV1() batchv1.BatchV1Interface
|
||||
}
|
||||
|
||||
type ClientProvider interface {
|
||||
Provide() (Client, error)
|
||||
}
|
||||
|
||||
type DefaultProvider struct {
|
||||
provider ConfigProvider
|
||||
}
|
||||
|
||||
func (d DefaultProvider) Provide() (Client, error) {
|
||||
config, err := d.provider.Provide()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return kubernetes.NewForConfig(config)
|
||||
}
|
||||
|
||||
var _ ClientProvider = &DefaultProvider{}
|
||||
|
||||
type ConfigProvider interface {
|
||||
Provide() (*rest.Config, error)
|
||||
}
|
||||
|
||||
type InClusterProvider struct{}
|
||||
|
||||
func (i InClusterProvider) Provide() (*rest.Config, error) {
|
||||
return rest.InClusterConfig()
|
||||
}
|
||||
|
||||
var _ ConfigProvider = &InClusterProvider{}
|
||||
|
||||
+465
@@ -0,0 +1,465 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"os"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/sanity-io/litter"
|
||||
cronjobv1 "k8s.io/api/batch/v1"
|
||||
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/types"
|
||||
"k8s.io/apimachinery/pkg/watch"
|
||||
applyv1 "k8s.io/client-go/applyconfigurations/batch/v1"
|
||||
"k8s.io/client-go/discovery"
|
||||
"k8s.io/client-go/kubernetes"
|
||||
batchv1 "k8s.io/client-go/kubernetes/typed/batch/v1"
|
||||
"k8s.io/client-go/rest"
|
||||
)
|
||||
|
||||
func Test_Main(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
connectFunc func(provider ConfigProvider) (Client, error)
|
||||
exitFunc func(code int)
|
||||
}{
|
||||
{
|
||||
name: "error connecting to K8S",
|
||||
connectFunc: func(ConfigProvider) (Client, error) {
|
||||
return nil, errors.New("error")
|
||||
},
|
||||
exitFunc: func(code int) {
|
||||
if code != 1 {
|
||||
t.Errorf("main() got %d, want 1", code)
|
||||
}
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
os.Args = []string{"dummy", "--slack-url", "https://dummy.example.org"}
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
exitFunc = tt.exitFunc
|
||||
main()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_doMain(t *testing.T) {
|
||||
type args struct {
|
||||
slackUrl string
|
||||
provider ClientProvider
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
checkFunc func(client Client, slackUrl string, ic chan os.Signal, sleepTime time.Duration, out io.Writer) error
|
||||
want int
|
||||
}{
|
||||
{
|
||||
name: "error checking",
|
||||
args: args{
|
||||
provider: &brokenClientProvider{},
|
||||
},
|
||||
checkFunc: func(client Client, slackUrl string, ic chan os.Signal, sleepTime time.Duration, out io.Writer) error {
|
||||
return errors.New("error")
|
||||
},
|
||||
want: 1,
|
||||
},
|
||||
{
|
||||
name: "success",
|
||||
args: args{
|
||||
provider: &brokenClientProvider{},
|
||||
},
|
||||
checkFunc: func(client Client, slackUrl string, ic chan os.Signal, sleepTime time.Duration, out io.Writer) error {
|
||||
return nil
|
||||
},
|
||||
want: 0,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
checkFunc = tt.checkFunc
|
||||
if got := doMain(tt.args.slackUrl, tt.args.provider); got != tt.want {
|
||||
t.Errorf("doMain() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func Test_doCheck(t *testing.T) {
|
||||
type args struct {
|
||||
client Client
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
args args
|
||||
timeout time.Duration
|
||||
slackResponse string
|
||||
wantErr bool
|
||||
wantOut []string
|
||||
}{
|
||||
{
|
||||
name: "error getting cronjobs",
|
||||
args: args{
|
||||
client: &brokenClient{
|
||||
batchApi: &batchApi{
|
||||
cronApi: &cronApi{
|
||||
listFn: func(_ context.Context, _ v1.ListOptions) (*cronjobv1.CronJobList, error) {
|
||||
return nil, errors.New("error")
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "no cronjobs",
|
||||
args: args{
|
||||
client: &brokenClient{
|
||||
batchApi: &batchApi{
|
||||
cronApi: &cronApi{
|
||||
listFn: func(_ context.Context, _ v1.ListOptions) (*cronjobv1.CronJobList, error) {
|
||||
return &cronjobv1.CronJobList{}, nil
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
timeout: time.Second,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "suspended cronjobs are ignored",
|
||||
args: args{
|
||||
client: &brokenClient{
|
||||
batchApi: &batchApi{
|
||||
cronApi: &cronApi{
|
||||
listFn: func(_ context.Context, _ v1.ListOptions) (*cronjobv1.CronJobList, error) {
|
||||
return &cronjobv1.CronJobList{
|
||||
Items: []cronjobv1.CronJob{
|
||||
{
|
||||
Spec: cronjobv1.CronJobSpec{Suspend: boolP(true)},
|
||||
},
|
||||
},
|
||||
}, nil
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
timeout: time.Second,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "invalid cron schedule",
|
||||
args: args{
|
||||
client: &brokenClient{
|
||||
batchApi: &batchApi{
|
||||
cronApi: &cronApi{
|
||||
listFn: func(_ context.Context, _ v1.ListOptions) (*cronjobv1.CronJobList, error) {
|
||||
return &cronjobv1.CronJobList{
|
||||
Items: []cronjobv1.CronJob{
|
||||
{
|
||||
Spec: cronjobv1.CronJobSpec{Schedule: "abc"},
|
||||
},
|
||||
},
|
||||
}, nil
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "only correctly running cronjobs",
|
||||
args: args{
|
||||
client: &brokenClient{
|
||||
batchApi: &batchApi{
|
||||
cronApi: &cronApi{
|
||||
listFn: func(_ context.Context, _ v1.ListOptions) (*cronjobv1.CronJobList, error) {
|
||||
return &cronjobv1.CronJobList{
|
||||
Items: []cronjobv1.CronJob{
|
||||
{
|
||||
ObjectMeta: v1.ObjectMeta{CreationTimestamp: v1.Time{Time: time.Now()}},
|
||||
Spec: cronjobv1.CronJobSpec{Schedule: "* * * * *", Suspend: boolP(false)},
|
||||
},
|
||||
{
|
||||
Spec: cronjobv1.CronJobSpec{Schedule: "* * * * *"},
|
||||
Status: cronjobv1.CronJobStatus{LastScheduleTime: &v1.Time{Time: time.Now()}},
|
||||
},
|
||||
},
|
||||
}, nil
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
timeout: time.Second,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "error in Slack call",
|
||||
args: args{
|
||||
client: &brokenClient{
|
||||
batchApi: &batchApi{
|
||||
cronApi: &cronApi{
|
||||
listFn: func(_ context.Context, _ v1.ListOptions) (*cronjobv1.CronJobList, error) {
|
||||
return &cronjobv1.CronJobList{
|
||||
Items: []cronjobv1.CronJob{
|
||||
{
|
||||
ObjectMeta: v1.ObjectMeta{Name: "some-name", Namespace: "some-ns"},
|
||||
Spec: cronjobv1.CronJobSpec{Schedule: "* * * * *"},
|
||||
Status: cronjobv1.CronJobStatus{LastScheduleTime: &v1.Time{Time: time.Now().Add(-3 * time.Minute)}},
|
||||
},
|
||||
},
|
||||
}, nil
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
timeout: time.Second,
|
||||
slackResponse: "dummy",
|
||||
wantErr: false,
|
||||
wantOut: []string{"Checking some-ns/some-name since", "some-ns/some-name was not scheduled. Sending Slack notification.", "Unable to send Slack notification: slack: request failed statuscode: 200, message: invalid character 'd' looking for beginning of value"},
|
||||
},
|
||||
{
|
||||
name: "Slack response not ok",
|
||||
args: args{
|
||||
client: &brokenClient{
|
||||
batchApi: &batchApi{
|
||||
cronApi: &cronApi{
|
||||
listFn: func(_ context.Context, _ v1.ListOptions) (*cronjobv1.CronJobList, error) {
|
||||
return &cronjobv1.CronJobList{
|
||||
Items: []cronjobv1.CronJob{
|
||||
{
|
||||
ObjectMeta: v1.ObjectMeta{Name: "some-name", Namespace: "some-ns"},
|
||||
Spec: cronjobv1.CronJobSpec{Schedule: "* * * * *"},
|
||||
Status: cronjobv1.CronJobStatus{LastScheduleTime: &v1.Time{Time: time.Now().Add(-3 * time.Minute)}},
|
||||
},
|
||||
},
|
||||
}, nil
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
timeout: time.Second,
|
||||
slackResponse: `{"ok": false, "error": "Something went wrong"}`,
|
||||
wantErr: false,
|
||||
wantOut: []string{"Checking some-ns/some-name since", "some-ns/some-name was not scheduled. Sending Slack notification.", "Unable to send Slack notification: slack: request failed statuscode: 200, message: Something went wrong"},
|
||||
},
|
||||
{
|
||||
name: "Slack response ok",
|
||||
args: args{
|
||||
client: &brokenClient{
|
||||
batchApi: &batchApi{
|
||||
cronApi: &cronApi{
|
||||
listFn: func(_ context.Context, _ v1.ListOptions) (*cronjobv1.CronJobList, error) {
|
||||
return &cronjobv1.CronJobList{
|
||||
Items: []cronjobv1.CronJob{
|
||||
{
|
||||
ObjectMeta: v1.ObjectMeta{Name: "some-name", Namespace: "some-ns"},
|
||||
Spec: cronjobv1.CronJobSpec{Schedule: "* * * * *"},
|
||||
Status: cronjobv1.CronJobStatus{LastScheduleTime: &v1.Time{Time: time.Now().Add(-3 * time.Minute)}},
|
||||
},
|
||||
},
|
||||
}, nil
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
timeout: time.Second,
|
||||
slackResponse: `{"ok": true}`,
|
||||
wantErr: false,
|
||||
wantOut: []string{"Checking some-ns/some-name since", "some-ns/some-name was not scheduled. Sending Slack notification."},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
ic := make(chan os.Signal, 1)
|
||||
if tt.timeout > 0 {
|
||||
timeout := tt.timeout
|
||||
fmt.Printf("Waiting %s before terminating\n", timeout.String())
|
||||
go func() {
|
||||
time.Sleep(timeout)
|
||||
fmt.Println("Done waiting, terminating")
|
||||
ic <- os.Interrupt
|
||||
}()
|
||||
}
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
_, _ = w.Write([]byte(tt.slackResponse))
|
||||
}))
|
||||
defer server.Close()
|
||||
baseURL := server.Listener.Addr().String()
|
||||
buff := &bytes.Buffer{}
|
||||
if err := doCheck(tt.args.client, fmt.Sprintf("http://%s", baseURL), ic, 10*time.Millisecond, buff); (err != nil) != tt.wantErr {
|
||||
t.Errorf("doCheck() error = %v, wantErr %v", err, tt.wantErr)
|
||||
}
|
||||
if len(tt.wantOut) > 0 {
|
||||
for _, o := range tt.wantOut {
|
||||
if !strings.Contains(buff.String(), o) {
|
||||
t.Errorf("doCheck() got %s, want %s", buff.String(), o)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestDefaultProvider_Provide(t *testing.T) {
|
||||
type fields struct {
|
||||
provider ConfigProvider
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
fields fields
|
||||
want Client
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "not in cluster",
|
||||
fields: fields{provider: &InClusterProvider{}},
|
||||
want: nil,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "dummy config",
|
||||
fields: fields{provider: &dummyProvider{}},
|
||||
want: &kubernetes.Clientset{
|
||||
DiscoveryClient: &discovery.DiscoveryClient{
|
||||
LegacyPrefix: "/api",
|
||||
},
|
||||
},
|
||||
wantErr: false,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
d := DefaultProvider{
|
||||
provider: tt.fields.provider,
|
||||
}
|
||||
got, err := d.Provide()
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("Provide() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
gotDump := litter.Sdump(got)
|
||||
wantDump := litter.Sdump(tt.want)
|
||||
if gotDump != wantDump {
|
||||
t.Errorf("Provide() got = %v, want %v", gotDump, wantDump)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
type dummyProvider struct{}
|
||||
|
||||
func (d dummyProvider) Provide() (*rest.Config, error) {
|
||||
return &rest.Config{}, nil
|
||||
}
|
||||
|
||||
var _ ConfigProvider = &dummyProvider{}
|
||||
|
||||
type brokenClientProvider struct{}
|
||||
|
||||
func (b brokenClientProvider) Provide() (Client, error) {
|
||||
return &brokenClient{}, nil
|
||||
}
|
||||
|
||||
var _ ClientProvider = &brokenClientProvider{}
|
||||
|
||||
type brokenClient struct {
|
||||
batchApi batchv1.BatchV1Interface
|
||||
}
|
||||
|
||||
func (b brokenClient) BatchV1() batchv1.BatchV1Interface {
|
||||
return b.batchApi
|
||||
}
|
||||
|
||||
var _ Client = &brokenClient{}
|
||||
|
||||
type batchApi struct {
|
||||
cronApi batchv1.CronJobInterface
|
||||
}
|
||||
|
||||
func (b batchApi) RESTClient() rest.Interface {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (b batchApi) CronJobs(namespace string) batchv1.CronJobInterface {
|
||||
return b.cronApi
|
||||
}
|
||||
|
||||
func (b batchApi) Jobs(namespace string) batchv1.JobInterface {
|
||||
//TODO implement me
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
var _ batchv1.BatchV1Interface = &batchApi{}
|
||||
|
||||
type cronApi struct {
|
||||
listFn func(ctx context.Context, opts v1.ListOptions) (*cronjobv1.CronJobList, error)
|
||||
}
|
||||
|
||||
func (c cronApi) List(ctx context.Context, opts v1.ListOptions) (*cronjobv1.CronJobList, error) {
|
||||
return c.listFn(ctx, opts)
|
||||
}
|
||||
|
||||
func (c cronApi) Create(ctx context.Context, cronJob *cronjobv1.CronJob, opts v1.CreateOptions) (*cronjobv1.CronJob, error) {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (c cronApi) Update(ctx context.Context, cronJob *cronjobv1.CronJob, opts v1.UpdateOptions) (*cronjobv1.CronJob, error) {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (c cronApi) UpdateStatus(ctx context.Context, cronJob *cronjobv1.CronJob, opts v1.UpdateOptions) (*cronjobv1.CronJob, error) {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (c cronApi) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (c cronApi) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (c cronApi) Get(ctx context.Context, name string, opts v1.GetOptions) (*cronjobv1.CronJob, error) {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (c cronApi) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (c cronApi) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *cronjobv1.CronJob, err error) {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (c cronApi) Apply(ctx context.Context, cronJob *applyv1.CronJobApplyConfiguration, opts v1.ApplyOptions) (result *cronjobv1.CronJob, err error) {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
func (c cronApi) ApplyStatus(ctx context.Context, cronJob *applyv1.CronJobApplyConfiguration, opts v1.ApplyOptions) (result *cronjobv1.CronJob, err error) {
|
||||
panic("implement me")
|
||||
}
|
||||
|
||||
var _ batchv1.CronJobInterface = &cronApi{}
|
||||
|
||||
func boolP(b bool) *bool {
|
||||
return &b
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends": [
|
||||
"config:recommended"
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user