diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0da3e115..2b98bca1 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -6,21 +6,17 @@ name: CI env: GOPROXY: https://proxy.golang.org - GOPATH: ${{ github.workspace }}/go jobs: verify-goimports: runs-on: ubuntu-latest steps: - name: Set up go - uses: actions/setup-go@v2 + uses: actions/setup-go@v5 with: go-version: '1.22' stable: true - - run: | - echo "GOPATH=${HOME}/go" >> $GITHUB_ENV - - uses: actions/checkout@v2 - name: verify goimports @@ -37,14 +33,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Set up go - uses: actions/setup-go@v2 + uses: actions/setup-go@v5 with: go-version: '1.22' stable: true - - run: | - echo "GOPATH=${HOME}/go" >> $GITHUB_ENV - - uses: actions/checkout@v2 - run: dev/format-gomod @@ -52,7 +45,9 @@ jobs: - run: | changes=$(git status --porcelain) if [[ -n "${changes}" ]]; then - echo "::error Changes detected from go mod tidy:" + echo "::error Changes detected from dev/format-gomod:" + echo "::error (You may need to run go clean -cache -modcache)" + git diff | head -n60 echo "${changes}" exit 1 fi @@ -62,15 +57,15 @@ jobs: runs-on: [ubuntu-latest] steps: - uses: actions/checkout@v1 - - uses: actions/setup-go@v1 + - uses: actions/setup-go@v5 with: go-version: '1.22' - name: Install latest version of Kind run: | - GO111MODULE=on go get sigs.k8s.io/kind + go get sigs.k8s.io/kind - name: Create Kind cluster run: | - PATH=$(go env GOPATH)/bin:$PATH kind create cluster --config .github/workflows/kind-config.yaml + kind create cluster --config .github/workflows/kind-config.yaml - name: Run some sanity checks # kubectl is already installed on the Github Ubuntu worker run: | diff --git a/applylib/go.mod b/applylib/go.mod index c8d043a3..f6c04403 100644 --- a/applylib/go.mod +++ b/applylib/go.mod @@ -23,6 +23,7 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/evanphx/json-patch v5.6.0+incompatible // indirect github.com/evanphx/json-patch/v5 v5.8.0 // indirect github.com/go-logr/logr v1.4.1 // indirect github.com/go-openapi/jsonpointer v0.19.6 // indirect @@ -35,7 +36,7 @@ require ( github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect - github.com/imdario/mergo v0.3.12 // indirect + github.com/imdario/mergo v0.3.15 // 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 diff --git a/applylib/go.sum b/applylib/go.sum index ff01fa54..abc147e1 100644 --- a/applylib/go.sum +++ b/applylib/go.sum @@ -50,8 +50,7 @@ github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxER github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= -github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= github.com/evanphx/json-patch/v5 v5.8.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -168,8 +167,7 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T 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/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -440,7 +438,6 @@ 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.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/dev/format-gomod b/dev/format-gomod index 187ee457..5d5cccc6 100755 --- a/dev/format-gomod +++ b/dev/format-gomod @@ -15,7 +15,7 @@ # limitations under the License. -# CI script to run all the test commands +# CI script to keep all our go.mod/go.sum updated set -o errexit set -o nounset @@ -25,10 +25,14 @@ set -o pipefail REPO_ROOT=$(git rev-parse --show-toplevel) cd "${REPO_ROOT}" -# Run go mod tidy in each go module -for module in $(find . -name "go.mod"); do - dir="$(dirname ${module})" - pushd "${dir}" - go mod tidy - popd -done +# Print the go version +go version + +# Updates the go.mod in each go module +# Note: go work sync is not entirely deterministic; I had to clear my modcache with `go clean -cache -modcache` +go work sync + +# Pin mockkubeapiserver an older version of kube, so mockkubeapiserver can be used from repos that aren't on the latest kube +cd ${REPO_ROOT}/mockkubeapiserver +go get k8s.io/client-go@v0.26.2 +go get k8s.io/apimachinery@v0.26.2 diff --git a/dev/update-golden b/dev/update-golden index 2daf31bd..04099ce7 100755 --- a/dev/update-golden +++ b/dev/update-golden @@ -19,4 +19,7 @@ chmod +x bin/kubectl export PATH="${REPO_ROOT}/bin:$PATH" echo "kubectl version is $(kubectl version --client)" -WRITE_GOLDEN_OUTPUT=1 go test -count=1 -v ./... \ No newline at end of file +WRITE_GOLDEN_OUTPUT=1 go test -count=1 -v ./... + +cd "${REPO_ROOT}/mockkubeapiserver" +WRITE_GOLDEN_OUTPUT=1 go test -count=1 -v ./... diff --git a/examples/guestbook-operator/controllers/guestbook_controller_test.go b/examples/guestbook-operator/controllers/guestbook_controller_test.go index 959abf64..7ca1eb15 100644 --- a/examples/guestbook-operator/controllers/guestbook_controller_test.go +++ b/examples/guestbook-operator/controllers/guestbook_controller_test.go @@ -20,7 +20,6 @@ import ( "testing" api "sigs.k8s.io/kubebuilder-declarative-pattern/examples/guestbook-operator/api/v1alpha1" - "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/test/golden" ) diff --git a/go.work b/go.work new file mode 100644 index 00000000..7ca7a6ca --- /dev/null +++ b/go.work @@ -0,0 +1,9 @@ +go 1.22.4 + +use ( + . + ./applylib + ./examples/guestbook-operator + ./ktest + ./mockkubeapiserver +) diff --git a/go.work.sum b/go.work.sum new file mode 100644 index 00000000..a76eadf1 --- /dev/null +++ b/go.work.sum @@ -0,0 +1,354 @@ +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= +cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= +cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= +cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= +cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= +cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= +cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= +cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= +cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= +cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= +cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= +cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= +cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= +cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= +cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= +cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= +cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= +cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= +cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.21.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= +cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= +cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= +cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= +cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= +cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= +cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= +cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= +cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= +cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= +cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= +cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= +cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= +cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= +cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= +cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= +cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= +cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= +cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= +cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= +cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= +cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= +cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= +cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= +cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= +cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= +cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= +cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= +cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= +cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= +cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= +cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= +cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= +cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= +cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= +cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= +cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= +cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= +cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= +cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= +cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= +cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= +cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= +cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= +cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= +cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= +cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= +cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= +cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= +cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= +cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= +cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= +cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= +cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= +cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= +cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= +cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= +cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= +cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= +cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= +cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= +cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= +cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= +cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= +github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/blang/semver v3.5.0+incompatible h1:CGxCgetQ64DKk7rdZ++Vfnb1+ogGNnB17OJKJXD2Cfs= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/daviddengcn/go-colortext v1.0.0/go.mod h1:zDqEI5NVUop5QPpVJUxE9UO10hRnmkD5G4Pmri9+m4c= +github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= +github.com/envoyproxy/go-control-plane v0.11.1/go.mod h1:uhMcXKCQMEJHiAb0w+YGefQLaTEw+YhGluxZkrTmD0g= +github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/cel-go v0.17.7/go.mod h1:HXZKzB0LXqer5lHHgfWAnlYwJaQBDKMjxjulNQzhwhY= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o= +github.com/onsi/gomega v1.29.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +github.com/spyzhov/ajson v0.4.2/go.mod h1:63V+CGM6f1Bu/p4nLIN8885ojBdt88TbLoSFzyqMuVA= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75/go.mod h1:KO6IkyS8Y3j8OdNO85qEYBsRPuteD+YciPomcXdrMnk= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +go.etcd.io/etcd/api/v3 v3.5.10/go.mod h1:TidfmT4Uycad3NM/o25fG3J07odo4GBB9hoxaodFCtI= +go.etcd.io/etcd/client/pkg/v3 v3.5.10/go.mod h1:DYivfIviIuQ8+/lCq4vcxuseg2P2XbHygkKwFo9fc8U= +go.etcd.io/etcd/client/v2 v2.305.10/go.mod h1:m3CKZi69HzilhVqtPDcjhSGp+kA1OmbNn0qamH80xjA= +go.etcd.io/etcd/client/v3 v3.5.10/go.mod h1:RVeBnDz2PUEZqTpgqwAtUd8nAPf5kjyFyND7P1VkOKc= +go.etcd.io/etcd/pkg/v3 v3.5.10/go.mod h1:TKTuCKKcF1zxmfKWDkfz5qqYaE3JncKKZPFf8c1nFUs= +go.etcd.io/etcd/raft/v3 v3.5.10/go.mod h1:odD6kr8XQXTy9oQnyMPBOr0TVe+gT0neQhElQ6jbGRc= +go.etcd.io/etcd/server/v3 v3.5.10/go.mod h1:gBplPHfs6YI0L+RpGkTQO7buDbHv5HJGG/Bst0/zIPo= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0/go.mod h1:5z+/ZWJQKXa9YT34fQNx5K8Hd1EoIhvtUygUQPqEOgQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= +go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.3.1-0.20221206200815-1e63c2f08a10/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.57.0/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.29.0/go.mod h1:sdVmXoz2Bo/cb77Pxi71IPTSErEW32xa4aXwKH7gfBA= +k8s.io/apimachinery v0.26.0/go.mod h1:tnPmbONNJ7ByJNz9+n9kMjNP8ON+1qoAIIC70lztu74= +k8s.io/apimachinery v0.29.0/go.mod h1:eVBxQ/cwiJxH58eK/jd/vAk4mrxmVlnpBH5J2GbMeis= +k8s.io/apiserver v0.29.0/go.mod h1:31n78PsRKPmfpee7/l9NYEv67u6hOL6AfcE761HapDM= +k8s.io/client-go v0.29.0/go.mod h1:yLkXH4HKMAywcrD82KMSmfYg2DlE8mepPR4JGSo5n38= +k8s.io/code-generator v0.29.0/go.mod h1:5bqIZoCxs2zTRKMWNYqyQWW/bajc+ah4rh0tMY8zdGA= +k8s.io/component-base v0.29.0/go.mod h1:sADonFTQ9Zc9yFLghpDpmNXEdHyQmFIGbiuZbqAXQ1M= +k8s.io/component-helpers v0.29.1/go.mod h1:+I7xz4kfUgxWAPJIVKrqe4ml4rb9UGpazlOmhXYo+cY= +k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= +k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kms v0.29.0/go.mod h1:mB0f9HLxRXeXUfHfn1A7rpwOlzXI1gIWu86z6buNoYA= +k8s.io/metrics v0.29.1/go.mod h1:JrbV2U71+v7d/9qb90UVKL8r0uJ6Z2Hy4V7mDm05cKs= +k8s.io/utils v0.0.0-20221107191617-1a15be271d1d/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.28.0/go.mod h1:VHVDI/KrK4fjnV61bE2g3sA7tiETLn8sooImelsCx3Y= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/kustomize/kustomize/v5 v5.0.4-0.20230601165947-6ce0bf390ce3/go.mod h1:/d88dHCvoy7d0AKFT0yytezSGZKjsZBVs9YTkBHSGFk= +sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca h1:6dsH6AYQWbyZmtttJNe8Gq1cXOeS1BdV3eW37zHilAQ= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/hack/ci/test.sh b/hack/ci/test.sh index 39017b9c..7d489024 100755 --- a/hack/ci/test.sh +++ b/hack/ci/test.sh @@ -37,11 +37,4 @@ chmod +x bin/kubectl export PATH="${REPO_ROOT}/bin:$PATH" echo "kubectl version is $(kubectl version --client)" -# Run with a go workspace -rm -f go.work go.work.sum -go work init . -go work use applylib -go work use mockkubeapiserver -go work use examples/guestbook-operator - dev/test diff --git a/ktest/go.mod b/ktest/go.mod new file mode 100644 index 00000000..0289757b --- /dev/null +++ b/ktest/go.mod @@ -0,0 +1,30 @@ +module sigs.k8s.io/kubebuilder-declarative-pattern/ktest + +go 1.21 + +toolchain go1.22.0 + +require ( + github.com/google/go-cmp v0.6.0 + k8s.io/apimachinery v0.29.1 + k8s.io/klog/v2 v2.110.1 + sigs.k8s.io/yaml v1.4.0 +) + +require ( + github.com/go-logr/logr v1.4.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + golang.org/x/net v0.19.0 // indirect + golang.org/x/text v0.14.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect +) diff --git a/ktest/go.sum b/ktest/go.sum new file mode 100644 index 00000000..4f5c8885 --- /dev/null +++ b/ktest/go.sum @@ -0,0 +1,94 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +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/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +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/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +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 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +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/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +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-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +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/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +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/apimachinery v0.29.1 h1:KY4/E6km/wLBguvCZv8cKTeOwwOBqFNjwJIdMkMbbRc= +k8s.io/apimachinery v0.29.1/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU= +k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= +k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/pkg/test/httprecorder/http_recorder.go b/ktest/httprecorder/http_recorder.go similarity index 96% rename from pkg/test/httprecorder/http_recorder.go rename to ktest/httprecorder/http_recorder.go index c9947b84..cc68db7a 100644 --- a/pkg/test/httprecorder/http_recorder.go +++ b/ktest/httprecorder/http_recorder.go @@ -29,7 +29,7 @@ func (m *HTTPRecorder) RoundTrip(request *http.Request) (*http.Response, error) if request.Body != nil { requestBody, err := io.ReadAll(request.Body) if err != nil { - panic("failed to read request body") + return nil, fmt.Errorf("HTTPRecorder failed to read request body") } entry.Request.Body = string(requestBody) request.Body = io.NopCloser(bytes.NewReader(requestBody)) diff --git a/pkg/test/httprecorder/request_log.go b/ktest/httprecorder/request_log.go similarity index 78% rename from pkg/test/httprecorder/request_log.go rename to ktest/httprecorder/request_log.go index 01df2dcc..ac08b939 100644 --- a/pkg/test/httprecorder/request_log.go +++ b/ktest/httprecorder/request_log.go @@ -3,12 +3,14 @@ package httprecorder import ( "encoding/json" "fmt" + "io" "net/http" "net/url" "regexp" "sort" "strings" "sync" + "testing" "time" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -36,16 +38,17 @@ type Response struct { Body string `json:"body,omitempty"` } -func (e *LogEntry) FormatHTTP() string { +func (e *LogEntry) FormatHTTP(pretty bool) string { var b strings.Builder - b.WriteString(e.Request.FormatHTTP()) - b.WriteString(e.Response.FormatHTTP()) + b.WriteString(e.Request.FormatHTTP(pretty)) + b.WriteString("\n") + b.WriteString(e.Response.FormatHTTP(pretty)) return b.String() } -func (r *Request) FormatHTTP() string { - var b strings.Builder - b.WriteString(fmt.Sprintf("%s %s\n", r.Method, r.URL)) +func (r *Request) FormatHTTP(pretty bool) string { + var w strings.Builder + w.WriteString(fmt.Sprintf("%s %s\n", r.Method, r.URL)) var keys []string for k := range r.Header { keys = append(keys, k) @@ -53,15 +56,31 @@ func (r *Request) FormatHTTP() string { sort.Strings(keys) for _, k := range keys { for _, v := range r.Header[k] { - b.WriteString(fmt.Sprintf("%s: %s\n", k, v)) + w.WriteString(fmt.Sprintf("%s: %s\n", k, v)) } } - b.WriteString("\n") - if r.Body != "" { - b.WriteString(r.Body) - b.WriteString("\n\n") + w.WriteString("\n") + writeBody(&w, r.Body, pretty) + return w.String() +} + +func writeBody(w io.StringWriter, body string, pretty bool) { + if body == "" { + return } - return b.String() + + if pretty { + var obj interface{} + if err := json.Unmarshal([]byte(body), &obj); err == nil { + b, err := json.MarshalIndent(obj, "", " ") + if err == nil { + body = string(b) + } + } + } + + w.WriteString(body) + w.WriteString("\n") } func (l *RequestLog) ReplaceTimestamp() { @@ -101,7 +120,12 @@ func resetTimestamp(body string) string { return string(b) } -func (r *Response) FormatHTTP() string { +func (r *Response) FormatHTTP(pretty bool) string { + // Skip empty responses (e.g. from streaming watch) + if r.Status == "" && r.StatusCode == 0 && r.Body == "" { + return "" + } + var b strings.Builder b.WriteString(fmt.Sprintf("%s\n", r.Status)) var keys []string @@ -115,10 +139,7 @@ func (r *Response) FormatHTTP() string { } } b.WriteString("\n") - if r.Body != "" { - b.WriteString(r.Body) - b.WriteString("\n") - } + writeBody(&b, r.Body, pretty) return b.String() } @@ -136,13 +157,13 @@ func (l *RequestLog) AddEntry(entry *LogEntry) { l.entries = append(l.entries, entry) } -func (l *RequestLog) FormatHTTP() string { +func (l *RequestLog) FormatHTTP(pretty bool) string { l.mutex.Lock() defer l.mutex.Unlock() var actual []string for _, entry := range l.entries { - s := entry.FormatHTTP() + s := entry.FormatHTTP(pretty) actual = append(actual, s) } return strings.Join(actual, "\n---\n\n") @@ -222,17 +243,19 @@ func (l *RequestLog) RemoveUserAgent() { l.RemoveHeader("user-agent") } -func (l *RequestLog) RegexReplaceURL(find string, replace string) { +func (l *RequestLog) RegexReplaceURL(t *testing.T, find string, replace string) { l.mutex.Lock() defer l.mutex.Unlock() + r, err := regexp.Compile(find) + if err != nil { + t.Fatalf("failed to compile regex %q: %v", find, err) + } + for i := range l.entries { request := &l.entries[i].Request u := request.URL - r, err := regexp.Compile(find) - if err != nil { - klog.Fatalf("failed to compile regex %q: %v", find, err) - } + u = r.ReplaceAllString(u, replace) request.URL = u } diff --git a/pkg/test/testharness/golden.go b/ktest/testharness/golden.go similarity index 100% rename from pkg/test/testharness/golden.go rename to ktest/testharness/golden.go diff --git a/pkg/test/testharness/harness.go b/ktest/testharness/harness.go similarity index 100% rename from pkg/test/testharness/harness.go rename to ktest/testharness/harness.go diff --git a/ktest/testharness/manifest.go b/ktest/testharness/manifest.go new file mode 100644 index 00000000..06734e5f --- /dev/null +++ b/ktest/testharness/manifest.go @@ -0,0 +1,52 @@ +/* +Copyright 2024 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package testharness + +import ( + "bufio" + "context" + "fmt" + "io" + "strings" + + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + k8syaml "k8s.io/apimachinery/pkg/util/yaml" +) + +func ParseObjects(ctx context.Context, manifest string) ([]*unstructured.Unstructured, error) { + var objects []*unstructured.Unstructured + reader := k8syaml.NewYAMLReader(bufio.NewReader(strings.NewReader(manifest))) + for { + raw, err := reader.Read() + if err != nil { + if err == io.EOF { + return objects, nil + } + + return nil, fmt.Errorf("reading YAML doc: %w", err) + } + + u := &unstructured.Unstructured{} + if err := k8syaml.Unmarshal(raw, &u); err != nil { + return nil, fmt.Errorf("parsing object to unstructured: %w", err) + } + + objects = append(objects, u) + } + + return objects, nil +} diff --git a/mockkubeapiserver/go.mod b/mockkubeapiserver/go.mod index db7f5c08..9cac77ba 100644 --- a/mockkubeapiserver/go.mod +++ b/mockkubeapiserver/go.mod @@ -7,24 +7,46 @@ toolchain go1.22.0 require ( github.com/google/go-cmp v0.6.0 k8s.io/apimachinery v0.26.2 + k8s.io/client-go v0.26.2 k8s.io/klog/v2 v2.110.1 + sigs.k8s.io/controller-runtime v0.14.6 sigs.k8s.io/structured-merge-diff/v4 v4.4.1 - sigs.k8s.io/yaml v1.3.0 + sigs.k8s.io/yaml v1.4.0 ) require ( - github.com/go-logr/logr v1.3.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/evanphx/json-patch v5.6.0+incompatible // indirect + github.com/go-logr/logr v1.4.1 // indirect + github.com/go-openapi/jsonpointer v0.19.6 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/gnostic-models v0.6.8 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.3.0 // indirect + github.com/imdario/mergo v0.3.15 // 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.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect golang.org/x/net v0.19.0 // indirect + golang.org/x/oauth2 v0.12.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/term v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + golang.org/x/time v0.3.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/protobuf v1.31.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/api v0.26.2 // indirect + k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 // indirect k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect ) diff --git a/mockkubeapiserver/go.sum b/mockkubeapiserver/go.sum index 63ec98d2..148718c5 100644 --- a/mockkubeapiserver/go.sum +++ b/mockkubeapiserver/go.sum @@ -1,72 +1,141 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 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/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= +github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= +github.com/evanphx/json-patch/v5 v5.8.0 h1:lRj6N9Nci7MvzrXuX6HFzU8XjmhPiXPlsKEy1u0KQro= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +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 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= +github.com/imdario/mergo v0.3.15/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +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/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 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 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +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.6.0 h1:9t9b9vRUbFq3C4qKFCGkVuq/fIHji802N1nrtkh1mNc= +github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4= +github.com/onsi/ginkgo/v2 v2.14.0 h1:vSmGj2Z5YPb9JwCWT6z6ihcUvDhuXLc3sJiqd3jMKAY= +github.com/onsi/gomega v1.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E= +github.com/onsi/gomega v1.29.0 h1:KIA/t2t5UBzoirT4H9tsML45GEbo3ouUnBHsCfD2tVg= +github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 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/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= 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/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/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +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 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 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= @@ -75,17 +144,34 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +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.26.2 h1:dM3cinp3PGB6asOySalOZxEG4CZ0IAdJsrYZXE/ovGQ= +k8s.io/api v0.26.2/go.mod h1:1kjMQsFE+QHPfskEcVNgL3+Hp88B80uj0QtSOlj8itU= +k8s.io/api v0.29.1 h1:DAjwWX/9YT7NQD4INu49ROJuZAAAP/Ijki48GUPzxqw= +k8s.io/api v0.29.1/go.mod h1:7Kl10vBRUXhnQQI8YR/R327zXC8eJ7887/+Ybta+RoQ= +k8s.io/apiextensions-apiserver v0.26.1 h1:cB8h1SRk6e/+i3NOrQgSFij1B2S0Y0wDoNl66bn8RMI= +k8s.io/apiextensions-apiserver v0.29.0 h1:0VuspFG7Hj+SxyF/Z/2T0uFbI5gb5LRgEyUVE3Q4lV0= k8s.io/apimachinery v0.26.2 h1:da1u3D5wfR5u2RpLhE/ZtZS2P7QvDgLZTi9wrNZl/tQ= k8s.io/apimachinery v0.26.2/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= +k8s.io/apimachinery v0.29.1 h1:KY4/E6km/wLBguvCZv8cKTeOwwOBqFNjwJIdMkMbbRc= +k8s.io/apimachinery v0.29.1/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU= +k8s.io/client-go v0.26.2 h1:s1WkVujHX3kTp4Zn4yGNFK+dlDXy1bAAkIl+cFAiuYI= +k8s.io/client-go v0.26.2/go.mod h1:u5EjOuSyBa09yqqyY7m3abZeovO/7D/WehVVlZ2qcqU= +k8s.io/client-go v0.29.1 h1:19B/+2NGEwnFLzt0uB5kNJnfTsbV8w6TgQRz9l7ti7A= k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00 h1:aVUu9fTY98ivBPKR9Y5w/AuzbMm96cd3YHRTU83I780= +k8s.io/kube-openapi v0.0.0-20231010175941-2dd684a91f00/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/controller-runtime v0.14.6 h1:oxstGVvXGNnMvY7TAESYk+lzr6S3V5VFxQ6d92KcwQA= +sigs.k8s.io/controller-runtime v0.14.6/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0= +sigs.k8s.io/controller-runtime v0.17.2 h1:FwHwD1CTUemg0pW2otk7/U5/i5m2ymzvOXdbeGOUvw0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/mockkubeapiserver/patchresource.go b/mockkubeapiserver/patchresource.go index 8853302d..467c760f 100644 --- a/mockkubeapiserver/patchresource.go +++ b/mockkubeapiserver/patchresource.go @@ -85,6 +85,10 @@ func (req *patchResource) Run(ctx context.Context, s *MockKubeAPIServer) error { patched.SetGeneration(1) } + if err := beforeObjectCreation(ctx, patched); err != nil { + return err + } + if err := resource.CreateObject(ctx, id, patched); err != nil { return err } @@ -130,6 +134,10 @@ func (req *patchResource) Run(ctx context.Context, s *MockKubeAPIServer) error { klog.Infof("skipping write, object not changed") return req.writeResponse(existingObj) } else { + if err := beforeObjectCreation(ctx, updated); err != nil { + return err + } + if resource.SetsGeneration() { specIsSame := reflect.DeepEqual(existingObj.Object["spec"], updated.Object["spec"]) if !specIsSame { diff --git a/mockkubeapiserver/postresource.go b/mockkubeapiserver/postresource.go index 1b2ddda5..a531dfe7 100644 --- a/mockkubeapiserver/postresource.go +++ b/mockkubeapiserver/postresource.go @@ -18,6 +18,7 @@ package mockkubeapiserver import ( "context" + "encoding/base64" "fmt" "io" "net/http" @@ -73,8 +74,55 @@ func (req *postResource) Run(ctx context.Context, s *MockKubeAPIServer) error { obj.SetGeneration(1) } + if err := beforeObjectCreation(ctx, obj); err != nil { + return err + } + if err := resource.CreateObject(ctx, id, obj); err != nil { return err } return req.writeResponse(obj) } + +var secretGVK = schema.GroupVersionKind{ + Group: "", + Version: "v1", + Kind: "Secret", +} + +func beforeObjectCreation(ctx context.Context, obj *unstructured.Unstructured) error { + gvk := obj.GroupVersionKind() + if gvk == secretGVK { + return beforeSecretCreation(ctx, obj) + } + return nil +} + +func beforeSecretCreation(ctx context.Context, obj *unstructured.Unstructured) error { + // If there is any stringData, merge it into data + stringData, _, err := unstructured.NestedStringMap(obj.Object, "stringData") + if err != nil { + return fmt.Errorf("getting Secret stringData: %w", err) + } + if len(stringData) == 0 { + return nil + } + + // Get a copy of data + data, _, err := unstructured.NestedStringMap(obj.Object, "data") + if err != nil { + return fmt.Errorf("getting Secret data: %w", err) + } + if data == nil { + data = make(map[string]string) + } + for k, v := range stringData { + data[k] = base64.StdEncoding.EncodeToString([]byte(v)) + } + if err := unstructured.SetNestedStringMap(obj.Object, data, "data"); err != nil { + return fmt.Errorf("setting Secret data: %w", err) + } + unstructured.RemoveNestedField(obj.Object, "stringData") + + return nil +} diff --git a/mockkubeapiserver/putresource.go b/mockkubeapiserver/putresource.go index b5ad6404..9db449f3 100644 --- a/mockkubeapiserver/putresource.go +++ b/mockkubeapiserver/putresource.go @@ -98,6 +98,10 @@ func (req *putResource) Run(ctx context.Context, s *MockKubeAPIServer) error { } } + if err := beforeObjectCreation(ctx, updated); err != nil { + return err + } + if err := resource.UpdateObject(ctx, id, updated); err != nil { return err } diff --git a/mockkubeapiserver/storage/hook.go b/mockkubeapiserver/storage/hook.go index 8e85bbb1..c0ea766e 100644 --- a/mockkubeapiserver/storage/hook.go +++ b/mockkubeapiserver/storage/hook.go @@ -2,5 +2,6 @@ package storage // A Hook implements a lightweight watch on all objects, intended for use to mock controller behaviour. type Hook interface { + // OnWatchEvent is called whenever a watch event is created OnWatchEvent(ev *WatchEvent) } diff --git a/mockkubeapiserver/tests/kubeapiserver_test.go b/mockkubeapiserver/tests/kubeapiserver_test.go new file mode 100644 index 00000000..a49934cc --- /dev/null +++ b/mockkubeapiserver/tests/kubeapiserver_test.go @@ -0,0 +1,94 @@ +package applier + +import ( + "context" + "net/http" + "path/filepath" + "testing" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/rest" + "k8s.io/klog/v2" + "sigs.k8s.io/controller-runtime/pkg/client/apiutil" + "sigs.k8s.io/kubebuilder-declarative-pattern/ktest/httprecorder" + "sigs.k8s.io/kubebuilder-declarative-pattern/ktest/testharness" + "sigs.k8s.io/kubebuilder-declarative-pattern/mockkubeapiserver" +) + +func TestGoldenTests(t *testing.T) { + testharness.RunGoldenTests(t, "testdata", func(h *testharness.Harness, testdir string) { + ctx := context.Background() + + k8s, err := mockkubeapiserver.NewMockKubeAPIServer(":0") + if err != nil { + t.Fatalf("error building mock kube-apiserver: %v", err) + } + defer func() { + if err := k8s.Stop(); err != nil { + t.Fatalf("error closing mock kube-apiserver: %v", err) + } + }() + + addr, err := k8s.StartServing() + if err != nil { + t.Errorf("error starting mock kube-apiserver: %v", err) + } + + klog.Infof("mock kubeapiserver will listen on %v", addr) + + var requestLog httprecorder.RequestLog + wrapTransport := func(rt http.RoundTripper) http.RoundTripper { + return httprecorder.NewRecorder(rt, &requestLog) + } + restConfig := &rest.Config{ + Host: addr.String(), + WrapTransport: wrapTransport, + } + + httpClient, err := rest.HTTPClientFor(restConfig) + if err != nil { + t.Fatalf("error from rest.HTTPClientFor: %v", err) + } + + p := filepath.Join(testdir, "manifest.yaml") + manifestYAML := string(h.MustReadFile(p)) + objects, err := testharness.ParseObjects(ctx, manifestYAML) + if err != nil { + t.Errorf("error parsing manifest %q: %v", p, err) + } + + restMapper, err := apiutil.NewDynamicRESTMapper(restConfig, httpClient) + if err != nil { + t.Fatalf("error from apiutil.NewDynamicRESTMapper: %v", err) + } + + dynamicClient, err := dynamic.NewForConfigAndClient(restConfig, httpClient) + if err != nil { + t.Fatalf("building dynamic client: %v", err) + } + for _, obj := range objects { + gvk := obj.GroupVersionKind() + restMapping, err := restMapper.RESTMapping(gvk.GroupKind(), gvk.Version) + if err != nil { + t.Errorf("error getting restmapping for %v: %v", gvk, err) + } + + var applyOptions metav1.ApplyOptions + applyOptions.FieldManager = "test" + resource := dynamicClient.Resource(restMapping.Resource).Namespace(obj.GetNamespace()) + + if _, err := resource.Apply(ctx, obj.GetName(), obj, applyOptions); err != nil { + t.Fatalf("error applying resource %v: %v", gvk, err) + } + } + + t.Logf("replacing old url prefix %q", "http://"+restConfig.Host) + requestLog.ReplaceURLPrefix("http://"+restConfig.Host, "http://kube-apiserver") + requestLog.RemoveUserAgent() + requestLog.SortGETs() + + requests := requestLog.FormatHTTP(true) + h.CompareGoldenFile(filepath.Join(testdir, "expected.yaml"), requests) + }) +} diff --git a/mockkubeapiserver/tests/testdata/configmap/expected.yaml b/mockkubeapiserver/tests/testdata/configmap/expected.yaml new file mode 100644 index 00000000..044a215a --- /dev/null +++ b/mockkubeapiserver/tests/testdata/configmap/expected.yaml @@ -0,0 +1,226 @@ +GET http://kube-apiserver/api/v1 +Accept: application/json, */* + + +200 OK +Cache-Control: no-cache, private +Content-Length: 1820 +Content-Type: application/json +Date: (removed) + +{ + "apiVersion": "v1", + "groupVersion": "v1", + "kind": "APIResourceList", + "resources": [ + { + "kind": "ComponentStatus", + "name": "componentstatuses", + "namespaced": false, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "ConfigMap", + "name": "configmaps", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "Endpoints", + "name": "endpoints", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "Event", + "name": "events", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "LimitRange", + "name": "limitranges", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "Namespace", + "name": "namespaces", + "namespaced": false, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "Node", + "name": "nodes", + "namespaced": false, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "PersistentVolume", + "name": "persistentvolumes", + "namespaced": false, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "PersistentVolumeClaim", + "name": "persistentvolumeclaims", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "Pod", + "name": "pods", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "PodTemplate", + "name": "podtemplates", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "ReplicationController", + "name": "replicationcontrollers", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "ResourceQuota", + "name": "resourcequotas", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "Secret", + "name": "secrets", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "Service", + "name": "services", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "ServiceAccount", + "name": "serviceaccounts", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + } + ] +} + +--- + +PATCH http://kube-apiserver/api/v1/namespaces/default?fieldManager=test&force=false +Accept: application/json +Content-Type: application/apply-patch+yaml + +{ + "apiVersion": "v1", + "kind": "Namespace", + "metadata": { + "name": "default" + } +} + +200 OK +Cache-Control: no-cache, private +Content-Length: 294 +Content-Type: application/json +Date: (removed) + +{ + "apiVersion": "v1", + "kind": "Namespace", + "metadata": { + "creationTimestamp": "2022-01-01T00:00:00Z", + "labels": { + "kubernetes.io/metadata.name": "default" + }, + "name": "default", + "resourceVersion": "1", + "uid": "00000000-0000-0000-0000-000000000001" + }, + "spec": { + "finalizers": [ + "kubernetes" + ] + }, + "status": { + "phase": "Active" + } +} + +--- + +PATCH http://kube-apiserver/api/v1/namespaces/default/configmaps/config?fieldManager=test&force=false +Accept: application/json +Content-Type: application/apply-patch+yaml + +{ + "apiVersion": "v1", + "data": { + "foo": "bar" + }, + "kind": "ConfigMap", + "metadata": { + "name": "config", + "namespace": "default" + } +} + +200 OK +Cache-Control: no-cache, private +Content-Length: 220 +Content-Type: application/json +Date: (removed) + +{ + "apiVersion": "v1", + "data": { + "foo": "bar" + }, + "kind": "ConfigMap", + "metadata": { + "creationTimestamp": "2022-01-01T00:00:01Z", + "name": "config", + "namespace": "default", + "resourceVersion": "2", + "uid": "00000000-0000-0000-0000-000000000002" + } +} diff --git a/mockkubeapiserver/tests/testdata/configmap/manifest.yaml b/mockkubeapiserver/tests/testdata/configmap/manifest.yaml new file mode 100644 index 00000000..adad3779 --- /dev/null +++ b/mockkubeapiserver/tests/testdata/configmap/manifest.yaml @@ -0,0 +1,14 @@ +kind: Namespace +apiVersion: v1 +metadata: + name: default + +--- + +kind: ConfigMap +apiVersion: v1 +metadata: + name: config + namespace: default +data: + foo: bar diff --git a/mockkubeapiserver/tests/testdata/secrets_stringdata/expected.yaml b/mockkubeapiserver/tests/testdata/secrets_stringdata/expected.yaml new file mode 100644 index 00000000..27b3d5c1 --- /dev/null +++ b/mockkubeapiserver/tests/testdata/secrets_stringdata/expected.yaml @@ -0,0 +1,230 @@ +GET http://kube-apiserver/api/v1 +Accept: application/json, */* + + +200 OK +Cache-Control: no-cache, private +Content-Length: 1820 +Content-Type: application/json +Date: (removed) + +{ + "apiVersion": "v1", + "groupVersion": "v1", + "kind": "APIResourceList", + "resources": [ + { + "kind": "ComponentStatus", + "name": "componentstatuses", + "namespaced": false, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "ConfigMap", + "name": "configmaps", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "Endpoints", + "name": "endpoints", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "Event", + "name": "events", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "LimitRange", + "name": "limitranges", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "Namespace", + "name": "namespaces", + "namespaced": false, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "Node", + "name": "nodes", + "namespaced": false, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "PersistentVolume", + "name": "persistentvolumes", + "namespaced": false, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "PersistentVolumeClaim", + "name": "persistentvolumeclaims", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "Pod", + "name": "pods", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "PodTemplate", + "name": "podtemplates", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "ReplicationController", + "name": "replicationcontrollers", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "ResourceQuota", + "name": "resourcequotas", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "Secret", + "name": "secrets", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "Service", + "name": "services", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + }, + { + "kind": "ServiceAccount", + "name": "serviceaccounts", + "namespaced": true, + "singularName": "", + "verbs": null, + "version": "v1" + } + ] +} + +--- + +PATCH http://kube-apiserver/api/v1/namespaces/default?fieldManager=test&force=false +Accept: application/json +Content-Type: application/apply-patch+yaml + +{ + "apiVersion": "v1", + "kind": "Namespace", + "metadata": { + "name": "default" + } +} + +200 OK +Cache-Control: no-cache, private +Content-Length: 294 +Content-Type: application/json +Date: (removed) + +{ + "apiVersion": "v1", + "kind": "Namespace", + "metadata": { + "creationTimestamp": "2022-01-01T00:00:00Z", + "labels": { + "kubernetes.io/metadata.name": "default" + }, + "name": "default", + "resourceVersion": "1", + "uid": "00000000-0000-0000-0000-000000000001" + }, + "spec": { + "finalizers": [ + "kubernetes" + ] + }, + "status": { + "phase": "Active" + } +} + +--- + +PATCH http://kube-apiserver/api/v1/namespaces/default/secrets/secret?fieldManager=test&force=false +Accept: application/json +Content-Type: application/apply-patch+yaml + +{ + "apiVersion": "v1", + "kind": "Secret", + "metadata": { + "name": "secret", + "namespace": "default" + }, + "stringData": { + "foo": "bar", + "foo2": "bar2" + }, + "type": "Opaque" +} + +200 OK +Cache-Control: no-cache, private +Content-Length: 252 +Content-Type: application/json +Date: (removed) + +{ + "apiVersion": "v1", + "data": { + "foo": "YmFy", + "foo2": "YmFyMg==" + }, + "kind": "Secret", + "metadata": { + "creationTimestamp": "2022-01-01T00:00:01Z", + "name": "secret", + "namespace": "default", + "resourceVersion": "2", + "uid": "00000000-0000-0000-0000-000000000002" + }, + "type": "Opaque" +} diff --git a/mockkubeapiserver/tests/testdata/secrets_stringdata/manifest.yaml b/mockkubeapiserver/tests/testdata/secrets_stringdata/manifest.yaml new file mode 100644 index 00000000..1836f7ed --- /dev/null +++ b/mockkubeapiserver/tests/testdata/secrets_stringdata/manifest.yaml @@ -0,0 +1,16 @@ +kind: Namespace +apiVersion: v1 +metadata: + name: default + +--- + +kind: Secret +apiVersion: v1 +metadata: + name: secret + namespace: default +type: Opaque +stringData: + foo: bar + foo2: bar2 \ No newline at end of file diff --git a/pkg/patterns/declarative/pkg/applier/applylib_test.go b/pkg/patterns/declarative/pkg/applier/applylib_test.go index 8767ee4f..07e5863e 100644 --- a/pkg/patterns/declarative/pkg/applier/applylib_test.go +++ b/pkg/patterns/declarative/pkg/applier/applylib_test.go @@ -17,11 +17,11 @@ import ( "k8s.io/klog/v2" "sigs.k8s.io/controller-runtime/pkg/client/fake" "sigs.k8s.io/kubebuilder-declarative-pattern/applylib/applyset" + "sigs.k8s.io/kubebuilder-declarative-pattern/ktest/httprecorder" + "sigs.k8s.io/kubebuilder-declarative-pattern/ktest/testharness" "sigs.k8s.io/kubebuilder-declarative-pattern/mockkubeapiserver" "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/declarative/pkg/manifest" "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/restmapper" - "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/test/httprecorder" - "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/test/testharness" ) func fakeParent() runtime.Object { @@ -119,7 +119,7 @@ func runApplierGoldenTests(t *testing.T, testDir string, interceptHTTPServer boo requestLog.RemoveUserAgent() requestLog.SortGETs() - requests := requestLog.FormatHTTP() + requests := requestLog.FormatHTTP(false) h.CompareGoldenFile(filepath.Join(testdir, "expected.yaml"), requests) if interceptHTTPServer { @@ -128,7 +128,7 @@ func runApplierGoldenTests(t *testing.T, testDir string, interceptHTTPServer boo apiserverRequestLog.RemoveUserAgent() apiserverRequestLog.SortGETs() apiserverRequestLog.RemoveHeader("Kubectl-Session") - apiserverRequests := apiserverRequestLog.FormatHTTP() + apiserverRequests := apiserverRequestLog.FormatHTTP(false) h.CompareGoldenFile(filepath.Join(testdir, "expected-apiserver.yaml"), apiserverRequests) } }) diff --git a/pkg/patterns/declarative/pkg/applier/testdata/applylib/simple1/expected.yaml b/pkg/patterns/declarative/pkg/applier/testdata/applylib/simple1/expected.yaml index 4c9d92d5..dd23dca0 100644 --- a/pkg/patterns/declarative/pkg/applier/testdata/applylib/simple1/expected.yaml +++ b/pkg/patterns/declarative/pkg/applier/testdata/applylib/simple1/expected.yaml @@ -1,6 +1,7 @@ GET http://kube-apiserver/api/v1 Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Length: 1926 diff --git a/pkg/patterns/declarative/pkg/applier/testdata/applylib/simple2/expected.yaml b/pkg/patterns/declarative/pkg/applier/testdata/applylib/simple2/expected.yaml index 26343090..ad4fe601 100644 --- a/pkg/patterns/declarative/pkg/applier/testdata/applylib/simple2/expected.yaml +++ b/pkg/patterns/declarative/pkg/applier/testdata/applylib/simple2/expected.yaml @@ -1,6 +1,7 @@ GET http://kube-apiserver/api/v1 Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Length: 1926 diff --git a/pkg/patterns/declarative/pkg/applier/testdata/applylib/simple3/expected.yaml b/pkg/patterns/declarative/pkg/applier/testdata/applylib/simple3/expected.yaml index 56c77edc..f6710898 100644 --- a/pkg/patterns/declarative/pkg/applier/testdata/applylib/simple3/expected.yaml +++ b/pkg/patterns/declarative/pkg/applier/testdata/applylib/simple3/expected.yaml @@ -1,6 +1,7 @@ GET http://kube-apiserver/api/v1 Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Length: 1926 diff --git a/pkg/patterns/declarative/pkg/applier/testdata/direct/simple1/expected.yaml b/pkg/patterns/declarative/pkg/applier/testdata/direct/simple1/expected.yaml index 27f374c0..b644ff4c 100644 --- a/pkg/patterns/declarative/pkg/applier/testdata/direct/simple1/expected.yaml +++ b/pkg/patterns/declarative/pkg/applier/testdata/direct/simple1/expected.yaml @@ -1,6 +1,7 @@ GET http://kube-apiserver/api/v1 Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Length: 1926 @@ -14,6 +15,7 @@ Date: (removed) GET http://kube-apiserver/api/v1/namespaces/ns1 Accept: application/json + 404 Not Found Content-Length: 10 Content-Type: text/plain; charset=utf-8 @@ -45,6 +47,7 @@ Date: (removed) GET http://kube-apiserver/api/v1/namespaces/ns2 Accept: application/json + 404 Not Found Content-Length: 10 Content-Type: text/plain; charset=utf-8 diff --git a/pkg/patterns/declarative/pkg/applier/testdata/direct/simple2/expected.yaml b/pkg/patterns/declarative/pkg/applier/testdata/direct/simple2/expected.yaml index 0168b769..df8c9ea3 100644 --- a/pkg/patterns/declarative/pkg/applier/testdata/direct/simple2/expected.yaml +++ b/pkg/patterns/declarative/pkg/applier/testdata/direct/simple2/expected.yaml @@ -1,6 +1,7 @@ GET http://kube-apiserver/api/v1 Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Length: 1926 @@ -14,6 +15,7 @@ Date: (removed) GET http://kube-apiserver/api/v1/namespaces/ns1 Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 286 @@ -43,6 +45,7 @@ Date: (removed) GET http://kube-apiserver/api/v1/namespaces/ns2 Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 286 diff --git a/pkg/patterns/declarative/pkg/applier/testdata/direct/simple3/expected.yaml b/pkg/patterns/declarative/pkg/applier/testdata/direct/simple3/expected.yaml index f7b9a37a..cf04ac6c 100644 --- a/pkg/patterns/declarative/pkg/applier/testdata/direct/simple3/expected.yaml +++ b/pkg/patterns/declarative/pkg/applier/testdata/direct/simple3/expected.yaml @@ -1,6 +1,7 @@ GET http://kube-apiserver/api/v1 Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Length: 1926 @@ -14,6 +15,7 @@ Date: (removed) GET http://kube-apiserver/api/v1/namespaces/ns1 Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 455 @@ -27,6 +29,7 @@ Date: (removed) GET http://kube-apiserver/api/v1/namespaces/ns2 Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 455 diff --git a/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple1/expected-apiserver.yaml b/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple1/expected-apiserver.yaml index 70f1a64b..e6b90cfe 100644 --- a/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple1/expected-apiserver.yaml +++ b/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple1/expected-apiserver.yaml @@ -4,7 +4,6 @@ Accept-Encoding: gzip - --- GET /openapi/v2?timeout=32s @@ -14,7 +13,6 @@ Kubectl-Command: kubectl apply - --- GET /api?timeout=32s @@ -24,7 +22,6 @@ Kubectl-Command: kubectl apply - --- GET /api/v1?timeout=32s @@ -34,7 +31,6 @@ Kubectl-Command: kubectl apply - --- GET /apis?timeout=32s @@ -44,7 +40,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/admissionregistration.k8s.io/v1?timeout=32s @@ -54,7 +49,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/apiextensions.k8s.io/v1?timeout=32s @@ -64,7 +58,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/apiregistration.k8s.io/v1?timeout=32s @@ -74,7 +67,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/apps/v1?timeout=32s @@ -84,7 +76,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/autoscaling/v1?timeout=32s @@ -94,7 +85,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/autoscaling/v2?timeout=32s @@ -104,7 +94,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/autoscaling/v2beta2?timeout=32s @@ -114,7 +103,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/batch/v1?timeout=32s @@ -124,7 +112,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/certificates.k8s.io/v1?timeout=32s @@ -134,7 +121,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/coordination.k8s.io/v1?timeout=32s @@ -144,7 +130,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/discovery.k8s.io/v1?timeout=32s @@ -154,7 +139,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/events.k8s.io/v1?timeout=32s @@ -164,7 +148,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/flowcontrol.apiserver.k8s.io/v1beta1?timeout=32s @@ -174,7 +157,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/flowcontrol.apiserver.k8s.io/v1beta2?timeout=32s @@ -184,7 +166,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/networking.k8s.io/v1?timeout=32s @@ -194,7 +175,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/node.k8s.io/v1?timeout=32s @@ -204,7 +184,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/policy/v1?timeout=32s @@ -214,7 +193,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/rbac.authorization.k8s.io/v1?timeout=32s @@ -224,7 +202,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/scheduling.k8s.io/v1?timeout=32s @@ -234,7 +211,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/storage.k8s.io/v1?timeout=32s @@ -244,7 +220,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/storage.k8s.io/v1beta1?timeout=32s @@ -254,7 +229,6 @@ Kubectl-Command: kubectl apply - --- GET /api/v1/namespaces/ns1 @@ -264,7 +238,6 @@ Kubectl-Command: kubectl apply - --- POST /api/v1/namespaces?fieldManager=kubectl-client-side-apply&fieldValidation=Ignore @@ -278,8 +251,6 @@ Kubectl-Command: kubectl apply - - --- GET /api/v1/namespaces/ns2 @@ -289,7 +260,6 @@ Kubectl-Command: kubectl apply - --- POST /api/v1/namespaces?fieldManager=kubectl-client-side-apply&fieldValidation=Ignore @@ -302,5 +272,3 @@ Kubectl-Command: kubectl apply {"apiVersion":"v1","kind":"Namespace","metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"ns2\"}}\n"},"name":"ns2"}} - - diff --git a/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple1/expected.yaml b/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple1/expected.yaml index 95bf8150..a3a008f5 100644 --- a/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple1/expected.yaml +++ b/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple1/expected.yaml @@ -1,6 +1,7 @@ GET http://kube-apiserver/api/v1 Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Length: 1926 diff --git a/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple2/expected-apiserver.yaml b/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple2/expected-apiserver.yaml index 8f4ce0ca..a610433c 100644 --- a/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple2/expected-apiserver.yaml +++ b/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple2/expected-apiserver.yaml @@ -4,7 +4,6 @@ Accept-Encoding: gzip - --- GET /openapi/v2?timeout=32s @@ -14,7 +13,6 @@ Kubectl-Command: kubectl apply - --- GET /api?timeout=32s @@ -24,7 +22,6 @@ Kubectl-Command: kubectl apply - --- GET /api/v1?timeout=32s @@ -34,7 +31,6 @@ Kubectl-Command: kubectl apply - --- GET /apis?timeout=32s @@ -44,7 +40,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/admissionregistration.k8s.io/v1?timeout=32s @@ -54,7 +49,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/apiextensions.k8s.io/v1?timeout=32s @@ -64,7 +58,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/apiregistration.k8s.io/v1?timeout=32s @@ -74,7 +67,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/apps/v1?timeout=32s @@ -84,7 +76,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/autoscaling/v1?timeout=32s @@ -94,7 +85,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/autoscaling/v2?timeout=32s @@ -104,7 +94,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/autoscaling/v2beta2?timeout=32s @@ -114,7 +103,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/batch/v1?timeout=32s @@ -124,7 +112,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/certificates.k8s.io/v1?timeout=32s @@ -134,7 +121,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/coordination.k8s.io/v1?timeout=32s @@ -144,7 +130,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/discovery.k8s.io/v1?timeout=32s @@ -154,7 +139,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/events.k8s.io/v1?timeout=32s @@ -164,7 +148,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/flowcontrol.apiserver.k8s.io/v1beta1?timeout=32s @@ -174,7 +157,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/flowcontrol.apiserver.k8s.io/v1beta2?timeout=32s @@ -184,7 +166,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/networking.k8s.io/v1?timeout=32s @@ -194,7 +175,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/node.k8s.io/v1?timeout=32s @@ -204,7 +184,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/policy/v1?timeout=32s @@ -214,7 +193,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/rbac.authorization.k8s.io/v1?timeout=32s @@ -224,7 +202,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/scheduling.k8s.io/v1?timeout=32s @@ -234,7 +211,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/storage.k8s.io/v1?timeout=32s @@ -244,7 +220,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/storage.k8s.io/v1beta1?timeout=32s @@ -254,7 +229,6 @@ Kubectl-Command: kubectl apply - --- GET /api/v1/namespaces/ns1 @@ -264,7 +238,6 @@ Kubectl-Command: kubectl apply - --- PATCH /api/v1/namespaces/ns1?fieldManager=kubectl-client-side-apply&fieldValidation=Ignore @@ -277,8 +250,6 @@ Kubectl-Command: kubectl apply {"metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"ns1\"}}\n"}}} - - --- GET /api/v1/namespaces/ns2 @@ -288,7 +259,6 @@ Kubectl-Command: kubectl apply - --- PATCH /api/v1/namespaces/ns2?fieldManager=kubectl-client-side-apply&fieldValidation=Ignore @@ -300,5 +270,3 @@ Kubectl-Command: kubectl apply {"metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"ns2\"}}\n"}}} - - diff --git a/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple2/expected.yaml b/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple2/expected.yaml index 95bf8150..a3a008f5 100644 --- a/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple2/expected.yaml +++ b/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple2/expected.yaml @@ -1,6 +1,7 @@ GET http://kube-apiserver/api/v1 Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Length: 1926 diff --git a/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple3/expected-apiserver.yaml b/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple3/expected-apiserver.yaml index 352c9054..137e3f21 100644 --- a/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple3/expected-apiserver.yaml +++ b/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple3/expected-apiserver.yaml @@ -4,7 +4,6 @@ Accept-Encoding: gzip - --- GET /openapi/v2?timeout=32s @@ -14,7 +13,6 @@ Kubectl-Command: kubectl apply - --- GET /api?timeout=32s @@ -24,7 +22,6 @@ Kubectl-Command: kubectl apply - --- GET /api/v1?timeout=32s @@ -34,7 +31,6 @@ Kubectl-Command: kubectl apply - --- GET /apis?timeout=32s @@ -44,7 +40,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/admissionregistration.k8s.io/v1?timeout=32s @@ -54,7 +49,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/apiextensions.k8s.io/v1?timeout=32s @@ -64,7 +58,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/apiregistration.k8s.io/v1?timeout=32s @@ -74,7 +67,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/apps/v1?timeout=32s @@ -84,7 +76,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/autoscaling/v1?timeout=32s @@ -94,7 +85,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/autoscaling/v2?timeout=32s @@ -104,7 +94,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/autoscaling/v2beta2?timeout=32s @@ -114,7 +103,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/batch/v1?timeout=32s @@ -124,7 +112,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/certificates.k8s.io/v1?timeout=32s @@ -134,7 +121,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/coordination.k8s.io/v1?timeout=32s @@ -144,7 +130,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/discovery.k8s.io/v1?timeout=32s @@ -154,7 +139,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/events.k8s.io/v1?timeout=32s @@ -164,7 +148,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/flowcontrol.apiserver.k8s.io/v1beta1?timeout=32s @@ -174,7 +157,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/flowcontrol.apiserver.k8s.io/v1beta2?timeout=32s @@ -184,7 +166,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/networking.k8s.io/v1?timeout=32s @@ -194,7 +175,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/node.k8s.io/v1?timeout=32s @@ -204,7 +184,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/policy/v1?timeout=32s @@ -214,7 +193,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/rbac.authorization.k8s.io/v1?timeout=32s @@ -224,7 +202,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/scheduling.k8s.io/v1?timeout=32s @@ -234,7 +211,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/storage.k8s.io/v1?timeout=32s @@ -244,7 +220,6 @@ Kubectl-Command: kubectl apply - --- GET /apis/storage.k8s.io/v1beta1?timeout=32s @@ -254,7 +229,6 @@ Kubectl-Command: kubectl apply - --- GET /api/v1/namespaces/ns1 @@ -264,7 +238,6 @@ Kubectl-Command: kubectl apply - --- GET /api/v1/namespaces/ns2 @@ -273,4 +246,3 @@ Accept-Encoding: gzip Kubectl-Command: kubectl apply - diff --git a/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple3/expected.yaml b/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple3/expected.yaml index 95bf8150..a3a008f5 100644 --- a/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple3/expected.yaml +++ b/pkg/patterns/declarative/pkg/applier/testdata/kubectl/simple3/expected.yaml @@ -1,6 +1,7 @@ GET http://kube-apiserver/api/v1 Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Length: 1926 diff --git a/pkg/test/testreconciler/simpletest/controller_test.go b/pkg/test/testreconciler/simpletest/controller_test.go index 60d02c35..10ec7523 100644 --- a/pkg/test/testreconciler/simpletest/controller_test.go +++ b/pkg/test/testreconciler/simpletest/controller_test.go @@ -15,13 +15,13 @@ import ( ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/kubebuilder-declarative-pattern/commonclient" + "sigs.k8s.io/kubebuilder-declarative-pattern/ktest/httprecorder" + "sigs.k8s.io/kubebuilder-declarative-pattern/ktest/testharness" "sigs.k8s.io/kubebuilder-declarative-pattern/mockkubeapiserver" "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/addon/pkg/loaders" "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/declarative" "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/declarative/pkg/applier" "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/restmapper" - "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/test/httprecorder" - "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/test/testharness" api "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/test/testreconciler/simpletest/v1alpha1" ) @@ -125,11 +125,11 @@ func testSimpleReconciler(h *testharness.Harness, testdir string, applier applie requestLog.RemoveUserAgent() requestLog.SortGETs() // Workaround for non-determinism in https://github.com/kubernetes/kubernetes/blob/79a62d62350fb600f97d1f6309c3274515b3587a/staging/src/k8s.io/client-go/tools/cache/reflector.go#L301 - requestLog.RegexReplaceURL("&timeoutSeconds=.*&", "&timeoutSeconds=&") + requestLog.RegexReplaceURL(h.T, "&timeoutSeconds=.*&", "&timeoutSeconds=&") h.Logf("replacing real timestamp in request and response to a fake value") requestLog.ReplaceTimestamp() - requests := requestLog.FormatHTTP() + requests := requestLog.FormatHTTP(false) h.CompareGoldenFile(filepath.Join(testdir, "expected-http.yaml"), requests) } diff --git a/pkg/test/testreconciler/simpletest/testdata/reconcile/direct/create/expected-http.yaml b/pkg/test/testreconciler/simpletest/testdata/reconcile/direct/create/expected-http.yaml index 2db23713..abcf7820 100644 --- a/pkg/test/testreconciler/simpletest/testdata/reconcile/direct/create/expected-http.yaml +++ b/pkg/test/testreconciler/simpletest/testdata/reconcile/direct/create/expected-http.yaml @@ -1,6 +1,7 @@ GET http://kube-apiserver/apis/addons.example.org/v1alpha1 Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Length: 245 @@ -14,6 +15,7 @@ Date: (removed) GET http://kube-apiserver/apis/addons.example.org/v1alpha1/simpletests?limit=500&resourceVersion=0 Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Length: 379 @@ -27,6 +29,7 @@ Date: (removed) GET http://kube-apiserver/apis/addons.example.org/v1alpha1/simpletests?allowWatchBookmarks=true&resourceVersion=2&timeoutSeconds=&watch=true Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Type: application/json @@ -39,6 +42,7 @@ Date: (removed) GET http://kube-apiserver/api/v1 Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Length: 2128 @@ -52,6 +56,7 @@ Date: (removed) GET http://kube-apiserver/apis/apps/v1 Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Length: 831 @@ -65,6 +70,7 @@ Date: (removed) GET http://kube-apiserver/api/v1/namespaces/ns1/configmaps/foo Accept: application/json + 404 Not Found Content-Length: 10 Content-Type: text/plain; charset=utf-8 @@ -79,6 +85,7 @@ Not Found GET http://kube-apiserver/apis/apps/v1/namespaces/ns1/deployments/mydeployment Accept: application/json + 404 Not Found Content-Length: 10 Content-Type: text/plain; charset=utf-8 @@ -93,6 +100,7 @@ Not Found GET http://kube-apiserver/api/v1/configmaps?allowWatchBookmarks=true&labelSelector=addons.example.org%2Fsimpletest%3Dsimple1&watch=true Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Type: application/json @@ -105,6 +113,7 @@ Date: (removed) GET http://kube-apiserver/apis/apps/v1/deployments?allowWatchBookmarks=true&labelSelector=addons.example.org%2Fsimpletest%3Dsimple1&watch=true Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Type: application/json @@ -117,6 +126,7 @@ Date: (removed) GET http://kube-apiserver/api/v1/namespaces/ns1/configmaps/foo Accept: application/json + 404 Not Found Content-Length: 10 Content-Type: text/plain; charset=utf-8 @@ -131,6 +141,7 @@ Not Found GET http://kube-apiserver/api/v1/namespaces/ns1 Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 286 @@ -161,6 +172,7 @@ Date: (removed) GET http://kube-apiserver/apis/apps/v1/namespaces/ns1/deployments/mydeployment Accept: application/json + 404 Not Found Content-Length: 10 Content-Type: text/plain; charset=utf-8 @@ -175,6 +187,7 @@ Not Found GET http://kube-apiserver/api/v1/namespaces/ns1 Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 286 @@ -205,6 +218,7 @@ Date: (removed) GET http://kube-apiserver/apis/apps/v1/namespaces/ns1/deployments/mydeployment Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 1680 @@ -235,6 +249,7 @@ Date: (removed) GET http://kube-apiserver/api/v1/namespaces/ns1/configmaps/foo Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 1025 @@ -248,6 +263,7 @@ Date: (removed) GET http://kube-apiserver/apis/apps/v1/namespaces/ns1/deployments/mydeployment Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 1680 @@ -261,6 +277,7 @@ Date: (removed) GET http://kube-apiserver/api/v1/namespaces/ns1/configmaps/foo Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 1025 @@ -274,6 +291,7 @@ Date: (removed) GET http://kube-apiserver/apis/apps/v1/namespaces/ns1/deployments/mydeployment Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 1680 @@ -287,6 +305,7 @@ Date: (removed) GET http://kube-apiserver/apis/apps/v1/namespaces/ns1/deployments/mydeployment Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 1680 diff --git a/pkg/test/testreconciler/simpletest/testdata/reconcile/ssa/create/expected-http.yaml b/pkg/test/testreconciler/simpletest/testdata/reconcile/ssa/create/expected-http.yaml index 7347d59f..ffb634db 100644 --- a/pkg/test/testreconciler/simpletest/testdata/reconcile/ssa/create/expected-http.yaml +++ b/pkg/test/testreconciler/simpletest/testdata/reconcile/ssa/create/expected-http.yaml @@ -1,6 +1,7 @@ GET http://kube-apiserver/apis/addons.example.org/v1alpha1 Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Length: 245 @@ -14,6 +15,7 @@ Date: (removed) GET http://kube-apiserver/apis/addons.example.org/v1alpha1/simpletests?limit=500&resourceVersion=0 Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Length: 379 @@ -27,6 +29,7 @@ Date: (removed) GET http://kube-apiserver/apis/addons.example.org/v1alpha1/simpletests?allowWatchBookmarks=true&resourceVersion=2&timeoutSeconds=&watch=true Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Type: application/json @@ -39,6 +42,7 @@ Date: (removed) GET http://kube-apiserver/api/v1 Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Length: 2128 @@ -52,6 +56,7 @@ Date: (removed) GET http://kube-apiserver/apis/apps/v1 Accept: application/json, */* + 200 OK Cache-Control: no-cache, private Content-Length: 831 @@ -65,6 +70,7 @@ Date: (removed) GET http://kube-apiserver/api/v1/namespaces/ns1/configmaps/foo Accept: application/json + 404 Not Found Content-Length: 10 Content-Type: text/plain; charset=utf-8 @@ -79,6 +85,7 @@ Not Found GET http://kube-apiserver/apis/apps/v1/namespaces/ns1/deployments/mydeployment Accept: application/json + 404 Not Found Content-Length: 10 Content-Type: text/plain; charset=utf-8 @@ -93,6 +100,7 @@ Not Found GET http://kube-apiserver/api/v1/configmaps?allowWatchBookmarks=true&labelSelector=addons.example.org%2Fsimpletest%3Dsimple1&watch=true Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Type: application/json @@ -105,6 +113,7 @@ Date: (removed) GET http://kube-apiserver/apis/apps/v1/deployments?allowWatchBookmarks=true&labelSelector=addons.example.org%2Fsimpletest%3Dsimple1&watch=true Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Type: application/json @@ -166,6 +175,7 @@ Date: (removed) GET http://kube-apiserver/api/v1/namespaces/ns1/configmaps/foo Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 583 @@ -179,6 +189,7 @@ Date: (removed) GET http://kube-apiserver/apis/apps/v1/namespaces/ns1/deployments/mydeployment Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 1040 @@ -208,6 +219,7 @@ Date: (removed) GET http://kube-apiserver/api/v1/namespaces/ns1/configmaps/foo Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 583 @@ -221,6 +233,7 @@ Date: (removed) GET http://kube-apiserver/apis/apps/v1/namespaces/ns1/deployments/mydeployment Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 1040 @@ -234,6 +247,7 @@ Date: (removed) GET http://kube-apiserver/api Accept: application/json;g=apidiscovery.k8s.io;v=v2beta1;as=APIGroupDiscoveryList,application/json + 200 OK Cache-Control: no-cache, private Content-Length: 74 @@ -247,6 +261,7 @@ Date: (removed) GET http://kube-apiserver/apis Accept: application/json;g=apidiscovery.k8s.io;v=v2beta1;as=APIGroupDiscoveryList,application/json + 200 OK Cache-Control: no-cache, private Content-Length: 3401 @@ -292,6 +307,7 @@ Date: (removed) GET http://kube-apiserver/api/v1/namespaces/ns1/configmaps/foo Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 583 @@ -305,6 +321,7 @@ Date: (removed) GET http://kube-apiserver/apis/apps/v1/namespaces/ns1/deployments/mydeployment Accept: application/json + 200 OK Cache-Control: no-cache, private Content-Length: 1040 diff --git a/pkg/test/testreconciler/simpletest/with_kubectl_test.go b/pkg/test/testreconciler/simpletest/with_kubectl_test.go index 1537cb1b..b17eaf14 100644 --- a/pkg/test/testreconciler/simpletest/with_kubectl_test.go +++ b/pkg/test/testreconciler/simpletest/with_kubectl_test.go @@ -6,9 +6,9 @@ package simpletest import ( "testing" + "sigs.k8s.io/kubebuilder-declarative-pattern/ktest/testharness" "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/addon/pkg/status" "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/declarative/pkg/applier" - "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/test/testharness" ) func TestDirectSimpleReconciler(t *testing.T) { diff --git a/pkg/test/testreconciler/simpletest/without_kubectl_test.go b/pkg/test/testreconciler/simpletest/without_kubectl_test.go index 24caaaff..b9d9c00b 100644 --- a/pkg/test/testreconciler/simpletest/without_kubectl_test.go +++ b/pkg/test/testreconciler/simpletest/without_kubectl_test.go @@ -4,9 +4,9 @@ import ( "testing" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/kubebuilder-declarative-pattern/ktest/testharness" "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/addon/pkg/status" "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/patterns/declarative/pkg/applier" - "sigs.k8s.io/kubebuilder-declarative-pattern/pkg/test/testharness" ) func TestSSASimpleReconciler(t *testing.T) {